这是一个有点愚蠢的例子,但我试图保持这个概念非常基本,以便更好地理解。说我有以下一元关系:
person(steve).
person(joe).
fruit(apples).
fruit(pears).
fruit(mangos).
以下二元关系:
eats(steve, apples).
eats(steve, pears).
eats(joe, mangos).
我知道查询eats(steve, F).
将会恢复史蒂夫吃的所有水果(苹果和梨)。我的问题是,我希望得到史蒂夫不吃所吃的所有成果。我知道这一点:\+eats(steve,F)
只会返回" no"因为F不能与无限多种可能性联系在一起,但是我希望它能够回归芒果,因为它是史蒂夫不能吃的唯一存在的果实可能性。有没有办法写这个会产生预期结果?
我试过这个,但在这里也没有运气:\+eats(steve,F), fruit(F).
如果一个更好的标题适合这个问题,我将不胜感激。
答案 0 :(得分:2)
Prolog只提供了一种非常粗略的否定形式,事实上,(\+)/1
仅仅意味着“在执行的这个时间点不可证明”。因此,您必须考虑执行(\+)/1
的确切时刻。在您的特定情况下,有一个简单的方法:
fruit(F), \+eats(steve,F).
然而,在一般情况下,这远远不能轻易修复。想一想\+ X = Y
,请参阅this answer。
另一个问题是,即使使用得当,否定将在您的程序中引入非单调属性:通过为eats/2
添加更少的事实,可能会推断出更少的事实。所以除非你真的想要这个(就像在这个例子中它确实有意义),避免构造。