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在列表中(即它的头)。
但是搜索树会是什么样的呢?我真的不知道,我害怕他们会让我在测试中画一棵搜索树.
发布于 2017-11-19 23:30:52
这个查询意味着
哪个
X是列表[2, a, X]的元素2?
那么,让我们看看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总是访问整个列表。一个接一个的解决方案。因此,搜索树只取决于列表中的元素数。
https://stackoverflow.com/questions/47382835
复制相似问题