【问题标题】:Simple Prolog program - Unsure about results简单的 Prolog 程序 - 不确定结果
【发布时间】:2014-09-03 01:43:22
【问题描述】:

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

标签: prolog


【解决方案1】:

对于您的第一个问题,我可以看到输出的意义。

您要求列出与文森特爱的同一个人的人的名单。

由于 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.

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

我怀疑,如果你按照建议修改嫉妒检测器,所有的自我厌恶可能会消失,世界会变得更快乐。

嗯,除了文森特和马塞勒斯,他们显然仍然不喜欢对方,而且都在遭受单相思的折磨。世界有时会如此严酷:-)

【讨论】:

  • 谢谢。你看起来是对的。我想我必须明确指出 X 和 Y 不能相同。我以为这会根据我写的规则推断出来,但我猜不是!
  • 另外,在 SWI-Prolog 中编写它的正确方法是 X \== Y(请随意将其编辑到您上面的答案中以供其他人使用)。
  • @Decoy,谢谢你,我已经把它添加进去了。我也想我把第二个问题搞砸了,它是由同一个问题引起的。查看更新的答案。
  • 改用prolog-dif
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多