Перевод на DCG Semicontext не работает - следите за 2
В продолжение этого вопроса, который ставит проблему
Возвращает количество элементов в списке, но если два одинаковых элемента находятся рядом друг с другом, не увеличивайте количество.
Этот код наиболее близок к решению с помощью DCG и полуконтекста.
lookahead(C),[C] -->
[C].
% empty list
% No lookahead needed because last item in list.
count_dcg(N,N) --> [].
% single item in list
% No lookahead needed because only one in list.
count_dcg(N0,N) -->
[_],
\+ [_],
{ N is N0 + 1 }.
% Lookahead needed because two items in list and
% only want to remove first item.
count_dcg(N0,N) -->
[C1],
lookahead(C2),
{ C1 == C2 },
count_dcg(N0,N).
% Lookahead needed because two items in list and
% only want to remove first item.
count_dcg(N0,N) -->
[C1],
lookahead(C2),
{
C1 \== C2,
N1 is N0 + 1
},
count_dcg(N1,N).
count(L,N) :-
DCG = count_dcg(0,N),
phrase(DCG,L).
Хотелось бы узнать, возможна ли вариация с полутекстовым заголовком главы, например
count_dcg(N0,N),[C] -->
[C,C],
count_dcg(N0,N).
Если возможно, тогда нужен рабочий пример кода, если не возможно, то желательно пояснение.