Prolog如何回应以下询问?为查询绘制搜索树.
?- member(2, [2, a, X]).
Run Code Online (Sandbox Code Playgroud)
首先,这个调查意味着什么?
让我们再看一个更清晰的例子:
?- member(vincent,[yolanda,trudy,vincent,jules]).
Run Code Online (Sandbox Code Playgroud)
Prolog将检查是否vincent在列表中.它逐个检查,因此它将首先进行比较vincent和yolanda.没有匹配,现在递归规则又转到第二个子句.现在它看起来像这样:
?- member(vincent,[trudy,vincent,jules]).
Run Code Online (Sandbox Code Playgroud)
vincent并且trudy,没有匹配.递归规则:
?- member(vincent,[vincent,jules]).
Run Code Online (Sandbox Code Playgroud)
vincent并且vincent,匹配!所以回归true.
回到我们的例子.序言将立即返回true如2在列表(即它的头).
但是搜索树怎么样?我真的不知道,我很害怕他们会让我在测试中画一个搜索树...
那个查询意味着
对于哪个
X是列表中的2个元素[2, a, X]?
那么,让我们看看Prolog如何回答这个问题:
?- member(2, [2, a, X]).
true
; X = 2.
Run Code Online (Sandbox Code Playgroud)
我们得到的第一个答案true是空答案替换.这意味着2是任何 一个列表的成员X.真的没有!这可能是真的吗?
?- X = any, member(2, [2, a, X]).
X = any
; false. % that is no solution
Run Code Online (Sandbox Code Playgroud)
它甚至是真的any!
现在回到原始查询:第二个答案是一个简单的解决方案X = 2.所以Prolog告诉我们,2也可能是这样一个元素.唉,我们已经知道,因为我们知道这适用于任何一个任期.因此,第二个答案是多余的.
你可以通过使用memberd/2来避免许多这样的冗余!
对于搜索树,member/2始终访问整个列表.一个接一个的解决方案.因此搜索树仅取决于列表中的元素数量.
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |