Использование отрицания - один из способов найти максимум. И это действительно работает.
Вот пример:
p(2).
p(1).
p(3).
?- p(X), \+ (p(Y), Y > X).
X = 3
Но сложность будет O (n * n), где n
количество фактов. Но максимум может быть
определяется в O (n). Так что, возможно, следующее
более эффективно для крупных баз фактов:
:- dynamic(the_max/1).
update_max(X) :-
the_max(Y), X>Y, !, retract(the_max(Y)), assertz(the_max(X)).
update_max(_).
find_max(X) :-
assertz(the_max(0)),
(p(Y), update_max(Y), fail; true),
retract(the_max(X)).
?- find_max(X).
X = 3
Но будьте осторожны, когда вы используете его из нескольких потоков,
вам нужно немного его адаптировать, то есть сделать the_max
локальный поток.
С наилучшими пожеланиями