Введение

В математической логике и теории типов, λ-куб (также называемый кубом лямбда) — это фреймворк, предложенный Хенком Барендрегтом для исследования различных измерений, в которых исчисление конструкций является обобщением просто типизированного λ-исчисления. Каждое измерение куба соответствует новому виду зависимости между термами и типами. Здесь под "зависимостью" понимается способность терма или типа связывать терм или тип. Соответствующие измерения λ-куба следующие:

Ось x: типы, способные связывать термы, что соответствует зависимым типам. Ось y: термы, способные связывать типы, что соответствует полиморфизму. Ось z: типы, способные связывать типы, что соответствует (связывающим) операторам типов. Различные комбинации этих трех измерений дают 8 вершин куба, каждая из которых соответствует определенному типу системы. λ-куб может быть обобщен до концепции системы чистых типов.

(λ→) Простой тип ламбда-расчета

Самая простая система, обнаруженная в λ-кубе, — это ламбда-исчисление с простой типизацией, также называемое λ→. В этой системе единственный способ построить абстракцию — это сделать один член зависимым от другого, с правилом типизации:

(λω) Система Fω

В системе F введена конструкция для предоставления типов, зависящих от других типов. Это называется конструктором типа и обеспечивает способ построения "функции, принимающей тип в качестве значения". Примером такого конструктора типа является тип двоичных деревьев с листьями, помеченными данными заданного типа: , где "" неформально означает "является типом". Это функция, которая принимает параметр типа в качестве аргумента и возвращает тип значений типа . В конкретном программировании эта возможность соответствует способности определять конструкторы типов внутри языка, а не рассматривать их как примитивы. Предыдущий конструктор типа примерно соответствует следующему определению дерева с помеченными листьями в OCaml: type 'a tree = | Leaf of 'a | Node of 'a tree * 'a tree.

Этот конструктор типа может быть применен к другим типам для получения новых типов. Например, для получения типа деревьев целых чисел: type int tree = int tree.

Система F обычно не используется самостоятельно, но полезна для выделения независимой особенности – конструкторов типов.

(λP) Ламбда-П

В системе λP, также называемой ΛΠ, и тесно связанной с логической структурой LF Logical Framework, существуют так называемые зависимые типы. Это типы, которым разрешено зависеть от термов. Ключевое правило введения в системе имеет вид

где обозначает допустимые типы. Новый конструктор типа соответствует, посредством изоморфизма Карри-Говарда, универсальному квантору, а система λP в целом соответствует логике первого порядка, где единственным связующим элементом является импликация. Примером таких зависимых типов в конкретном программировании является тип векторов заданной длины: длина является термом, от которого зависит тип.

(λω) Система Fω

Система Fω объединяет конструктор системы F и конструкторы типов из системы F. Таким образом, система Fω обеспечивает наличие как термов, зависящих от типов, так и типов, зависящих от типов.

λ2

В λ2 такие термы могут быть получены как с помощью. Если интерпретировать как универсальную квантификацию, то, благодаря изоморфизму Карри-Ховарда, это можно рассматривать как доказательство принципа взрыва. В общем случае, λ2 добавляет возможность иметь импредикативные типы, такие как , то есть термы, квантифицирующие по всем типам, включая сами себя. Полиморфизм также позволяет конструировать функции, которые не были построимы в λ→. Более точно, функции, определимые в λ2, – это те, которые доказуемо тотальны в арифметике Пеано второго порядка. В частности, все примитивно рекурсивные функции определимы.

λP

В λP возможность задавать типы, зависящие от термов, позволяет выражать логические предикаты. Например, следующее является выводимым: что соответствует, посредством изоморфизма Карри-Говарда, доказательству. С вычислительной точки зрения, однако, наличие зависимых типов не увеличивает вычислительную мощность, а лишь возможность выражать более точные типовые свойства. Правило конверсии (или правило преобразования) крайне необходимо при работе с зависимыми типами, поскольку оно позволяет выполнять вычисления над термами внутри типа. Например, если у вас есть и , вам необходимо применить правило конверсии (или правило преобразования), чтобы получить и, таким образом, иметь возможность определить тип .

λω

В λω определим следующий оператор, то есть, вывод можно получить уже в λ2, однако полиморфный оператор может быть определен только при наличии правила . С точки зрения вычислительных возможностей, λω чрезвычайно мощна и рассматривается как основа для языков программирования.