我有以下事实:
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
的查询却不起作用?
答案 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。