假设我的序言中有以下列表:
L=[10,11,2,3,5]
有没有一种方法可以检查列表L
的所有成员,以确保每个成员小于5
?
答案 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。试试吧!