Prolog中否定的可能性

Negated possibilities in Prolog

这是一个有点愚蠢的例子,但我试图让这个概念保持基本概念以便更好地理解。假设我有以下一元关系:

person(steve). 
person(joe). 

fruit(apples).
fruit(pears).
fruit(mangos).

以及以下二元关系:

eats(steve, apples).
eats(steve, pears).
eats(joe, mangos).

我知道查询 eats(steve, F). 会 return 史蒂夫吃的所有水果(苹果和梨)。我的问题是我想得到史蒂夫 吃的所有水果。我知道这个: \+eats(steve,F) 将只是 return "no" 因为 F 不能被无限的可能性所束缚,但是我希望它成为 return 芒果,因为那是史蒂夫不吃的唯一现存水果。有没有一种方法可以产生预期的结果?

我试过了,但也不走运:\+eats(steve,F), fruit(F).

如果有更好的标题适合这个问题,我将不胜感激。

Prolog 只提供了一种非常粗略的否定形式,事实上,(\+)/1 的意思就是 "not provable at this point in time of the execution"。因此,您必须考虑执行 (\+)/1 的确切时刻。在您的特定情况下,有一个简单的方法:

fruit(F), \+eats(steve,F).

然而,在一般情况下,这远非轻易修复。想到\+ X = Y,看到this answer

另一个问题是否定,即使使用得当,也会在您的程序中引入 非单调 属性:通过为 eats/2 添加更多事实,可以推断出更少.所以除非你真的想要这个(就像在这个例子中它确实有意义),避免构造