使用Coq表示法重载运算符

时间:2017-05-03 14:44:25

标签: operator-overloading coq

我想为几种判断创建符号,例如打字和子类型关系:

Reserved Notation "Г '⊢' t '∈' T" (at level 40).
Reserved Notation "Г '⊢' T '<:' U" (at level 40).

Inductive typing_relation : context -> term -> type -> Prop := ...
where "Γ '⊢' t '∈' T" := (typing_relation Γ t T).

Inductive subtyping_relation : context -> type -> type -> Prop := ...
where "Г '⊢' T '<:' U" := (subtyping_relation Γ T U).

据我了解,Coq不允许这样做,因为运算符在这些定义中过载。

我怎样才能让Coq根据其参数的类型(例如 vs term)推断出重载运算符的定义(在本例中为type)(和/或基于作为符号一部分的其他运算符,例如 vs <:)?

(请注意,使用不同的符号不是一个选项,因为我的Coq程序定义了几种打字和子类型关系。)

编辑:这是一个最小的例子:

Inductive type : Type :=
  | TBool : type.

Inductive term : Type :=
  | tvar : nat -> term.

Definition context := nat -> (option type).

Reserved Notation "G '⊢' t '∈' T" (at level 40).

Inductive typing_relation : context -> term -> type -> Prop :=
 | T_Var : forall G x T,
      G x = Some T ->
      G ⊢ tvar x ∈ T
 where "G '⊢' t '∈' T" := (typing_relation G t T).

Reserved Notation "G '⊢' T '<:' U" (at level 40).

Inductive subtype_relation : context -> type -> type -> Prop :=
  | S_Refl : forall G T,
      G ⊢ T <: T
  where "G '⊢' T '<:' U" := (subtype_relation G T U).

这会导致错误:

Syntax error: '<:' or '∈' expected after [constr:operconstr level 200] (in [constr:operconstr]).

1 个答案:

答案 0 :(得分:2)

原因是您无法使用<:,因为<:已被定义为Coq&#39; typecast notation。它的行为就好像是这样定义的

Reserved Notation "t <: T" (at level 100, right associativity).

情况类似于“Coq参考手册”(§12.1.3)中描述的情况:

  

在最后一种情况下,与类型转换的符号存在冲突。最后一种表示法,如命令Print Grammar constr.所示,处于100级。为避免x : A被解析为类型转换,有必要将x置于低于100的水平,通常99.

以下是适合您情况的可能解决方案:

Reserved Notation "G '⊢' t '∈' T" (at level 40, t at level 99).
Reserved Notation "G '⊢' T '<:' U" (at level 40, T at level 99).