首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog比较返回False

Prolog比较返回False
EN

Stack Overflow用户
提问于 2021-09-27 03:59:02
回答 2查看 123关注 0票数 0

我预先道歉,因为我怀疑这是一个基本的prolog问题。我有下面的知识库来定义一个家族树

代码语言:javascript
运行
复制
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).

我编写了以下查询

代码语言:javascript
运行
复制
parent(charles1,james1) == parent(elizabeth,james1).

我认为这是真的,因为james1是伊丽莎白和charles1的父母。这两个查询都返回true,那么为什么==返回false?

EN

回答 2

Stack Overflow用户

发布于 2021-09-27 05:37:49

Prolog没有返回值的函数。知识库中的malefemaleparent术语表示谓词。

谓词成功或失败,它们不返回布尔值。如果您想要查询AB两个术语是否成功,则只能在它们成功时才能执行A, B (在共享变量实例化下)。

也是如此:

代码语言:javascript
运行
复制
| ?- parent(charles1,james1), parent(elizabeth,james1).

yes

| ?- parent(charles1, X), parent(elizabeth, X).

X = james1

yes

对于分离,您可以使用A; B

您对==的实际操作是比较这两个项是否相等。

@Term2 1 == @Term2

如果Term1等同于Term2,则为True。变量仅与共享变量相同。

代码语言:javascript
运行
复制
| ?- parent(charles1,james1) == parent(elizabeth,james1).
no

| ?- parent(charles1,james1) == parent(charles1,james1).
yes
票数 3
EN

Stack Overflow用户

发布于 2021-10-01 19:19:16

代码语言:javascript
运行
复制
parent(charles1,james1) == parent(elizabeth,james1).

返回false,因为它只是比较标识的两个prolog术语。不对prolog数据库中的parent/2事实进行查找。

Prolog是一种声明性语言,而不是一种过程语言。你用谓词演算来定义真理.然后让Prolog的推理机对其进行评估。

听起来你想问两个人是否是兄弟姐妹(例如,有一个共同的父母)。你可以这样说

代码语言:javascript
运行
复制
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谓词定义了一个搜索树。

当您查询时,会发生什么?

代码语言:javascript
运行
复制
siblings(A,B).

Prolog的推理引擎对搜索树进行深度优先,从左到右遍历,依次计算每个断言,并在一个叶节点被击中时成功。回溯后,树遍历继续从它停止的地方,寻找替代解决方案,并最终失败时,搜索树已用尽,没有更多的解决方案被找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69341051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档