0

我有一些值 H,我想使用 \+ 找到最大值,我该怎么做?

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

没有线索....请帮助,谢谢!

4

2 回答 2

3

使用否定是找到最大值的一种方法。它确实有效。这是一个例子:

   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 线程本地化。

此致

于 2011-03-15T21:02:15.300 回答
1

另请参阅这些问题/答案:

于 2011-03-16T08:53:12.563 回答