Prolog 从集合中获取最大值

Kar*_*ars 2 prolog

这是一个简单的问题。

has(steve, 5).
has(mark, 6).
has(craig, 4).
Run Code Online (Sandbox Code Playgroud)

你如何从 Prolog 中获得最多的人?

我试过了,has(Who, Max)但这没有帮助。有可以在这里使用的运算符吗?

谢谢。

Cap*_*liC 5

?- has(U,S),\+((has(V,T),T>S)).
U = mark,
S = 6 ;
false.
Run Code Online (Sandbox Code Playgroud)

前缀运算符\+读作not。由于我们必须反驳的是由中缀运算符 表示的连词,,因此需要那些双括号。

您应该意识到,在使用它时,它是一种限制形式的否定,即所谓的失败否定,通过Prolog 语义中隐含的封闭世界假设使之成为可能。

或者,做完全一样的

max(U,S) :- has(U,S),notanybetterthan(S).

notanybetterthan(S) :- has(_,T),T>S,!,fail.
notanybetterthan(_).
Run Code Online (Sandbox Code Playgroud)

或者

max(U,S) :- has(U,S),\+anybetterthan(S).

anybetterthan(S) :- has(_,T),T>S.
Run Code Online (Sandbox Code Playgroud)

编辑

正如@WillNess 所指出的,我使用的语法不精确。事实上,双括号是\+被视为函子而不是运算符的结果。在我们可以写的符号后添加一个空格

?- has(U,S),\+ (has(V,T),T>S).
Run Code Online (Sandbox Code Playgroud)