Я пытаюсь определить Prolog DCG для набора строк 0^N 1^M 2^N + M длины 2N + 2M для N, M> = 0 с использованием дополнительных аргументов. Примером правильной строки будет «011222», но не «012».Определение Prolog DCG с дополнительными аргументами
Для создания этого DCG-кода я использовал следующий код.
s --> a(N), b(M), c(N), c(M).
a(0) --> [].
a(succ(X)) --> [0], a(X).
b(0) --> [].
b(succ(X)) --> [1], b(X).
c(0) --> [].
c(succ(X)) --> [2], c(X).
Когда я выполнить запрос
s([0,1,1,2,2,2], []).
Пролог возвращает значение ИСТИНА, как и ожидалось.
Однако, когда я бегу
s(X, []).
Пролог возвращает следующее:
X = []
X = [1,2]
X = [1,1,2,2]
X = [1,1,1,2,2,2]
Они не являются действительными строками. Я думаю, это может быть связано с тем, что N и M декрементируются предикатом c до того, как пролог выполнит предикаты a и b. Это так? Как это можно решить?
Edit: Я попытался изменения производства ей на это:
s --> a(N), b(M), c(NplusM), {NplusM is N + M}.
но выдает ошибку при выполнении запросов.
Я попытался это, но он не работает. Prolog дает ошибку, что succ не был достаточно инстанцирован. Как это обойти? – Darkphenom
Если вы используете clpfd здесь, используйте также дополнительные ограничения, такие как 'X #> = 0' в рекурсивных предложениях. Они могут быть избыточными в некоторых режимах, но обеспечить прекращение в других! – repeat
Ваше решение имеет плохие свойства завершения. Например. 'phrase (s, [2 | _]).' loops – false