Coq:我可以使用类型参数作为连续参数的类型吗?
Coq: can I use a type argument as the type of successive argument?
简单,我可以写吗
Inductive witness : (X : Type) -> X -> Type :=
| witness_nat : witness nat 1. (* for example *)
这样 X
是一个参数,而不是参数,因此我可以让构造函数使用 X
?
进行临时多态性
上下文
我正在尝试对打字判断进行编码,我希望它是多态的,因为我有很多针对不同类型术语(Coq 类型)的打字规则,但所有规则都具有相同的判断形式.
这意味着,对于 Coq 类型 A
、B
,我希望能够做类似
的事情
Inductive typing_judgement : (X : Type) -> context -> X -> myType -> Prop :=
| type_A : ... (* type terms of Coq type A *)
| type_B_1 : ... (* type terms of Coq type B, one way *)
| type_B_2 : ... (* type terms of type B, another way *)
然后能够 inversion
在适当的地方(比如)匹配构造函数 type_B_1
和 type_B_2
如果已知 X
实际上是 B
.
在Haskell
我基本上是在模拟 GHC GADTs
允许的模式:
data Judgement termType
= Type_A :: ... -> Judgement A
| Type_B_1 :: ... -> Judgement B
| Type_B_2 :: ... -> Judgement B
编译器足够聪明,可以使用 Type_A
作为 termType ~ A
的见证——尽管我不认为它可以像 inversion
那样消除匹配臂。
是;您只需要 forall
关键字:
Inductive witness : forall (X : Type), X -> Type :=
| witness_nat : witness nat 1.
简单,我可以写吗
Inductive witness : (X : Type) -> X -> Type :=
| witness_nat : witness nat 1. (* for example *)
这样 X
是一个参数,而不是参数,因此我可以让构造函数使用 X
?
上下文
我正在尝试对打字判断进行编码,我希望它是多态的,因为我有很多针对不同类型术语(Coq 类型)的打字规则,但所有规则都具有相同的判断形式.
这意味着,对于 Coq 类型 A
、B
,我希望能够做类似
Inductive typing_judgement : (X : Type) -> context -> X -> myType -> Prop :=
| type_A : ... (* type terms of Coq type A *)
| type_B_1 : ... (* type terms of Coq type B, one way *)
| type_B_2 : ... (* type terms of type B, another way *)
然后能够 inversion
在适当的地方(比如)匹配构造函数 type_B_1
和 type_B_2
如果已知 X
实际上是 B
.
在Haskell
我基本上是在模拟 GHC GADTs
允许的模式:
data Judgement termType
= Type_A :: ... -> Judgement A
| Type_B_1 :: ... -> Judgement B
| Type_B_2 :: ... -> Judgement B
编译器足够聪明,可以使用 Type_A
作为 termType ~ A
的见证——尽管我不认为它可以像 inversion
那样消除匹配臂。
是;您只需要 forall
关键字:
Inductive witness : forall (X : Type), X -> Type :=
| witness_nat : witness nat 1.