Isabelle Isar证明中的驯服元蕴涵

Isabelle Isar证明中的驯服元蕴涵,isabelle,isar,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.z

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

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
理论沙箱
主要进口
开始
引理“(x::nat)>0∨ x=0“
证据(案例x)
假设“x=0”
显示“0

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

原则上,元蕴涵
==>
是无法避免的(事实上,它是用“本机”的方式来表达伊莎贝尔的推理规则)。在编写Isar证明时,有一种规范的方法通常允许我们避免元蕴涵。例如,为了一个总体目标

"!!x. A ==> B"
我们可以用Isar写

fix x
assume "A"
...
show "B"
对于你的具体例子,当你在《伊莎贝尔/杰迪特》中看到它时,你可能会注意到 第二种情况的
n
突出显示。原因是它是一个自由变量。虽然这本身不是一个问题,但更规范的做法是在本地修复这些变量(如教科书中典型的“for a arbitative but fixed…”语句)。例如:


在编写结构化证明时,最好避免子目标最外层结构的元蕴涵(和量化)。也就是说,不要谈论

⋀x. P x ⟹ Q x ⟹ R x
你应该使用

fix x
assume "P x" "Q x"
...
show "R x"
如果
px
qx
具有某种结构,则可以对它们使用元蕴涵和-量化

与结构化证明中的元运算符相比,人们更喜欢
修复
/
假设

  • 有点琐碎,您不必在每个have和show语句中再次声明它们

  • 更重要的是,当您使用
    fix
    量化变量时,它在整个证明中保持不变。如果您使用
    ,它在每个
    have
    语句中新量化(并且不存在于外部)。这使得不可能直接引用此变量,并且常常使自动工具的搜索空间复杂化。类似的事情适用于
    假设
    vs

  • 更复杂的一点是
    show
    在存在元含义的情况下的行为。考虑下面的尝试:

    lemma "P ⟷ Q"
    proof
      show "P ⟹ Q" sorry
    next
      show "Q ⟹ P" sorry
    qed
    
    proof
    命令之后,有两个子目标:
    p⟹ Q
    Q⟹ P
    。然而,最终的
    qed
    失败。这是怎么发生的

    第一个
    show
    应用规则
    p⟹ Q
    到第一个适用的子目标,即
    P⟹ Q
    。使用Isabelle常用的规则解析机制,这将产生
    P⟹ P
    假设P
    show Q`会删除子目标)

    第二个
    show
    应用规则
    Q⟹ P
    到第一个适用的子目标:现在是
    P⟹ P
    (as
    Q⟹ P
    是第二个子目标),产生
    P⟹ Q
    又来了

    因此,我们仍然有两个子目标
    p⟹ Q
    Q⟹ P
    qed
    无法完成目标

    在许多情况下,我们没有注意到
    show
    的这种行为,就像
    p⟹ P
    可通过
    qed
    解决

关于
show
行为的几句话:如上所述,
show
中的元含义与
假设不对应。相反,它对应于
假设
的不太知名的兄弟
假设
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

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