这是一个简单的问题。
has(steve, 5).
has(mark, 6).
has(craig, 4).
在Prolog中,您如何从中获得最大收益?
我已经尝试过了,has(Who, Max)
但这无济于事。这里有可以使用的运算符吗?
谢谢。
?- has(U,S),\+((has(V,T),T>S)).
U = mark,
S = 6 ;
false.
前缀运算符\+
读为not。由于我们必须证明的是由infix运算符表示的连接,,
因此需要使用双括号。
您应该意识到,使用Prolog语义时,它是一种受限的否定形式,即作为失败的否定,它是由隐含在Prolog语义中的封闭世界假设实现的。
max(U,S) :- has(U,S),notanybetterthan(S).
notanybetterthan(S) :- has(_,T),T>S,!,fail.
notanybetterthan(_).
要么
max(U,S) :- has(U,S),\+anybetterthan(S).
anybetterthan(S) :- has(_,T),T>S.
编辑
正如@WillNess指出的那样,我使用的语法不精确。的确,双括号是\+
被视为函子而不是运算符的结果。我们可以在符号后面添加空格
?- has(U,S),\+ (has(V,T),T>S).
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句