我有一个这样的事实清单:
set(h, 3).
set(h, 6).
set(h, 12).
set(h, 1).
set(h, 7).
我需要找到集合 h 的最大值,查询需要如下所示:
?- maximum(h, Max).
Max = 12.
显然,现在有很多方法可以做到这一点。但目前我正在寻找一种使用动态谓词和失败谓词的方法。我猜我可能不得不使用重复?不幸的是,重复谓词和动态谓词都让我感到困惑。
我在想这样的事情:
set(h, 3).
set(h, 6).
set(h, 12).
set(h, 1).
set(h, 7).
:- dynamic current_max/1.
assert(current_max(0)).
maximum(Set, Element):-
repeat,
set(Set,Element),
current_max(Max),
(Max > Element,
fail);
(Element > Max,
retract(current_max(Max)),
assert(current_max(Element)),
fail).
maximum(_, Max):-
current_max(Max).
我自己看到的问题之一是重复循环不会停止。如果我能以某种方式知道它是集合中的最后一个元素,我可能会使用 cut,但我不确定如何使用。