Recursion Prolog递归长度计数

Recursion Prolog递归长度计数,recursion,prolog,Recursion,Prolog,这可能是一个简单/基本的问题,但我很难掌握逻辑 我想使用递归计算列表的长度。 想象一下这个问题有一个列表[a,b,c,d] 我们有一个基本子句和一个递归子句,如下所示。 basic子句总是处理最基本的问题,在本例中是一个空列表。递归子句试图解决列表大小N-1的问题 listLength([],0). listLength([Head|Tail], Count):- listLength(Tail, PartialCount), Count is PartialCount+1.

这可能是一个简单/基本的问题,但我很难掌握逻辑

我想使用递归计算列表的长度。 想象一下这个问题有一个列表[a,b,c,d]

我们有一个基本子句和一个递归子句,如下所示。 basic子句总是处理最基本的问题,在本例中是一个空列表。递归子句试图解决列表大小N-1的问题

listLength([],0).

listLength([Head|Tail], Count):-
    listLength(Tail, PartialCount),
    Count is PartialCount+1.
现在,我的问题是:

让我们看看这段代码:

listLength(Tail, PartialCount)
程序将继续运行,直到尾部为空,然后将传递到
listLength([],0)。
其中PartialCount变为等于0。 然后,程序继续
计数为PartialCount+1。
且计数变为等于1

然后程序开始回溯到其他“未解决”的长度。 首先它以[d]开始,因为这是它试图解决的最后一个元素,现在PartialCount变成了1,这是我不理解的。 为什么PartialCount突然变为“1”,这使得Count之后等于2,因为在程序中,没有重新定义PartialCount的指示

该程序还回溯到[c,d],使部分计数等于2,依此类推

有人能解释一下这是怎么发生的吗?据我所知,PartialCount在
列表长度([],0]
示例中设置为“0”,但我不知道它的值是如何更新的?
我看到
Count
得到了更新,但不是
PartialCount

在每个递归调用中都有一个单独的
PartialCount
。这就像局部变量与全局变量一样。局部变量屏蔽了同名的全局变量。嵌套最深的局部变量屏蔽了它之外的变量

补充:以下是发生的情况:

Call [a,b,c,d]
  Call [b,c,d]
    Call [c,d]
      Call [d]
        Call []
        Success (first clause): Count = 0, no ParticalCount
      Success (2nd clause): PartialCount = 0, Count = 1
    Success (2nd clause): PartialCount = 1, Count = 2
  Success (2nd clause): PartialCount = 2, Count = 3
Success (2nd clause): PartialCount = 3, Count = 4

在每个递归调用中都有一个单独的
PartialCount
。这就像局部变量与全局变量一样。局部变量屏蔽同名的全局变量。嵌套最深的局部变量屏蔽其外部变量

补充:以下是发生的情况:

Call [a,b,c,d]
  Call [b,c,d]
    Call [c,d]
      Call [d]
        Call []
        Success (first clause): Count = 0, no ParticalCount
      Success (2nd clause): PartialCount = 0, Count = 1
    Success (2nd clause): PartialCount = 1, Count = 2
  Success (2nd clause): PartialCount = 2, Count = 3
Success (2nd clause): PartialCount = 3, Count = 4

如果我理解正确的话,当回溯时,它返回到listLength(Tail,PartialCount),对吗?还是一直返回到listLength([Head | Tail],Count)实际上根本没有回溯。代码是确定的。只有一个子句可以匹配,参数1中的空列表或非空列表。将在答案中添加解释。我确实试图理解它,但我仍然不理解“PartialCount”是如何匹配的不断更新。我没有看到任何添加到PartialCount的值。它们的键是递归调用(
listLength(Tail,PartialCount)
)。下一级(down)的
Count
值变为当前级的
PartialCount
。如果我理解正确,回溯时会返回到listLength(Tail,PartialCount),对吗?或者它会一直追溯到listLength([Head | Tail],Count)实际上根本没有回溯。代码是确定的。只有一个子句可以匹配,参数1中的空列表或非空列表。将添加解释作为答案。我真的试图理解它,但我仍然不理解“PartialCount”是如何匹配的不断更新。我看不到任何添加到PartialCount的值。它们的键是递归调用(
listLength(Tail,PartialCount)
)。下一级别(down)的
Count
值变为当前级别的
PartialCount