Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
FLOGOL IDE (отчёт).pdf
Скачиваний:
13
Добавлен:
28.06.2014
Размер:
923.8 Кб
Скачать

2.3. Вычисление НО на основе КССГ.

Вычисление программы производится путем порождения заданного КССГ сетевого языка при помощи подстановки сети – правой части правила (тела правила) вместо одного из элементов нетерминальных сортов в некоторой порожденной ранее сети [6]. Изначально множество сетей Σн

содержит только одну сеть, имеющую единственный элемент сорта аксиомы грамматики. Процесс порождения языка начинается с подстановки правил для аксиомы грамматики. Для выполнения подстановки исходная сеть из множества Σн и тело правила для одного из элементов этой сети копируются. В случае, если после выполнения подстановки новая сеть не содержит элементов нетерминального сорта, она добавляется в множество сетей Σт

результат вычисления, иначе она добавляется в множество Σн. После того,

как к некоторому элементу сети из Σн применены все определяющие его правила, такая сеть удаляется из множества Σн. Вычисление либо длится бесконечно долго, либо завершается, если множество Σн становится пустым.

Вычисление программы как процесс порождения языка путем выполнения подстановок с использованием правил КССГ носит чисто синтаксический характер. Несмотря на то, что такая модель вычисления может в некоторых случаях рассматриваться как способ получения окончательного результата, в большинстве случаев для его получения необходим также учет и семантики получаемых сетей. Семантической составляющей модели вычисления НО является редукция.

Выполнение редукции преследует две цели. Во-первых, применение правил редукции приводит к упрощению сети, что уменьшает число действий

по ее дальнейшему анализу и обработке. Во-вторых, редукция, результат

выполнения которой позволяет интерпретировать рассматриваемую сеть как пустое НО, отсекает некоторую ветвь дерева подстановок, на которой

гарантированно не будет получен результат вычисления. Это приводит к

более быстрому продвижению по другим ветвям дерева, на которых, возможно, будут получены сети, принадлежащие результату вычисления.

Выполнение редукции реализует в том числе операции, хорошо известные по другим моделям вычисления, такие как, например, унификация

10

и сопоставление с образцом. Приведем правила редукции, использующие свойство функциональности для моделирования унификации.

функциональность деструкторов

ортогональность различных

 

деструкторов

C

C

C

C

C′′

Кроме правил редукции, преобразующих структуру сети, при вычислении с разметкой используется модель Data-Flow.

2.4. Стратегии вычисления НО.

Важную роль при вычислении функционально-логических программ

играет стратегия вычисления. Одной из реализованных в системе функционально-логического программирования стратегий, является поиск в глубину. Свое название поиск в глубину получил от способа обхода дерева подстановок (дерева решений), который углубляется по одной из ветвей, пока не достигнет листа дерева (или не возникнет конфликт вычисления), после чего следует возврат к предыдущей вершине для выбора другой ветви дерева. Благодаря такому виду просмотра дерева, эту стратегию иногда называют поиском с возвратом (backtracking).

Другой реализованной стратегией поиска является поиск в ширину. Свое название поиск в ширину также получил благодаря способу обхода

дерева подстановок, предполагающего последовательное по уровням

углубление по всем ветвям дерева подстановок.

Кроме перечисленных стратегий можно также использовать и условия

вычислимости, позволяющие отложить вычисление элемента до тех пор,

пока разметка на его входных и выходных точках не будет удовлетворять

указанному условию. Например, естественно потребовать, чтобы при вычислении функционального отношения были заданы его аргументы (входы элемента). В некоторых языках и системах программирования используются

11

аналогичные подходы, называемые защитными правилами, метаописаниями, «заморозкой» и т.д.

3. Язык функционально-логического программирования S-FLOGOL. 3.1. Принципы построения.

Принципы построения языка S-FLOGOL согласуются с основными чертами и тенденциями развития современных декларативных языков программирования. В то же время используемые технологические приемы программирования не нарушают декларативной семантики программы, обеспечивая корректность и монотонность вводимых определений НО.

Основными принципами построения языка S-FLOGOL являются:

-Модульная структура программы;

-Мспользование явной и неявной спецификации НО;

-Возможности композиционной и аппликативной формы определения НО;

