К типизации лямбды с зависимыми типами (2)
Jun. 9th, 2008 12:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Отталкиваясь от полученной в прошлом посту просьбы, попытаюсь рассказать о Σ-типах.
Напомню, что Π-абстракция аналогична λ-абстракции, но производит не терм (зависящий от связанной абстракцией переменной), а тип (зависящий от связанной абстракцией переменной). В прошлом посту мы рассматривали терм a:A, который параметризовал семейство типов Ba - нижний индекс указывает на зависимость типа от терма. Если рассматривать функцию, принимающую значение типа A и возвращающую некоторого представителя ba:Ba, то получившаяся лямбда
Сам по себе знак Π описывает индексированное произведение типов. Когда тип B не зависит от термов типа A, Π-абстракция эквивалентна обычной функциональной стрелке
Предположим теперь, что мы хотим типизировать не функцию от a:A, у которой тип результата зависит от значения a, а пару, первым элементом которой служит значение a:A, а вторым значение ba:Ba с типом, зависящим от значения первого элемента пары. Наивная попытка типизации такой пары:
PS. Не следует искать глубокой философии в терминах сумма и произведение. Простая мнемоника груба, но действенна: пар из типов A и B мы можем образовать m(A)*m(B) штук, а функций из A в B - m(B)^m(A) штук, где m() возвращает число элементов в множестве ;-)
не может быть типизирована в обычной стрелочной нотации; способ
(λa:A.ba)
плох, поскольку не позволяет пометить связанность переменной a в типе. Решением и является Π-абстракция:
(λa:A.ba):(A → Ba)
В примере с типом списка заданной длины (см. предыдущий пост)
(λa:A.ba):(Πa:A.Ba)
(λn:Nat.replicate 'z' n):(Πn:Nat.ListOfChar n)
Сам по себе знак Π описывает индексированное произведение типов. Когда тип B не зависит от термов типа A, Π-абстракция эквивалентна обычной функциональной стрелке
Здесь функция для каждого значения a:A возвращает один и тот же тип B. Обозначение со степенью как раз и является маркером произведения. Чтобы задать функцию из типа A нам нужно задать возвращаемое значения одного и того же типа (B) столько раз, сколько "населения" есть в типе A. В общем, "зависимом", случае каждый сомножитель Ba уникален и запись со степенью (или стрелкой) не проходит.
Πa:A.B ≡ B^A ≡ (A → B)
Предположим теперь, что мы хотим типизировать не функцию от a:A, у которой тип результата зависит от значения a, а пару, первым элементом которой служит значение a:A, а вторым значение ba:Ba с типом, зависящим от значения первого элемента пары. Наивная попытка типизации такой пары:
терпит неудачу по той же самой причине, что и в случае функции: происхождение переменной a в типе не является частью типа. Π-абстракция тоже не годится - она описывает "произведение всех типов сразу", что необходимо при определении функции, но не пары. Для каждой из рассматриваемых пар, наоборот, достаточно всего одного конкретного зависимого типа. Поэтому вводят специальную нотацию (восходящую к размеченному объединению):
(a:A, ba:Ba):(A,Ba)
Происхождение значка суммы легко понять, посмотрев на простейший случай отсутствия зависимости. Если тип B не зависит от термов типа A, Σ-абстракция эквивалентна обычному декартову произведению
(a:A, ba:Ba):(Σa:A.Ba)
Это отражает тот факт, что B берется столько раз, сколько элементов в A. Что, как и следовало ожидать, совпадает с типом обычной, не-зависимой пары.
Σa:A.B ≡ A × B
PS. Не следует искать глубокой философии в терминах сумма и произведение. Простая мнемоника груба, но действенна: пар из типов A и B мы можем образовать m(A)*m(B) штук, а функций из A в B - m(B)^m(A) штук, где m() возвращает число элементов в множестве ;-)
no subject
Date: 2008-06-09 08:55 pm (UTC)Я не понимаю, откуда вылезает N^M.
no subject
Date: 2008-06-10 07:34 am (UTC)Сколькими способами можно это сделать? Пару a1 можно выбрать n способами (столько у нас разных b-шек); для каждого такого выбора пару a2 можно выбрать тоже n способами, и т.д (m раз). Получаем
штук различных функций можем смонтировать над заданными доменом и кодоменом.
no subject
Date: 2008-06-10 11:44 am (UTC)Где-то я слышал, что этимология примерно такова:
- Π является типом для ∀-выражений. Предикат ∀a:A.Ba можно представить как коньюнкцию Ba0∧Ba1∧Ba2∧...
∧ можно сравнить с произведением (в каком контексте, сказать не могу. В булевом кольце and вроде как произведение, но там с коньюнкцией нестыковка. Можно представить and и or как операции над множествами, но я не знаю как эта модель называется). Ну так вот, ∧ соответствует произведению, поэтому Π-тип называют зависимым произведением (dependent product);
- Σ — вроде как, тип для ∃-выражений. Предикат ∃a:A.Ba можно представить как Ba0∨Ba1∨Ba2∨...
∨ является аналогом суммы, поэтому Σ-тип называют зависимой суммой (dependent sum).
Если элементов в A слишком много, то коньюнкции и дизьюнкции получаются бесконечными. Не конструктивно.
Ходят легенды, что в стане интуиционистов Π и Σ-типы назывались иначе:
- с конструктивной точки зрения, предикат ∀a:A.Ba говорит о том, что у нас есть способ построения объекта Ba для каждого объекта a∈A. Т.е. есть некоторая функция из A в Ba. А Πa:A.Ba — обобщение функционального типа. Поэтому его называют зависимым функциональным типом dependent function type;
- ∃a:A.Ba значит, что у нас есть пара: объект a∈A и объект Ba (который мы смогли построить из а). Поскольку пара является элементом произведения двух множеств, то Σ-тип называют зависимым произведением dependent product (ага, в первом варианте было совсем наоборот).
Вроде, как-то так.
no subject
Date: 2008-06-10 11:52 am (UTC)