软件基础'|-'符号隐藏 Ltac 匹配符号
Software Foundations '|-' notation shadows Ltac match notation
Software Foundations uses |-
in a couple of its notations. For example, in Stlc:
Reserved Notation "Gamma '|-' t '\in' T" (at level 40).
这会干扰 Ltac 匹配结构。例如,这个:
Ltac test :=
match goal with
H: _ |- _ => idtac
end.
在 Stlc 之外工作正常,但是一旦定义了该符号,它就会失败:
Toplevel input, characters 43-44:
Syntax error: "\in" expected after [constr:operconstr level 200] (in [constr:operconstr]).
除了更改 Gamma '|-' t '\in' T
符号外,还有什么可以做的吗?
据我所知,这里无法真正解决问题。 Coq 的可扩展解析器非常脆弱,这样的冲突会导致某些东西变得无法解析。
解决方法是在模块中声明符号:
(* Foo.v *)
Module MyNotation.
Reserved Notation "Gamma '|-' t '\in' T" (at level 40).
(* Include actual notation definition somewhere here *)
End MyNotation.
要使用符号,只需导入模块:
(* Bar.v *)
Require Import Foo.
Import MyNotation.
Definition asdf := 4.
然后,您可以在其他地方使用 Foo
和 Bar
而不会与 ltac 代码冲突:
(* Baz.v *)
Require Import Foo.
Require Import Bar.
Ltac test :=
match goal with
| H : _ |- _ => idtac
end.
Software Foundations uses |-
in a couple of its notations. For example, in Stlc:
Reserved Notation "Gamma '|-' t '\in' T" (at level 40).
这会干扰 Ltac 匹配结构。例如,这个:
Ltac test :=
match goal with
H: _ |- _ => idtac
end.
在 Stlc 之外工作正常,但是一旦定义了该符号,它就会失败:
Toplevel input, characters 43-44:
Syntax error: "\in" expected after [constr:operconstr level 200] (in [constr:operconstr]).
除了更改 Gamma '|-' t '\in' T
符号外,还有什么可以做的吗?
据我所知,这里无法真正解决问题。 Coq 的可扩展解析器非常脆弱,这样的冲突会导致某些东西变得无法解析。
解决方法是在模块中声明符号:
(* Foo.v *)
Module MyNotation.
Reserved Notation "Gamma '|-' t '\in' T" (at level 40).
(* Include actual notation definition somewhere here *)
End MyNotation.
要使用符号,只需导入模块:
(* Bar.v *)
Require Import Foo.
Import MyNotation.
Definition asdf := 4.
然后,您可以在其他地方使用 Foo
和 Bar
而不会与 ltac 代码冲突:
(* Baz.v *)
Require Import Foo.
Require Import Bar.
Ltac test :=
match goal with
| H : _ |- _ => idtac
end.