Как вы получаете исчисление конструкций из других точек в лямбда-кубе?

21

Говорят, что КО является кульминацией всех трех измерений лямбда-куба. Это не очевидно для меня вообще. Я думаю, что я понимаю отдельные измерения, и комбинация любых двух, кажется, приводит к относительно простому объединению (возможно, я что-то упускаю?). Но когда я смотрю на CoC, вместо того, чтобы выглядеть как комбинация всех трех, это выглядит как совершенно другая вещь. Из какого измерения происходят Type, Prop и small / large типы? Куда исчезли зависимые продукты? И почему акцент делается на предложениях и доказательствах, а не на типах и программах? Есть ли что-то эквивалентное, что фокусируется на типах и программах?

Изменить: В случае, если это не ясно, я прошу объяснить, как CoC эквивалентно прямому объединению измерений лямбда-куба. И есть ли фактическое объединение всех трех где-то, где я могу изучать (то есть с точки зрения программ и типов, а не доказательств и предложений)? Это в ответ на комментарии к вопросу, а не на какие-либо текущие ответы.

indil
источник
1
По крайней мере, это должно быть soft-question. Я не вижу здесь действительно технического вопроса. Возможно, вы можете быть более конкретным относительно того, что вы спрашиваете?
Андрей Бауэр
3
@AndrejBauer Не вопрос: какова связь между презентацией CoC Barendregt-cube / PTS и оригинальной презентацией Coquand & Huet?
Мартин Бергер
1
@AndrejBauer: Кажется, что вопрос также заключается в разнице в представлении CoC (в любом виде) и акценте на определенных функциях на практике. Это правда, что версия CoC, ориентированная на PTS, подчеркивает некоторые важные функции, в то время как практика Coq подчеркивает другие. Я согласен, что он должен иметь тег мягкого вопроса.
Жак Каретт
1
Я рад видеть, что кто-то сможет ответить на это.
Андрей Бауэр

Ответы:

28

Во-первых, чтобы повторить один из пунктов Коди, исчисление индуктивных конструкций (на котором основано ядро ​​Кока) очень отличается от исчисления конструкций. Лучше всего начинать с теории типов Мартина-Лёфа с вселенных, а затем добавить опору сортировки внизу иерархии типов. Это совершенно другой зверь, чем оригинальный CoC, который лучше всего рассматривать как зависимую версию F-омеги. (Например, CiC имеет теоретико-множественные модели, а CoC - нет.)

Тем не менее, лямбда-куб (членом которого является CoC) обычно представляется как система чистого типа по соображениям экономии в количестве правил ввода. Рассматривая сортировки, типы и термины как элементы одной и той же синтаксической категории, вы можете записать гораздо меньше правил, и ваши доказательства также станут немного менее избыточными.

Тем не менее, для понимания может быть полезно четко разделить различные категории. Мы можем ввести три синтаксические категории, виды (ранжированные по метавариабельной переменной k), типы (ранжированные по метавариабельной A) и термины (ранжированные по метавариабельной)e ). Тогда все восемь систем можно понимать как вариации того, что разрешено на каждом из трех уровней.

λ → (Лямбда-исчисление простого типа)

 k ::= ∗
 A ::= p | A → B
 e ::= x | λx:A.e | e e

Это базовое типизированное лямбда-исчисление. Есть один вид , который является видом типов. Сами типы являются атомарными типами pи функциональными типами.A → B . Термины - это переменные, абстракции или приложения.

λω_ (STLC + операторы старшего типа)

 k ::= ∗ | k → k
 A ::= a | p | A → B | λa:k.A | A B
 e ::= x | λx:A.e | e e

STLC разрешает абстракцию только на уровне терминов. Если мы добавим его на уровне типов, то добавим новый видk → k который представляет собой тип функций уровня типа, а также абстракцию λa:k.Aи приложение.A B на уровне типов. Так что теперь у нас нет полиморфизма, но у нас есть операторы типа.

Если память служит, эта система не обладает большей вычислительной мощностью, чем STLC; это просто дает вам возможность сокращать типы.

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

 k ::= ∗
 A ::= a | p | A → B  | ∀a:k. A 
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

