Типовые системы |
---|
Общие понятия |
Основные категории |
|
Второстепенные категории |
В информатике и логике зависимый тип — это тип, определение которого зависит от значения. Это перекрывающаяся особенность теории типов и систем типов . В интуиционистской теории типов зависимые типы используются для кодирования квантификаторов логики , таких как «для всех» и «существует». В функциональных языках программирования, таких как Agda , ATS , Coq , F* , Epigram , Idris и Lean , зависимые типы помогают уменьшить количество ошибок, позволяя программисту назначать типы, которые еще больше ограничивают набор возможных реализаций.
Два распространенных примера зависимых типов — зависимые функции и зависимые пары . Тип возвращаемого значения зависимой функции может зависеть от значения ( а не только типа) одного из ее аргументов. Например, функция, которая принимает положительное целое число , может возвращать массив длины , где длина массива является частью типа массива. (Обратите внимание, что это отличается от полиморфизма и обобщенного программирования , оба из которых включают тип в качестве аргумента.) Зависимая пара может иметь второе значение, тип которого зависит от первого значения. Придерживаясь примера с массивом, зависимая пара может использоваться для сопряжения массива с его длиной безопасным для типов способом.
Зависимые типы добавляют сложности к системе типов. Решение о равенстве зависимых типов в программе может потребовать вычислений. Если в зависимых типах допускаются произвольные значения, то решение о равенстве типов может включать решение о том, производят ли две произвольные программы одинаковый результат; следовательно, разрешимость проверки типов может зависеть от семантики равенства данной теории типов, то есть от того, является ли теория типов интенсиональной или экстенсиональной . [1]
В 1934 году Хаскелл Карри заметил, что типы, используемые в типизированном лямбда-исчислении и в его комбинаторном логическом аналоге, следовали той же схеме, что и аксиомы в пропозициональной логике . Идя дальше, для каждого доказательства в логике существовала соответствующая функция (терм) в языке программирования. Одним из примеров Карри было соответствие между просто типизированным лямбда-исчислением и интуиционистской логикой . [2]
Логика предикатов является расширением пропозициональной логики, добавляя квантификаторы. Говард и де Брейн расширили лямбда-исчисление, чтобы соответствовать этой более мощной логике, создав типы для зависимых функций, которые соответствуют «для всех», и зависимые пары, которые соответствуют «существует». [3]
Благодаря этой и другим работам Говарда, предложения как типы известны как соответствие Карри–Говарда .
Грубо говоря, зависимые типы похожи на тип индексированного семейства множеств . Более формально, если задан тип в универсуме типов , можно иметь семейство типов , которое назначает каждому термину тип . Мы говорим, что тип изменяется в зависимости от .
Функция, тип возвращаемого значения которой меняется в зависимости от ее аргумента (т.е. не существует фиксированной области значений ), является зависимой функцией , а тип этой функции называется типом зависимого произведения , пи-типом ( типом Π ) или типом зависимой функции . [4] Из семейства типов мы можем построить тип зависимых функций , члены которого являются функциями, которые принимают член и возвращают член в . Для этого примера тип зависимой функции обычно записывается как или .
Если — постоянная функция, то соответствующий зависимый тип произведения эквивалентен обычному типу функции . То есть, оценочно равен , когда не зависит от .
Название «Π-тип» происходит от идеи, что их можно рассматривать как декартово произведение типов. Π-типы также можно понимать как модели кванторов всеобщности .
Например, если мы напишем для n -кортежей действительных чисел , то будет типом функции, которая, учитывая натуральное число n , возвращает кортеж действительных чисел размера n . Обычное пространство функций возникает как особый случай, когда тип диапазона фактически не зависит от входных данных. Например, это тип функций от натуральных чисел до действительных чисел, который записывается как в типизированном лямбда-исчислении.
Для более конкретного примера, принимая в качестве типа беззнаковых целых чисел от 0 до 255 (тех, которые помещаются в 8 бит или 1 байт) и для , то преобразуется в произведение .
Двойственный зависимому типу продукта — зависимый тип пары , зависимый тип суммы , сигма-тип или (что сбивает с толку) зависимый тип продукта . [4] Сигма-типы также можно понимать как экзистенциальные квантификаторы . Продолжая приведенный выше пример, если во вселенной типов есть тип и семейство типов , то есть зависимый тип пары . (Альтернативные обозначения аналогичны обозначениям Π -типов.)
Тип зависимой пары отражает идею упорядоченной пары, где тип второго члена зависит от значения первого. Если то и . Если — постоянная функция, то тип зависимой пары становится (оценочно равен) типу продукта , то есть обычному декартову произведению . [4]
Для более конкретного примера, снова принимая тип беззнаковых целых чисел от 0 до 255, и снова принимая значение для более произвольного 256 , затем сводится к сумме .
Пусть будет некоторым типом, и пусть . По соответствию Карри–Ховарда, может быть интерпретировано как логический предикат на терминах . Для заданного , является ли тип обитаемым, указывает на то, удовлетворяет ли этому предикату. Соответствие может быть распространено на экзистенциальную квантификацию и зависимые пары: предложение истинно тогда и только тогда, когда тип обитаем.
Например, меньше или равно тогда и только тогда, когда существует другое натуральное число, такое что . В логике это утверждение кодифицируется экзистенциальной квантификацией:
Это предложение соответствует типу зависимой пары:
То есть доказательством утверждения, что число меньше или равно, является пара, содержащая как неотрицательное число , представляющее собой разность между и , так и доказательство равенства .
Хенк Барендрегт разработал лямбда-куб как средство классификации систем типов по трем осям. Восемь углов полученной кубической диаграммы соответствуют системе типов, с просто типизированным лямбда-исчислением в наименее выразительном углу и исчислением конструкций в наиболее выразительном. Три оси куба соответствуют трем различным расширениям просто типизированного лямбда-исчисления: добавление зависимых типов, добавление полиморфизма и добавление конструкторов типов более высокого рода (например, функций из типов в типы). Лямбда-куб далее обобщается чистыми системами типов .
Система чистых зависимых типов первого порядка, соответствующая логическому каркасу LF , получается путем обобщения типа функционального пространства просто типизированного лямбда-исчисления до типа зависимого произведения.
Система зависимых типов второго порядка получается из разрешения квантификации по конструкторам типов. В этой теории оператор зависимого произведения включает в себя как оператор простого типизированного лямбда-исчисления, так и связующее устройство Системы F.
Система более высокого порядка распространяется на все четыре формы абстракции от лямбда-куба : функции от термов к термовам, типы к типам, термов к типам и типы к термовам. Система соответствует исчислению конструкций , производная которой, исчисление индуктивных конструкций , является базовой системой помощника доказательства Coq .
Соответствие Карри–Ховарда подразумевает, что типы могут быть построены, которые выражают произвольно сложные математические свойства. Если пользователь может предоставить конструктивное доказательство того, что тип обитаем (т. е. что значение этого типа существует), то компилятор может проверить доказательство и преобразовать его в исполняемый компьютерный код, который вычисляет значение, выполняя построение. Функция проверки доказательств делает зависимо типизированные языки тесно связанными с помощниками по доказательству . Аспект генерации кода обеспечивает мощный подход к формальной проверке программ и коду, несущему доказательство , поскольку код выводится непосредственно из механически проверенного математического доказательства.
Язык | Активно разрабатывается | Парадигма [а] | Тактика | Условия доказательства | Проверка завершения | Типы могут зависеть от [b] | Вселенные | Доказательство нерелевантности | Извлечение программы | Извлечение удаляет ненужные термины |
---|---|---|---|---|---|---|---|---|---|---|
Ада 2012 | Да [5] | Императив | Да [6] | Нет | ? | Любой термин [c] | ? | ? | Ада | ? |
Агда | Да [7] | Чисто функциональный | Мало/ограниченно [d] | Да | Да (необязательно) | Любой термин | Да (необязательно) [e] | Аргументы, не имеющие отношения к доказательству [9] Предложения, не имеющие отношения к доказательству [10] | Хаскелл , JavaScript | Да [9] |
АТС | Да [11] | Функциональный / императивный | Нет [12] | Да | Да | Статические термины [13] | ? | Да | Да | Да |
Кайенский перец | Нет | Чисто функциональный | Нет | Да | Нет | Любой термин | Нет | Нет | ? | ? |
Галлина ( Coq ) | Да [14] | Чисто функциональный | Да | Да | Да | Любой термин | Да [ж] | Да [15] | Haskell , Scheme , OCaml | Да |
Зависимый ML | Нет [г] | ? | ? | Да | ? | Натуральные числа | ? | ? | ? | ? |
Ф* | Да [16] | Функциональный и императивный | Да [17] | Да | Да (необязательно) | Любой чистый термин | Да | Да | OCaml , F# и C | Да |
Гуру | Нет [18] | Чисто функциональный [19] | hypjoin [20] | Да [19] | Да | Любой термин | Нет | Да | Тмин | Да |
Идрис | Да [21] | Чисто функциональный [22] | Да [23] | Да | Да (необязательно) | Любой термин | Да | Нет | Да | Да [23] |
Наклонять | Да | Чисто функциональный | Да | Да | Да | Любой термин | Да | Да | Да | Да |
Матита | Да [24] | Чисто функциональный | Да | Да | Да | Любой термин | Да | Да | OCaml | Да |
НуПРЛ | Да | Чисто функциональный | Да | Да | Да | Любой термин | Да | ? | Да | ? |
ПВС | Да | ? | Да | ? | ? | ? | ? | ? | ? | ? |
Sage Архивировано 2020-11-09 в Wayback Machine | Нет [ч] | Чисто функциональный | Нет | Нет | Нет | ? | Нет | ? | ? | ? |
СПАРК 2014 | Да [25] | Императив | Да [26] | Да [27] | Да [28] | Любой термин [i] | ? | ? | Ада и С [29] | Да [30] |
Двенадцать | Да | Логическое программирование | ? | Да | Да (необязательно) | Любой (LF) термин | Нет | Нет | ? | ? |