Совместное применение синтаксических и семантических конструкций в системе обозначений DCG
Система обозначений DCG фактически позволяет включать определение смысла непосредственно в грамматику, что дает возможность избежать необходимости промежуточного формирования дерева синтаксического анализа. Это — еще одно расширение системы обозначений, поддерживаемое DCG, которое является очень удобным для решения указанной задачи. Это расширение позволяет вставлять обычные цели Prolog в грамматические правила. Такие цели должны быть заключены в фигурные скобки, чтобы их можно было отличить от других символов грамматики. Таким образом, любое выражение, которое заключено в фигурные скобки, будучи обнаруженным интерпретатором Prolog, выполняется как обычная цель Prolog. Такое выполнение может, например, предусматривать арифметические вычисления.
Это средство может использоваться для подготовки такого варианта грамматики движения робота, который позволяет непосредственно совмещать операции извлечения смысла с синтаксическими конструкциями. Для этого необходимо добавить определение смысла; иными словами, ввести расстояние перемещения в результате некоторого движения в качестве параметра нетерминальных символов move и sLep, например, следующим образом: move[ Dist)
Этот предикат теперь обозначает синтаксическую конструкцию move, смыслом которой является Dist. Соответствующая грамматика приведена ниже. move( D) --> step! D),
move( D) —> step( Dl), move( D2), {D is Dl + D2}, stepi 1) --> [ up]. step{ -1) —> [ down].
Второе правило этой грамматики может служить примером применения системы обозначений, в которой используются фигурные скобки. Это правило можно описать словами, как показано ниже.
Движение, смыслом которого является D, состоит из следующего:
• шаг, смысловым значением которого является D1;
• движение, имеющее смысловое значение D2, при выполнении которого должно также быть удовлетворено отношение D is Dl + D2.
Часть II. Применение языка Prolog в области искусственного интеллекта
В действительности способ обработки семантических конструкций путем включения правил формирования смысла непосредственно в грамматику DCG является настолько удобным, что с его помощью часто удается полностью избежать необходимости применять промежуточный этап формирования дерева синтаксического анализа. Благодаря исключению этого промежуточного этапа программы становятся, как принято их называть, свернутыми, (collapsed). Обычно в результате этого достигаются такие преимущества, что программы, кроме того, становятся более краткими и эффективными. Но этот подход характеризуется также некоторыми недостатками: свернутая программа может оказаться менее наглядной, менее гибкой и более сложной для корректировки.
В качестве еще одной иллюстрации данного метода совместного применения синтаксических и смысловых конструкций рассмотрим немного более интересный вариант грамматики движений робота. Предположим, что для управления манипулятором робота могут использоваться два приводных механизма •— gl и д2. После получения команды перемещения на один шаг роботом, использующим приводной механизм gl, робот выполняет движение на 1 мм вверх или вниз, а при использовании приводного механизма д2 происходит движение на расстояние 2 мм. Предположим, что вся программа управления роботом состоит из команд переключения на тот или иной приводной механизм (gl или д2) и команд перемещения на один шаг, а оканчивается командой stop. Примеры таких программ приведены ниже.
stop
gl up up stop
gl up up g2 down up stop
gl gl g2 up up gl up down up g2 stop
Последняя программа имеет следующий смысл (т.е. расстояние перемещения в результате движения): Dist =2* (1 + 11 + 1* (1-1+1) =5
Для обработки таких программ управления роботом существующая грамматика движений робота должна быть расширена с помощью следующих правил: р:;од( 0) --> [ stop] .
prog ( Dist) --> деаг( _) , рюд ( Dist) .
prog( Dist) -> gear( Gl, move[ D) , prog( Distl), {Dist is G * D + Distl}.
gear( 1) -> [ gl].
gear{ 2) -> [ g2) .