-Применение единого шаблона для построения всех типов выражений.

-Применение вычислимых имен определяемых объектов.

-Возможность доопределения НО.

-Использование параметризованных определений НО.

Рассмотрим реализацию указанных принципов в языке S-FLOGOL.

База данных программы формируется из схем описаний НО, расположенных в программных модулях. Модули языка могут образовывать гамакообразную (без циклов) структуру, формируемую при помощи определения для каждого модуля списка подключенных модулей. При включении модуля в список подключенных модулей (импорте модуля) множество определенных в нем объектов попадает в область видимости

текущего модуля. В языке используется следующие типы модулей –

текстовые, сетевые и объектные.

Текстовые модули содержат описания НО, определенные при помощи

текстовой грамматики языка S-FLOGOL с использованием возможностей

схемной надстройки. Текстовые модули создаются в системе при помощи специализированного текстового редактора.

Сетевые модули предназначены для альтернативной формы задания

множества описаний НО, основынной на представлении базы данных описаний НО в виде КССГ. Сетевая грамматика не поддерживает схемную

12

надстройку языка S-FLOGOL, поэтому сетевые модули лишь частично реализуют возможности языка. Для формирования сетевого представления НО в графическом виде предназначен специализированный графический редактор.

Объектные модули представляют записанную в форме специальных кодов базу данных описаний НО и получаются путем раздельной компиляции (текстовых) модулей, что позволяет ускорить компиляцию многомодульных запросов.

Синтаксически текстовые модули программы задаются при помощи конструкции, включающей одно или два доменных выражения, разделенных ключевым словом WHERE. Доменные выражения задают множества описаний НО (точнее, схем НО). Первое доменное выражение в модуле

определяет видимую часть модуля, то есть множество описаний НО, видимых в других модулях при импорте данного модуля. Второе доменное выражение определяет закрытую часть модуля, и, соответственно, описания НО, определенные в этом доменном выражении, не включаются в область видимости модулей при его импорте другими модулями. Имя вызываемого отношения может быть квалифицированно с использованием традиционной точечной нотации.

Вязыке предусмотрено две формы описания НО – объявление и определение (синтаксически представляются понятиями «конструктор» и «правило»). Объявление НО предполагает задание его интерпретации как конструктора на эрбрановском универсуме. Определение НО вводит новое уравнение (точнее, новую схему уравнений) в рекурсивную систему определений НО. С позиции средств конструирования НО имя отношения, введенного при помощи объявления, рассматривается как терминальный символ, в то время как имя отношения, введенного как определение, рассматривается как реляционная переменная, то есть нетерминальный символ.

Вязыке допускается две формы определения НО – аппликативного и композиционного. Аппликативная форма определения НО предполагает

задание отношения непосредственно как график этого отношения. Для определения графика вводятся термы, описывающие входной и выходной кортежи отношения, определяющие разметки входных и выходных точек в

13

сетевом представлении НО, причем переменные термов локализованы внутри соответствующего графика. Заметим, что, согласно интерпретации сетей как НО, переменные термов в графике полагаются неявно связанными кванторами существования. Таким образом, семантика переменной терма определяет существование на носителе такого значения этой переменной, при котором описываемое графиком отношение выполняется. Помимо входного и выходного термов, в график может также входить логическая формула, позволяющая описывать дополнительные ограничения на значения переменных термов. Композиционная форма предполагает определение схем НО как результатов применения операций композиции отношений к другим схемам НО.

Каждое НО может быть специфицировано. Под спецификацией НО

понимается декларирование основных характеристик отношения, таких как входная и выходная арности, наличие свойств прямой и обратной функциональности и тотальности. Спецификация задается при помощи специальных синтаксических конструкций, называемых спецификаторами. В общем случае спецификатор предполагает определение арности НО в виде заключенных в круглые скобки и разделенных двоеточием двух арифметических выражений, а также опционального указания свойств тотальности и функциональности самого описываемого и обратного ему отношений, причем наличие указанных свойств отмечается знаками «+» в определенных позициях спецификатора (так, функциональность указывается после открывающей скобки, тотальность – перед двоеточием, функциональность обратного отношения – после двоеточия, а тотальность обратного отношения – перед закрывающей скобкой). В качестве

