Isabelle/HOL规则反转证明
我从Isabelle/HOL开始,通过发行版中包含的Isabelle/HOL规则反转证明,isabelle,Isabelle,我从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 ha
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
这是可行的,尽管我不得不把记事本
放在校样周围,因为伊莎贝尔不喜欢假设
在顶层。但是现在我想用同样的证明技巧,通过陈述与引理相同的事实,这不起作用:
lemma "ev n ⟹ ev (n - 2)"
proof cases
case ev0 thus "ev (n - 2)" by (simp add: ev.ev0)
(* ... *)
Isabelle停在ev0
处,抱怨未定义的情况:“ev0”
,然后在处以“状态”模式非法应用证明命令
这两种表述目标的方式有什么区别?我如何在引理语句中使用上述证明技巧?(我知道我可以用sledgehammer
证明引理,但我正在努力理解Isar证明。)案例方法试图根据“给定事实”选择正确的案例分析规则。给定事实是使用然后使用或从或使用提供的事实
如果你把光标放在“ev(n-2)”上,你会看到这个目标状态
proof (prove): depth 1
using this:
ev n
goal (1 subgoal):
1. ev (n - 2)
开启时引理“ev n⟹ ev(n-2)“
您可以
proof (prove): depth 0
goal (1 subgoal):
1. ev n ⟹ ev (n - 2)
当您可以使用适当的Isar命令分别指定引理的假设,并使用使用将它们提供给证据时,解决方案是避免元含蓄(==>
):
lemma
assumes "ev n"
shows "ev (n - 2)"
using assms
谢谢我也尝试过这种假设
-显示
风格,但我遇到了同样的问题。实际使用假设的关键是使用using
。这种使用的用法在我的教程中没有出现过,所以我不知道。现在可以了。虽然我确实想知道为什么伊莎贝尔在默认情况下不会使用假设……事实上,在初始证明方法中不使用假设,而是在证明本身的某个地方使用假设是很常见的。你也会看到的。