2015-05-08 70 views
-1

我有以下代码:基本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的发现了一个事实,这统一N10N是为了1添加到该值。

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

+0

这些变量*已*在堆栈中。 Prolog不会在* exit *上展开堆栈。它在*重做*或*失败*。 – CapelliC

回答

2

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

Exit:my_length([3], 1) 

配对与前

Call:my_length([3], _G4746) 

因此,这意味着my_length([3], _G4746)执行绑定变量_G4746为1

通话中堆栈的新纪录和失败弹出。