我有以下代码:
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]
来自哪里?我尝试将其描绘成调用堆栈,但它对这些变量的传递方式没有任何意义。
答案 0 :(得分:2)
您应该通过将呼叫或重做配对为退出或失败来读取跟踪。在这种情况下
Exit:my_length([3], 1)
与之前的
配对Call:my_length([3], _G4746)
所以这意味着my_length([3], _G4746)
的执行将变量_G4746
绑定为1。
“呼叫”是堆栈中的新记录,并且是“失败”弹出窗口。