Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Брошюры / Брошюра FLOGOL.4 / Часть 4. ЯЗЫК ФУНКЦИОНАЛЬНО-ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ FLOGOL.doc
Скачиваний:
13
Добавлен:
28.06.2014
Размер:
1.2 Mб
Скачать

4 . Язык функционально-логического программирования высокого уровняflogol

  1. Язык функционально-логического программирования flogol

    1. Парадигмы функционального и логического программирования.

Давно прошли времена, когда программой называли алгоритм решения некоторой задачи. Полагая понятие задачи интуитивно понятным, попробуем дать более широкую трактовку термина «программирование».

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

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

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

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

Трансформационный стиль программирования предполагает, что программа – включающий всю информацию о задаче (в том числе и об исходном данном) элемент языка, на множестве всех элементов которого задано отношениередукции в форме системы правил (называемых также правилами переписывания). Элемент , к которому редуцируетсяи к которому не применимы правила редукции (говорят, чтонаходится внормальной форме относительно этих правил), рассматривается как результат решения задачи. Если система правил редукции обладает свойством Черча-Россера (конфлюэнтностью), то результат – единственный (если он вообще существует). Трансформационный стиль вычислений характерен для всех теоретических и практически используемых языков программирования, основу семантики которых представляет -исчисление.

Функциональный стиль программирования предполагает, что исходные данные и результаты решения задачи связаны функциональной зависимостью, описание которой, наряду с исходными данными, и составляет содержание программы. В частном случае, поиск вычислителем решения задачи может определяться как процесс редукции по системе правил, обладающей свойством Черча-Россера. Другой подход основан на представлении нужной функциональной зависимости в форме некоторой композиции базисных функций. В число допустимых способов композиции обычно включаются суперпозиция и оператор рекурсии. Основным достоинством функциональных программ является то, что в них не требуется описание процесса вычислений определяемых функций, уточнение которого осуществляет вычислитель. Согласованность структуры функциональной программы с композиционной структурой самой функции является хорошей основой для спецификации и верификации программ, для выбора эффективных путей реализации вычислений, в том числе и с использованием возможностей параллелизма в работе вычислителя. Обеспечение возможности передачи вычислителю дополнительной информации, вообще говоря, не являющейся необходимой для получения результата, позволяет вычислителю оптимизировать процесс вычислений и по времени вычислений, и по использованию ресурсов, что для общих моделей вычислений, как правило, представляется диалектическим противоречием. Следует отметить, что, к сожалению, известные языки функционального программирования по своему уровню поддержки современных технологий программирования существенно уступают основным языкам программирования общего назначения.

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

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