【问题标题】:Checking all Members Of List检查列表的所有成员
【发布时间】:2019-10-14 20:01:33
【问题描述】:

假设我的序言中有以下列表:

L=[10,11,2,3,5]

有没有一种方法可以检查列表中的所有成员L,以确保每个成员都小于5

【问题讨论】:

    标签: prolog meta-predicate


    【解决方案1】:

    我们可以在这里使用maplist/2。这是一个谓词:

    maplist(:Goal, ?List)

    True 如果Goal 可以成功应用于List 的所有元素。对参数进行重新排序以获得性能以及使谓词在正常情况下具有确定性。

    所以我们可以在这里检查元素:

    all_less_five(L) :-
        maplist(>(5), L).

    这里对于每个元素 x &in; L,它将因此调用&gt;(5, <i>x</i>),或内联形式5 &gt; <i>x</i>。因此,如果所有这些元素都小于 5,则 all_less_five/1 谓词将成功。

    例如:

    ?- all_less_five([10,11,2,3,5]).
    false.
    
    ?- all_less_five([2,3,5]).
    false.
    
    ?- all_less_five([2,3]).
    true.
    

    【讨论】:

      【解决方案2】:

      这是另一个不使用任何内置函数的解决方案:

      all_less_five([]).
      all_less_five([X|L]):-
              X < 5,
              all_less_five(L).
      

      此解决方案使用典型的列表递归。谓词对空列表成立,然后我们只在头部小于 5 时才调用尾部递归。

      这里有一些关于谓词的问题:

      ?- all_less_five([10,11,2]).
      false.
      ?- all_less_five([2,3,6,5]).
      false.
      ?- all_less_five([1,2,3,4]).
      true.
      

      现在应该很容易在任何给定的 X 上实现它。试试吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        相关资源
        最近更新 更多