似乎有一些关于归纳谓词的东西我不明白,因为我不断遇到它们的问题。我最近的努力是用ev
具体语义书籍第 5 章中归纳定义的谓词来理解案例分析。
假设我正在证明
lemma
shows "ev n ⟹ ev (n - 2)"
我试图在 Isabelle/HOL 中立即开始证明,但是当我尝试或给出奇怪的目标时它会抱怨:
lemma
shows "ev n ⟹ ev (n - 2)"
proof (cases)
这表明:
proof (state)
goal (2 subgoals):
1. ⟦ev n; ?P⟧ ⟹ ev (n - 2)
2. ⟦ev n; ¬ ?P⟧ ⟹ ev (n - 2)
这不是我所期望的。
当我传递n
到案例时,我们改为对自然数的定义进行归纳(注意其他时候它ev
正确地进行了归纳,请参见后面的示例):
lemma
shows "ev n ⟹ ev (n - 2)"
proof (cases n)
给出:
proof (state)
goal (2 subgoals):
1. ⟦ev n; n = 0⟧ ⟹ ev (n - 2)
2. ⋀nat. ⟦ev n; n = Suc nat⟧ ⟹ ev (n - 2)
这不是我所期望的。但是请注意,即使作为参数,以下内容也可以工作(即它ev
不是对自然数进行归纳) :n
lemma
shows "ev n ⟹ ev (n - 2)"
proof -
assume 0: "ev n"
from this show "ev (n - 2)"
proof (cases n)
我意识到首先假设ev n
然后声明显示必须有一些魔力,ev (n-2)
否则不会发生错误。
我理解规则倒置的想法(通过分析可能导致它的案例,得出要反向证明的给定事实)。对于“偶数”谓词,规则反转是:
ev n ==> n = 0 ∨ (∃k. n = Suc (Suc k) ∧ ev k)
这基于归纳定义的谓词是有意义的:
inductive ev :: "nat ⇒ bool" where
ev0: "ev 0" |
evSS: "ev n ⟹ ev (Suc (Suc n))"
但我不明白。为什么不直接做案例工作?或者为什么这个语法无效:
proof (cases ev)
或这个:
proof (cases ev.case)
等等
我认为症结在于,在处理归纳定义谓词时,我不知道这种归纳是否适用于目标或假设,但从教科书的文字来看:
名称规则倒置强调我们是在倒推:通过哪些规则可以证明某些给定的事实?
我假设它正在对目标应用规则倒置,因为它说“通过哪些规则可以证明某些给定的事实”。
此外,ev ==> ev (n-2)
书中的这个例子也无济于事,因为前提和结论都ev
涉及。
规则倒置的案例分析如何真正发挥作用,为什么我们需要首先假设 Isabelle 为案例分析提供合理的目标?