Prolog - 从事实列表中获取set的最大值(使用失败谓词)

时间:2016-11-01 17:49:56

标签: prolog set max

基本上我有一个这样的事实清单:

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也似乎不起作用。

任何想法的人?

1 个答案:

答案 0 :(得分:3)

您可以简单地使用forall/2谓词来检查每个元素,如:

maximum(Set, Element1):-
    set(Set,Element1),
    forall(set(Set,Y),(Y>Element1->fail;true)).

现在查询:

?-  maximum(x,X).
X = 10 ;
false.