[英]Trouble with finding length of list in Prolog
我无法找到列表的长度。 我知道如何处理诸如[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.
希望我的问题清楚。 谢谢!
附言 我查看了与此相关的其他文章,但找不到针对此特定问题的任何解决方案。
您的问题来自以下事实:当列表的头是非空列表时,您需要以特殊的方式处理它。 因此,例如:
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).
)
?- atom(_).
false.
然后,第二个子句无用,将始终失败。 您不应该忽略列表头的“形状”,因为它可能是列表。 此问题也出现在第三节中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.