我预先道歉,因为我怀疑这是一个基本的序言问题。 我有以下知识库来定义家谱
male(james1).
male(james2).
male(charles1).
male(charles2).
male(george1).
female(catherine).
female(elizabeth).
female(sophia).
parent(charles1, james1).
parent(elizabeth, james1).
parent(charles2, charles1).
parent(catherine, charles1).
parent(james2, charles1).
parent(sophia, elizabeth).
parent(george1, sophia).
我写了以下查询
parent(charles1,james1) == parent(elizabeth,james1).
我期望 true 因为 james1 是 elizabeth 和 charles1 的父母。 两个查询都返回 true 那么为什么
==
返回 false?
Prolog 没有返回值的函数。知识库中的
male
、female
和 parent
术语代表谓词。
谓词无论成功还是失败,它们都不返回布尔值。如果你想查询两个项
A
和B
是否成功,你可以执行A, B
,只有当它们都成功时(在共享变量实例化下)才会成功。
所以这样做:
| ?- parent(charles1,james1), parent(elizabeth,james1).
yes
| ?- parent(charles1, X), parent(elizabeth, X).
X = james1
yes
对于析取,您可以使用
A; B
。
您实际上对
==
所做的是比较两项是否相等。
@Term1 == @Term2
如果 Term1 等于 Term2,则为 True。变量仅与共享变量相同。
| ?- parent(charles1,james1) == parent(elizabeth,james1).
no
| ?- parent(charles1,james1) == parent(charles1,james1).
yes
这个
parent(charles1,james1) == parent(elizabeth,james1).
返回
false
,因为它只是比较两个 prolog terms 的同一性。不会对 prolog 数据库中的 parent/2
事实进行任何查找。
Prolog 是一种“声明性语言”,而不是过程性语言。您根据谓词演算定义真理的构成...然后让 Prolog 的推理引擎对其进行评估。 听起来您想查询两个人是否是兄弟姐妹(例如,有共同的父母)。你可以这样说
siblings(A,B) :- % A and B are siblings, IFF...
parent(A,P) , % A has parent P, and
parent(B,P) , % B likewise has parent P
.
那个
siblings/2
谓词定义了一个搜索树。
当您查询时[概念上]会发生什么siblings(A,B).
Prolog 的推理引擎对搜索树进行深度优先、从左到右的遍历,依次评估每个断言,并在命中叶节点时成功。回溯后,树遍历从停止的地方继续,寻找替代解决方案,并最终在搜索树耗尽且无法找到更多解决方案时失败。