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.
非常感谢任何帮助。谢谢!
答案 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
正好意味着,X
和Y
是相同的,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.
换句话说,与第一个问题类似,每个人都嫉妒自己,以及任何其他可能喜欢某个目标的人。
我怀疑,如果你按照建议修改嫉妒探测器,所有那些自我厌恶可能会消失,世界将会更加幸福。
嗯,除了文森特和马塞洛斯,他们显然仍然不喜欢彼此,并且都遭受了单相思的爱。世界有时可能是如此苛刻的地方: - )