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


退出上下文后,定义将到处展开并消失,给你你想要的引理。

这些变量出现在函数定义、定理或证明中吗?这些变量出现在函数定义、定理或证明中吗?