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 ‹...›.

在引理头中显式引入自由变量