Prolog仅返回所有迭代中的最大值

时间:2018-11-05 20:21:28

标签: prolog

我有一个方法可以向我返回所有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

2 个答案:

答案 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)).