множеств: “содержит ли себя множество, члены которого не себя содержать?” Надо создать иерархию типов и назначить каждой сущности тип. Объекты типа строятся исключительно из объектов предыдущих по иерархии, таким образом, избегая циклов. — λ-исчисление Чёрча. Чёрч типизировал и показал, что оно может служить обобщением всей математики, назвал его логикой высшего порядка, — Исчисление конструкций Тьери Коканда используется в Coq и других доказателях теорем, — Интуиционистская теория типов Пера Мартин-Лёфа, которая тоже всё обобщает, используется в конструктивной математике и Agda, — Гомотопическая теория типов — поле активного исследования.
операции ограничены типом выражения. Суждение “M: A” говорит, что выражение M имеет тип A, например, 2: Int Функции обозначаются: →. Функция addOne, представляет суждение addOne: Int → Int Вызов ("применение") функции к аргументу обычно записывается: addOne 2. Теории типов также имеют правила переписывания выражений. Правила называются правилами преобразования или, если в одну сторону — упрощения. 2+1 и 3 — разные выражения, но первое упрощается до второго (“2+1↠3”).
нормальной формой. • Теория типов сильно нормализуема — все выражения имеют нормальную форму, которая достигается любым порядком применения упрощений; • Слабо нормализуемые теории имеют нормальную форму, но последовательности упрощений могут зациклиться и не достичь её. Выражения, упрощаемые до одной нормальной формы (к одному “элементу”): 2+1 и 3+0 упрощаются до элемента 3 Два выражения конвертируемы, если существует выражение, до которого оба упрощаются: 2+1 и 1+2 или x+(1+1) и x+2 x+1 и 1+x — нет (оба уже в нормальной форме и не одинаковы)
или другого типа: List[Int, List[Int, List[Int, List[Int, Nil]]] другого типа чем List[Int, List[Int, List[Int, List[Int, List[Int, Nil]]]] Так тип, возвращаемый функцией, может зависеть от аргумента функции. def zeroes(n: Int): List[Int, List[Int, ...]] Зависимые типы используется в интуиционистской теории типов и в функциональных языках программирования, например, Agda и Idris.
T) Может отличаться от конвертируемости и обозначать утверждаемое равенство: override def equals(o: AnyRef) Определить выражения равенства можно начиная с рефлексивных выражений и упрощая: Equals[T](3, 3) Equals[T](2+1, 2+1) Equals[T](2+1, 3) В такой системе, равенство обозначает, конвертируемость с помощью упрощений. Equals[Int](3, 4) можно построить, но не будет существовать выражений такого типа. Неравенства нет, но a ≠ b эквивалентно (a=b) → ⊥ , где ⊥ тип без значений (Nothing). Типы для равенства
которых оперировать. Некоторые теории строят их из функций, используя запись Чёрча. 0 := λf.λx.x 1 := λf.λx.f x 2 := λf.λx.f (f x) Другие — индуктивные типы: множество базовых типов и множество конструкторов типов, которые генерируют типы с “хорошими” свойствами. Рекурсивные функции на индуктивных типах гарантированно завершаются. Коиндуктивные типы — бесконечные структуры данных, создаются с
теории типов имеют "универсальный тип", содержащий все другие типы. Чтобы сказать что-либо об универсальных типах, существует иерархия этих типов, содержащих другие типы ниже по иерархии. Иерархия может быть определена бесконечно, но утверждения должны ссылаться только на конечное число уровней. В Scala — Any, AnyRef, AnyVal, завершаются конкретными типами.
говорят, что они имеют "вычислительный компонент". Вычисления — упрощение выражений, используя правила переписывания. Теория типов c “хорошим” выч. компонентом связана с конструктивной математикой через BHK-интерпретацию (функции и доказательства): Доказательство A ∧ B — Доказательство A, Доказательство B Доказательство A ∨ B — (0, доказательство P) или (1, доказательство Q) Из A следует B — Функция из доказательства A в доказательство B etc.
выражений от выражений; — простые функции, как в типизированном λ-исчислении. типизированное λ- исчисление исчисление конструкций (содержит все абстракции куба) выражения, зависящие от типов, или полиморфизм зависимые типы параметры типов или операторы на типах Каждое измерение λ-куба — новая форма абстракции Идея куба принадлежит математику Хенку Барендрегту (1991) Scala тут
конструктивизма Интуиционистская теория типов — Истина → Конструктивная доказуемость — Формула истинна → “населена” доказательством — Не бинарная логика, даже не конечная Закон исключения среднего и упрощение двойного отрицания не принимаются за аксиомы, но могут быть доказаны Если есть конструктивное доказательство существования объекта, его легко превратить в алгоритм генерации такого объекта
гомотопической теории: — особые типы преобразований: слабая эквивалентность, fibration, cofibration; — системы со слабой факторизацией. Позволяет наоборот описать гомотопическую теорию с помощью теории типов Множество эквивалентностей расширено при помощи аксиомы унивалентности: — эквивалентность эквивалентна идентичности, (A=B) ≃ (A≃B); — эквивалентные типы идентичны (как Iso в shapeless). Обобщает всю математику: типы, логику, открывает новые подходы к аксиоме выбора и т.д. Среди открытых вопросов — вычислительнуя интерпретация: новые типы доказателей теорем, которые будут лучше поддерживать теорию
проверять и запускать — Однако, программы не всегда завершаются! — К Тьюринг-полным языкам с произвольной рекурсией применять соответствие нужно осторожно, ведь оно может привести к противоречивому доказательству — Можно попробовать отделить потенциально не останавливающийся код с помощью монад: MayNotTerminate[T] — Или запретить неограниченную рекурсию (тотальное программирование), но оставить корекурсию, когда незавершающиеся вычисления предсказуемы
формула — тип программы — Логика становится программированием (для этого есть языки Agda, Coq) — Доказательства теперь формальны и вычисляются, на их основе можно строить более сложные доказательства, рефакторить — Математические теории из разных областей можно тривиально закодить — Обратно, из корректной программы также можно получить доказательство, — Если язык программирования достаточно сильно типизирован) — Баги и зависания кода — это противоречия и парадоксы — Мы каждый день пишем логические системы и доказываем теории!