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

Prolog 为什么我的谓词不起作用,而类似的谓词起作用?,prolog,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作为事实本身。对于爱的事实,我写道: is_loved(X, Y) :- X = loved(Y), X. 正如预期的那样,返回: is_loved(

我有以下事实:

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.

我不熟悉prolog,不明白为什么会这样为什么对
的查询可以工作,而对
的查询不能工作?

问题是您试图用两个不同的值统一
X

  • X=loves(…)
  • 爱(X,…)
(我使用
截断,因为这些部分与我所说的无关)

换句话说,您的
dou_love
谓词表示“X必须与
loves
谓词统一”以及“X必须与
loves
谓词中的第一个参数统一”。对于您设置的数据集,没有一个值同时满足这两个要求

根据您的尝试,这可能是您想要的:

do_love(X, Y) :- loves(X, Y).
旁注1:谓词不会像其他语言中的函数那样“返回”值。谓词中不需要
,X
,它们就可以工作


旁注2:与其他语言一样,
=
是一个“统一”运算符,而不是一个“赋值”。请参阅了解更多信息。

问问自己,
X=loved(Y)
在Prolog中做了什么?它不同于C#或Java。想想
X=loves(X,Y)
的意思——你试图将它统一为
X=loves(loves(X,Y),Y)
,然后是
X=loves(loves(loves(loves(X,Y),Y),Y)
,等等。它永远不会得到满足。你使用的是哪个Prolog系统?如果您使用的是SWI,请尝试添加
:-set_prolog_flag(occurs_check,error)。
在prolog文件前面,重新加载,然后再次运行查询。感谢unification上的链接,这些示例使其用法更加清晰,但是,我仍然不确定如何从这里开始。您所建议的谓词,连同查询loves(X,Y),将计算为,例如X=andy,Y=julia。但是我想要的是X=loves(andy,julia),Y=julia(因此我尝试使用equals/unification操作符)。在这种情况下,您只需要使用一个单独的变量。类似于
X=loves(Z,Y)
,或者如果您不关心它的值,请使用下划线,如
X=loves(u,Y)
谢谢您,感谢您的帮助。