在Prolog找到列表长度的麻烦

时间:2015-03-12 06:06:01

标签: list 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.

我希望我的问题很明确。谢谢!

聚苯乙烯。我查看了有关此问题的其他帖子,但未找到解决此特定问题的任何方法。

2 个答案:

答案 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.

然后第二个条款没用,总会失败。你不应该忽视这种形状。列表'头,因为它可能是一个列表。这个问题也出现在第三个条款中。