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(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/

相关文章:

prolog - 如何在 Prolog 中找到集合的基数?

prolog - 为什么 `f(a)=a` 失败但 `f(X)=X` 在序言中成功?

performance - 是否有库/技术来收集 Prolog 中最佳子句排序的统计信息?

prolog - 列表不等式约束

string - 如何在序言中将 (0,0) 转换为 [0,0]?

Prolog - 证明树错过了可能性

performance - 在Prolog中更快地执行口头算术

types - swi-prolog 中的 Prolog 类型定义

Prolog 扁平化列表

prolog - Prolog 谓词中的随机优先级