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



我有以下事实:

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的查询无效

问题是您试图将X两个不同的值统一起来:

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

(我使用...截断,因为这些部分与我所说的内容无关(。

换句话说,您的do_love谓词表示"X必须与loves谓词统一">,并且"X必须和loves谓词中的第一个自变量统一"。对于您设置的数据集,没有任何一个值能够同时满足这两个要求。

根据你想做什么,这可能是你想要的:

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

旁注1:谓词不会像在其他带有函数的语言中那样"返回"值。谓词中不需要, X,它们就可以工作。

旁注2:=是一个"统一"运算符,而不是像其他语言那样的"赋值"。有关详细信息,请参阅此页。

最新更新