#coq #curry-howard
#coq #карри-Говард
Вопрос:
Согласно соответствию Карри Говарда, все теоремы и леммы являются типами, а объекты доказательства — значениями. В качестве примера:
Theorem test: 0 <= 0.
Proof.
omega. Qed.
Когда я это сделаю, проверьте test. Результат Coq является:
test
: 0 <= 0
Но когда я проверяю тип «<=», это nat -> nat -> Prop. Это означает, что (0 <= 0) имеет тип Prop. Означает ли это, что тип ‘test’ является подтипом Prop? В общем, являются ли идентификаторы теоремы и леммы подтипами Prop?
Ответ №1:
test : 0 <= 0
и 0 <= 0 : Prop
, как вы сказали. В терминологии соответствия Карри-Говарда, 0 <= 0
является утверждением типа / теоремы, и test
является значением этого типа / доказательством этой теоремы.
В этом примере нет никакого подтипа, задействованного. Подтипирование — это взаимосвязь между двумя типами; когда Cat <: Animal
(cat является подтипом animal), это означает, что все объекты типа cat также относятся к типу animal: x : Cat
подразумевает x : Animal
.
Coq имеет одну относительно простую форму подтипирования, между универсалиями типов. Простейшим примером является то, что Prop
является подтипом Type
. Вы можете увидеть это, используя Check
для подтверждения этого 0 <= 0 : Prop
а также 0 <= 0 : Type
.
Комментарии:
1. ‘0 <= 0 : Prop’ : здесь и LHS, и RHS являются типами, не так ли? Итак, подтипирование?
2. Они оба являются типами, но связь между ними «имеет тип», а не подтипирование. Они кажутся действительно похожими (и мы используем похожие обозначения), но ведут себя по-разному.
3. Если я прав, для отношения типа has требуется значение типа в LHS и типа в RHS, как в (n: nat). В приведенном выше (0 <= 0) есть ‘значение’, которое имеет тип ‘Prop’; также это тип? Итак, тип имеет тип ‘Prop’? Я прав?
4. Вы правы в том, что некоторые типы, такие как
0 <= 0
,True
,False
p / q
илиx = y
, имеют типProp
, но не все типы имеют типProp
, для началаProp
сам который имеет типProp : Type
, но такжеnat : Set
(Set
является псевдонимом для конкретного случаяType
).