我已完成lean tutorial的前3章,我已经done a few proofs in propositional logic。
现在我想回去一点ask myself dumb questions。
我的理解是:
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
为什么呢?我怀疑所有条款都不能成为类型。我怀疑其类型依赖于其他类型的术语不能成为类型。为什么呢?
答案 0 :(得分:1)
中第一个类型错误的问题
constant C : Π (b : B), Type
是你不能说b : B
,因为B
是类型为A -> Type
的函数(没有定义),即B
是一个值,而非类型。
提出b : 1
或b : "xyz"
或b : (λ a : A, Type)
等声明是没有意义的。
E.g。以下内容可行,因为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
有效的原因。