如何在存在性证明中使用获取?

时间:2014-07-01 14:21:56

标签: isabelle isar

我试图证明一个存在主义定理

lemma "∃ x. x * (t :: nat) = t"
proof
  obtain y where "y * t = t" by (auto)

但我无法完成证明。所以我有必要y,但我怎样才能将其纳入原定目标?

3 个答案:

答案 0 :(得分:4)

自然演绎的健全性要求你在打开存在量词之前掌握证人。这就是为什么不允许在show语句中使用获得的变量。在您的示例中,proof步骤隐式应用规则exI。这将存在量化变量x转换为原型变量?x,可以在以后实例化,但实例化可能只引用?x到位时已在范围内的变量。在低级证明状态中,获得的变量是元量化的(!!),?x的实例化只能引用作为?x的参数出现的变量。

因此,您必须在校样中切换顺序:

lemma "∃ x. x * (t :: nat) = t"
proof - (* method - does not change the goal *)
  obtain y where "y * t = t" by (auto)
  then show ?thesis by(rule exI)
qed

答案 1 :(得分:3)

您可以在show子句中提供见证(即您要为x输入的元素):

lemma "∃ x. x * (t :: nat) = t"
proof
  show "1*t = t" by simp
qed

答案 2 :(得分:1)

或者,当您已经知道见证人(此处为 1Suc 0)时,您可以显式实例化规则 exI 以引入存在项:

lemma "∃ x. x * (t :: nat) = t"
  by (rule exI[where x = "Suc 0"], simp)

这里,存在量词引入规则thm exI

?P ?x ⟹ ∃x. ?P x

你可以用答案逐步探索和实例化它。

thm exI[where x = "Suc 0"] 是:

?P (Suc 0) ⟹ ∃x. ?P x

exI[where P = "λ x. x * t = t" and x = "Suc 0"]

Suc 0 * t = t ⟹ ∃x. x * t = t

Suc 0 * t = t 只是一种简化形式 (simp)。但是系统可以通过统一计算出最后一个实例化 P = "λ x. x * t = t",所以这不是真的必要。

相关:

Instantiating theorems in Isabelle