
- •Лекция 5. Ламбда-исчисление как формализация языка функционального программирования
- •5.2. Аксиомы ламбда-исчисления
- •5.2.1. Конвертируемость
- •6.1. Понятие комбинатора
- •6.2. Комбинаторная логика как формальная система
- •6.2.1. Правила конструирования допустимых для заданного алфавита комбинаторных выражений (термов).
- •6.2.2. Аксиомы комбинаторной логики
- •6.2.3.Умолчания
- •6.2.4. Синтаксис выражений комбинаторной логики
- •6.2.5. Редукция комбинаторных термов
- •6.2.6. Базис термов
- •7.1. Определение типов
- •7.2. Аксиомы вывода типа комбинатора
- •7.3. Типизация выражений в sml
- •7.3.1. Схема типизации
- •7.3.2. Выводимость типов
- •7.3.3. Полиморфная типизация
- •7.4. Преимущества типизации
- •7.5. Применение типизации
- •7.5.1. Статическая типизация
- •7.5.2. Полимофная типизация
- •7.6. Управление типами в технологии .Net
7.1. Определение типов
Определение 7.1. Типом (сортом) называют относительно устойчивую и независимую совокупность элементов, которую можно выделить во всем рассматриваемом множестве (предметной области).
Заметим, что разделение элементов предметной области на типы или сорта во многом является условным и носит субъективный характер, т.к. зависит от эксперта в этой области.
Тип, подобно множеству, может определяться двумя способами.
1. Определение типа посредством явного перечисления всех элементов, принадлежащих типу (заметим, что такой подход применяется и в математике, и в программировании, где существуют так называемые перечислимые типы).
2. Определение типа T путем формализации общих свойств тех элементов d из предметной области D, которые объединяются в этот тип, посредством задания индивидуализирующей предикатной функции Ψ, значение которой истинно, если элемент принадлежит данному типу и ложно в противном случае:
T = {d: D|Ψ}.
При более формальном подходе к теории типов и типизации в связи с исчислением ламбда-конверсий следует определить чистую систему типов.
Определение 7.2. Чистой системой типов называется семейство ламбда-исчислений, в которых каждый элемент характеризуется тройкой
<S, A, R>,
где:
S - подмножество констант, называемых сортами;
A - множество аксиом вида c:s, где с является константой, а s является сортом;
R - множество троек сортов, определяющих возможные функциональные пространства и их сорта для системы.
Далее введем обозначение, характеризующее то обстоятельство, что тот или иной объект является типизированным, или, иначе говоря, что тому или иному объекту приписан тип.
В частности, для ламбда-терма M приписывание ему типа T обозначим как
#M ||- T
и будем в таком случае говорить, что ламбда-терм M имеет тип T.
При более общем подходе, который верен и для математики, и для программирования, система типов формируется следующим образом.
1. Задается множество базисных типов (обозначим их символами d1 , d2 , и так далее).
2. Примем соглашение, что всякий базисный тип считается типом.
3. Условимся, что если a и b считаются типами, то функция из a в b также считается типом и при этом имеет тип a→b.
Заметим, что в основе теории типов лежит принцип иерархичности, который заключается в том, что производные типы содержат базисные как подмножества.
Этот принцип построения справедлив и для языков программирования. В частности, иерархии классов в объектно-ориентированных языках программирования формируются аналогично приведенному выше построению математической системы типов.
7.2. Аксиомы вывода типа комбинатора
Для иллюстрации построения теории типов расширим комбинаторную логику операцией приписывания типа.
Напомним аксиомы комбинаторной логики, задающие свойства отношения конвертируемости:
Аксиома (I) |
Ix = x |
существования комбинатора (функции) тождества, т.е. наличие тождественного преобразования, при котором любой аргумент отображается сам в себя |
Аксиома(K) |
Kxy = x |
существование комбинатора (функции) взятия первой проекции, т.е. первого элемента упорядоченной пары или первого элемента списка* |
Аксиома (S) |
Sxyz = xz(yz) |
попарного связывания третьего элемента с первыми двумя |
*Интуитивно ясно, что эта аксиома близка языкам функционального программирования, оперирующим списками, и соответствует фундаментальной операции взятия головного (первого) элемента списка.
В случае комбинаторной логики будем считать, что тип a приписан комбинатору X тогда и только тогда, когда это утверждение получено из следующих аксиом (||- «имеет тип»):
(FI) ||- #(I) = (a,a), тип тождества
(FK) ||- #(K) = (a,(b,a)) = (a,b,a), тип канцелятора
(FS) ||- #(S) = ((a,(b,c)), ((a, b)(a,c))) тип связывания (коннектора)
и правила вывода типа
(F) если ||- #(X) = (a,b) и ||- #(U) = a,
то ||- #(XU) = b.
Заметим, что процедура контроля соответствия типов транслятора языка программирования реализована сходным образом, причем в ней используется механизм сопоставления с образцом.