如何在Coq中使用多个符号“ 0”

时间:2019-05-19 08:09:38

标签: coq

我已经在Coq中定义了场公理,并用它们来证明简单的属性,如所描述的here。然后,我添加了向量空间公理并在那里证明了简单的属性。由于我的字段已经使用0表示法,所以:

(*******************)
(* Field notations *)
(*******************)
Notation "0" := zero.
Notation "1" :=  one.
Infix    "+" :=  add.
Infix    "*" :=  mul.

我在向量空间中使用了较难看的符号:

(**************************)
(* Vector space notations *)
(**************************)
Notation "00" := zerov.
Notation "11" := onev.
Infix    "+_v" :=  addv (at level 50, no associativity).
Infix    "*_v" :=  mulv (at level 60, no associativity).

可以证明以下简单引理:

Lemma mul_0_l: forall (v : V), (eqv (mulv 0 v) 00).

当我将"00"更改为"0V"(更漂亮)时,所有内容均停止工作,并且出现以下错误:

In environment
v : V
The term "0" has type "F" while it is expected to have type "V".

反正有使用"0V"吗?还是我坚持使用"00"

1 个答案:

答案 0 :(得分:2)

令我惊讶的是,无法识别以数字开头的令牌; I opened a GitHub issue on it。同时,我相信您可以使用的最接近的东西是一个范围符号(尽管它长了一个字符):

Section test.
  Variable T : Type.
  Variable zero : T.
  Notation "0" := zero.

  Variable V : Type.
  Variable zeroV : V.

  Notation "0" := zeroV : V_scope.
  Delimit Scope V_scope with V.
  Check 0.   (* 0 : T *)
  Check 0%V. (* 0%V : V *)

编辑

正如@JasonGross在注释中建议的那样,您可以Bind Scope0T两种类型使用相同的符号V。在某些情况下,这可能会影响可读性。

Section test.
  Variable T : Type.
  Variable zero : T.
  Notation "0" := zero.

  Variable V : Type.
  Variable zeroV : V.

  Notation "0" := zeroV : V_scope.
  Delimit Scope V_scope with V.
  Bind Scope V_scope with V.
  Check 0.   (* 0 : T *)
  Check 0%V. (* 0%V : V *)

  Variable mult : T -> V -> V.
  Check mult 0 0.   (* mult 0 0 : V *)
  Check mult 0 0%V. (* mult 0 0 : V *)