我在计算嵌套列表中的列表数时遇到了麻烦。
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.
答案 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的空列表。