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
添加更多事实,可以推断出更少.所以除非你真的想要这个(就像在这个例子中它确实有意义),避免构造。
这是一个有点愚蠢的例子,但我试图让这个概念保持基本概念以便更好地理解。假设我有以下一元关系:
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
添加更多事实,可以推断出更少.所以除非你真的想要这个(就像在这个例子中它确实有意义),避免构造。