精益中的有效类型是什么?
What constitutes a valid type in lean?
我已经完成了 lean tutorial, and I've already done a few proofs in propositional logic 的前 3 章。
现在我想往回走一点 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
为什么?我怀疑并非 all 项都可以成为类型。我怀疑 类型依赖于其他类型的术语不能成为类型 。为什么?
第一次输入错误
第一个类型错误的问题
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
起作用的原因。
我已经完成了 lean tutorial, and I've already done a few proofs in propositional logic 的前 3 章。
现在我想往回走一点 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
为什么?我怀疑并非 all 项都可以成为类型。我怀疑 类型依赖于其他类型的术语不能成为类型 。为什么?
第一次输入错误
第一个类型错误的问题
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
起作用的原因。