У меня есть несколько значений H, и я хотел бы найти максимальное, используя \ +, как мне это сделать?
maxValue(X) :-
Get(Id, X),
\+( Get(Id, Y), X < Y ).
понятия не имею .... помогите пожалуйста, спасибо!
У меня есть несколько значений H, и я хотел бы найти максимальное, используя \ +, как мне это сделать?
maxValue(X) :-
Get(Id, X),
\+( Get(Id, Y), X < Y ).
понятия не имею .... помогите пожалуйста, спасибо!
Использование отрицания - один из способов найти максимум. И это действительно работает. Вот пример:
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 локальным.
Наилучшие пожелания
См. Также эти вопросы / ответы: