Языки продукционного программирования
К настоящему времени создано несколько универсальных языков продукционного программирования. Одним из наиболее известных языков этого класса является OPS5 [95], разработанный в университете Карнеги-Меллона. Рассмотрим особенности этого языка. База данных в языке называется рабочей памятью (working memory) и состоит из нескольких сотен объектов, каждый из которых имеет свой набор атрибутов. Объект вместе с парами < атрибут — значение> называется элементом рабочей памяти. Синтаксически элемент рабочей памяти выглядит следующим образом
(Expression | Name Expr1 | Arg1 2 | Oр * | Arg2 X),
здесь знак | является оператором языка OPS5 и отделяет имя атрибута от его значения. В данном примере сказано, что объект класса Expression имеет четыре атрибута: Name, Arg1, Ор, Arg2, которые имеют следующие значения: Name = Expr1, Arg1 = 2, Ор = *, Arg2 = X.
Программа на OPS5 — это множество продукций, каждая из которых имеет следующие особенности. Левая часть продукции — это последовательность образцов, каждый из которых представляет собой частичное описание элементов рабочей памяти. Некоторые образцы начинаются символом "-". Такие образцы являются средством задания отрицательного контекста.
Условия левой части правила выполнены тогда, когда:
- для каждого образца данной продукции существует элемент рабочей памяти, который соответствует этому образцу;
- для образцов, помеченных символом "-" нет подходящих элементов в рабочей памяти.
В простейшем случае образцы содержат только константы и числа. Однако наибольший интерес представляют образцы, в которых используются переменные и предикаты, выделяемые в тексте угловыми скобками.
Предикаты OPS5 традиционны и включают: =, ¹, £, >, <, ³. Например, следующий образец
(Expression |Arg1 < Left > | Arg 2 ¹ < Left >)
будет соответствовать любому элементу рабочей памяти, у которого первый аргумент не равен второму.
Правая часть продукции состоит из последовательности безусловных действий. Все эти действия меняют рабочую память (базу данных). Выделены три типа действий:
MAKE — создает новый элемент рабочей памяти;
MODIFY — изменяет один или несколько значений атрибутов у существующего элемента рабочей памяти;
REMOVE — удаляет элемент рабочей памяти.
Каждая продукция в OPS5 состоит из символа Р, имени продукции, левой части, символа ®и правой части. Следующий пример иллюстрирует типичную продукцию OPS5:
(Р TimeOx
(Goal | Type Simplify | Object <X>)
(Expression | Name <X> | Arg1 0 | Op *)
®
(MODIFY 2 | 0p NL |Arg2 NIL))
Основная задача, которую поставили перед собой разработчики языка OPS5, добиться максимально высокой эффективности выполнения продукционной программы. Интерпретатор системы порождает конфликтное множество, каждый элемент которого представляет собой пару <имя продукции, список элементов рабочей памяти, которые являются означиваниями для образцов продукции>.
Авторами языка OPS5 был предложен эффективный алгоритм построения конфликтного множества, получивший название RETE алгоритм [94]. Эффективность интерпретатора зависит от перебора элементов рабочей памяти и перебора продукций. RETE алгоритм позволяет избежать обоих этих переборов.
RETE алгоритм связывает с каждым образцом список тех элементов рабочей памяти, которые означивают этот образец. Когда элемент добавляется в рабочую память, интерпретатор находит все образцы, которым он соответствует и связывает этот элемент со всеми подходящими образцами. Когда элемент удаляется из рабочей памяти, то происходит обратное. Это означает, что интерпретатор никогда не делает поиска по образцу в рабочей памяти.
Второй вид циклов, снижающий эффективность работы системы, — это перебор продукционных правил. RETE алгоритм позволяет избегать этого перебора. Для этого над правилами строится сеть, которая позволяет сортировать продукции. Сеть строится из образцов левых частей продукций. Компилятор образцов строит из них сеть, связывая вместе одинаковые образцы из разных продукций. Было показано, что RETE алгоритм реализует самую эффективную процедуру построения конфликтного множества в системах продукций [94].
Данный алгоритм обладает высокой степенью внутреннего параллелизма, и позднее было предложено большое количество его обобщений и расширений для параллельных архитектур [109]. В настоящее время известно большое количество интеллектуальных систем, реализованных на языке OPS5 [108,95,61].
Другой известный язык продукционного программирования — Рефал. Язык Рефал задуман и функционирует как универсальный метаязык для описания преобразований языковых объектов [58]. Рефал позволяет описывать сколь угодно сложные преобразования одного текста в другой без каких-либо ограничений на характер преобразований. Эта ориентация языка получила название преобразование символьной информации. Одной из базовых операций языка является операция конкретизации, которую можно определить как переход от имени к значению. В OPS5 этой операции соответствует операция означивания.
Знаки К и ! являются выделенными и называются конкретизационными скобками, в которые заключается языковой объект, подлежащий конкретизации. Так, например, если X'есть некоторая переменная величина, то КХ! (конкретизация X) будет изображать значение этой величины. Конкретизация — переход от имени к значению — является основной операцией в языке Рефал.
Минимальную семантическую единицу в языке называют символом и обозначают последовательностью любых знаков (букв и цифр), взятых в кавычки. Из простых объектов строятся структурные. Простейший вид задания структурных объектов — это скобки. Выражение определяется как последовательность знаков, правильно построенная относительно скобок. Пример выражения: К 'ЕСЛИ' А<В 'ТО' А 'ИНАЧЕ' В!
Программа на языке Рефал представляет собой набор правил конкретизации. Поскольку правило конкретизации есть указание для замены одного языкового объекта на другой, то предложение состоит из левой части (заменяемый объект) и правой части (объект, заменяющий левую часть). Левая и правая части отделяются друг от друга символом -->. Например, предложение, выражающее тот факт, что значение переменной Х есть 137, запишется в виде
К X! ®137
Структура интерпретатора Рефала выглядит следующим образом. Как и во всех системах продукционного стиля в архитектуре выделяются три компонента: рабочая память (база данных), база правил и интерпретатор. Пусть интерпретатор преобразует некоторое выражение, находящееся в рабочей памяти. В Рефале по умолчанию принято, что интерпретатор просматривает правила в том порядке, в котором они перечислены, и применяет первое из них, после чего шаг считается выполненным. Обрабатываемое выражение может содержать как угодно много конкретизационных скобок, причем они могут быть вложены друг в друга. В связи с этим необходимо зафиксировать дисциплину, которая определяет в каком порядке надо производить конкретизацию.
Ведущим называют самый левый знак конкретизации К, в области действия которого нет ни одного знака К. В начале каждого шага интерпретатор просматривает рабочую память слева направо в поисках ведущего знака конкретизации. Найдя его, он сравнивает термы, начинающиеся с этого знака, с левыми частями правил. Найдя подходящее правило, интерпретатор производит замену на соответствующую правую часть правила, и выполнение данного шага заканчивается.
Процесс преобразований останавливается, когда результирующее выражение не содержит конкретизационных скобок, либо когда неприменимо ни одно из правил. В общем случае правила языка Рефал могут содержать переменные, что приводит к необходимости выполнять операцию поиска по образцу. Процедура означивания переменной конкретным значение получила в Рефале название синтаксического отождествления. В правой части правил разрешается использовать только те переменные, которые использовались в левой части, и при означивании переменной в левой части все вхождения одной и той же переменной в пределах одного правила заменяются на одно и то же значение.
Приведенное краткое описание свойств Рефала наглядно демонстрирует насколько близко данный язык совпадает с парадигмой продукционного программирования. К середине 70-х годов были разработаны эффективные программные версии Рефала, на которых был реализован ряд системдля решения задач символьных преобразований [3] и продукционных систем [64].
Большое количество прикладных систем и моделей сделали возможным разработать общую метамодель систем продукций и построить формальные модели.
Дата добавления: 2016-03-05; просмотров: 2283;