Isabelle:命令/句法局部变量/句法缩写

Isabelle: commands/ syntactic local variables / syntactic abbreviations

我想写多个公式,其中包含一个公共变量组合,但我很懒,所以我想有一个句法变量。

IE "a + b + c"
"a + b - c"
"a + b + e - a"

而不是每次都写 "a + b" 我希望能够写这样的东西:

X == a + b

"X + c"
"X - c"
"X - e - a"

与 LaTeX 的 \include 命令具有相同的功能。它仍应将 "X - e - a" 标识为 "b - e".

简答

默认方式是使用abbreviation。这引入了一个纯句法缩写,将在解析期间扩展。如果你的 ab 是像 1+23+4 这样的固定词,你可以简单地这样做:

abbreviation "X ≡ (1 + 2) + (3 + 4)"

然后写X + cX - cX - e - a。另请注意,缩写在打印前会折回,即 (1 + 2) + (3 + 4) + 5 将打印为 X + 5。如果你不想这样,你可以使用 abbreviation (input) 代替。

另请注意 5 + (1 + 2) + (3 + 4)not 打印为 5 + X 并且 not 在语法上与5 + X 因为加法关联到左边:5 + (1 + 2) + (3 + 4)(5 + (1 + 2)) + (3 + 4),而 5 + X5 + ((1 + 2) + (3 + 4)).

你也可以使用definition;这引入了一个名为 X 的新常量。您可以使用定理 X_def 展开定义。但从你的问题来看,我了解到你不希望那样。

变量呢?

从你的问题看不太清楚,但我猜你的情况是这样的:

lemma foo: "P (a + b + c)"
(* some proof *)

lemma bar: "P (a + b - c)"
(* some proof *)

在那种情况下,你不能像上面那样使用缩写,因为 ab 是变量,你不能在缩写(或定义)的右侧有自由变量).但是,您可以在匿名上下文中本地修复变量:

context
  fixes a b :: "'a :: ring_1" (* change this type if necessary *)
begin

abbreviation "X ≡ a + b"

lemma foo: "P (X + 3)"
(* some proof *)

lemma bar: "P (X - 3)"
(* some proof *)

end

然后引理 foobar 与固定的自由变量 ab 一起导出,以通常的方式推广到原理图变量。然而,thm foo 将打印为 ?P (X (X ?a ?b) 3),这有点奇怪,事实上,任何出现的 + 都会以这种方式打印,所以 abbreviation (input) 是无论如何都是个好主意。

卫生注意事项

用如此笼统的名称污染全局命名空间通常被认为是糟糕的风格。使用本地定义的替代方法是:

context
  fixes a b :: "'a :: ring_1"
  fixes X defines X_def[simp]: "X ≡ a + b"
begin

lemma foo: "P (X + 3)"
sorry

lemma bar: "P (X - 3)"
sorry

end

这里,X不仅仅是一个语法缩写,而是一个新的常量,其定义必须展开。但是,通过将定义声明为 simp 规则,此展开将自动完成。但是,它不会自动重新折叠,因此在使用简化器后,您将永远不会在输出中看到 X

退出上下文后,定义将在各处展开并消失,为您提供所需的引理。