Prolog - 追踪规则

时间:2014-11-30 16:54:20

标签: prolog

考虑以下规则:

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 ]

任何人都可以帮我跟踪它是如何做到的吗?我不确定它首先是什么样的例子,我确信我可以从那里弄明白。

1 个答案:

答案 0 :(得分:1)

首先,我想,whatexample的别名,你的规则看起来很像:

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