【发布时间】:2019-10-14 20:01:33
【问题描述】:
假设我的序言中有以下列表:
L=[10,11,2,3,5]
有没有一种方法可以检查列表中的所有成员L,以确保每个成员都小于5?
【问题讨论】:
标签: prolog meta-predicate
假设我的序言中有以下列表:
L=[10,11,2,3,5]
有没有一种方法可以检查列表中的所有成员L,以确保每个成员都小于5?
【问题讨论】:
标签: prolog meta-predicate
我们可以在这里使用maplist/2。这是一个谓词:
maplist(:Goal, ?List)
True如果Goal可以成功应用于List的所有元素。对参数进行重新排序以获得性能以及使谓词在正常情况下具有确定性。
所以我们可以在这里检查元素:
all_less_five(L) :-
maplist(>(5), L).
这里对于每个元素 x ∈ L,它将因此调用>(5, <i>x</i>),或内联形式5 > <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.
【讨论】:
这是另一个不使用任何内置函数的解决方案:
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 上实现它。试试吧!
【讨论】: