计算嵌套列表中的列表数

时间:2014-01-14 08:17:06

标签: prolog nested-lists

我在计算嵌套列表中的列表数时遇到了麻烦。

count_lists([H|T],R):-
   atomic(H),!,
   count_lists(T,NR),
   R is NR+1.
count_lists([[H|T]|Rest],R):-
   !,
   count_lists([H|T],R1),
   count_lists(Rest,R2),
   R is R1+R2.
count_lists([],0).

首先,我尝试基本情况,其中列表中的元素是原子的,因此,我应该将计数器增加1。 (另外,我尝试删除原子谓词因为我认为因为它,我的代码将计算嵌套列表中的元素数量,但它仍然不起作用) 然后,如果第一个元素本身就是一个列表,我会在它上面递归,然后在剩下的列表上添加结果。 第三个子句指出空列表中嵌套列表的数量为0。

?count_lists([[1,5,2,4],[1,[4,2],[5]],[4,[7]],8,[11]],R).

应返回8,而是返回12.

4 个答案:

答案 0 :(得分:0)

您需要将列表与其他元素区分开来,即

count_lists(E,R):-
    is_list(E),!,count_elems(E,N),
    R is N+1.
count_lists(_,0).

count_elems([H|T],R):-
    count_lists(H,Hc),
    count_elems(T,Tc),
    R is Hc+Tc.
count_elems([],0).

但代码是设计的,使用库我们可以在一步完成它:

count_lists(E, R):-
    maplist(count_lists, E, Cs) -> sum_list(Cs, S), R is S+1 ; R = 0.

代码只能理解WRT maplist / N行为

?- maplist(_,a).
false.

?- maplist(_,[]).
true.

?- maplist(_,[1]).
ERROR: apply:maplist_/2: Arguments are not sufficiently instantiated

答案 1 :(得分:0)

在您的解决方案中,您忘记了[1,2,3] = [1,2,3| []][1,2,3] = [1| [2| [3| []]]]。因此,由于您的第一个条款,您已经过度计算了#34;例如:

?- count_lists([1,2,3], N).
N = 3.

但还有另一个问题。在您的第二个条款中,如果您拥有嵌套其他列表的嵌套列表,则无法计算它。如果标题不符合标题或者它是否是错误,则不清楚标题。

答案 2 :(得分:0)

我知道距您提出此请求已经有一段时间了,但这是我认为您正在寻找的答案:

count_lists([],1).
count_lists([H|T],Rez):-atomic(H),!,count_lists(T,Part),Rez is Part.
count_lists([H|T],Rez):-count_lists(H,Part1),count_lists(T,Part2),Rez is Part1+Part2.

这样,您只计算列表数,而不计算其中的元素数。

答案 3 :(得分:-1)

你自己不应该复杂。

count([],1).
count([L1|L2],Rez):- count(L1,Rez1),count(L2,Rez2),Rez is Rez1+Rez2.

以递归方式取出列表中的所有元素,直到省略了值为1的空列表。