Software Foundations在其几个符号中使用|-
。例如,在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
表示法之外,还有什么可以做的吗?
答案 0 :(得分:2)
据我所知,这里没有任何可以做到真正修复问题的事情。 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.