在Prolog中统计子列表元素

4
我应该如何在Prolog中计算嵌套列表的元素数量? 我已经定义了以下谓词,它将把嵌套列表视为一个元素:
length([ ], 0).
length([H|T],N) :- length(T,M), N  is  M+1.

使用方法:

?- length([a,b,c],Out).
Out = 3 

这个可以实现,但我也想要计算嵌套元素的数量,例如:
length([a,b,[c,d,e],f],Output).
?- length([a,b,[c,d,e],f],Output).

输出结果为6


嗨,Shaggy,我在我的课程中使用Prolog,但这不是一个直接的作业问题。不过我计划在未来的项目中实现类似的东西。 - Blair
1个回答

3
len([H|T],N) :-
    len(H, LH),
    len(T, LT),
    !,
    N is LH + LT.
len([], 0):-!.
len(_, 1):-!.

测试:

?- len([a,b,[c,d,e],f],Output).
Output = 6.

2
len([],1) 成功。 - false
我想知道你能否更好地为我解释一下“cut”?我理解它的意思是只匹配H、T、LH、LT多次。我写了一些完全相似但没有使用“cut”的代码,结果出现了溢出错误。我猜测这是因为回溯等操作占用了太多内存。我的直觉正确吗? - Kyle Calica-St
我认为你是正确的。当执行剪枝时,会取消回溯。这意味着如果 len(H, LH), len(T, LT) 成功,并且未越界 - 它不会再次尝试成功它们。 - Volodymyr Gubarkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接