考虑以下规则:
example(A, [A|As], As).
example(A, [B|Bs], [B|Cs]) :- what(A, Bs, Cs).
和查询:
example(c, [a, b, c, a], X).
结果:
X = [ a, b, a ]
任何人都可以帮我跟踪它是如何做到的吗?我不确定它首先是什么样的例子,我确信我可以从那里弄明白。
答案 0 :(得分:1)
首先,我想,what
是example
的别名,你的规则看起来很像:
example(A, [A|As], As).
example(A, [B|Bs], [B|Cs]) :- example(A, Bs, Cs).
然后,情况就是这样:
?- example(c, [a, b, c, a], X).
现在我们寻找匹配条款:
example(c, [a, b, c, a], X) = example(A, [A|As], As).
这个是 false 。所以我们尝试下一个:
example(c, [a, b, c, a], X) = example(A, [B|Bs], [B|Cs]).
这个有效,我们得到结果:
X = [a|Cs],
A = c,
B = a,
Bs = [b, c, a].
所以我们得到:
example(c, [a, b, c, a], [a|Cs]) = example(c, [a|[b, c, a]], [a|Cs]).
从example/3
的第二条规则我们知道:
example(c, [a|[b, c, a]], [a|Cs]) :- example(c, [b, c, a], Cs).
所以我们再次完成这个过程,我们得到:
example(c, [b, c, a], Cs) = example(A, [B|Bs], [B|Cs]).
结果是:
Cs = [b|Cs],
A = c,
B = b,
Bs = [c, a]
这意味着:
example(c, [b, c, a], [b|Cs]) = example(c, [b|[c, a]], [b|Cs]).
再次来自第二条规则:
example(c, [b|[c, a]], [b|Cs]) :- example(c, [c, a], Cs).
所以我们搜索另一场比赛 - 这次是第一条规则:
example(c, [c, a], Cs) = example(A, [A|As], As).
现在我们有:
Cs = As,
As = [a],
A = c.
现在我们可以返回并转移Cs的值。这就是我们现在所拥有的:
Cs = As = [a],
我们将此移至之前的结果:
OldCs = [b|Cs] = [b,a]
以前的结果:
X = [a|OldCs] = [a,b,a].