Prolog的可能性有所不同

时间:2015-03-12 21:39:01

标签: prolog

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

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).

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

1 个答案:

答案 0 :(得分:2)

Prolog只提供了一种非常粗略的否定形式,事实上,(\+)/1仅仅意味着“在执行的这个时间点不可证明”。因此,您必须考虑执行(\+)/1的确切时刻。在您的特定情况下,有一个简单的方法:

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

然而,在一般情况下,这远远不能轻易修复。想一想\+ X = Y,请参阅this answer

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