Coq的新范围

Coq的新范围,coq,Coq,我想要我自己的范围,玩长距离修复 Declare Scope my_scope. Delimit Scope my_scope with my. Open Scope my_scope. Definition f (x y a b : nat) : nat := x+y+a+b. Notation "x < y * a = b" := (f x y a b) (at level 100, no associativity) : my_scope. Check (1 < 2 *

我想要我自己的范围,玩长距离修复

Declare Scope my_scope.
Delimit Scope my_scope with my.
Open Scope my_scope.

Definition f (x y a b : nat) : nat := x+y+a+b.
Notation "x < y * a = b" := (f x y a b)
 (at level 100, no associativity) : my_scope.

Check (1 < 2 * 3 = 4)%my.
声明作用域我的作用域。
将范围my_范围与my分隔。
打开范围我的范围。
定义f(xyab:nat):nat:=x+y+a+b。
符号“x
如何制作新的示波器


编辑:我选择“x 命令
Declare Scope
不存在。中介绍了有关作用域的各种命令

您对示例符号的选择存在固有的问题,因为它与预定义的符号冲突,而预定义的符号似乎是在您的符号之前使用的

当查看第一个组件时,解析器会看到
,并认为您实际上在谈论整数的比较,然后它会将第二部分视为表示法
\u*\ ucode>的实例,然后它会看到所有这些都是等式的左侧。一直以来,解析器都很高兴,它构造了以下形式的表达式:

(1 < (2 * 3)) = 4
选择
x
的级别低于
=
的级别,选择y的级别低于
*
的级别,选择
a
的级别低于
=
。这些级别是通过读取命令
Print Grammar constr.
的答案获得的,因为下面的命令被接受,所以它似乎有效

Check << 1 < 2 * 3 = 4 >>.
检查>。

但是你可能需要加入更多的工程学才能有一个真正好的符号。

要回答标题中的实际问题:

当您声明使用新范围的符号时,就会创建新范围。也就是说,您不需要单独声明一个新的作用域
my_scope
。你只要写

Notation "x <<< y" := (f x y) (at level 100, no associativity) : my_scope.

表示法“x我不明白这个问题。你不是刚创建了你自己的作用域吗?你不想要的东西怎么可能不是你想要的?我确实想让我愚蠢的四元运算符对coq进行阴影处理。没有办法去掉括号?”>“说“最左边的非终结符的级别不能更改”。这与“本质上是一个LL1解析器”有关吗?
Notation "x <<< y" := (f x y) (at level 100, no associativity) : my_scope.