Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Type Theory

Type Theory

Or how are we doing logic writing Scala code

Vladimir Uspensky

February 26, 2014
Tweet

More Decks by Vladimir Uspensky

Other Decks in Programming

Transcript

  1. Теория типов Предложена Бертраном Расселом как решение парадокса наивной теории

    множеств: “содержит ли себя множество, члены которого не себя содержать?” Надо создать иерархию типов и назначить каждой сущности тип. Объекты типа строятся исключительно из объектов предыдущих по иерархии, таким образом, избегая циклов. — λ-исчисление Чёрча. Чёрч типизировал и показал, что оно может служить обобщением всей математики, назвал его логикой высшего порядка, — Исчисление конструкций Тьери Коканда используется в Coq и других доказателях теорем, — Интуиционистская теория типов Пера Мартин-Лёфа, которая тоже всё обобщает, используется в конструктивной математике и Agda, — Гомотопическая теория типов — поле активного исследования.
  2. Основные концепции В теории типов, каждое выражение имеет тип и

    операции ограничены типом выражения. Суждение “M: A” говорит, что выражение M имеет тип A, например, 2: Int Функции обозначаются: →. Функция addOne, представляет суждение addOne: Int → Int Вызов ("применение") функции к аргументу обычно записывается: addOne 2. Теории типов также имеют правила переписывания выражений. Правила называются правилами преобразования или, если в одну сторону — упрощения. 2+1 и 3 — разные выражения, но первое упрощается до второго (“2+1↠3”).
  3. Нормализация “2+1” упрощается до “3”. “3” дальше не упрощается, называется

    нормальной формой. • Теория типов сильно нормализуема — все выражения имеют нормальную форму, которая достигается любым порядком применения упрощений; • Слабо нормализуемые теории имеют нормальную форму, но последовательности упрощений могут зациклиться и не достичь её. Выражения, упрощаемые до одной нормальной формы (к одному “элементу”): 2+1 и 3+0 упрощаются до элемента 3 Два выражения конвертируемы, если существует выражение, до которого оба упрощаются: 2+1 и 1+2 или x+(1+1) и x+2 x+1 и 1+x — нет (оба уже в нормальной форме и не одинаковы)
  4. Зависимые типы Зависимый тип — тип, который зависит от выражения

    или другого типа: 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.
  5. Тип, представляющий равенство типов и выражений: class Equals[T](a: T, b:

    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). Типы для равенства
  6. Индуктивные типы Теория типов требует базовые выражения и типы, на

    которых оперировать. Некоторые теории строят их из функций, используя запись Чёрча. 0 := λf.λx.x 1 := λf.λx.f x 2 := λf.λx.f (f x) Другие — индуктивные типы: множество базовых типов и множество конструкторов типов, которые генерируют типы с “хорошими” свойствами. Рекурсивные функции на индуктивных типах гарантированно завершаются. Коиндуктивные типы — бесконечные структуры данных, создаются с
  7. Универсальные типы Чтобы сформулировать суждения обо всех типах сразу многие

    теории типов имеют "универсальный тип", содержащий все другие типы. Чтобы сказать что-либо об универсальных типах, существует иерархия этих типов, содержащих другие типы ниже по иерархии. Иерархия может быть определена бесконечно, но утверждения должны ссылаться только на конечное число уровней. В Scala — Any, AnyRef, AnyVal, завершаются конкретными типами.
  8. Вычислительный компонент Многие системы теории типов — языки программирования, поэтому

    говорят, что они имеют "вычислительный компонент". Вычисления — упрощение выражений, используя правила переписывания. Теория типов c “хорошим” выч. компонентом связана с конструктивной математикой через BHK-интерпретацию (функции и доказательства): Доказательство A ∧ B — Доказательство A, Доказательство B Доказательство A ∨ B — (0, доказательство P) или (1, доказательство Q) Из A следует B — Функция из доказательства A в доказательство B etc.
  9. λ-исчисление и λ-куб Все вершины куба содержат абстракции: — зависимость

    выражений от выражений; — простые функции, как в типизированном λ-исчислении. типизированное λ- исчисление исчисление конструкций (содержит все абстракции куба) выражения, зависящие от типов, или полиморфизм зависимые типы параметры типов или операторы на типах Каждое измерение λ-куба — новая форма абстракции Идея куба принадлежит математику Хенку Барендрегту (1991) Scala тут
  10. Интуиционистская теория типов — теория типов, основанная на принципах математического

    конструктивизма Интуиционистская теория типов — Истина → Конструктивная доказуемость — Формула истинна → “населена” доказательством — Не бинарная логика, даже не конечная Закон исключения среднего и упрощение двойного отрицания не принимаются за аксиомы, но могут быть доказаны Если есть конструктивное доказательство существования объекта, его легко превратить в алгоритм генерации такого объекта
  11. Гомотопическая теория типов Теория с гарантированной проверкой типов, использует аппарат

    гомотопической теории: — особые типы преобразований: слабая эквивалентность, fibration, cofibration; — системы со слабой факторизацией. Позволяет наоборот описать гомотопическую теорию с помощью теории типов Множество эквивалентностей расширено при помощи аксиомы унивалентности: — эквивалентность эквивалентна идентичности, (A=B) ≃ (A≃B); — эквивалентные типы идентичны (как Iso в shapeless). Обобщает всю математику: типы, логику, открывает новые подходы к аксиоме выбора и т.д. Среди открытых вопросов — вычислительнуя интерпретация: новые типы доказателей теорем, которые будут лучше поддерживать теорию
  12. Завершимость и тотальность — Доказательства, как и программы, можно формализовать,

    проверять и запускать — Однако, программы не всегда завершаются! — К Тьюринг-полным языкам с произвольной рекурсией применять соответствие нужно осторожно, ведь оно может привести к противоречивому доказательству — Можно попробовать отделить потенциально не останавливающийся код с помощью монад: MayNotTerminate[T] — Или запретить неограниченную рекурсию (тотальное программирование), но оставить корекурсию, когда незавершающиеся вычисления предсказуемы
  13. Соответствие Карри-Ховарда — Доказательство — это программа, а доказываемая ей

    формула — тип программы — Логика становится программированием (для этого есть языки Agda, Coq) — Доказательства теперь формальны и вычисляются, на их основе можно строить более сложные доказательства, рефакторить — Математические теории из разных областей можно тривиально закодить — Обратно, из корректной программы также можно получить доказательство, — Если язык программирования достаточно сильно типизирован) — Баги и зависания кода — это противоречия и парадоксы — Мы каждый день пишем логические системы и доказываем теории!
  14. Ссылки 1. http://en.wikipedia.org/wiki/Curry-Howard_correspondence 2. http://en.wikipedia.org/wiki/Type_theory 3. http://en.wikipedia.org/wiki/Bertrand_Russell 4. http://en.wikipedia.org/wiki/Lambda_cube 5.

    http://en.wikipedia.org/wiki/Intuitionistic_type_theory 6. http://en.wikipedia.org/wiki/Intuitionistic_logic 7. http://en.wikipedia.org/wiki/Constructivism_(mathematics) 8. http://en.wikipedia.org/wiki/Homotopy_type_theory 9. http://homotopytypetheory.org/ (https://github.com/HoTT/HoTT)