\+ можно использовать для создания менее неоднозначных грамматик. Преимущество использования \+ перед ! например, является определенной декларативностью \+, так что, например, результирующие правила DCG могут быть переупорядочены.
Давайте сделаем пример, рассмотрим следующую грамматику:
s([X|Y]) --> t(X), s(Y). % 1
s([]) --> []. % 2
t(2) --> [a,a]. % 3
t(1) --> [a]. % 4
Приведенная выше грамматика очень неоднозначна, например, я получаю несколько синтаксических анализов для следующего ввода:
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..
Теперь предположим, что я хочу предпочесть длинный анализ t короткому анализу t. Я могу сделать это с разрезом следующим образом:
t(2) --> [a,a], !. % 5
t(1) --> [a]. % 6
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
К сожалению не могу перезаказать. Так как выполнение следующего не дает желаемого результата. Хотя s(A) теперь выдает результаты в другом порядке, мы вернулись к исходной точке, поскольку грамматика снова неоднозначна:
t(1) --> [a]. % 7
t(2) --> [a,a], !. % 8
?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...
Теперь давайте попробуем то же самое с \+. Мы можем заменить разрез следующим отрицанием:
t(2) --> [a,a]. % 9
t(1) --> [a], \+ [a]. % 10
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Теперь давайте попробуем, можем ли мы изменить порядок. Переупорядочим правила грамматики t//1:
t(1) --> [a], \+ [a]. % 11
t(2) --> [a,a]. % 12
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Декларативность очень полезна. Это означает, например, что мы можем использовать \+ в синтаксическом анализаторе диаграмм справа налево, который выбирает правила грамматики в произвольном порядке. Декларативность гарантирует, что восходящая прямая цепочка анализатора диаграмм дает один и тот же результат независимо от порядка ввода правил DCG.
Затем можно применять метод DCG в больших проектах на естественном языке (NL), и он хорошо масштабируется. Грамматики ЕЯ можно эмпирически настроить на детерминизм. Чем более детерминирована грамматика, тем эффективнее ее синтаксический анализ. Сложные ЕЯ-грамматики, которые в противном случае были бы неразрешимы, становятся возможными.
до свидания
person
Mostowski Collapse
schedule
07.10.2012