Coq中的符号

Coq中的符号,coq,Coq,我想使用符号来表示谓词test,如下所示: Variable A B : Type. Inductive test : A -> B -> A -> B -> Prop := | test1 : forall a1 a2 b1 b2, a1 \ b1 || a2 \ b2 where "c1 '\' st '||' c2 '\' st'" := (test c1 st c2 st') . 但是,Coq有一个错误: 为什么Coq中不能接受此符号?该符号被接受,

我想使用符号来表示谓词test,如下所示:

Variable A B : Type.

Inductive test : A -> B -> A -> B -> Prop :=
| test1 : forall a1 a2 b1 b2,
    a1 \ b1 || a2 \ b2
where "c1 '\' st '||' c2 '\' st'" := (test c1 st c2 st')
.
但是,Coq有一个错误:


为什么Coq中不能接受此符号?

该符号被接受,实际上是Coq在
test1
的定义中错误地解析了您对符号的使用。要正确解析此符号,您需要调整其术语的解析级别。您可以使用保留的表示法来实现这一点,因为归纳表达式中表示法的这些
where
子句不支持配置表示法的语法:

Variable A B : Type.

Reserved Notation "c1 '\' st '||' c2 '\' st'" (at level 40, st at next level, c2 at next level, no associativity).

Inductive test : A -> B -> A -> B -> Prop :=
| test1 : forall a1 a2 b1 b2,
    a1 \ b1 || a2 \ b2
where "c1 '\' st '||' c2 '\' st'" := (test c1 st c2 st')
.

我没有很好的直觉来判断什么样的解析级别工作得好(40在上面有点随意),所以我能给出的最好建议是进行实验,如果它在某个地方被错误解析,那么试着调整级别。

它必须在
50级别或以下,因为
orb
处于50级别。不过,我承认,我并不完全确定冲突的形式。