我预先道歉,因为我怀疑这是一个基本的prolog问题。我有下面的知识库来定义一个家族树
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).
我认为这是真的,因为james1是伊丽莎白和charles1的父母。这两个查询都返回true,那么为什么==
返回false?
发布于 2021-09-27 05:37:49
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
。
您对==
的实际操作是比较这两个项是否相等。
@Term2 1 == @Term2
如果Term1等同于Term2,则为True。变量仅与共享变量相同。
| ?- parent(charles1,james1) == parent(elizabeth,james1).
no
| ?- parent(charles1,james1) == parent(charles1,james1).
yes
发布于 2021-10-01 19:19:16
这
parent(charles1,james1) == parent(elizabeth,james1).
返回false
,因为它只是比较标识的两个prolog术语。不对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的推理引擎对搜索树进行深度优先,从左到右遍历,依次计算每个断言,并在一个叶节点被击中时成功。回溯后,树遍历继续从它停止的地方,寻找替代解决方案,并最终失败时,搜索树已用尽,没有更多的解决方案被找到。
https://stackoverflow.com/questions/69341051
复制相似问题