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

Инф(Лог) = {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

= NullSucc;

//1.число 1

Num3

= NullSuccSuccSucc

//2.число 3

Операция параллельной композиции полезна для группировки

нескольких отношений c целью их дальнейшего композиционного

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

QUERY = {: Append(List1,List2)},

может быть преобразован из аппликативной в композиционную форму следующим образом:

QUERY = (List1# List2) Append.

31