基本上我有一个这样的事实清单:
set(x,2).
set(x,7).
set(x,10).
set(x,4).
我需要找到这个集合的最大元素。
输入:maximum(x, MaxElement)
输出:MaxElement = 10.
现在这个想法本身并不复杂,我自己在网上看到很多例子。问题是我需要使用 fail 谓词。
这是我的想法(不起作用):
maximum(Set, Element1):-
set(Set,Element1),
set(Set,Element2),
Element2 > Element1,
fail.
maximum(Set, Element) :- set(Set, Element).
这里的想法是第一个规则查找集合中具有更大元素的每个元素。如果有更大的元素,我们会失败并停止。
然后理想情况下,对于最大的一个(10),我们不会失败并继续下一个规则,它只是看到它在集合中并返回true。
但是像这样,它仍然是每个数字的第二个规则。使用cut也似乎不起作用。
任何想法的人?
答案 0 :(得分:3)
您可以简单地使用forall/2
谓词来检查每个元素,如:
maximum(Set, Element1):-
set(Set,Element1),
forall(set(Set,Y),(Y>Element1->fail;true)).
现在查询:
?- maximum(x,X).
X = 10 ;
false.