Введение
Грамматика детерминированных предложений (DCG) — это способ представления грамматики, как для естественных, так и для формальных языков, в языке логического программирования, таком как Prolog. Она тесно связана с концепциями атрибутных и аффиксных грамматик. DCG обычно ассоциируются с Prolog, но подобные языки, такие как Mercury, также поддерживают DCG. Они называются грамматиками детерминированных предложений, поскольку представляют грамматику как набор детерминированных предложений в логике первого порядка. Термин DCG относится к конкретному типу синтаксиса в Prolog и других аналогичных языках; не все способы представления грамматик с использованием детерминированных предложений считаются DCG. Однако все возможности и свойства DCG будут одинаковы для любой грамматики, представленной детерминированными предложениями, по сути, тем же способом, что и в Prolog. Детерминированные предложения DCG можно рассматривать как набор аксиом, где корректность предложения и наличие у него определённого дерева разбора можно считать теоремами, вытекающими из этих аксиом. Это даёт преимущество в том, что распознавание и синтаксический анализ выражений в языке сводится к общей задаче доказательства утверждений, например, в языке логического программирования.
История
История DCG тесно связана с историей Prolog, а история Prolog вращается вокруг нескольких исследователей в Марселе (Франция) и Эдинбурге (Шотландия). По словам Роберта Ковальски, одного из первых разработчиков Prolog, первая система Prolog была разработана в 1972 году Аленом Колмерауэром и Филиппом Русселем. Первая программа, написанная на этом языке, представляла собой крупную систему обработки естественного языка. Фернандо Перейра и Дэвид Уоррен из Эдинбургского университета также принимали участие в ранней разработке Prolog. Колмерауэр ранее работал над системой обработки языка под названием Q systems, которая использовалась для перевода с английского на французский и обратно. В 1978 году Колмерауэр опубликовал статью о способе представления грамматик, называемом метаморфными грамматиками, который был частью ранней версии Prolog, известной как Marseille Prolog. В этой статье он дал формальное описание метаморфных грамматик и привёл примеры программ, использующих их. Фернандо Перейра и Дэвид Уоррен, два других ранних архитектора Prolog, ввели термин «грамматика детерминированных клауз» и разработали нотацию для DCG, которая используется в Prolog и сегодня. Они признали, что идея принадлежит Колмерауэру и Ковальски, и отметили, что DCG являются частным случаем метаморфных грамматик Колмерауэра. Они представили эту идею в статье под названием «Грамматики детерминированных клауз для анализа языка», где описывают DCG как «формализм, в котором грамматики выражаются в виде клауз логики предикатов первого порядка», которые «создают эффективные программы на языке программирования Prolog». Перейра, Уоррен и другие пионеры Prolog впоследствии писали о различных других аспектах DCG. Перейра и Уоррен опубликовали статью под названием «Парсинг как дедукция», в которой описывается, в частности, использование процедуры доказательства дедукции Эрли для синтаксического анализа. Перейра также сотрудничал со Стюартом М. Шибером над книгой под названием «Prolog и анализ естественного языка», которая задумывалась как общее введение в вычислительную лингвистику с использованием логического программирования.
Пример
Основной пример DCG помогает проиллюстрировать, что это такое и как они выглядят. предложение > именная группа, глагольная группа. именная группа > определитель, существительное. глагольная группа > глагол, именная группа. определитель > [the]. определитель > [a]. существительное > [cat]. существительное > [bat]. глагол > [eats]. Это генерирует такие предложения, как "the cat eats the bat", "a bat eats the cat". Можно сгенерировать все допустимые выражения в языке, порожденном этой грамматикой, в интерпретаторе Prolog, введя sentence(X, []). Аналогично, можно проверить, является ли предложение допустимым в языке, введя что-то вроде sentence([the, bat, eats, the, bat], []).
Перевод в определённые предложения
DCG обозначение — это просто синтаксический сахар для обычных определённых клауз в Prolog. Например, предыдущий пример можно перевести следующим образом:
sentence(A, Z) :- noun_phrase(A, B), verb_phrase(B, Z).
noun_phrase(A, Z) :- det(A, B), noun(B, Z).
verb_phrase(A, Z) :- verb(A, B), noun_phrase(B, Z).
det([the|X], X).
det([a|X], X).
noun([cat|X], X).
noun([bat|X], X).
verb([eats|X], X).
sentence(A,Z) : noun phrase(A,B), verb phrase(B,Z). noun phrase(A,Z) : det(A,B), noun(B,Z). verb phrase(A,Z) : verb(A,B), noun phrase(B,Z). det([the|X], X). det([a|X], X). noun([cat|X], X). noun([bat|X], X). verb([eats|X], X).
Представление особенностей
Различные лингвистические особенности также могут быть представлены довольно лаконично с помощью DCG, предоставляя дополнительные аргументы функторам. Например, рассмотрим следующий набор правил DCG:
предложение > местоимение_подлежащее, глагольная_фраза.
глагольная_фраза > глагол, местоимение_дополнение.
местоимение_подлежащее > [он].
местоимение_подлежащее > [она].
местоимение_дополнение > [его].
местоимение_дополнение > [её].
глагол > [любит].
Эта грамматика позволяет строить предложения, такие как "он любит её" и "он любит его", но не "она любит его" и "он любит его".
sentence > pronoun(subject), verb phrase. verb phrase > verb, pronoun(object). pronoun(subject) > [he]. pronoun(subject) > [she]. pronoun(object) > [him]. pronoun(object) > [her]. verb > [likes]. This grammar allows sentences like "he likes her" and "he likes him", but not "her likes he" and "him likes him".
Другие применения
DCG могут служить удобным синтаксическим сахаром для сокрытия определенных параметров в коде, не только в приложениях для разбора. В декларативно чистом языке программирования Mercury ввод/вывод должен быть представлен парой аргументов состояния io. Нотация DCG может быть использована для упрощения работы с вводом/выводом, хотя обычно предпочтительнее нотация переменных состояния. Нотация DCG также используется для разбора и подобных задач в Mercury, как и в Prolog.
Расширения
Поскольку DCG были введены Перейрой и Уорреном, было предложено несколько расширений. Сам Перейра предложил расширение, называемое грамматиками экстрапозиции (XG). Этот формализм был предназначен, в частности, для упрощения выражения определенных грамматических явлений, таких как левая экстрапозиция. Перейра утверждает: "Различие между правилами XG и правилами DCG заключается в том, что левая часть правила XG может содержать несколько символов". Это облегчает выражение правил для контекстно-зависимых грамматик. Питер Ван Рой расширил DCG, чтобы разрешить использование нескольких аккумуляторов. Еще одно, более позднее расширение было разработано исследователями из NEC Corporation в 1995 году и получило название Multi Modal Definite Clause Grammars (MM DCGs). Их расширения были направлены на распознавание и синтаксический анализ выражений, включающих нетекстовые элементы, такие как изображения. Другое расширение, называемое грамматиками трансляции определённых предложений (DCTGs), было описано Харви Абрамсоном в 1984 году. Обозначение DCTG очень похоже на обозначение DCG; основное различие заключается в использовании `::=` вместо `>` в правилах. Оно было разработано для удобной обработки грамматических атрибутов. Трансляция DCTG в нормальные предикаты Prolog аналогична трансляции DCG, но добавляются 3 аргумента вместо 2.