Prolog:解释Prolog如何响应查询,并为其绘制搜索树?- member(2,[2,a,X])

3
Prolog将如何回应以下查询?同时绘制一个搜索树来表示此查询。
?- member(2, [2, a, X]).

首先,这个问题是什么意思?

让我们来看一个更清晰的例子:

?-  member(vincent,[yolanda,trudy,vincent,jules]).

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

?-  member(vincent,[trudy,vincent,jules]).

vincenttrudy,不匹配。递归规则:

?-  member(vincent,[vincent,jules]).

vincentvincent匹配!所以返回true


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

但搜索树会是什么样子呢?我真的不知道,而且我担心他们会要求我在测试中画出一个搜索树...

1个回答

5

这个查询的意思是

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

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

?- member(2, [2, a, X]).
   true
;  X = 2.

我们得到的第一个答案是true,意思是空的答案替换。这意味着2是那个列表中任何X的成员,真的是任何X!这可能是真的吗?
?- X = any, member(2, [2, a, X]).
   X = any
;  false.                % that is no solution

这个结论同样适用于任何元素!

现在回到原始查询:第二个答案是一个简单的解决方案X = 2。因此,Prolog告诉我们也许2也是这样的一个元素。不幸的是,我们已经知道了这一点,因为我们知道这对于任何项都成立。因此也包括2。因此,第二个答案是冗余的

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


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接