Вместо добавления операторов типа мы могли бы добавить полиморфизм. На уровне типов, мы добавляем ∀a:k. Aполиморфный тип, а на уровне мы добавляем абстракцию над типами Λa:k. eи типом приложения.e [A] .

Эта система намного более мощная, чем STLC - она ​​так же сильна, как арифметика второго порядка.

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

 k ::= ∗ | k → k 
 A ::= a | p | A → B  | ∀a:k. A | λa:k.A | A B
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

Если у нас есть оба типа операторов и полиморфизм, мы получаем F-омега. Эта система является более или менее теорией типов ядра большинства современных функциональных языков (таких как ML и Haskell). Он также значительно более мощный, чем система F - он эквивалентен по силе арифметике более высокого порядка.

λP (LF)

 k ::= ∗ | Πx:A. k 
 A ::= a | p | Πx:A. B | Λx:A.B | A [e]
 e ::= x | λx:A.e | e e

Вместо полиморфизма мы могли бы пойти в направлении зависимости от простейшего типа лямбда-исчисления. Если вы позволили типу функции разрешить использование ее аргумента в возвращаемом типе (т.е. Πx:A. B(x)вместо записи A → B), то вы получите λP. Чтобы сделать это действительно полезным, мы должны расширить набор видов с помощью операторов типа, которые принимают термины в качестве аргументов Πx:A. k, и поэтому мы должны добавить соответствующую абстракцию Λx:A.Bи приложение A [e]на уровне типов.

Эту систему иногда называют LF, или Edinburgh Logical Framework.

Он обладает такой же вычислительной мощью, как и простейшее лямбда-исчисление.

λP2 (без специального имени)

 k ::= ∗ | Πx:A. k 
 A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

Мы также можем добавить полиморфизм к λP, чтобы получить λP2. Эта система используется не часто, поэтому у нее нет определенного имени. (Одна статья, которую я прочитал и которая использовала ее, - « Индукция Германа Гойвера» не выводится в теории зависимых типов второго порядка .)

Эта система имеет ту же силу, что и система F.

λPω_ (без специального имени)

 k ::= ∗ | Πx:A. k | Πa:k. k'
 A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B 
 e ::= x | λx:A.e | e e 

Мы могли бы также добавить операторы типа к λP, чтобы получить λPω_. Это включает в себя добавление типа Πa:k. k'для операторов типа, а также соответствующую абстракцию Λx:A.Bи приложение на уровне типа.A [e] .

Поскольку снова нет скачка в вычислительной мощности по сравнению с STLC, эта система также должна стать прекрасной основой для логической структуры, но никто этого не сделал.

λPω (исчисление конструкций)

 k ::= ∗ | Πx:A. k | Πa:k. k'
 A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B 
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

Наконец, мы получаем λPω, исчисление конструкций, взяв λPω_ и добавив полиморфный тип прежнего ∀a:k.Aи абстракцию уровня термина Λa:k. eи применение e [A]для него.

Типы этой системы гораздо более выразительны, чем в F-омеге, но имеют одинаковую вычислительную мощь.

Нил Кришнасвами
источник
3
Конечно, технически CoC (без аксиом) имеет, по крайней мере, столько же теоретико-множественных моделей, сколько CiC, они просто не очень хороши в моделировании нужной нам ситуации, а именно CoC с аксиомами для натуральных чисел (скажем, ). 01
Коди
2
Я также был бы очень признателен за ссылку на консервативность над STLC. Это кажется неочевидным. λω_
Коди
3
@Cody: Я не знаю ссылку - Кевин Уоткинс набросал доказательство для меня на доске! Идея состоит в том, что вы берете термин, напечатанный в λω_, помещаете все типы в бета-нормальную eta-long форму, а затем встраиваете ее в STLC, вводя новый атомарный тип для каждой отдельной нормальной формы в исходной программе. Тогда очевидно, что редукционные последовательности должны выстраиваться один в один.
Нил Кришнасвами
1
@ user833970 тот факт, что не является выводимым, на самом деле гораздо проще, чем другие упомянутые вами факты, и не имеет ничего общего с кодировкой n a t : это происходит из-за того, что существует доказательная нерелевантная модель CC , в которых типы имеют не более одного элемента . Это плохое свойство, если вам нужна логика, в которой есть тип с более чем одним элементом (скажем, nat). Ссылка такова: не очень простая доказательная, не относящаяся к делу модель КЦ , созданная Микел и Вернером. 01nat
Коди
1
Вы говорите, что Fw "гораздо более мощный", чем система F. У вас есть ссылка для этого? В частности, есть ли функция от натуральных чисел, которая доказуемо итогова в Fw, но не в F?
Торстен Альтенкирх
21

