为什么我的谓词不起作用,而类似的谓词却起作用?

时间:2020-03-24 05:09:26

标签: prolog

我有以下事实:

loves(andy, julia).
loves(andrew, maria).
loves(bob, sofia).
loved(juila).
loved(maria).
loved(sofia).

我想要两个谓词:

do_love(X, Y) :- ...
is_loved(X, Y) :- ...

,其返回Y作为该人的姓名,并返回X作为事实本身。。出于loved的事实,我写道:

is_loved(X, Y) :- X = loved(Y), X.

预期会返回:

is_loved(X,Y).
X = loved(juila),
Y = juila ;
X = loved(maria),
Y = maria ;
X = loved(sofia),
Y = sofia.

但是,当我以类似方式为loves事实写谓词时:

do_love(X, Y) :- X = loves(X, Y), X.

它为查询返回false:

do_love(X,Y).
false.

我是prolog的新手,真的看不出来为什么会这样。 为什么对is_loved的查询不起作用,而对do_love的查询却不起作用?

1 个答案:

答案 0 :(得分:5)

问题是您要尝试将<{> 1 和两个不同的值统一用于X

  • X = loves(...)
  • loves(X, ...)

(我使用...截断,因为这些部分与我的意思无关)。

换句话说,您的do_love谓词说“ X必须与loves谓词结合” ,而且“ X必须与{{ 1}}谓词”。使用已设置的数据集,没有任何一个值可以同时满足这两个要求。

取决于您要执行的操作,这可能是您想要的:

loves

侧注1:谓词不会“返回”值,就像它们在其他具有功能的语言中一样。您不需要谓词中的do_love(X, Y) :- loves(X, Y). 即可使它们起作用。

旁注2: , X是一个“统一”运算符,而不是像其他语言一样的“赋值”。有关更多信息,请参见this page