你如何在Isabelle / HOL中使用感应战术/ Isar?

时间:2017-09-03 14:56:04

标签: isabelle theorem-proving proofs

我正在努力理解为什么下面的每个例子都有效或无效,而且更抽象地说,归纳如何与战术相比与Isar相互作用。我正在使用最新的Isabelle / HOL(2016-1)在Windows 10上的Isabelle / HOL(2016年12月)编程和证明中进行4.3的工作

有8种情况:引理要么长(包括显式名称)要么是短的,有结构的(使用assumesshows)或非结构化(使用箭头)并且证明要么是结构化的( Isar)或非结构化(战术)。

theory Confusing_Induction
  imports Main
begin

(* 4.3 *)
inductive ev :: " nat ⇒ bool " where
  ev0: " ev 0 " |
  evSS: " ev n ⟹ ev (n + 2) "

fun evn :: " nat ⇒ bool " where
  " evn 0 = True " |
  " evn (Suc 0) = False " |
  " evn (Suc (Suc n)) = evn n "

1。结构化短引理&结构化证明

(* Hangs/gets stuck/loops on the following *)
(*
lemma assumes a: " ev (Suc(Suc m)) " shows" ev m "
proof(induction  "Suc (Suc m)" arbitrary: " m " rule: ev.induct)
*)

2。非结构化短引理&结构化证明

(* And this one ends up having issues with
   "Illegal application of proof command in state mode" *)
(*
lemma " ev (Suc (Suc m)) ⟹ ev m " 
proof(induction " Suc (Suc m) " arbitrary: " m " rule: ev.induct)
  case ev0
  then show ?case sorry
next
  case (evSS n)
  then show ?case sorry
qed
*)

第3。结构化长引理&结构化证明

(* And neither of these can apply the induction *)
(*
lemma assumes a1: " ev n " and a2: " n = (Suc (Suc m)) " shows " ev m "
proof (induction " n " arbitrary: " m " rule: ev.induct)

lemma assumes a1: " n = (Suc (Suc m)) " and a2: "ev n " shows " ev m "
proof (induction " n " arbitrary: " m " rule: ev.induct)
*)

(* But this one can ?! *)
(*
lemma assumes a1: " ev n " and a2: " n = (Suc (Suc m)) " shows " ev m "
proof -
  from a1 and a2 show " ev m "
  proof (induction " n " arbitrary: " m " rule: ev.induct)
    case ev0
    then show ?case by simp
  next
    case (evSS n) thus ?case by simp
  qed
qed
*)

4。非结构化长引理&结构化证明

(* And this is the manually expanded form of the Advanced Rule Induciton from 4.4.6 *)
lemma tmp: " ev n ⟹  n = (Suc (Suc m)) ⟹ ev m "
proof (induction " n " arbitrary: " m " rule: ev.induct)
  case ev0 thus ?case by simp
next
  case (evSS n) thus ?case by simp
qed

lemma " ev (Suc (Suc m)) ⟹ ev m "
  using tmp by blast

** 5。结构化短引理&非结构化证据*

(* Also gets stuck/hangs *)
(*
lemma assumes a: " ev (Suc (Suc m)) " shows " ev m "
  apply(induction  "Suc (Suc m)" arbitrary: " m " rule: ev.induct)
*)

6。非结构化短引理&非结构化证据

(* This goes through no problem (``arbitrary: " m "`` seems to be optional, why?)  *)
lemma " ev (Suc(Suc m)) ⟹ ev m "
  apply(induction  "Suc (Suc m)" arbitrary: " m " rule: ev.induct)
  apply(auto)
  done

7。结构化长引理&非结构化证据

(* But both of these "fail to apply the proof method" *)
(*
lemma assumes a1: " n = (Suc (Suc m)) " and a2: " ev n" shows " ev m "
  apply(induction " n " arbitrary: " m " rule: ev.induct)

lemma assumes a1: " ev n "  and a2: " n = (Suc (Suc m)) " shows " ev m "
  apply(induction " n " arbitrary: " m " rule: ev.induct)
*)

8。非结构化长引理&非结构化证据

lemma " ev n ⟹  n = (Suc (Suc m)) ⟹ ev m "
  apply(induction  " n " arbitrary: " m " rule: ev.induct)
  apply(auto)
  done

end

1 个答案:

答案 0 :(得分:0)

我将其发布到cl-isabelle-users@lists.cam.ac.uk并收到Larry Paulson的以下回复。我在下面复制了它。

感谢您的查询。你的一些问题与以正确的方式为导入装置提供前提有关,但这里至少存在两个大问题。

(* 1. Structured short lemma & structured proof *)
(* Hangs/gets stuck/loops on the following *)

lemma assumes a: "ev (Suc(Suc m))” shows "ev m"
proof(induction  "Suc (Suc m)"  rule: ev.induct)

这样做,你的假设是不可见的,目标只是“ev m”,因此归纳不适用。但是这个错误导致归纳法循环是绝对不好的。

(* 2. Unstructured short lemma & structured proof *)
(* And this one ends up having issues with
   "Illegal application of proof command in state mode" *)
lemma "ev (Suc (Suc m)) ⟹ ev m" 
proof(induction "Suc (Suc m)"  rule: ev.induct)
  case ev0
  then show ?case
    sorry
next
  case (evSS n)
  then show ?case sorry
qed

在这里你得到错误“无法优化任何待定目标”,这会打破其余的证据。你收到此错误信息的原因是由于某种原因,你的目标与你的目标不匹配感应方法认为你有的目标。实际上这个证明可以写得很直接,但它的形状很意外。这也很糟糕。

lemma "ev (Suc (Suc m)) ⟹ ev m" 
proof(induction "Suc (Suc m)"  rule: ev.induct)
  show "⋀n. ev n ⟹
         (n = Suc (Suc m) ⟹ ev m) ⟹
         n + 2 = Suc (Suc m) ⟹ ev m"
    by simp
qed

您的(3,7,8)与您的(1)的问题相同,只是感应方法(正确)失败。很明显,“Suc(Suc m)”这个论点导致归纳法因某种原因而循环,如你的(5)所示。

(* 6. Unstructured short lemma & unstructured proof *)
(* This goes through no problem (``arbitrary: " m "`` seems to be optional, why?)  *)

只是一些证据需要“任意”,即当归纳假设涉及需要推广的变量时。

您的(7)可以这样写:

lemma assumes "ev n" and " n = (Suc (Suc m)) " shows " ev m "
  using assms
proof(induction " n " arbitrary: " m " rule: ev.induct)
  case ev0
  then show ?case
    sorry
next
  case (evSS n)
  then show ?case
    sorry
qed

也就是说,您可以向证明提供假设(“使用”)。我们甚至以这种方式做到了正确的案例。

我们正处于一个新的发布阶段,但我希望能够及时修复涉及归纳法和非原子术语的问题。

拉里保尔森