我有以下事实:
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:=
是一个"统一"运算符,而不是像其他语言那样的"赋值"。有关详细信息,请参阅此页。