我可以使用Inductive类型的表示法来在Coq中定义该类型吗?

时间:2017-02-14 22:28:04

标签: coq notation dependent-type

假设我有这样的事情:

Inductive SubtypeOf :
  Gamma -> UnsafeType -> Type -> Set :=
| SubRefl :
    forall (gamma : GammaEnv)  (u : UnsafeType)
    , SubtypeOf gamma u u
| SubTrans :
    forall (gamma : GammaEnv)  (u1 u2 u3 : Type)
    , SubtypeOf gamma u1 u2
      -> SubtypeOf gamma u2 u3
      -> SubtypeOf gamma u1 u3.

并定义了一个符号:

Notation "G |- x <: y " := (SubtypeOf G x y) (at level 50).

有什么办法可以将这个符号带到SubtypeOf定义的范围内,所以我可以这样做:

Inductive SubtypeOf :
  Gamma -> UnsafeType -> Type -> Set :=
| SubRefl :
    forall (gamma : GammaEnv)  (u : UnsafeType)
    ,  gamma |- u <: u
| SubTrans :
    forall (gamma : GammaEnv)  (u1 u2 u3 : Type)
    , gamma |- u1 <: u2
      -> gamma |- u2 <: u3
      -> gamma |- u1 <: u3.

1 个答案:

答案 0 :(得分:2)

扩展了ejgallego的评论,有Reserved Notationsa where clause for inductives的文档。这是有效的代码:

Reserved Notation "G |-  x <: y" (at level 50, x at next level).
Definition UnsafeType := Type.
Axiom Gamma : Set.
Notation GammaEnv := Gamma.
Inductive SubtypeOf :
  Gamma -> UnsafeType -> Type -> Type :=
| SubRefl :
    forall (gamma : GammaEnv)  (u : UnsafeType)
    ,  gamma |- u <: u
| SubTrans :
    forall (gamma : GammaEnv)  (u1 u2 u3 : Type)
    , gamma |- u1 <: u2
      -> gamma |- u2 <: u3
      -> gamma |- u1 <: u3
where "G |-  x <: y " := (SubtypeOf G x y).

请注意,我们必须将x置于下一级(49),以便<:使用|-进行解析,而不是被x吸收。< / p>