вопрос пролога найти максимум с помощью оператора отрицания \ +

У меня есть несколько значений H, и я хотел бы найти максимальное, используя \ +, как мне это сделать?

maxValue(X) :-
  Get(Id, X),
  \+( Get(Id, Y), X < Y ).

понятия не имею .... помогите пожалуйста, спасибо!


person Tom    schedule 15.03.2011    source источник
comment
Пожалуйста, поместите обратную косую черту перед обратной косой чертой, чтобы она стала видимой как обратная косая черта. Требуется только тогда, когда он не отмечен как код.   -  person Mostowski Collapse    schedule 16.03.2011
comment
возможный дубликат Максимальное количество значений, определенных предложениями пролога   -  person Fred Foo    schedule 16.03.2011


Ответы (2)


Использование отрицания - один из способов найти максимум. И это действительно работает. Вот пример:

   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 локальным.

Наилучшие пожелания

person Mostowski Collapse    schedule 15.03.2011