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

时间:2016-02-25 22:12:42

标签: isabelle

我想写多个包含公共变量组合的公式,但我很懒,所以我想要一个语法变量。

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”。

1 个答案:

答案 0 :(得分:2)

简答

默认方式是使用abbreviation。这引入了一个纯语法缩写,将在解析过程中进行扩展。如果您的案例中的ab1+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)打印为5 + X在语法上与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

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