Пролог вопрос найти максимум используя оператор отрицания \ + - PullRequest
1 голос
/ 15 марта 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

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

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

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

1 голос
/ 16 марта 2011
...