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
。这引入了一个纯句法缩写,将在解析期间扩展。如果你的 a
和 b
是像 1+2
和 3+4
这样的固定词,你可以简单地这样做:
abbreviation "X ≡ (1 + 2) + (3 + 4)"
然后写X + c
、X - c
、X - 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 + X
是 5 + ((1 + 2) + (3 + 4))
.
你也可以使用definition
;这引入了一个名为 X
的新常量。您可以使用定理 X_def
展开定义。但从你的问题来看,我了解到你不希望那样。
变量呢?
从你的问题看不太清楚,但我猜你的情况是这样的:
lemma foo: "P (a + b + c)"
(* some proof *)
lemma bar: "P (a + b - c)"
(* some proof *)
在那种情况下,你不能像上面那样使用缩写,因为 a
和 b
是变量,你不能在缩写(或定义)的右侧有自由变量).但是,您可以在匿名上下文中本地修复变量:
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
然后引理 foo
和 bar
与固定的自由变量 a
和 b
一起导出,以通常的方式推广到原理图变量。然而,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
。
退出上下文后,定义将在各处展开并消失,为您提供所需的引理。
我想写多个公式,其中包含一个公共变量组合,但我很懒,所以我想有一个句法变量。
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
。这引入了一个纯句法缩写,将在解析期间扩展。如果你的 a
和 b
是像 1+2
和 3+4
这样的固定词,你可以简单地这样做:
abbreviation "X ≡ (1 + 2) + (3 + 4)"
然后写X + c
、X - c
、X - 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 + X
是 5 + ((1 + 2) + (3 + 4))
.
你也可以使用definition
;这引入了一个名为 X
的新常量。您可以使用定理 X_def
展开定义。但从你的问题来看,我了解到你不希望那样。
变量呢?
从你的问题看不太清楚,但我猜你的情况是这样的:
lemma foo: "P (a + b + c)"
(* some proof *)
lemma bar: "P (a + b - c)"
(* some proof *)
在那种情况下,你不能像上面那样使用缩写,因为 a
和 b
是变量,你不能在缩写(或定义)的右侧有自由变量).但是,您可以在匿名上下文中本地修复变量:
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
然后引理 foo
和 bar
与固定的自由变量 a
和 b
一起导出,以通常的方式推广到原理图变量。然而,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
。
退出上下文后,定义将在各处展开并消失,为您提供所需的引理。