Prolog 比较返回 False

问题描述 投票:0回答:2

我预先道歉,因为我怀疑这是一个基本的序言问题。 我有以下知识库来定义家谱

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 comparison equality
2个回答
3
投票

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

1
投票

这个

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 的推理引擎对搜索树进行深度优先、从左到右的遍历,依次评估每个断言,并在命中叶节点时成功。回溯后,树遍历从停止的地方继续,寻找替代解决方案,并最终在搜索树耗尽且无法找到更多解决方案时失败。

© www.soinside.com 2019 - 2024. All rights reserved.