Более портативная альтернатива 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.
Versus:
?- 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
.