2014-01-14 1 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

Ваш предикат работает только для списков, рекурсивно построенных из пустых списков ':-('. –

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. 

Но есть еще одна проблема. В своем втором предложении, если у вас есть вложенный список, который содержит другие списки, вы не считаете его. Не ясно из названия, если это предназначено или если это ошибка.