Coq:我可以使用类型参数作为连续参数的类型吗?
简单地说,我能写吗Coq:我可以使用类型参数作为连续参数的类型吗?,coq,typing,parametric-polymorphism,adhoc-polymorphism,Coq,Typing,Parametric Polymorphism,Adhoc Polymorphism,简单地说,我能写吗 Inductive witness : (X : Type) -> X -> Type := | witness_nat : witness nat 1. (* for example *) 因此,X是一个参数,而不是一个参数,因此我可以让构造函数对X执行特殊多态性 上下文 我试图编码一个类型判断,我希望它是多态的,因为我有很多不同类型的术语(Coq类型)的类型规则,但是所有的规则都有相同的判断形式 这意味着,对于Coq类型A,B,我希望能够像 Induct
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 *)
然后能够在适当的位置进行反转
,以便(比如)只匹配构造函数type_B_1
和type_B_2
,如果知道X
实际上是B
在哈斯克尔
我基本上在模拟GHC的GADTs
允许的模式:
数据类型
=类型A::…->判决A
|类型_B_1::…->判决B
|类型_B_2::…->判决B
编译器足够聪明,可以使用
Type\u A
作为termType~A
的见证人,尽管我不认为它可以像inversion
那样避免匹配arms;您只需输入for all
关键字:
Inductive witness : forall (X : Type), X -> Type :=
| witness_nat : witness nat 1.
太好了,谢谢!你知道为什么另一种形式不起作用吗?forall会以某种方式改变
X
的范围吗?@IsaacvanBakel我想没有什么深层次的原因。虽然您不需要冒号左侧的forall,但是您需要一个forall来绑定依赖函数的参数。这就是语法的工作方式。