альтернативной формы задания спецификаторов предлагается использование специальных ключевых слов, полностью или частично

определяющих характеристики НО. Ключевые спецификаторы и

определяемые ими свойства представлены на следующей таблице:

СПЕЦИФИКАТОР

СПЕЦИФИКАЦИЯ

 

 

ASSERTION

(0+: +0)

 

 

PROPERTY

(1+: 0)

 

 

 

 

14

PREDICATE(m)

(m+: 0)

OBJECT

(+0+: +1)

 

 

SET

(0 : +1)

 

 

TUPLE(n)

(+0+: +n)

 

 

TUPLE_SET(n)

(0 : +n)

 

 

TRANSPOSITION

(+1+: +1+)

 

 

SUBSTITUTION

(+1+: +1)

 

 

FUNCTOR

(+1+:1)

 

 

OPERATOR

(1+:1)

 

 

TRANSITION

(1:1)

 

 

TuPLE_TRANSPOSITION(m)

(+m+: +m+)

 

 

TUPLE_SUBSTITUTION(m)

(+m+: +m)

 

 

TUPLE_FUNCTOR(m)

(+m+: m)

 

 

TUPLE_OPERATOR(m)

(m+: m)

 

 

TUPLE_TRANSITION(m)

(m : m)

 

 

SUPER_CONSTRUCTOR(m)

(+m+: +1+)

 

 

CONSTRUCTOR(m)

(+m+: +1)

 

 

FUNCTION(m)

(+m+:1)

 

 

REFLECTION(m)

(m+:1)

 

 

SUPER_RECONSTRUCTOR(m,n)

(+m+: +n+)

 

 

RECONSTRUCTOR(m,n)

(+m+: +n)

 

 

TUPLE_FUNCTION(m,n)

(+m+: n)

 

 

TUPLE_REFLECTION(m,n)

(m+: n)

 

 

 

 

В случае, если спецификатор отношения не был задан, отношение считается специфицированным неявно. В этом варианте спецификация отношения определятся автоматически при выполнении компиляции запроса.

Имена отношений и переменных термов могут быть индексированы.

Список индексов представляется заключенными в квадратные скобки и записанными через запятую натуральными числами, для определения

которых используются арифметические выражения, и записывается непосредственно перед идентификатором отношения или переменной терма. При описании списка индексов могут дополнительно использоваться свертки и условные конструкции (см. далее), позволяющие описывать

15

сложные списки индексов в компактной форме. Возможность использования значения операторной переменной свертки, определенной на более высоком уровне вложенности, позволяет описывать сразу много различных НО, имена которых при одних и тех же идентификаторах могут различаться списком индексов.

Определение отношений с одинаковыми идентификаторами и списками индексов, но различными спецификаторами, приводит к возникновению полиморфных НО. В сетевом представлении такие отношения будут представлены элементами, имеющими различное число входов и выходов. Таким образом, спецификатор отношения также должен быть включен в имя отношения. Однако, поскольку язык допускает неявную спецификацию отношений, спецификатор в имени отношения является

опциональным и может быть опущен.

Следующим важным свойством языка является возможность параметризации определяемых отношений. Различают два вида параметров

– фактические и формальные. Формальные и фактические параметры записываются в квадратных скобках после имени определяемого и вызываемого отношения, соответственно. Список фактических параметров задается при вызове отношений, причем в качестве значений параметров могут использоваться только имена отношений. Формальные параметры позволяют определять значения параметров по умолчанию, которые используются при обращении к параметру в том случае, если соответствующий фактический параметр не был задан при вызове отношение. Обращение к параметрам осуществляется по номерам. Если при определении списка формальных параметров значение по умолчанию для какого-либо параметра не задано, то считается, что значением по умолчанию

для данного параметра является пустое отношения. При определении списка фактических параметров могут быть указаны лишь значения некоторых параметров, для остальных параметров будет использовано значение по

умолчанию. Обращение к параметру, значением которого является пустое

отношение и к приводит интерпретации формируемого определения НО как

пустого отношения.

Все выражения языка строятся по единому шаблону. Для выражения каждого типа определено свое множество первичных выражений, множество

16