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来绑定依赖函数的参数。这就是语法的工作方式。