Prolog计数的深层次解释

Prolog计数的深层次解释,prolog,Prolog,目前正在Prolog中玩。。。我在摸索计数表规则时遇到了困难。我到处都找不到好的解释。有人能在每次递归时给我一个分解吗 count(0, []). count(Count, [Head|Tail]) :- count(TailCount, Tail), Count is TailCount + 1. 一个地方说它是递归的(这对我来说很有意义),另一个地方说它不是递归的。推理规则的定义是递归的。 此程序尝试计算列表中元素的数量 count(0,[])。这是一条公理,一个事实,因为

目前正在Prolog中玩。。。我在摸索计数表规则时遇到了困难。我到处都找不到好的解释。有人能在每次递归时给我一个分解吗

count(0, []).
count(Count, [Head|Tail]) :-
    count(TailCount, Tail),
    Count is TailCount + 1.

一个地方说它是递归的(这对我来说很有意义),另一个地方说它不是递归的。

推理规则的定义是递归的。 此程序尝试计算列表中元素的数量

count(0,[])。
这是一条公理,一个事实,因为你这么说,这是事实。在这里,您声明每个空列表的计数为零

count(count,[Head | Tail]):-
计数(TailCount,Tail),
计数是TailCount+1。

这是一条推理规则,即如果右侧部分为真,则表明
:-
的左侧部分为真。此推理规则还使用模式匹配,它匹配非空列表(
[Head | Tail]
)。
具体地说,计数规则表示非空列表的
count
变量是列表的
Tail
部分的计数加1(加1用于计算列表的Head元素)。

该过程是递归的,但不是Tail递归的。编写尾部递归过程是一种优化,它允许系统将递归转换为迭代,避免无用的堆栈用于确定性计算(就像我们所说的那样)。 在这种情况下(顺便说一句,它与内置长度/2相同,只是交换了参数),我们可以使用累加器,并以这种方式重写过程:

count(C, L) :- count(0, C, L).

count(Total, Total, []).
count(SoFar, Count, [_Head|Tail]) :-
    Count1 is SoFar + 1,
    count(Count1, Count, Tail).
一些较旧的系统需要在递归调用之前进行剪切,以使优化有效:

    ...,
    !, count(Count1, Count, Tail).

我知道TailCount是未知的,Prolog如何增加它以使它满足规则的两个条件?它类似于惰性计算还是在每个递归中递增?TailCount与Count是相同的未知变量,只是它应用于每个递归中的较小列表。最后,它到达一个结果已知的空列表(零),然后使用已知的TailConut值加1进行回溯以满足推理规则。尝试发出
跟踪。
,然后
计数(N[1,2,3])。
以查看谓词的作用。