Так как же доказать двусмысленность? В Прологе это легко возможно для конкретных предложений:
| ?- length(Xs,N), bagof(t,phrase(s,Xs),[_,_|_]).
N = 3
Xs = [0,0,1] ? ;
N = 4
Xs = [0,0,0,1] ? ;
N = 5
Xs = [0,0,0,0,1] ? ;
N = 5
Xs = [0,0,0,1,1] ? ;
N = 6
Xs = [0,0,0,0,0,1] ?
Это доказывает, что существует неоднозначность для конкретной длины, и дает соответствующий контрпример.
Однако есть одно предостережение, которое может проявиться только через некоторое время: bagof/3
нужно каким-то образом хранить весь набор решений. Поэтому, если этот набор очень велик, bagof/3
может переполниться. Следующий запрос позволяет избежать этой ошибки за счет получения избыточных решений:
| ?- length(Xs,N), phrase(s,Xs), bagof(t,phrase(s,Xs),[_,_|_]).
N = 3
Xs = [0,0,1] ? ;
N = 3
Xs = [0,0,1] ? ;
N = 4
Xs = [0,0,0,1] ? ;
N = 4
Xs = [0,0,0,1] ? ;
N = 4
Xs = [0,0,0,1] ? ;
N = 5
Xs = [0,0,0,1,1] ...
с вашей улучшенной грамматикой циклы запросов. Это означает, что система не может найти контрпример. По крайней мере, не с длиной ниже 1000, что я и тестировал.
Некоторые общие замечания о написании DCG на Прологе:
Попробуйте поставить рекурсивный регистр последним, это может сэкономить место.
Возможно, вы захотите использовать строки в двойных кавычках для представления терминалов. Дополнительную информацию см. в этом ответе.
person
false
schedule
17.06.2014
S -> 0 S 1
генерирует 0^n1^n, но ваша грамматика генерирует 0^n1^m, где n ›= m - person Grijesh Chauhan   schedule 07.04.2014s --> [0],a.
производству, вы не можете добавить 1 в строку. (и если вы думаете, что0
nas1
как оператор, то приоритет0
выше, чем1
, поскольку он получает позицию ниже в дереве синтаксического анализа). Вы можете прочитать этот ответ чтобы узнать идею приоритета - person Grijesh Chauhan   schedule 07.04.2014