目前在Prolog中玩...我在查看计数列表规则时遇到了麻烦。我无法在任何地方找到一个好的解释。有人可以在每次递归时给我一个细分吗?
count(0, []).
count(Count, [Head|Tail]) :-
count(TailCount, Tail),
Count is TailCount + 1.
有一个地方说它是递归的(这对我来说是有道理的)而另一个地方则表示它不是。
答案 0 :(得分:5)
它是递归的过程,但不是 tail 递归。编写尾递归过程是一种优化,它允许系统将递归转换为迭代,避免无用的堆栈用于确定性计算(就像我们所说的那样)。 在这种情况下(BTW它与内置长度/ 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).
答案 1 :(得分:1)
推理规则的定义是递归的。 该程序试图计算列表中元素的数量。
count(0, []).
这是一个公理,事实,这是事实,因为你这么说。在这里,您要说明每个空列表的计数为零。
count(Count, [Head|Tail]) :-
count(TailCount, Tail),
Count is TailCount + 1.
这是一个推理规则,如果右边部分为真,则规定:-
的左边部分为真。此推理规则还使用模式匹配,wicth匹配非空列表([Head|Tail]
)。
具体来说,计数规则表示非空列表的Count
变量是列表的Tail
部分的计数加1(加1用于计算列表的Head元素)