在 [constr:operconstr] 之后使用预期的 3 符号表示法 [constr:operconstr]

Using a 3 symbols notation [constr:operconstr] expected after [constr:operconstr]

假设我有一个关系及其自反和传递闭包(n 计算 "transitive steps" 的数量:

Variable A: Type.

Inductive Relation: A -> A -> Prop :=
| rel: forall (a b: A), Relation a b.

Notation "a --> b" := (Relation a b) (at level 50).

Inductive Refl_Trans_Rel: A -> A -> nat -> Prop :=
| zero_step: forall a b, a --> b -> Refl_Trans_Rel a b 0
| n_steps: forall a b c n, a --> b /\ Refl_Trans_Rel b c n
    -> Refl_Trans_Rel a c (S n).

现在,我想要一个类似于 a --> b:

的符号
Notation "a -->^ n b" :=
  (Refl_Trans_Rel a b n) (at level 50, n at next level, b at next level).

打印没问题:Check forall a b n, Refl_Trans_Rel a b n.确实打印:

forall (a b : A) (n : nat), a -->^ n b
 : Prop

但是,当我想自己使用表示法时,出现了问题:

Check forall a b n, a -->^ n b.

失败:

Syntax error: [constr:operconstr] expected after [constr:operconstr]
  (in [constr:operconstr]).

知道为什么会失败吗?


P.S.: 随意编辑更精确的标题,因为我不知道原因,我没有更好的标题。

Coq 似乎试图将 a -->^ n b 中的 n b 部分解析为函数应用程序。克服这个困难的一种方法是将 n 放在较低的级别,如下所示:

Notation "a -->^ n b" := (Refl_Trans_Rel a b n) (at level 50, n at level 9).
Check forall (a b : A) (n : nat), a -->^ n b.

另一种选择是在 bn 之间放置一个分隔符:

Notation "a --> b # n" := (Refl_Trans_Rel a b n) (at level 50).
Check forall (a b : A) (n : nat), a --> b # n.

您可以了解有关符号和解析级别的更多信息