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

rob*_*ind 3 prolog

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在列表中.它逐个检查,因此它将首先进行比较vincentyolanda.没有匹配,现在递归规则又转到第二个子句.现在它看起来像这样:

?-  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.


回到我们的例子.序言将立即返回true2在列表(即它的头).

但是搜索树怎么样?我真的不知道,我很害怕他们会让我在测试中画一个搜索树...

fal*_*lse 6

那个查询意味着

对于哪个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始终访问整个列表.一个接一个的解决方案.因此搜索树仅取决于列表中的元素数量.