软件基础'|-'符号隐藏 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.

然后,您可以在其他地方使用 FooBar 而不会与 ltac 代码冲突:

(* Baz.v *)
Require Import Foo.
Require Import Bar.

Ltac test :=
  match goal with
  | H : _ |- _ => idtac
  end.