1

我有以下代码,其中我将 is_max 定义为 is_below 的否定。

rank(mary,1).
rank(juan,2).
rank(john,3).
rank(jane,4).

is_below(X)   :- rank(X,A), rank(Y,B), A<B .
is_max(X)     :- not(is_below(X)) .

如果 X 在排名方面低于某人,is_below 为真。因此,具有最高/最大等级的人是 is_below 为假的人(因此定义了 is_max)。

当我查询

is_max(jane) .

这是真的(以上对于玛丽、胡安和约翰来说是错误的)

但是,当我查询

is_max(X) .

这是错误的。我期待它返回简。我的逻辑似乎很好,所以我不确定为什么我没有得到简。任何见解将不胜感激!

4

1 回答 1

2

Prolog 将否定视为失败。将其视为“不可证明”。

is_max(X)如果is_below(X)永远是假的,那就是真的。is_below(X)对于 X=mary 为真,所以is_below(X)是可证明的,并且is_max(X)是假的。

因此,最好使用 notation\+而不是not,以提醒自己这不是 true not

修复代码的一种可能方法是显式实例化 X:

is_max(X) :- rank(X,_), \+ is_below(X).
于 2014-09-25T00:42:45.963 回答