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

我从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
这是可行的,尽管我不得不把
记事本
放在校样周围,因为伊莎贝尔不喜欢
假设
在顶层。但是现在我想用同样的证明技巧,通过陈述与引理相同的事实,这不起作用:

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
。这种使用
的用法在我的教程中没有出现过,所以我不知道。现在可以了。虽然我确实想知道为什么伊莎贝尔在默认情况下不会使用假设……事实上,在初始证明方法中不使用假设,而是在证明本身的某个地方使用假设是很常见的。你也会看到的。