Часть 4. Язык функционально-логического программирования FLOGOL
.pdf4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
(СписЗнач), построенного синтаксически подобно множеству значений, но в котором по-иному интерпретируются символы операций. Полученные таким образом конструкции первичных выражений могут связываться символами бинарных операций (параметр «2»), применяемых в порядке,
определяемом их приоритетами. Наконец, для построения выражений мо-
жет использоваться условная конструкция IF-THEN-ELSE, управляемая значением логического выражения (ЛогВыр); при отсутствии ELSE-части соответствующее значение по умолчанию определяется особо для каждого из возможных типов выражений.
АрВыр – арифметическое выражение – одно из наиболее синтаксиче-
ски сложных примеров использования общего шаблона Выр. Для постро-
ения арифметических выражений в качестве встроенных инфиксов исполь-
зуются знаки операций умножения, целочисленного деления, взятия остат-
ка по модулю, вычитания (три последних знака с предпочтением слева) и
сложения натуральных чисел (последние два из перечисленных знаков – меньшего, чем у первых трех, приоритета). В качестве первичных арифме-
тических выражений (ПервАр) могут выступать натуральные константы
(НатЧис), вызовы библиотечных арифметических функций с натуральны-
ми параметрами, вызовы функций, возвращающих количества выходов
(префикс ) и входов (суффикс ) заданного отношения.
ЛогВыр – логическое выражение, тоже построенное по шаблону Выр,
применяемое в условных конструкциях выражений. Для построения логи-
ческих выражений используются операции отрицания (префикс), конъ-
юнкции, суммы по модулю 2 и дизъюнкции (инфиксы, перечислены в по-
рядке уменьшения приоритетов). Первичное логическое выражение
(ПервЛог) строится как цепочка арифметических выражений, связанных знаками операций арифметических отношений, и понимается как конъ-
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 31
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
юнкция соответствующих отношений между соседними элементами це-
почки.
МножЗнач – множество значений ключа в CASE-конструкции выра-
жений. Для построения множеств значений (как соответствующих выра-
жений) используются инфиксы операций над множествами: объединения,
пересечения и вычитания.
СписЗнач – список значений операторной переменной в операторе свертки. Для построения этих списков используется инфикс операции сцепления.
ПервМнСп – общая синтаксическая форма (но интерпретируемая по-
разному) первичных выражений для множеств и списков значений, зада-
ющая или отдельное натуральное значение, или диапазон значений. Отсут-
ствие нижней границы предполагает нулевое значение, а верхней – макси-
мально возможное для реализации языка.
ИмяОтн – имя фактического отношения, задаваемого либо в форме квалифицированного имени (КвИмя), либо символом @ , понимаемым как конкретное отношение, либо как подстановочный параметр, порядко-
вый номер которого задается арифметическим выражением. Если вызыва-
ется параметр домена, то дополнительно указывается натуральное число – индекс вхождения, характеризующее уровень вложенности места вызова параметра по отношению к месту описания этого домена.
КвИмя – квалифицированное имя отношения, предполагающее, в об-
щем виде, задание цепочки имен доменов, завершающейся именем отно-
шения для случая, когда КвИмя используется для ссылки на имя отноше-
ния.
Имя – конструкция имен описываемых доменов и отношений, пред-
полагающая, в общем случае, задание списка индексов и списка формаль-
ных параметров.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 32
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
СпИнд – выражение, задающее список индексов имени отношения или домена, первичной формой которого является арифметическое выра-
жение, а единственным символом бинарной операции – знак операции пе-
речисления элементов списка (запятая).
СпПар – список параметров, синтаксически одинаково построенный и для списков формальных параметров, используемых в левых частях описа-
ний, и для списков фактических параметров, используемых при вызове от-
ношений. В выражениях, определяющих списки параметров, в качестве единственного инфикса используется точка с запятой.
ЭлемСпПар – определяет различные виды элементов списков пара-
метров. Если в очередном элементе списка отсутствует компонент Груп-
Пар (группа параметров; фактически, это список номеров единообразно определяемых параметров), этот элемент определяет «очередной» пара-
метр, номер которого является непосредственно следующим за последним из номеров параметров предыдущего элемента списка (при отсутствии компонента ГрупПар в первом элементе списка определяется параметр с нулевым номером). Семантика повторного определения параметра с одним и тем же номером была пояснена в предыдущем разделе. Напомним, что список формальных параметров характеризует значения параметров, ис-
пользуемые по умолчанию, если они не определяются при вызове в списке фактически параметров. Спецификация параметров ограничивает множе-
ство возможных значений параметров подмножествами отношений соот-
ветствующей арности и обладающими соответствующими свойствами.
РелВыр – реляционное выражение. Этот вид выражений используется в качестве правых частей определений отношений и для задания значений параметров (формальных и фактических): префикс ~ представляет опе-
рацию обращения отношения, префикс представляет операцию постро-
ения генератора области значений отношения, инфиксы представляют (в
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 33
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
порядке уменьшения приоритета) операции последовательной компози-
ции ( ), конкатенации ( ), унификации ( ), условной композиции ( ),
параллельной композиции ( # ), пересечения ( ) и объединения ( ),
наконец, суффикс представляет операцию построения предиката при-
надлежности области определения отношения.
ПервРел – первичная форма реляционных выражений. Это либо имя некоторого отношения, видимого в соответствующем реляционном выра-
жении, либо так называемый график (График) – не композиционная форма определения отношений, связанная с их сетевым представлением.
График – конструкция сетевой формы определения отношений. Ис-
пользуемые конструкции – Терм и Формула. Первая используется для описания входных и выходных точек сети, а вторая – для описания компо-
нентов сети, не вошедших в описание ее входных и выходных точек.
ПервТерм – вид первичных выражений для термов. Это либо пустой терм, либо Вызов, либо локализованное в определении графика имя точки сети, возможно, индексированное.
Вызов – одна из первичных форм задания термов и формул-условий при описании графиков, определяющая в функциональной нотации значе-
ния из области интерпретации, связанные с выходными точками элемента,
представляющего некоторое отношение (ИмяОтн), с помощью термов,
определяющих значения, связанные с входными точками этого элемента.
Терм – особый вид выражений, при построении которых используют-
ся символы бинарных операций: запятая для обозначения конкатенации значений термов и меньшего приоритета символ « | » для операции соеди-
нения равноправных вариантов термов. Множество точек сети определяет-
ся множеством используемых при описании всех компонентов графика имен точек с конкретными числовыми значениями индексов.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 34
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
Формула – специальная форма выражений, в которых используются
знаки операций конъюнкции и дизъюнкции.
ПервФорм – первичная конструкция формул – либо вызов предиката
(отношения арности n,0 ), либо цепочка описывающих кортежи дан-
ных одинаковой длины термов, соединенных знаками отношений равен-
ства и неравенства. Цепочка термов t1 ,...,tn , n 1, связанных знаками ра-
венства, при n 1 эквивалентна формуле |
x t1 &...& x tn , где |
x – но- |
|
вое имя точки, неявно вводимой для этой группы термов. Для |
каждого |
||
знака неравенства включается конъюнктивный член вида x x , где |
x |
представляет группу связанных знаком равенства термов слева от знака неравенства, а x – группу связанных знаком равенства термов справа от него.
Модуль – библиотечная единица FLOGOL -программы; вводит имя домена, определяет видимость (извне) отношений, описанных в других доменах, путем задания списка имен модулей-родителей, и содержит иерархически организованное множество описаний отношений, синтакси-
чески имеющее форму так называемого домена.
Домен – структурный компонент множества описаний, включающий,
в общем случае, два синтаксически подобных компонента в форме домен-
ных выражений – особого вида выражений, интерпретируемых как множе-
ство описаний отношений и доменов, непосредственно вложенных в дан-
ный домен. Первое из них описывает объекты, «видимые» не только внут-
ри этого домена, но и извне (с помощью квалифицированных имен), а вто-
рое – объекты, обращение к которым допускается только внутри описыва-
емого домена.
ИмяДом – имя домена, представленное уже рассмотренной ранее кон-
струкцией КвИмя.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 35
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
ЭлемОпис – элемент описания в доменах. В качестве объектов описа-
ния выступают отношения и вложенные домены: для отношений возмож-
ны две формы описания – объявление и определение, а для доменов – только определение. Объявляемое имя отношения обязательно должно быть специфицировано, причем одинаково специфицированные отноше-
ния могут описываться общим списком. Если объявляемые имена отноше-
ний сопровождаются ключевым словом EXT, то их интерпретация задает-
ся одноименным разделом специальной системной библиотеки, в против-
ном случае используется интерпретация отношения как конструктора на эрбрановском универсуме. Форма правой части определения одновремен-
но задает и вид определяемого объекта. Особенности определений, связан-
ные с понятиями наследования, были подробно рассмотрены в предыду-
щем разделе. Альтернативой имени определяемого отношения является введение новой связки, операндные места которой ассоциируются с пара-
метрами этого отношения. Определение отношения со специальным, воз-
можно, индексированным именем EMPTY означает, что рассматривают-
ся только такие интерпретации, при которых правая часть такого опреде-
ления представляет пустое отношение. Специальный компонент определе-
ний – Импорт – позволяет использовать в определении не полностью ква-
лифицированные имена доменов и отношений. Перечисленные в этой кон-
струкции имена доменов задают для них возможные префиксные части
(контексты). Если один контекст является суффиксом другого, возможные конфликты разрешаются в пользу последнего, для несравнимых контек-
стов предпочтение отдается описанному в списке раньше.
Спец – спецификация описываемых имен отношений и подстановоч-
ных (формальных) параметров; спецификация дается либо в общей форме
(арность плюс свойства), либо использует специальные ключевые слова – спецификаторы.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 36
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
Перенос текста программы со строки на строку осуществляется с точ-
ностью до лексем, представленных в диаграммах отдельными овальными
блоками. Комментарии могут включаться в программу в конце любой
строки (возможно и пустой) через двойной разделитель « // ».
Ниже приводится сводная таблица знаков операций для всех видов
выражений в языке FLOGOL |
(знаки бинарных операций перечислены в |
|||||||||||
порядке уменьшения приоритетов). |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
Таблица 4.1 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
ВИД |
УНАРНЫЕ |
|
БИНАРНЫЕ ОПЕРАЦИИ |
|
||||||||
ВЫРАЖЕНИЯ |
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MO |
|
|
|
|
АрВыр |
|
|
|
|
* |
|
/ |
D |
- |
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЛогВыр |
NOT |
|
|
|
AND |
|
XOR |
OR |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
РелВыр |
~ |
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ДомВыр |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Терм |
|
|
|
|
, |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Формула |
|
|
|
|
& |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СпПар |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СпИнд |
|
|
|
|
, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Множ/СписЗнач |
|
|
|
|
|
|
\ |
, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В заключение отметим, что использование возможности программно-
го определения связок реляционных операций, в частности, с помощью графиков, вообще говоря, позволяет отказаться от включения встроенных префиксов, инфиксов и суффиксов, используемых в языке для построения реляционных выражений, что и показано в следующем разделе в качестве фрагмента системного модуля, по умолчанию являющегося предком всех остальных модулей.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 37
4.ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
4.4.Примеры программ на языке FLOGOL.
//Cистемный модуль, в котором определяются операции композиции
//направленных отношений.
MODULE RelComp
SecComp [9]_ _ {~ «0» ((, I 1.. «0» )[ I]x ) :
«1» ((, I 1.. «0» )[ I]x )} ;
ParComp [8]_# _ { (, I 1..«0» )[ I ]x ,(, J 1..«1» )[ J ] y :
«0» ((, I 1..«0» )[ I]x) ,«1» ((, J 1..«1» )[ J ]y)} ;
Concatenat ion [7]_ _ { (, I 1..«0» )[ I ]x :
«0» ((, I 1..«0» )[ I]x) ,«1» ((, I 1..«0» )[ I]x)} ; Unificatio n [6]_ _ { (, I 1..«0» )[ I ]x , (, J 1..«1» )[J] y :
(, K 1.. «0» )[ K ]z ? «0» ((, I 1.. «0» )[ I ]x)
(, K 1.. «0» )[ K ]z «1» ((, J 1..«1» )[ J ]y)} ;
Intersection [4]_ _ { (, I 1..«0» )[ I ]x : (, J 1.. «0» )[J] y ?
«0» ((, I 1..«0» )[ I]x) (, J 1.. «0» )[J]y
«1» ((, I 1..«0» )[ I]x)} ;
Union [3]_ _ { (, I 1.. «0» )[ I ]x :«0» ((, I 1.. «0» )[ I ]x) |
«1» ((, I 1.. «0» )[ I ]x) } ;
Inversion ~ _ { (, I 1.. «0» )[ I ]x : (, J 1.. «0» )[J ] y ?
«0» ((, J 1.. «0» )[J ] y ) (, I 1.. «0» )[ I ]x } ;
InputSet _ { (, I 1.. «0» )[ I ]x ?
«0» ((, I 1.. «0» )[ I ]x) (, J 1.. «0» )[J ] y} ;
OutputSet _ {: (, J 1.. «0» )[J ] y ?
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 38
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
«0» ((, I 1.. «0» )[ I]x ) (, J 1.. «0» )[J ] y}
//Cистемный модуль, в котором определяются часто используемые
//комбинаторные константы и конструкторы строк для стандартного
//набора из 256 символов.
MODULE Common ( RelComp)
ASSERTION
True {},
False False;
// |
другой вариант определения пустого отношения арности 0,0 : |
// |
False {?x x}; |
(K ..)(
|
K |
|
// определение константы |
|
: |
PREDICATE (K) |
[K]Exist {(,I 1..K)[I]x}; |
|
|
K |
|
// определение константы |
|
: |
TUPLE_TRANSPOSITION (K)
[K]Copy {(,I 1..K)[I]x : (,I 1..K)[I]x};
K
// определение константы :
RECONSTRUCTOR (K : K 2)
[K]Duble {(, I 1..K)[I]x: (, I 1..K)[I]x ,(, I 1..K)[I]x};
K
// определение константы :
TUPLE_SET (K) [K]Gen {: (, I 1..K)[I]x};
// определение константы K L :
(L ..) TUPLE_TRANSPOSITION (K L)
[K, L]Trans {(,I 1..K) [ I]x ,(,J 1..L) [ J ] y :
(, J 1..L) [ J ]y ,(,I 1..K) [ I]x} ;
K
// определение константы :
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 39
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
TUPLE_REFLECTION (K 2 : K)
[K]Unif {( , I 1..K)[I]x,(, I 1..K)[I]x : (, I 1..K)[I]x} ) ;
PROPERTY E1 [1]Exist ;
TRANSPOSITION C1 [1]Copy ;
// другой вариант определения C1 и Copy :
//TRANSPOSITION C1 {x:x} ;
//TUPLE_TRANSPOSITION (K)
//[K]Copy ( # I 1..K) C1 ;
RECONSTRUCTOR (1: 2) D1 [1]Duble ;
SET G1 [1]Gen ;
SUPER_RECONSTRUCTOR (2 : 2) T11 [1,1]Trans;
REFLECTION (2) U1 [1]Unif ;
OBJECT Empty ; // пустая строка
// присоединение I -го символа справа к строке:
( I .. 255) SUBSTITUTION [I]Char ;
TRANSITION Ch ( I ..255)[I]Char
END
//Домен, в котором определены базовые функции и базовые способы
//композиции функций в системе функционального программирования
//Дж. Бэкуса [11].
DOMAIN Backus(Com mon)
//Конструкторы данных:
OBJECT T,F, Null, Nil ;
SUBSTITUTION Succ ;
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 40