Prolog中子列表元素的计数

Prolog中子列表元素的计数,prolog,Prolog,如何计算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 len([H|T],

如何计算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

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


嗨,Shaggy,我在课程中使用prolog,但这不是一个直接的家庭作业问题。不过,我计划在未来的项目中实现类似的功能。
len([],1)
成功了。不知道您是否能更好地为我解释一下这个削减?我知道它说只匹配H,T,LH,LT多次。我写了一些完全相似的东西,没有剪切,它给了我一个溢出,我假设它需要太多的内存回溯等等。我的直觉是对的吗?我想你是对的。执行剪切时取消回溯。这意味着如果
len(H,LH),len(T,LT),
成功,并且!交叉-不会再次尝试使其成功。
?- len([a,b,[c,d,e],f],Output).
Output = 6.