-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的发现了一个事实,这统一N1
与0
和N
是为了1添加到该值。
我不明白的是之后的内容。为什么Prolog会回到Exit:my_length([3], 1)
。具体来说,[3]
从哪里来?我试图把它描绘成像调用堆栈一样,但对于如何传递这些变量没有任何意义。
这些变量*已*在堆栈中。 Prolog不会在* exit *上展开堆栈。它在*重做*或*失败*。 – CapelliC