讽刺Isar证明中的元蕴涵

时间:2014-08-13 12:10:04

标签: isabelle isar

证明一个简单的定理我在证明中遇到了元级含义。拥有它们还是可以避免它们?如果我应该处理它们,这是正确的方法吗?

theory Sandbox
imports Main
begin

lemma "(x::nat) > 0 ∨ x = 0"
proof (cases x)
  assume "x = 0"
  show "0 < x ∨ x = 0" by (auto)
next
  have "x = Suc n ⟹ 0 < x" by (simp only: Nat.zero_less_Suc)
  then have "x = Suc n ⟹ 0 < x ∨ x = 0" by (auto)
  then show "⋀nat. x = Suc nat ⟹ 0 < x ∨ x = 0" by (auto)
qed

end

我想这可以更容易证明,但我希望有一个结构化的证明。

2 个答案:

答案 0 :(得分:4)

原则上,元蕴涵==>没有什么可以避免的(实际上它是在伊莎贝尔表达推理规则的本地&#34;方式)。有一种规范的方法通常允许我们在编写Isar证明时避免使用meta-implication。例如,为了一般目标

"!!x. A ==> B"

我们可以写在Isar

fix x
assume "A"
...
show "B"

对于您的具体示例,在Isabelle / jEdit中查看时您可能会注意到这一点 第二个案例的n突出显示。原因是它是一个自由变量。虽然这本身并不是问题,但在本地修复这些变量更为规范(就像典型的陈述&#34;对于任意但固定的......&#34;在教科书中)。如,

next
  fix n
  assume "x = Suc n"
  then have "0 < x" by (simp only: Nat.zero_less_Suc)
  then show "0 < x ∨ x = 0" ..
qed

在这里可以再次看到Isar中的fix / assume / show如何与实际目标相对应,即

1. ⋀nat. x = Suc nat ⟹ 0 < x ∨ x = 0

答案 1 :(得分:3)

在编写结构化证明时,最好避免对子目标的最外层结构进行元蕴涵(和量化)。即而不是谈论

⋀x. P x ⟹ Q x ⟹ R x

你应该使用

fix x
assume "P x" "Q x"
...
show "R x"

如果P xQ x有一些结构,可以使用元蕴涵和量化这些。

有多种理由希望fix / assumes优于结构化校样中的元运算符。

  • 有点琐碎,你不必在每个有和show语句中再说一遍。

  • 更重要的是,当您使用fix量化变量时,它在整个证明中保持不变。如果您使用,则会在每个have语句中对其进行新近量化(并且不存在于外部)。这使得无法直接引用此变量,并且通常会使自动化工具的搜索空间复杂化。类似的内容适用于assume vs

  • 更复杂的一点是show在存在元意义时的行为。请考虑以下证明尝试:

    lemma "P ⟷ Q"
    proof
      show "P ⟹ Q" sorry
    next
      show "Q ⟹ P" sorry
    qed
    

    proof命令之后,有两个子目标:P ⟹ QQ ⟹ P。然而,最终的qed失败了。这是怎么发生的?

    第一个show将规则P ⟹ Q应用于第一个适用的子目标,即P ⟹ Q。使用Isabelle通常的规则解析机制,这会产生P ⟹ Passume P显示Q`将删除子目标。)

    第二个show将规则Q ⟹ P应用于第一个适用的子目标:现在是P ⟹ P(因为Q ⟹ P是第二个子目标),产生{{1}再次。

    因此,我们仍有两个子目标P ⟹ QP ⟹ Q,而Q ⟹ P无法关闭目标。

    在很多情况下,我们没有注意到qed的这种行为,因为像show这样的琐事子目标可以通过P ⟹ P来解决。

关于qed行为的几句话:如上所述,show中的元蕴涵与show不对应。相反,它对应于assume鲜为人知的兄弟assumepresume允许您引入新的假设,但要求您在之后解除它们。例如,比较

presume

lemma "P 2 ⟹ P 0"
proof -
  presume "P 1" then show "P 0" sorry
next
  assume "P 2" then show "P 1" sorry
qed