2014-01-14 74 views
0

我有麻煩計數嵌套列表中的列表數。計算嵌套列表中的列表數

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). 

首先,我嘗試了列表中的一個元素是原子的基本情況,因此,我應該增加一個計數器。 (另外,我嘗試刪除原子謂詞,因爲我認爲由於它,我的代碼將計算嵌套列表中元素的數量,但它仍然不起作用) 然後,如果第一個元素是列表本身,我遞歸地在它和其餘列表上添加結果。 而第三條是規定的嵌套列表中的空單數爲0

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

應該返回8而是返回12

回答

-1

你不應該自己複雜。

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

你把列表中的所有元素遞歸,直到你與值1.

+0

你的謂詞只適用於由空列表遞歸構建的列表':-('。它在OP示例中給出的列表失敗。 –

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). 

但代碼是做作,利用圖書館,我們可以把它在1步完成:

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 
0

在您的解決方案中,您忘記了例如[1,2,3] = [1,2,3| []][1,2,3] = [1| [2| [3| []]]]。因此,由於您的第一個條款,您「過度計數」。例如:

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

但還有另一個問題。在第二個子句中,如果你有嵌套其他列表的嵌套列表,則不計算它。從標題不清楚,如果這是打算或如果它是一個錯誤。