【发布时间】:2020-03-24 05:09:26
【问题描述】:
我有以下事实:
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 = loved(Y)在 Prolog 中做了什么?它不同于 C# 或 Java。 -
想想
X = loves(X, Y)是什么意思——你试图将它统一为X = loves(loves(X, Y), Y),然后是X = loves(loves(loves(loves(X, Y), Y), Y), Y)等等。它永远不会满足。 -
您使用的是哪个 Prolog 系统?如果您使用的是 SWI,请尝试在 Prolog 文件前添加
:- set_prolog_flag(occurs_check, error).,重新加载并再次运行查询。
标签: prolog