Оба раствора размещены @dasblinkenlight и исходный код в вопросе может быть хвостовой рекурсией с помощью аккумуляторов, которые позволили бы работать в постоянном пространстве:
my_length(List, Length) :-
my_length(List, 0, Length).
my_length([], Length, Length).
my_length([_| Tail], Length0, Length) :-
Length1 is Length0 + 1,
my_length(Tail, Length1, Length).
my_length_lol(Lists, TotalLength) :-
my_length_lol(Lists, 0, TotalLength).
my_length_lol([List| Lists], TotalLength0, TotalLength) :-
my_length(List, Length),
TotalLength1 is TotalLength0 + Length,
my_length_lol(Lists, TotalLength1, TotalLength).
Просто сделайте другой предикат, аналогично этому, но вместо добавления 1 добавьте результат my_length. –
Если вы можете использовать существующие предикаты Prolog (если они находятся в вашей библиотеке Prolog), вы также можете просто сделать my_length (L, N): - flatten (L, F), length (F, N) .' – lurker