繁体   English   中英

在Prolog中查找列表长度有麻烦

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM