Введение

Грамматика детерминированных предложений (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).

Представление особенностей

Различные лингвистические особенности также могут быть представлены довольно лаконично с помощью DCG, предоставляя дополнительные аргументы функторам. Например, рассмотрим следующий набор правил DCG:
предложение > местоимение_подлежащее, глагольная_фраза.
глагольная_фраза > глагол, местоимение_дополнение.
местоимение_подлежащее > [он].
местоимение_подлежащее > [она].
местоимение_дополнение > [его].
местоимение_дополнение > [её].
глагол > [любит].
Эта грамматика позволяет строить предложения, такие как "он любит её" и "он любит его", но не "она любит его" и "он любит его".

Другие применения

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.