Prolog如何回应以下调查?为查询绘制搜索树。
?- member(2, [2, a, X]).
首先,这个调查是什么意思?
让我们采取另一个更明确的例子:
?- member(vincent,[yolanda,trudy,vincent,jules]).
Prolog将检查列表中是否有vincent
。它会逐个检查,因此会先比较vincent
和yolanda
。没有匹配,现在递归规则又转到第二个子句。现在它看起来像是:
?- member(vincent,[trudy,vincent,jules]).
vincent
和trudy
,不匹配。递归规则:
?- member(vincent,[vincent,jules]).
vincent
和vincent
匹配!所以请返回true
。
回到我们的例子。 Prolog将立即返回true
,因为2
在列表中(即其头部)。
但搜索树怎么样?我真的不知道,我害怕他们会让我在测试中画一个搜索树...
答案 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
始终访问整个列表。一个接一个的解决方案。所以搜索树只取决于列表中元素的数量。