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 类型 AB,我希望能够做类似

的事情
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_1type_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.