Например:
count_blocks([[b,c,f],[a,d,g],[h,e]],C).
C=[3,3,2]
Я знаю, что могу найти длину списка с помощью:
len([], LenResult):-
LenResult is 0.
len([X|Y], LenResult):-
len(Y, L),
LenResult is L + 1.
но не уверен, как рассчитать длину списка в списке. Длина внешнего списка всегда будет равна 3 (с возможностью пустых внутренних списков).





Вы должны выполнить сопоставление с длиной. Вы можете составить карту с помощью maplist/3, поэтому вы можете работать с:
count_blocks(L, R) :-
maplist(length, L, R).Если вы хотите написать все предикаты самостоятельно, вы можете сделать это так:
len([], 0).
len([_|Y], LenResult):-
len(Y, L),
LenResult is L + 1.
count_blocks([],[]).
count_blocks([H|T],[N|L]):-
len(H,N),
count_blocks(T,L).
?- count_blocks([[b,c,f],[a,d,g],[h,e]],C).
C = [3, 3, 2].
count_blocks/2 работает по тому же принципу, что и len/2. Пока в списке ввода есть хотя бы один подсписок H, вычислите длину N подсписка H и поместите его в качестве головного элемента возвращаемого списка L. Вы получите L, задав тот же запрос для остального списка: count_blocks(T,L). Если список ввода пуст, список длины подсписка также пуст: count_blocks([],[]).
Это был идеальный ответ. Спасибо!
@Joe ^^ вы можете принять ответ, щелкнув серую галочку слева от ответа под кнопкой «за» ^^
Попробуйте проверить эту ссылку stackoverflow.com/questions/29002906/…