首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:说明Prolog如何响应查询并为其绘制搜索树?-成员(2,[2,a,X])

Prolog:说明Prolog如何响应查询并为其绘制搜索树?-成员(2,[2,a,X])
EN

Stack Overflow用户
提问于 2017-11-19 22:46:12
回答 1查看 100关注 0票数 3

Prolog将如何回应以下询问?也为查询绘制一个搜索树。

代码语言:javascript
复制
?- member(2, [2, a, X]).

所以首先,这个调查是什么意思?

让我们再举一个更清楚的例子:

代码语言:javascript
复制
?-  member(vincent,[yolanda,trudy,vincent,jules]).

Prolog将检查vincent是否在列表中。它逐个检查,因此它将首先比较vincentyolanda。没有匹配,现在递归规则,也就是第二个子句。现在看起来是这样:

代码语言:javascript
复制
?-  member(vincent,[trudy,vincent,jules]).

vincenttrudy不匹配。递归规则:

代码语言:javascript
复制
?-  member(vincent,[vincent,jules]).

vincentvincent,匹配!所以返回true

回到我们的例子。Prolog将立即返回true,因为2在列表中(即它的头)。

但是搜索树会是什么样的呢?我真的不知道,我害怕他们会让我在测试中画一棵搜索树.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-19 23:30:52

这个查询意味着

哪个X是列表[2, a, X]的元素2?

那么,让我们看看Prolog是如何回答这个问题的:

代码语言:javascript
复制
?- member(2, [2, a, X]).
   true
;  X = 2.

我们得到的第一个答案true,它是空答案替换。这意味着2是任何X的列表中的一个成员。真的有!这会是真的吗?

代码语言:javascript
复制
?- X = any, member(2, [2, a, X]).
   X = any
;  false.                % that is no solution

甚至对any来说也是如此!

现在回到原来的查询:第二个答案是一个简单的解决方案X = 2。所以Prolog告诉我们,2也可能是这样的一个元素。唉,我们已经知道这一点,因为我们知道这适用于任何一个任期。因此,第二个答案是冗余

您可以通过使用memberd/2来避免许多这样的冗余!

至于搜索树,member/2总是访问整个列表。一个接一个的解决方案。因此,搜索树只取决于列表中的元素数。

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

https://stackoverflow.com/questions/47382835

复制
相关文章

相似问题

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