- •1. Теория направленных отношений.
- •1.1. Основные понятия.
- •2.2. Языки и схемы направленных отношений.
- •2. Сетевое представление направленных отношений.
- •2.1. Формальное определение сетевого представления НО.
- •2.2. Графическая интерпретация сетевого представления.
- •2.3. Вычисление НО на основе КССГ.
- •2.4. Стратегии вычисления НО.
- •3.2. Синтаксис языка и семантика S-FLOGOL.
- •4.1. Базовые средства языка.
- •4.2. Средства схемной надстройки языка S-FLOGOL.
- •4.3. Системные отношения.
- •5. Интегрированная среда разработки программ.
- •5.1. Центральный модуль.
- •5.2. Текстовый редактор.
- •5.3. Графический редактор.
- •5.4. Вычисление запроса.
- •5.5. Отладка программ.
- •Список литературы
Инф(Лог) = {AND OR XOR},
имеющие традиционную семантику.
Значением по умолчанию для логического выражения является значение False.
Выражение Список значений «Выр(СпЗнач)», используемое для формирования списка значения операторной переменной свертки, в качестве первичного выражения имеет правило, определяющее натуральное число или последовательность натуральных чисел из указанного диапазона:
ПервВыр(СпЗнач)
Выр(Ар)
Выр(Ар) . . Выр(Ар)
Вкачестве единственного символа инфиксной операции используется символ ‘,’, интерпретируемый как операция сцепления списков.
Значением по умолчанию для списка значений является пустой список.
4.Основы программирования на языке S-FLOGOL.
Вэтом разделе мы дадим краткие сведения о принципах и особенностях программирования на языке S-FLOGOL [9], а также приведем ряд демонстрационных примеров.
4.1.Базовые средства языка.
Начнем рассмотрение с ограниченного подмножества языка, представленного приведенной выше текстовой грамматикой и не включающего конструкции схемной надстройки, а именно индексированные имена, параметризацию, свертку и условную конструкцию IF.
Комментарии к тексту программы начинаются с символа ‘//’.
Пример 1.1. Отношение сложения Add:
(0:1)Null; |
//1. Конструктор Null |
(1:1)Succ; |
//2. Конструктор Succ |
Add = {Null,x : x}; |
//3. График. Ядро рекурсии |
Add = {Succ(x),y : Succ(@(x,y))} |
//4. График. Рекурсивная часть |
В этом примере показаны четыре первичных доменных выражения,
соединенных инфиксной операцией ‘;’. Первые два доменных выражения
вводят конструкторы Null и Succ. Спецификация конструкторов является
28
обязательной, поэтому перед именами отношений Null и Succ указаны их спецификаторы – (0:1) и (2:1), соответственно.
Третье выражение описывает ядро рекурсии отношения сложения. Его реляционное выражение (после символа ‘=’) определено как график, содержащий входной и выходной термы (разделены символом ‘:’). Входной терм представляет собой два терма, соединенных операцией сцепления термов ‘,’, причем первый из них представляет вызов отношения
(конструктора) Null, а второй – переменную с именем x. Выходной терм содержит единственную переменную x. Заметим, что переменная x связана в пределах графика, то есть переменные с именем x во входном и выходном терме представляют одну и ту же переменную.
Декларативный смысл этого правила заключается в том, что
отношению сложения принадлежат такие пары кортежей, где первым элементом входного кортежа является объект, построенный конструктором Null, а единственный элемент выходного совпадает со вторым элементом входного кортежа.
С точки зрения функционального стиля программирования можно сказать, что в случае, когда первым аргументом отношения является объект, построенный конструктором Null, то результатом вычисления будет значение второго аргумента.
Четвертое правило задает рекурсивную часть определения отношения Add. В этом правиле уже используется вызов отношения, на вход которого подан терм – Succ(x), @(x,y). Напомним, что символ @ должен обязательно использоваться для обозначения рекурсивного вызова. В данном случае символ @ используется для вызова определяемого отношения Add.
Декларативный смысл этого правила определяется следующим
образом. Отношению Add принадлежат такие пары кортежей, где первым
элементом входного кортежа является объект, построенный применением к некоторому объекту Z конструктора Succ, а элемент выходного кортежа находится в отношении Add c объектом Z и вторым элементом входного
кортежа.
Функционально смысл данного правила заключается в том, что выход
отношения получается сложением уменьшенного на единицу первого
аргумента со вторым, и прибавлением единицы к полученному результату.
29
Добавим к указанной программе правило вида
QUERY = {: Add(Succ(Succ(Null)),Succ(x))} //5. Запрос Add(2,1)
и выделим его в качестве запроса. Результатом выполнения запроса после его компиляции будет объект Succ(Succ(Succ(Null), который можно интерпретировать как число 3. Такой результат, очевидно, соответствует семантике отношения сложения (1+2=3).
Следующие два примера демонстрируют основные приемы работы со списками. В качестве первого примера опишем отношение Append, определяющее сцепление списков. В качестве конструктора списка будем использовать отношение Cons арности (2,1), а в качестве конструктора
пустого списка – отношение Nil арности (0,1). |
|
(0:1)Nil; |
//1.конструктор пустого списка |
(2:1)Cons; |
//2.конструктор списка |
Append = {Nil,x: x}; |
//3.ядро рекурсии |
Append = {Cons(x,xs),ys : Cons(x, @(xs,ys))} |
//4.рекурсивная часть |
Декларативный смысл программы следующий. Отношению принадлежат либо пары кортежей, где первый элемент входного кортежа получен конструктором Nil и элемент выходного кортежа совпадает со вторым элементом входного кортежа; либо пары кортежей, где первый элемент входного кортежа получен конструктором Cons из объектов X и XS, а элемент выходного кортежа получен применением конструктора Cons к объекту X и объекту, который находится в отношении Append с объектами X и вторым элементом входного кортежа.
Другими словами, если первым аргументом отношения Append оказался объект, полученный конструктором Nil, то второй аргумент выдается на выход отношения. Иначе список – первый аргумент разбирается на голову и хвост; хвост сцепляется со вторым аргументом, после чего
результат сцепления соединяется конструктором Cons с головой списка –
первого аргумента и подается на выход.
Добавим определение тестовых чисел и списков, а также запрос:
Num0 = Null; |
//5.число 0 |
Num1 = Succ(Null); |
//6.число 1 |
Num3 = Succ(Succ(Succ(Null))); |
//7.число 3 |
List1 = Cons(Num0,Cons(Num3,Nil)); |
//8.список (0,3) |
30
List2 = Cons(Num1,Cons(Num0,Cons(Num1,Nil)); |
//9.список (1,0,1) |
|
|||
QUERY = {: Append(List1,List2)} |
|
//10.Запрос Append(2,1) |
|||
Скомпилировав |
и |
выполнив |
запрос, |
получим |
ответ |
Cons(Num0,Cons(Num3, Cons(Num1,Cons(Num0,Cons(Num1,Nil)))), то есть список вида (0,3,1,0,1), что соответствует семантике отношения сцепления списков.
В следующем примере мы продемонстрируем применение формулы при описании графика. Формула, как правило, применятся для сравнения элементов входного и (или) выходного кортежей, а также для описания отношений между входными и выходными парами термов. Например, опишем отношение вставки элемента в упорядоченный список:
Insert={x,Nil : Cons(x,Nil)};
Insert={x,Cons(y,ys) : Cons(y,@(x,ys)) ? Greater(x,y)}; Insert={x,Cons(y,ys) : Cons(x,Cons(y,ys)) ? Less(x,y)|x=y}
Для экономии места здесь и далее будем исключать из текста программ ввод конструкторов Null, Succ, Cons и Nil. Определение отношений Greater и Less, представляющих предикатные отношения сравнения натуральных чисел, здесь также не приводится. Очевидно, что вызовы предикатных отношений не могут быть размещены в выражениях термов, поэтому они вынесены (после символа ‘?’) в формулу.
Следующие примеры показывают возможности композиционного определения отношений. В качестве первого примера покажем определение натуральных чисел при помощи операции последовательной композиции:
Num1 |
= Null•Succ; |
//1.число 1 |
Num3 |
= Null•Succ•Succ•Succ |
//2.число 3 |
Операция параллельной композиции полезна для группировки
нескольких отношений c целью их дальнейшего композиционного
использования. Так, запрос одного из представленных ранее примеров, имеющий вид:
QUERY = {: Append(List1,List2)},
может быть преобразован из аппликативной в композиционную форму следующим образом:
QUERY = (List1# List2) •Append.
31