- •Введение
- •Понятие функционального программирования
- •Языки функционального программирования
- •Лямбда-исчисление Введение в лямбда-исчисление
- •Алонсо Черч
- •Иллюстрация ромбического свойства на примере
- •Прикладные лямбда-исчисления
- •Данные и выражения языка Lisp. Понятия списков и атомов, вычисление функций.
- •Организация памяти Lisp-машины
- •Функции проверки типов и логические функции
- •Манипуляция элементами списков
- •Основные конструкции Лямбда - выражения и пользовательские функции
- •Последовательности вычислений
- •Условные операторы и циклы
- •Рекурсия
- •Проверка на вхождения атома в список
- •Удаление из списка n-ного элемента
- •Добавление в список элемента в позицию n
- •Функционалы
- •Макросы
- •Ввод и вывод
- •Типы данных Иерархия типов
- •Символы
- •Последовательности
- •Массивы
- •Структуры
- •Лабораторные работы Лабораторная работа 1
- •Лабораторная работа 2
- •Лабораторная работа 3
- •Дана схема метрополитена, найти кратчайший путь между станциями.
- •Игра в 15.
- •Задача о 8-ми ферзях.
- •Задача о 8-ми ферзях 2.
- •Задача о Ханойской башне.
- •Задача о составлении расписания
- •Раскрасить плоскую карту четырьмя цветами, так что бы любые две смежные области не были окрашены в один цвет
- •Задача о коммивояжере.
- •Лабораторная работа 4
Е
Иллюстрация ромбического свойства на примере
Прикладные лямбда-исчисления
Прикладное лямбда-исчисление отличается от чистого тем, что в него вводится набор констант c, характеризующий данную предметную область. В этом случае грамматика лямбда-выражения такова:
M = c | x | (M1 M2) | (x.M)
Константы иногда представляют в постфиксной форме, например, X’ = ’(X) или A + B = (A +) B = ((+ A) B). Здесь следует понимать, что + является константой прикладного лямбда-исчисления.
В виду того, что прикладные лямбда-выражения обладают специфичными для предметной области зависимостями, вводят понятие сигма-редукции, которая преобразует константы исчисления. Данные и значения обычно ни к чему не редуцируются (т.е. редуцируются сами к себе).
Рассмотрим пример прикладного лямбда-исчисления. Определим следующий набор констант: true false if not and or eq 0 next plus. Определим правила сигма-редукции(предметные правила).
Правило |
Комментарий |
not true false |
Данные правила частично являются стандартными правилами математической логики, частично – арифметики, при соблюдении следующих условий. Под not следует понимать инверсию, or – дизъюнкцию, and – конъюнкцию. True и false соответствуют логическим единице и нулю. Оператор If может быть представлен более сложным образом, например в виде (or (and x y (not a)) (and y (not x) (not a)) (and a x (not y)) ( and a x y))3. eq является выражением эквивалентности, а 0 – числом 0. plus представляет собой сложение, next - инкремент |
not false true |
|
or false x x |
|
or x false x |
|
or x true true |
|
or true x true |
|
if true x y x |
|
if false x y y |
|
and false x false |
|
and x false false |
|
and x true x |
|
and true x x |
|
eq true true true |
|
eq false false true |
|
eq true false false |
|
eq false true false |
|
eq 0 0 true |
|
eq (next x) 0 false |
|
eq 0 (next x) false |
|
eq (next x) (next y) eq x y |
|
plus 0 x x |
|
plus (next x) y next (plus x y) |
Большая часть данных правил соответствует обычной математической логике. В свете этого можно следующий пример, записанный в терминах языка Паскаль, вычислить с помощью лямбда-исчисления:
if 1+1=2 then return A else return B
if (eq (plus (next 0) (next 0)) (next (next 0))) A B =>
if (eq (next (plus 0 (next 0)) (next (next 0))) A B =>
if (eq (next (next 0)) (next (next 0))) A B=>
if (eq (next 0) (next 0)) A B =>
if (eq 0 0) A B=>
if true A B =>
A
