我无法找到列表的长度。我知道如何处理诸如[a,b,c,d]
或[a,b,[],d]
或甚至[a,[[[]]],c,[]]
之类的列表,每个列表的长度为4.我遇到的问题是试图找出长度像[a,[b,c],d]
这样的案例中的列表。有4个元素,但是当我运行我的代码时,它将打印3.它将内部列表[b,c]
视为单个元素,我不确定如何单独计算它们。
这就是我所拥有的:
% this is the base case
mylen([],0).
% case where element is a single atom like a or []
mylen([_|T],Len) :- atom(_),Len is Len1+1.
% case that *should* deal with sublists [b,c]
mylen([[_|TH]|T],Len) :- mylen(TH,Len1), Len is Len1+1.
% general case
mylen([_|T],Len):- mylen(T,Len1),Len is Len1+1.
我希望我的问题很明确。谢谢!
聚苯乙烯。我查看了有关此问题的其他帖子,但未找到解决此特定问题的任何方法。
答案 0 :(得分:2)
你的问题来自这样一个事实:当你是一个非空的列表时,你需要以特殊的方式处理列表的头部。例如:
strangelen([], 0).
strangelen([H|T], Len) :-
( H = [_|_] % head is a non-empty list
-> strangelen(H, LenH)
; LenH = 1
),
strangelen(T, LenT),
Len is LenH + LenT.
然后:
?- strangelen([a,b,c,d], Len).
Len = 4.
?- strangelen([a,b,[],d], Len).
Len = 4.
?- strangelen([a,[[[]]],c,[]], Len).
Len = 4.
?- strangelen([a,[b,c],d], Len).
Len = 4.
?- strangelen([[]], Len).
Len = 1.
?- strangelen([[[b,c]]], Len).
Len = 2.
此解决方案不适用于不是正确列表的第一个参数(尝试?- strangelen(List, Len).
)
答案 1 :(得分:1)
?- atom(_).
false.
然后第二个条款没用,总会失败。你不应该忽视这种形状。列表'头,因为它可能是一个列表。这个问题也出现在第三个条款中。