我有以下事实:
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 作为事实本身。对于喜爱
的事实,我写道:
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.
我是序言新手,不太明白为什么会出现这种情况。 为什么 is_loved
查询有效,而 do_love
查询无效?
最佳答案
问题是您试图将 X
与两个不同的值统一:
X = 爱(...)
和喜欢(X,...)
(我使用 ...
进行截断,因为这些部分与我所说的无关)。
换句话说,您的 do_love
谓词是说“X 必须与 loves
谓词统一”并且“X 必须与loves
谓词中的第一个参数”。根据您设置的数据集,没有任何一个值可以同时满足这两个要求。
根据您想要做什么,这可能就是您想要的:
do_love(X, Y) :- loves(X, Y).
旁注 1: 谓词不会像其他带有函数的语言那样“返回”值。您不需要在谓词中使用 , X
即可让它们发挥作用。
旁注 2: =
是一个“统一”运算符,而不是像其他语言那样的“赋值”运算符。请参阅this page了解更多信息。
关于prolog - 为什么我的谓词不起作用,而类似的谓词却起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60825285/