Coq:修复递归符号
Coq: Fixing a recursive notation
下面是一个半工作的简单递归符号:
Universe ARG. Definition ARG := Type@{ARG}.
Parameter X: ARG.
Notation A := (fun x:ARG->ARG => fun y:x X => y).
Parameter P: ARG -> ARG.
Parameter s: P X.
Notation "[ x .. z u ]" := (x P .. (z P u) .. ) (at level 5, z, u at next level).
Check (A P (A P (A P s))). (* [A A A s]: P X *)
Print Grammar constr.
(*| "5" RIGHTA
[ "["; NEXT; LIST1 NEXT; NEXT; "]"
| "["; NEXT; NEXT; "]" ]*)
Check [A A A s]. (* Syntax error: [constr:operconstr] or [constr:operconstr] expected (in [constr:operconstr]). *)
如您所见,Coq 将 A P (A P (A P s))
识别为 [A A A s]: P X
但无法解析 [A A A s]
。问题出在哪里,解决方法是什么?
编辑:Coq 似乎在这里需要一些 "parsing aids"。例如以下作品:
Notation "( x .. z [ u ] )" := (x P .. (z P u) .. ) (at level 5, z at next level).
Check (A A A [s]): P X.
因为我想摆脱内部符号,所以问题仍然悬而未决
问题是 Coq <= 8.7 不能很好地支持 x .. y z
形式的递归符号,解决方法是下载 Coq master,或等待 Coq 8.8。 Hugo Herbelin's fix, entitled Adding support for recursive notations of the form "x , .. , y , z"
,于 2017 年 8 月 1 日合并。
下面是一个半工作的简单递归符号:
Universe ARG. Definition ARG := Type@{ARG}.
Parameter X: ARG.
Notation A := (fun x:ARG->ARG => fun y:x X => y).
Parameter P: ARG -> ARG.
Parameter s: P X.
Notation "[ x .. z u ]" := (x P .. (z P u) .. ) (at level 5, z, u at next level).
Check (A P (A P (A P s))). (* [A A A s]: P X *)
Print Grammar constr.
(*| "5" RIGHTA
[ "["; NEXT; LIST1 NEXT; NEXT; "]"
| "["; NEXT; NEXT; "]" ]*)
Check [A A A s]. (* Syntax error: [constr:operconstr] or [constr:operconstr] expected (in [constr:operconstr]). *)
如您所见,Coq 将 A P (A P (A P s))
识别为 [A A A s]: P X
但无法解析 [A A A s]
。问题出在哪里,解决方法是什么?
编辑:Coq 似乎在这里需要一些 "parsing aids"。例如以下作品:
Notation "( x .. z [ u ] )" := (x P .. (z P u) .. ) (at level 5, z at next level).
Check (A A A [s]): P X.
因为我想摆脱内部符号,所以问题仍然悬而未决
问题是 Coq <= 8.7 不能很好地支持 x .. y z
形式的递归符号,解决方法是下载 Coq master,或等待 Coq 8.8。 Hugo Herbelin's fix, entitled Adding support for recursive notations of the form "x , .. , y , z"
,于 2017 年 8 月 1 日合并。