假设我的序言中有以下列表:
L=[10,11,2,3,5]
有没有一种方法可以检查列表的所有成员L
以确保每个成员都小于5
?
我们可以利用maplist/2
这里。这是一个谓词:
maplist(:Goal, ?List)
True
ifGoal
可以成功应用于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.
这是另一个不使用任何内置函数的解决方案:
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 上。试试吧!