Что представляет собой действительный тип в Lean?
Я сделал первые 3 главы бережливого урока, и я уже сделал несколько доказательств в логике высказываний.
Сейчас я пытаюсь немного вернуться и задать себе глупые вопросы.
Мое понимание таково:
- Термины могут иметь типы:
constant A : Type
,A
это термин,Type
это типA
, - Термины могут стать типами:
constant a : A
, - Тип термина может зависеть от типа другого термина:
constant B : A -> Type
, который является сахаром дляconstant B' : Π (a : A), Type
Но это понимание явно неверно, поскольку этот код не проверяет тип:
constant A : Type
constant a : A
constant B : A -> Type
constant B' : Π (a : A), Type
constant C : Π (b : B), Type
constant C' : Π (B : A), (Π (b : B), Type)
constant C'' : B -> Type
Все строки начинаются constant C
то есть строки 9, 11 и 13 выдают ошибку error: type expected at B
Зачем? Я подозреваю, что не все термины могут стать типами. Я подозреваю, что термины, типы которых зависят от других типов, не могут стать типами. Зачем?
1 ответ
Ошибка первого типа
Проблема с ошибкой первого типа в
constant C : Π (b : B), Type
что ты не можешь сказать b : B
, так как B
является функцией (без определения) типа A -> Type
т.е. B
это значение, а не тип. Не имеет смысла предъявлять претензии как b : 1
или же b : "xyz"
или же b : (λ a : A, Type)
,
Например, следующее будет работать, так как B a : Type
:
constant C : Π (b : B a), Type
Ошибка второго типа
Ошибка второго типа в
constant C' : Π (B : A), (Π (b : B), Type)
проистекает из того факта, что неизвестно, что B
это тип, все, что мы знаем о B
является то, что это какая-то ценность (житель) типа A
, Чтобы иметь возможность использовать B
Таким образом, вам нужно что-то вроде этого:
constant C' : Π (B : Type), (Π (b : B), Type)
то есть мы прямо говорим B
это тип.
Ошибка третьего типа
constant C'' : B -> Type
Причина, по которой это не удается проверить, та же, что и в первом случае. B
это значение функции, в то время как нам нужен тип здесь - вот почему constant B : A -> Type
работает.