【发布时间】:2016-12-01 07:18:37
【问题描述】:
我有一个这样的事实清单:
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,但我不确定如何。
【问题讨论】:
标签: prolog max prolog-assert