Перевод на DCG Semicontext не работает - следите за 2 - PullRequest
0 голосов
/ 05 марта 2019

В качестве ответа на этот вопрос , который ставит проблему

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

Этот код наиболее близок к решению этого вопроса с помощью 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).

Если возможно, тогда нужен рабочий пример кода, если не возможно, то требуется объяснение.

...