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

时间:2017-11-19 22:46:12

标签: prolog

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 个答案:

答案 0 :(得分:6)

该查询意味着

  

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

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

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

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

?- X = any, member(2, [2, a, X]).
   X = any
;  false.                % that is no solution

any甚至是真的!

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

您可以使用memberd/2来避免许多此类裁员!

对于搜索树,member/2始终访问整个列表。一个接一个的解决方案。所以搜索树只取决于列表中元素的数量。