我开始使用Isabelle / HOL并完成分发中包含的prog-prove.pdf
教程。我在第4.4.5节“规则倒置”中难以接受。本教程(基本上)给出了以下示例:
theory Structured
imports Main
begin
inductive ev :: "nat ⇒ bool" where
ev0: "ev 0" |
evSS: "ev n ⟹ ev (Suc (Suc n))"
notepad
begin
assume "ev n"
from this have "ev (n - 2)"
proof cases
case ev0 thus "ev (n - 2)" by (simp add: ev.ev0)
next
case (evSS k) thus "ev (n - 2)" by (simp add: ev.evSS)
qed
end
虽然我不得不将notepad
放在证据上,因为Isabelle不喜欢assume
在顶层。但是现在我想通过引用与引理相同的事实来使用相同的证明技术,这不起作用:
lemma "ev n ⟹ ev (n - 2)"
proof cases
case ev0 thus "ev (n - 2)" by (simp add: ev.ev0)
(* ... *)
Isabelle在ev0
停留,抱怨Undefined case: "ev0"
,然后Illegal application of proof command in "state" mode
by
。{/ p>
说明这一目标的两种方式之间有什么区别?如何将上述证明技术与引理语句一起使用? (我知道我可以使用sledgehammer
证明引理,但我试图理解Isar证明。)
答案 0 :(得分:3)
cases
方法尝试根据“给定事实”选择正确的案例分析规则。鉴于您使用then
或from
或using
提供的事实。
如果您将光标放在have "ev (n - 2)"
上,您会看到此目标状态
proof (prove): depth 1
using this:
ev n
goal (1 subgoal):
1. ev (n - 2)
在lemma "ev n ⟹ ev (n - 2)"
上你得到
proof (prove): depth 0
goal (1 subgoal):
1. ev n ⟹ ev (n - 2)
当您可以使用适当的Isar命令分别指定引理的假设并使用==>
将其提供给证明时,解决方案是避免元隐含(using
):
lemma
assumes "ev n"
shows "ev (n - 2)"
using assms