Isabelle/HOL 关于元组集的问题
Isabelle/HOL Question about Sets of Tuples
我有一个关于 Isabelle/HOL 的初学者问题:
我想证明以下引理:
lemma
shows "{(x,y) . x ∈ {0..<n} ∧ y ∈ {0..<n} ∧ x = y} = {(x,x). x < n}"
但证明状态是:
proof (prove)
goal (1 subgoal):
1. {(x, y). x ∈ {0..<n} ∧ y ∈ {0..<n} ∧ x = y} = {(xa, x). x < n}
为什么会出现 xa 以及如何以正确(简洁)的方式定义集合?
集合推导{(x,y). ....}
中的(x,y)
是绑定变量名。当您编写 {(x,x). x < n}
时,您绑定了 两个名为 x
的变量 x
,其中第二个 x
shadows 第一个。
{(x,x). x < n}
实际上只是 lambda 项的一个很好的语法。在内部,它转换为 Collect (case_prod (λx. λx. x < n))
。这样看术语,阴影更明显。
要解决您的问题,您必须明确表达第一个和第二个绑定变量要相同的信息,即:{(x1,x2). x1 = x2 ∧ x1 < n}
.
附带说明:您试图证明的引理不正确。 (例如,n
可能是一个 int
。)如果你希望 n
是一个 nat
,你必须明确这一点,例如通过在你的目标是这样 {(x,y). x ∈ {0..<(n::nat)} ∧ y ∈ {0..<n} ∧ x = y} = {(x1,x2). x1 = x2 ∧ x1 < n}
。
特别是,如果您是初学者,我强烈建议使用语法 lemma Name: fixes n :: ‹nat› assumes ‹...› shows ‹...›
.
在引理头中显式引入自由变量
我有一个关于 Isabelle/HOL 的初学者问题:
我想证明以下引理:
lemma
shows "{(x,y) . x ∈ {0..<n} ∧ y ∈ {0..<n} ∧ x = y} = {(x,x). x < n}"
但证明状态是:
proof (prove)
goal (1 subgoal):
1. {(x, y). x ∈ {0..<n} ∧ y ∈ {0..<n} ∧ x = y} = {(xa, x). x < n}
为什么会出现 xa 以及如何以正确(简洁)的方式定义集合?
集合推导{(x,y). ....}
中的(x,y)
是绑定变量名。当您编写 {(x,x). x < n}
时,您绑定了 两个名为 x
的变量 x
,其中第二个 x
shadows 第一个。
{(x,x). x < n}
实际上只是 lambda 项的一个很好的语法。在内部,它转换为 Collect (case_prod (λx. λx. x < n))
。这样看术语,阴影更明显。
要解决您的问题,您必须明确表达第一个和第二个绑定变量要相同的信息,即:{(x1,x2). x1 = x2 ∧ x1 < n}
.
附带说明:您试图证明的引理不正确。 (例如,n
可能是一个 int
。)如果你希望 n
是一个 nat
,你必须明确这一点,例如通过在你的目标是这样 {(x,y). x ∈ {0..<(n::nat)} ∧ y ∈ {0..<n} ∧ x = y} = {(x1,x2). x1 = x2 ∧ x1 < n}
。
特别是,如果您是初学者,我强烈建议使用语法 lemma Name: fixes n :: ‹nat› assumes ‹...› shows ‹...›
.