我有一个方法可以向我返回所有iterations
上的数字,但是现在我只需要返回所有已完成的iterations
的最大值。
find_max(X, Y):-
find_number(X, Y).
因此find_number()
仅返回1个数字和一些文本。因此,例如,如果我要运行它,我将得到以下输出:
X = 1, Y = me;
X = 5, Y = you;
X = 6, Y = he;
我需要返回的唯一输出是X = 6, Y = he;
。
我正在使用SWI-Prolog
。
答案 0 :(得分:3)
威廉姆(Willem)发布的library(aggregate)
更具可移植性,因为该库仅在少数Prolog系统中可用,
find_max_alt(Xm, Ym) :-
setof(max(X, Y), find_number(X, Y), Solutions),
reverse(Solutions, [max(Xm, Ym)| _]).
此解决方案似乎也需要较少的推断。使用问题中的数据,我们得到:
?- time(find_max(Xm, Ym)).
% 40 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 800000 Lips)
Xm = 6,
Ym = he.
对:
?- time(find_max_alt(Xm, Ym)).
% 25 inferences, 0.000 CPU in 0.000 seconds (76% CPU, 675676 Lips)
Xm = 6,
Ym = he.
setof/3
谓词是标准谓词。 reverse/2
谓词是一个常见的列表谓词(比aggregate
库中的谓词更容易定义。
答案 1 :(得分:1)
您可以为此使用aggregate
库:
:- use_module(library(aggregate)).
find_max(Xm, Ym):-
aggregate(max(X, Y), find_number(X, Y), max(Xm, Ym)).