如何在prolog中追踪谓词?

时间:2014-03-28 17:06:48

标签: prolog

这是一个获取列表排列的谓词。有人可以向我解释如何追踪这个谓词吗?我正在使用SWI。

perm([H|T],L) :- perm(T,P) ,  insert(H,P,L).
perm([],[]).

insert(X,L,[X|L]).
insert(X,[H|T],[H|T1]) :- insert(X,T,T1).

1 个答案:

答案 0 :(得分:0)

以下是在SWI Prolog中使用trace的示例。

输入代码:

?- [user].
|: perm([H|T],L) :- perm(T,P) ,  insert(H,P,L).
|: perm([],[]).
|:
|: insert(X,L,[X|L]).
|: insert(X,[H|T],[H|T1]) :- insert(X,T,T1).
|: % user://1 compiled 0.01 sec, 6 clauses
true.

运行跟踪。按"输入"在问号?到"蠕变" (迈出一步):

?- trace.
true.

[trace]  ?- perm([1,2,3], L).
   Call: (6) perm([1, 2, 3], _G366) ? creep
   Call: (7) perm([2, 3], _G445) ? creep
   Call: (8) perm([3], _G445) ? creep
   Call: (9) perm([], _G445) ? creep
   Exit: (9) perm([], []) ? creep
   Call: (9) insert(3, [], _G446) ? creep
   Exit: (9) insert(3, [], [3]) ? creep
   Exit: (8) perm([3], [3]) ? creep
   Call: (8) insert(2, [3], _G449) ? creep
   Exit: (8) insert(2, [3], [2, 3]) ? creep
   Exit: (7) perm([2, 3], [2, 3]) ? creep
   Call: (7) insert(1, [2, 3], _G366) ? creep
   Exit: (7) insert(1, [2, 3], [1, 2, 3]) ? creep
   Exit: (6) perm([1, 2, 3], [1, 2, 3]) ? creep
L = [1, 2, 3]

正如您所料,此跟踪显示perm递归调用自身,直到它到达输入列表[]的空尾([1,2,3])。然后显示对insert的调用,这些调用遵循这些递归调用,以及这些调用中发生的参数。 _Gnnn变量是Call上未经实例化的参数,它们会在您在Exit上看到的子句中实例化。