基本的Prolog递归跟踪

时间:2015-05-08 18:08:07

标签: prolog

我有以下代码:

my_length([],0).
my_length([_|L],N) :- my_length(L,N1), N is N1 + 1.

哪个应该基本上计算列表中元素的数量。 这是跟踪:

Call:my_length([1, 2, 3], _G4652)
 Call:my_length([2, 3], _G4746)
 Call:my_length([3], _G4746)
 Call:my_length([], _G4746)
 Exit:my_length([], 0)
 Call:_G4748 is 0+1
 Exit:1 is 0+1
 Exit:my_length([3], 1)
 Call:_G4751 is 1+1
 Exit:2 is 1+1
 Exit:my_length([2, 3], 2)
 Call:_G4652 is 2+1
 Exit:3 is 2+1
 Exit:my_length([1, 2, 3], 3)
Length = 3

到此为止Exit:my_length([], 0)Call:_G4748 is 0+1我了解Prolog发现了一个事实,并且N10统一了N 1到那个值。

我不明白的是之后的内容。为什么Prolog会回到Exit:my_length([3], 1)。具体来说,[3]来自哪里?我尝试将其描绘成调用堆栈,但它对这些变量的传递方式没有任何意义。

1 个答案:

答案 0 :(得分:2)

您应该通过将呼叫或重做配对为退出或失败来读取跟踪。在这种情况下

Exit:my_length([3], 1)

与之前的

配对
Call:my_length([3], _G4746)

所以这意味着my_length([3], _G4746)的执行将变量_G4746绑定为1。

“呼叫”是堆栈中的新记录,并且是“失败”弹出窗口。