Процедура рекурсивная, но не хвост рекурсивная. Написание хвостовых рекурсивных процедур - это оптимизация, которая позволяет системе преобразовывать рекурсию в итерацию, избегая бесполезного использования стека для вычислений детерминистики (как та, о которой мы говорим).
В этом случае (кстати, это то же самое, что встроенная длина / 2, только с замененными аргументами), мы можем использовать аккумулятор и переписать процедуру следующим образом:
count(C, L) :- count(0, C, L).
count(Total, Total, []).
count(SoFar, Count, [_Head|Tail]) :-
Count1 is SoFar + 1,
count(Count1, Count, Tail).
Некоторым системам более старых версий требовалось отключение перед рекурсивным вызовом, чтобы сделать оптимизацию эффективной:
...,
!, count(Count1, Count, Tail).