Isabelle:命令/语法局部变量/语法缩写
我想写多个公式,包括一个共同的变量组合,但我很懒,所以我想有一个语法变量Isabelle:命令/语法局部变量/语法缩写,isabelle,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”。简短的回答 默认方式是使用缩写。这引入了一个纯粹的语法缩写,将在解析过程中进行扩展。如果您案例中的a和b
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”。简短的回答
默认方式是使用缩写
。这引入了一个纯粹的语法缩写,将在解析过程中进行扩展。如果您案例中的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
。如果您不想这样做,可以使用缩写(输入)
还要注意的是,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)
您还可以使用定义
;这将引入一个名为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)
,这有点奇怪,事实上,任何出现的+
都将以这种方式打印,因此在任何情况下执行缩写(输入)
都是一个好主意
关于卫生的说明
使用像这样的通用名称污染全局命名空间通常被认为是不好的样式。使用本地定义的替代方法是:
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
退出上下文后,定义将在任何地方展开并消失,为您提供所需的引理。简短答案
默认方式是使用缩写
。这引入了一个纯粹的语法缩写,将在解析过程中进行扩展。如果您案例中的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
。如果您不想这样做,可以使用缩写(输入)
还要注意的是,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)
您还可以使用定义
;这将引入一个名为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)
,这有点奇怪,事实上,任何出现的+
都将以这种方式打印,因此在任何情况下执行缩写(输入)
都是一个好主意
关于卫生的说明
使用像这样的通用名称污染全局命名空间通常被认为是不好的样式。使用本地定义的替代方法是:
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
退出上下文后,定义将到处展开并消失,给你你想要的引理。这些变量出现在函数定义、定理或证明中吗?这些变量出现在函数定义、定理或证明中吗?