Часть 4. Язык функционально-логического программирования FLOGOL
.pdf4. ЯЗЫК ФУНКЦИОНАЛЬНО- ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ FLOGOL
4. ЯЗЫК ФУНКЦИОНАЛЬНО- ЛОГИЧЕСКОГО ПРО-
ГРАММИРОВАНИЯ FLOGOL
4.1.Парадигмы функционального и логического программирова-
ния.
Давно прошли времена, когда программой называли алгоритм реше-
ния некоторой задачи. Полагая понятие задачи интуитивно понятным, по-
пробуем дать более широкую трактовку термина «программирование».
Программирование – деятельность (профессиональная, научно-
обоснованная или творческая), целью которой является представле-
ние задачи в форме, допускающей ее дальнейшее автоматическое ре-
шение конкретным вычислителем.
Таким образом, мы полагаем, что необходимая для решения задачи информация произвольным образом распределяется между программой и вычислителем. Конкретизируя понятие задачи до представления о суще-
ствовании «исходных данных» и «результатов» ее решения, попробуем с позиций их взаимосвязи кратко охарактеризовать основные, разумеется,
абстрактные стили программирования.
Пусть исходные данные представлены на языке L I , а результаты ре-
шения на языке LO (языком мы называем конструктивно заданное под-
множество формальных конструктивных объектов).
Алгоритмический стиль программирования предполагает, что про-
грамма представляет собой непосредственно воспринимаемую вычислите-
лем пару – исходного данного a L I и конструктивно заданного описа-
ния на языке L (в общем случае частичного) оператора |
a |
на множестве |
|||||||||
|
|
|
I |
|
O L , где |
|
I |
|
|
|
|
элементов языка |
L , такого, что |
L |
L |
L |
и |
L I , |
LO и LO |
||||
связаны между |
собой конструктивно определенными |
взаимно- |
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
однозначными соответствиями. Последовательность элементов |
a0 , a1 ,...,an |
|||
языка L |
называется процессом вычисления для |
a a0 L I с результатом |
||
an LO , |
если для всех i 0.. n 1 |
ai 1 a (ai ) |
и для всех |
j 1.. n 1 |
a j LO . |
Алгоритмический стиль программирования поддерживает боль- |
шинство языков программирования общего назначения, различающихся сложностью языков L и L .
Трансформационный стиль программирования предполагает, что про-
грамма – включающий всю информацию о задаче (в том числе и об исход-
ном данном) элемент a языка L , на множестве всех элементов которого задано отношение редукции в форме системы правил (называемых также правилами переписывания). Элемент b L , к которому редуцируется a и
к которому не применимы правила редукции (говорят, что b находится в
нормальной форме относительно этих правил), рассматривается как ре-
зультат решения задачи. Если система правил редукции обладает свой-
ством Черча-Россера (конфлюэнтностью), то результат – единственный
(если он вообще существует). Трансформационный стиль вычислений ха-
рактерен для всех теоретических и практически используемых языков про-
граммирования, основу семантики которых представляет -исчисление.
Функциональный стиль программирования предполагает, что исход-
ные данные и результаты решения задачи связаны функциональной зави-
симостью, описание которой, наряду с исходными данными, и составляет содержание программы. В частном случае, поиск вычислителем решения задачи может определяться как процесс редукции по системе правил, об-
ладающей свойством Черча-Россера. Другой подход основан на представ-
лении нужной функциональной зависимости в форме некоторой компози-
ции базисных функций. В число допустимых способов композиции обычно включаются суперпозиция и оператор рекурсии. Основным достоинством функциональных программ является то, что в них не требуется описание
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 2
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
процесса вычислений определяемых функций, уточнение которого осу-
ществляет вычислитель. Согласованность структуры функциональной про-
граммы с композиционной структурой самой функции является хорошей основой для спецификации и верификации программ, для выбора эффек-
тивных путей реализации вычислений, в том числе и с использованием возможностей параллелизма в работе вычислителя. Обеспечение возмож-
ности передачи вычислителю дополнительной информации, вообще гово-
ря, не являющейся необходимой для получения результата, позволяет вы-
числителю оптимизировать процесс вычислений и по времени вычисле-
ний, и по использованию ресурсов, что для общих моделей вычислений,
как правило, представляется диалектическим противоречием. Следует от-
метить, что, к сожалению, известные языки функционального программи-
рования по своему уровню поддержки современных технологий програм-
мирования существенно уступают основным языкам программирования общего назначения.
Логический стиль программирования является в этом ряду еще более привлекательным. Действительно, предполагается, что в логической про-
грамме содержится только информация о необходимых свойствах ожидае-
мых результатов вычислений по отношению к исходным данным. В про-
цессе доказательства существования объектов с необходимыми свойства-
ми происходит и построение самих этих объектов – произвольного приме-
ра или перечисление всех возможных. Проблемы верификации логических программ не существует, от программиста требуется только грамотная формулировка задачи, а основную нагрузку по получению решения берет на себя вычислитель. Однако, во-первых, во много раз более остро стоит проблема эффективности исполнения логических программ, и к этому есть принципиальные предпосылки. В перспективе, конечно, для повторного решения подобных задач можно будет автоматически использовать уже
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 3
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
один раз найденное функциональное или даже алгоритмическое описание решения, хотя о существующих на сегодняшний день подобных реализа-
циях автору не известно. Во-вторых, существуют принципиальные ограни-
чения на сложность логического языка, для которого вообще возможна эффективная процедура доказательства и извлечения из него решения, не говоря уже о построении модели для произвольной логической формулы этого языка. На сегодня планка стоит на уровне языка исчисления преди-
катов первого порядка, и вряд ли стоит ожидать принципиальных измене-
ний. Основное ограничение, конечно, не в том, что в этом языке допустимо применение кванторов только по индивидным переменным, а в том, что рассматриваются только ограниченный класс интерпретаций функцио-
нальных и предикатных символов – как всюду определенных функций и предикатов. Развитие логического стиля программирования представляет-
ся не только в интеграции с более «приземленными» стилями программи-
рования, но и в разработке потенциально неограниченного числа специ-
альных логических языков с полуразрешимой проблемой строгого или, по крайней мере, «правдоподобного» доказательства.
Теория направленных отношений предоставляет возможности едино-
образного выражения логических формул, схем функций и отношений, со-
ставляющих основу построения и логических языков, и языков описания вычислимых функций. Предложенные модели вычислений и механизмы логического вывода являются теоретически подкрепленной основой реали-
зации рассматриваемого далее языка функционально-логического про-
граммирования, опирающегося на понятие направленного отношения.
4.2.Общие принципы построения языка функционально-
логического программирования FLOGOL.
Язык функционально-логического программирования FLOGOL
(Function and LOGic Oriented Language) предназначен для сложных рекур-
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 4
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
сивных определений систем функций, предикатов и других математиче-
ских объектов некоторой предметной области с целью их логического ана-
лиза и вычислений.
Центральной идеей построения на базе языка FLOGOL системы функционально-логического программирования является представление основных семантических объектов как направленных отношений. На тео-
рию направленных отношений опирается и реализация системы.
Язык построен с использованием ряда основных архитектурных и технологических решений, характерных для современных развитых языков программирования. Ниже приводится их краткая неформальная характери-
стика, имеющая своей целью создать общее впечатление о языке
FLOGOL .
1.Модульная структура. Информационная среда программирования на языке FLOGOL представляет собой библиотечную архитектуру, эле-
менты которой называются FLOGOL -модулями и в которой поддер-
живается обычный набор функций – создание, редактирование, удале-
ние и т.д. отдельных модулей. Модули представлены в библиотеке в не-
скольких взаимосвязанных формах:
-в виде текстов на языке FLOGOL (исходных модулей), для обработ-
ки которых используется специализированный текстовый редактор;
-в «графическом» представлении (в виде графических модулей);
связь с графическими модулями осуществляется через оригиналь-
ный экранный редактор, построенный с учетом особенностей сете-
вого представления направленных отношений. Эта форма представ-
ления, с одной стороны, отражает иерархическую структуру моду-
лей с учетом «видимости» объектов, а, с другой стороны, при опре-
делении d -отношений в форме графиков (см. далее) непосред-
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 5
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
ственно использует сетевое представление таких отношений, что позволяет еще на этапе определения d -отношений выполнять опе-
рации подстановки, последовательной и параллельной композиции для представляющих эти отношения сетей;
-в форме специальных кодов (объектных модулей), полученных раз-
дельной компиляцией исходных модулей или конструируемых в процессе использования экранного графического редактора и пред-
ставляющих собой процедуры, участвующие в выполнении так называемых запросов к системе.
Заметим, что первые две из указанных форм представления являют-
ся взаимно конвертируемыми. Как уже отмечалось, оконечной задачей модулей является описание, как правило, рекурсивное, направленных отношений, представляющих конкретные математические объекты не-
которой предметной области. Их внутреннее представление формиру-
ется на основе запроса к FLOGOL -системе программирования и пред-
полагает сетевое задание требуемого направленного отношения в фор-
ме сетевой КС-грамматики.
Между модулями имеется отношение частичного порядка, устанав-
ливаемое при их описании путем задания для каждого модуля списка модулей-«родителей», так что при определении объектов модуля все его модули-«предки» оказываются в области «видимости».
2.Иерархическая структура F L O G O-Lпрограмм. Синтаксически модули программы представляют собой специальные языковые конструкции с иерархической структурой, определенные в форме одного или двух до-
менных выражений (синтаксически определяемых нетерминальным символом ДомВыр), разделенных ключевым словом WHERE и до-
пускающих неограниченную глубину вложенности. Для инкапсуляции этих конструкций используются специальные скобки DOMAIN – END.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 6
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
Инкапсулированные конструкции (домены) получают имена, которые используются для внешнего по отношению к домену вызова описанных в нем объектов (с использованием квалифицированных имен), причем доступными для внешних вызовов являются только объекты, описан-
ные в первом из доменных выражений. Объекты, описанные во втором доменном выражении (после WHERE) доступны только для прямого вызова изнутри самого домена. В остальном доменная структура моду-
ля определяет видимость объектов внутри модуля общепринятым обра-
зом. Доменное выражение задает множество описаний – направленных отношений (точнее, схем направленных отношений) и вложенных до-
менов.
3.Виды описаний направленных отношений. В языке допускаются два вида описаний – объявление и определение направленного отношения.
Первый вариант предполагает, что объявленное отношение является первичным (или, с позиций средств конструирования отношений, его имя является терминальным символом) и интерпретация объявленного имени либо задается внешним по отношению к языку FLOGOL спосо-
бом (на это указывает ключевое слово EXT; как правило, это – функ-
циональные отношения и для их интерпретации используются храня-
щиеся в специальных библиотеках подпрограммы вычисления выход-
ного набора данных по заданному входному), либо принимается стан-
дартной – как конструктора или реконструктора на эрбрановском универсуме. Второй вариант – определение – вводит новое уравнение,
точнее, новую схему уравнений в рекурсивную систему определений,
т.е. имя этого отношения рассматривается как реляционная переменная
(нетерминальный символ).
4.Спецификация отношений. Все описываемые отношения явно или неяв-
но специфицируются. Явная спецификация может быть представлена в
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 7
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
общей форме или с использованием особых спецификаторов. Общая форма спецификации предполагает задание арности отношения (в виде заключенных в круглые скобки и разделенных двоеточием двух арифме-
тических выражений с возможными натуральными значениями) и, опци-
онно, свойств тотальности и функциональности самого описываемого и обратного ему отношений. Наличие указанных свойств отмечается знаками «+» в определенных позициях (тотальность – после открываю-
щей скобки, функциональность – перед двоеточием, функциональность обратного отношения – после двоеточия, тотальность обратного отно-
шения – перед закрывающей скобкой). На рис. 4.1 приведена таблица спецификаторов отношений и для каждого спецификатора приведена эк-
вивалентная спецификация в общей форме.
СПЕЦИФИКАТОР |
СПЕЦИФИКА- |
|
ЦИЯ |
||
|
||
|
|
|
ASSERTION |
(0 : 0) |
|
|
|
|
PROPERTY |
(1 : 0) |
|
|
|
|
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) |
|
|
|
|
|
|
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 8
4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
|
|
SUPER_CONSTRUCTOR (m) |
( m : 1 ) |
|
|
CONSTRUCTOR (m) |
( m : 1) |
|
|
FUNCTION (m) |
( m :1) |
|
|
REFLECTION (m) |
(m :1) |
|
|
SUPER_RECONSTRUCTOR |
( m : n ) |
|
|
(m, n) |
( m : n) |
RECONSTRUCTOR (m, n) |
|
TUPLE_FUNCTION (m, n) |
( m : n) |
|
|
TUPLE_REFLECTION (m, n) |
(m : n) |
|
|
RELATION (m, n) |
(m : n) |
|
|
Рис. 4.1. Таблица спецификаторов отношений в языке FLOGOL.
5.Способы определения направленных отношений. Возможны два спосо-
ба определения направленных отношений – композиционный и аппли-
кативный. Композиционное определение дается в форме реляционного выражения (РелВыр – соответствующее синтаксическое понятие), за-
дающего направленное отношение как композицию отношений, пред-
ставленных терминальными и нетерминальными символами, и исполь-
зующую в качестве базовых операций последовательную и параллель-
ную композиции, объединение и пересечение отношений, а также обра-
щение направленного отношения. Аппликативный способ определяет направленное отношение непосредственно как график этого отношения.
При этом, в общем случае, с этой целью задаются термы (переменные термов локализованы внутри соответствующего графика), описываю-
щие входные и выходные кортежи элементов определяемого отноше-
ния, т.е. возможные разметки входных и выходных точек в сетевом представлении отношения. В описание графика может входить логиче-
ская формула, описывающая ограничения на значения переменных в термах, которые вносятся элементами представляющей отношение сети,
не связанными непосредственно с описанием ее входов и выходов.
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 9
4.ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ FLOGOL
6.Имена всех объектов описания – доменов и отношений – могут быть индексированы. Наборы индексов могут отличаться как количеством индексов, так и их значениями, в качестве которых используются нату-
ральные числа. Вычисляющие индексы арифметические выражения за-
писываются через запятые в квадратных скобках перед именем описы-
ваемого объекта. Использование в качестве индексов арифметических выражений и операторов свертки в доменных выражениях позволяет описывать сразу множество объектов, имена которых при одном и том же идентификаторе могут отличаться наборами индексов. Использова-
ние операторов свертки при определении списка индексов позволяет создавать списки индексов, длина которых зависит от параметров свертки.
7.Повторное описание непосредственно в одном домене (описания во вложенных доменах не учитываются) объекта – отношения или домена
– с одним и тем же именем, т.е. с тем же идентификатором и тем же
набором индексов, рассматривается как продолжение этого описания.
Для отношений правые части всех таких определений полагаются неяв-
но связанными операцией объединения отношений. Для доменов мно-
жества описанных в них объектов неявно объединяются в один домен
(раздельно – видимые извне и скрытые – части доменов с одним и тем же именем), в результате чего вновь могут возникнуть повторные опи-
сания объектов и т.д.
8.Все определяемые отношения и домены могут быть параметризованы.
Имена формальных параметров – стандартные: порядковые номера па-
раметров (нумерация с нуля) в уголковых кавычках. Фактическими зна-
чениями параметров могут быть только конкретные отношения. Ин-
формация о параметрах размещается при описании объекта после иден-
тификатора в квадратных скобках. Формальные параметры могут быть
FLOGOL: ЯЗЫК И СИСТЕМА ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ 10