Информатика. Курс лекций. Громов Ю.Ю - 112 стр.

UptoLike

Основной трудностью в разработке декларативных языков программирования является выбор базового алгоритма ре-
шения задач. По этой причине ранние декларативные языки были узкоспециализированными по своей природе и ориентиро-
ванными на специфические приложения. Например, декларативный подход уже многие годы применяется для моделирова-
ния систем (экономических, физических, политических и т.п.) в целях проверки выдвинутых гипотез. В этом случае базовый
алгоритм, в сущности, является процессом моделирования течения времени посредством многократно повторяющегося вы-
числения значений параметров (роста внутреннего продукта, торгового дефицита и т.д.) исходя из вычисленных ранее зна-
чений. Использование декларативного языка для выполнения такого моделирования сводится, прежде всего, к реализации
алгоритма, выполняющего указанную повторяющуюся процедуру. В результате программисту остается лишь описать взаи-
моотношения моделируемых параметров. Далее базовый алгоритм моделирования просто имитирует течение времени, ис-
пользуя указанные соотношения для выполнения требуемых вычислений.
Не так давно декларативная парадигма нашла свое новое применениеблагодаря осознанию того факта, что примене-
ние методов математической формальной логики позволяет создавать простые алгоритмы решения задач, подходящие для
использования в системах декларативного программирования общего назначения. Результатом пристального внимания уче-
ных к декларативной парадигме явилось появление дисциплины логического программирования, которое будет обсуждаться
в разделе 5.7.
Функциональная парадигма (functional paradigm) рассматривает процесс разработки программ как конструирование ее
из неких "черных ящиков", каждый из которых получает некоторые исходные данные (на входе) и вырабатывает соответст-
вующий результат (на выходе). Математики называют такие "ящики" функциями, поэтому этот подход называется функцио-
нальной парадигмой. Языковые конструкции функциональных языков программирования состоят из элементарных функций,
на основе которых программист должен создавать более сложные функции, необходимые для решения поставленной задачи.
Таким образом, согласно функциональной парадигме, программист решает задачу, рассматривая исходные данные, требуе-
мые результаты и преобразование, которое необходимо выполнить, чтобы получить результаты из исходных данных. Реше-
ние требуемой задачи, вероятнее всего, можно получить, разбивая исходное преобразование на более простые преобразова-
ния, порождающие промежуточные результаты, служащие, в свою очередь, исходными данными для других простых преоб-
разований. Короче говоря, в соответствии с функциональной парадигмой процесс программирования заключается в конст-
руировании требуемых функций в виде вложенных друг в друга совокупностей более простых функций.
Например, на рис. 5.3 показано, как можно построить функцию вычисления среднеарифметического нескольких чисел
из трех более простых функций. Первая из нихSum получает на вход список чисел и вычисляет их сумму; вторая
Countполучает список чисел и подсчитывает их количество; третьяDivideполучает на вход два числа и вычисляет
их частное. На языке LISP (популярном функциональном языке программирования) эта конструкция может быть записана в
виде следующего выражения:
(Divide (Sum Numbers) (Count Numbers))
Использование в этом выражении вложенных структур отражает, что исходные данные для функции Divide являются
результатами выполнения функций Sum и Count. В качестве другого примера предположим, что у нас есть функция Sort,
которая сортирует список чисел, и функция First, которая находит первое число в этом списке. В этом случае приведенное
ниже выражение позволяет извлечь из списка List наименьшее из чисел:
(First (Sort List))
Рис. 5.3. Функция вычисления среднеарифметического для списка чисел, построенная из более простых функций Sum, Count и
Divide
В данном случае использование вложенных структур означает, что результат функции Sort является исходной инфор-
мацией для функции First. Таким образом, список сначала сортируется, а затем из отсортированного списка извлекается