русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Примеры.


Дата добавления: 2013-12-23; просмотров: 756; Нарушение авторских прав


Примеры.

Пусть x = (1, 2, 3) y = (4, 5)

car(x) = (1);

cdr(х) = (2, 3);

cons(x,y) = ((1, 2, 3), 4, 5);

append(x,y) = (1, 2, 3, 4, 5).

 

Синтаксис LISP достаточно архаичный, поэтому воспользуемся способом записи функциональных программ с помощью специальной нотации, ставшей популярной с легкой руки Хендерсона.

Функция длвычисления длины списка

 

дл(х) º if(x) = nil then 0 else дл(cdr(x)) + 1

 

Вычислим функцию для конкретного списка.

дл(A, B, C) = дл(B, C) + 1

дл(B, C) = дл(C) + 1

дл(C) = дл(nil) + 1

дл (nil) = 0

"Пройдя" в обратном направлении можно получить числовое значение.

 

Обращение списка обр, то есть список A, B, C обратится в список C, B, A

 

обр(x, y) º if x = nil then y else обр(cdr(x), cons(car(x), y))

 

Вычислим функцию для конкретного списка

обр(A, B, C, nil) = обр((B, C), (A))

обр((B, C), (A)) = обр((C), (B, A))

обр((C), (B, A)) = обр((nil), C, B, A)

 

Здесь использован популярный прием функционального программирования "сумка". Это позволяет получить результат сразу, без обратного прохода.

 

Функциональный язык Бэкуса.

LISP, созданный в начале 60-х годов, не единственный функциональный язык, хотя и самый распространенный.

Интересный функциональный язык РЕФАЛ был разработан в 70-х годах нашим соотечественником Турчиным и исподльзовал математическую модель нормальных алгорифмов Маркова.

Но, пожалуй, наибольший резонанс у теоретиков программирования имел функциональный язык, предложенный Дж. Бэкусом 1979 году. Он был создан, одним из "отцов" фортрана не только как альтернатива Фортрану и всем прочим процедурным языкам, но в известной мере и как альтернатива LISP, синтаксис которого ориентировался на устаревшее представление об архитестуре компьютера, да и в области математической логики за тот период произошли заметные подвижки.



Следуя за Дж. Бэкусом сравним процедурный и функциональные стили программирования.

 

Пусть у нас есть фрагмент процедурной программы:

с := 0

for i := 1 to N do c := c + a[i] * b[j]

Беспристрастный, но строгий анализ показывает очевидные недостатки процедурного программирования:

1. Операторы работают с невидимыми значениями переменных.

2. Программа неиерархична (операторы одного уровня).

3. Программа динамична (чтобы её понять необходимо её выполнить).

4. Последовательно выполняются операции с отдельными элементами массива.

5. Часть данных находится в программе.

6. Программа называет свои операнды, предварительно их записав.

7. Отсутствует механизм сбора мусора - ненужные части программы продолжают находиться в памяти.

 

На языке, предложенном Бэкусом, та же самая задача решается проще:

 

(/+) ° (a*) ° T :

 

где

Т – транспозиция (проектирование),

° - композиция,

/ - вставка,

a - применить ко всем (applay to all)

это функциональные формы, они оперируют функциями

+ и * - традиционные функции.

Приведем пример выполнения этой программы:

(/+)°(a*)°T :<<1,2,3>,<6,5,4>>

кортеж из двух кортежей

(/+)°(a*): <<1,6>,<2,5>,<3,4>>

(/+): <6,10,12>

:28

 

Достоинства метода:

1. Нет невидимых данных.

2. Программа иерархична, т.к. есть не только функции, но и функциональные формы.

3. Статическое описание программы. Программа читается «за один проход».

4. Работаем сразу со всеми данными, а не с отдельными элементами.

5. В теле программы нет никаких данных.

6.В программе нет названий операндов.

7. Сбор мусора - программы и данные эволюционируют в процессе вычислений.

 

Принципиальное отличие функционального программирования от процедурного состоит в том, что функциональное программирование не требует от пользователя управления памятью.

 



<== предыдущая лекция | следующая лекция ==>
Функциональное программирование | Язык Пролог


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.052 сек.