我想写多个包含公共变量组合的公式,但我很懒,所以我想要一个语法变量。
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”。
答案 0 :(得分:2)
默认方式是使用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)
将不打印为5 + X
且不在语法上与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
。
退出上下文后,定义将在各处展开并消失,为您提供所需的引号。