Я часто хотел попытаться суммировать каждое измерение куба и то, что он представляет, поэтому я попробую это сделать.λ

Но сначала, вероятно, следует попытаться распутать различные проблемы. Интерактивный доказатель теорем Coq основан на основной теории типов, которую иногда с любовью называют исчислением индуктивных конструкций со вселенными . Вы заметите, что это нечто большее, чем просто «Исчисление конструкций», и, действительно, там гораздо больше вещей, чем просто CoC. В частности, я думаю, что вы не уверены, какие именно функции есть в самом CoC. В частности, различие Set / Prop и юниверсы не отображаются в CoC.

Я не буду давать полный обзор систем Pure Type здесь, но важное правило (для функциональных PTS, таких как CoC) заключается в следующем

ΓA:sΓ,x:AB:kΓΠx:A.B : k (s,k)R

где являются элементы фиксированного множества S из рода , и пара ( ы , K ) находится в фиксированном множестве R пара S , называется правилом .s,kS(s,k)RS

Решающее понимание, что тщательный выбор из и R сделать огромные различия в том , что тип продукта Π х : . Б на самом деле представляет!SRΠx:A.B

В частности, в исчислении конструкций, множество сортов есть { * , } часто называют Prop и типа (хотя эта терминология немного запутанным для пользователя Coq по причинам , я расскажу чуть позже), а полная набор правил: R = { ( , ) , ( , S

{,}
R={(,),(,),(,),(,)}

Итак, у нас есть 4 правила, которые соответствуют 4 различным целям:

  • : типы функций(,)

  • (,)

  • (,)

  • (,)

Я объясню каждый из них более подробно.


Прежде всего заметим , что я буду писать вместо П х : А .ABΠx:A.BxB

natboolx=yxyдает нам обычные функции высшего порядка, которые вам нравятся на любом функциональном языке программирования, то есть возможность передавать функции в другие функции.

listlist:listnat,listbool(,)

Πt:. tt
λ(t:)(x:t).xΠt:._(,)tt(,)

AB:=Πt:. (ABt)t
AB:=Πt:. (At)(Bt)t
:=Πt:. t
:=Πt:. tt
x:A. P(x):=Πt:. (Πy:A. P(y)t)t
(,)

(,)

(,)

Πc:.  c natc nat

0=1

= : natnat
= : Πt:. tt
natnat(,)

ii=1,2,3,i:i+1

(i,i)

ΓA:iΓA:j ij

С этими дополнительными сортировками и правилами вы получаете что-то не PTS, а что-то близкое. Это (почти) Расширенное исчисление конструкций , которое ближе к основанию Coq. Большая недостающая часть здесь - индуктивные типы, которые я не буду обсуждать здесь.

Изменить: есть довольно хороший справочник, который описывает различные функции языков программирования в рамках PTS, описывая PTS, который является хорошим кандидатом для промежуточного представления функционального языка программирования:

Хенк: типизированный промежуточный язык , С.П. Джонс и Э. Мейер.

Коди
источник
2
Дополнительные темы по типам и языкам программирования, S2.6 и S2.7 .
Каве
2
Кстати, «семейства типов» часто также называют типами с более высоким родом.
Мартин Бергер
1
PTS была хорошей идеей 20 лет назад, но с тех пор дела пошли еще дальше.
Торстен Альтенкирх
@ThorstenAltenkirch Не нужно исключений, Торстен! Есть еще несколько забавных моментов, которые следует рассмотреть с участием PTS, например, приходит на ум работа Бернарди по интернализованной параметричности.
Коди
@cody Исключение не подразумевается, но мы не должны зацикливаться на прошлом теории синтаксического типа. Работа Бернарди превосходна и может быть лучше сделана с помощью вселенных.
Торстен Альтенкирх