检查列表中的所有成员

时间:2019-10-13 19:17:16

标签: prolog meta-predicate

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

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

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

2 个答案:

答案 0 :(得分:0)

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

  

maplist(:Goal, ?List)

     

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

因此我们可以在此处使用以下元素检查元素:

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

在这里,对于每个元素 x∈L ,它将调用>(5, x)或内联形式5 > x。因此,如果所有这些元素都少于五个,则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.

答案 1 :(得分:0)

这是不使用任何内置功能的另一种解决方案:

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。试试吧!