Coq表示法中的`<`语法错误

时间:2017-02-15 01:15:26

标签: parsing syntax operators coq notation

以下代码:

Reserved Notation "g || t |- x < y" (at level 10).

Inductive SubtypeOf :
  GammaEnv -> ThetaEnv -> UnsafeType -> UnsafeType -> Set :=
| SubRefl :
    forall (gamma : GammaEnv) (theta : ThetaEnv) (u : UnsafeType) , gamma || theta |- u < u
where "g || t |- x < y" := (SubtypeOf g t x y).

给出以下错误:

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

如果我使用<:代替<,我会收到类似的错误。

但是这段代码很好用:

Reserved Notation "g || t |- x << y" (at level 10).

Inductive SubtypeOf :
  GammaEnv -> ThetaEnv -> UnsafeType -> UnsafeType -> Set :=
| SubRefl :
    forall (gamma : GammaEnv) (theta : ThetaEnv) (u : UnsafeType) , gamma || theta |- u << u
where "g || t |- x << y" := (SubtypeOf g t x y).

为什么呢?是否有可以更改为允许<<:表示法的优先级设置?是否存在我与之碰撞的内置语法,并且在定义符号时需要注意?

1 个答案:

答案 0 :(得分:6)

Coq使用LL1解析器来处理符号。它还可以输出语法。那么,让我们通过以下

来检查我们得到了什么
Reserved Notation "g || t |- x < y" (at level 10).

Print Grammar constr.输出:

...
| "10" LEFTA
  [ SELF;
    "||";
    constr:operconstr LEVEL "200";        (* subexpression t *)
    "|-";
    constr:operconstr LEVEL "200";        (* subexpression x *)
    "<";
    NEXT
...

下面,

  • 10是我们的优先级别;
  • LEFTA表示左关联;
  • 200是内部子表达式的默认优先级。

考虑到较低级别比较高级别更紧密地绑定以及<级别为70(见Coq.Init.Notations)这一事实,我们可以推断出Coq正在尝试将x < y部分解析为x的子表达式,消耗<令牌,从而显示错误消息。

为了解决这种情况,我们可以明确禁止将第三个参数解析为小于表达式,方法是赋予x更高的优先级,即更低的级别。

Reserved Notation "g || t |- x < y" (at level 10, x at level 69).

Print Grammar constr.

| "10" LEFTA
  [ SELF;
    "||";
    constr:operconstr LEVEL "200";        (* subexpression t *)
    "|-";
    constr:operconstr LEVEL "69";         (* subexpression x *)
    "<";
    NEXT