简单的Prolog程序 - 不确定结果

时间:2014-09-03 01:43:23

标签: prolog

Prolog(本例中为SWI-Prolog)全新,请对这个非常基本的问题道歉。我有一个简单的程序如下。

loves(vincent,mia).
loves(marsellus,mia). 
loves(pumpkin,honey_bunny).
loves(honey_bunny,pumpkin).

jealous(X, Y):- loves(X,Z), loves(Y,Z).

我对以下查询的结果感到有点困惑:

?- jealous(vincent, X).
X = vincent ;
X = marsellus.

也许我只是不习惯Prolog的统一过程,但答案不应该只是marsellus?为什么vincent包含在这里作为有效结果?

此外,作为一个后续问题:我是否正确,为了得到所有'嫉妒'的人的结果,我会写一个查询,如嫉妒(X,Y)。 ?

如果有,有人可以解释所述查询的以下结果吗?

?- jealous(X, Y).
X = Y, Y = vincent ;
X = vincent,
Y = marsellus ;
X = marsellus,
Y = vincent ;
X = Y, Y = marsellus ;
X = Y, Y = pumpkin ;
X = Y, Y = honey_bunny.

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

对于你的第一个问题,我可以看到输出是否有意义。

你要的是一份爱文森特所喜爱的人的名单。

由于Vincent和Marsellus都喜欢Mia,所以列表是{Vincent, Marsellus},正如您所知。

我不确定Prolog的语法,但你需要类似的东西:

jealous(X, Y):- loves(X,Z), loves(Y,Z), X \== Y.

删除X和Y引用同一个人的情况,使用Prolog中的任何符号表示“不等于”,如果它不是\==

有点难以嫉妒你自己,除非你患有某种分裂型人格障碍,如果你是,你可以说它是不是你自己实际上是在嫉妒,self在这种情况下成为一个相当流畅的概念。


经过一番思考后,第二个问题输出也有意义,并且与上述问题相关。查看输出略有重新格式化:

X = Y,         Y = vincent ;
X = vincent,   Y = marsellus ;
X = marsellus, Y = vincent ;
X = Y,         Y = marsellus ;
X = Y,         Y = pumpkin ;
X = Y,         Y = honey_bunny.

这些是嫉妒的输出,X = Y正好意味着,XY是相同的,Y被指定为每行的第二项。它可以改写为:

X = vincent,     Y = vincent ;
X = vincent,     Y = marsellus ;
X = marsellus,   Y = vincent ;
X = marsellus,   Y = marsellus ;
X = pumpkin,     Y = pumpkin ;
X = honey_bunny, Y = honey_bunny.

换句话说,与第一个问题类似,每个人都嫉妒自己,以及任何其他可能喜欢某个目标的人。

我怀疑,如果你按照建议修改嫉妒探测器,所有那些自我厌恶可能会消失,世界将会更加幸福。

嗯,除了文森特和马塞洛斯,他们显然仍然不喜欢彼此,并且都遭受了单相思的爱。世界有时可能是如此苛刻的地方: - )