Theory Induction_Scheme

Up to index of Isabelle/HOL/ex

theory Induction_Scheme
imports Main
begin

(*  Title:      HOL/ex/Induction_Scheme.thy
    ID:         $Id: Induction_Scheme.thy,v 1.1 2007/12/07 08:42:20 krauss Exp $
    Author:     Alexander Krauss, TU Muenchen
*)

header {* Examples of automatically derived induction rules *}

theory Induction_Scheme
imports Main
begin

subsection {* Some simple induction principles on nat *}

lemma nat_standard_induct: (* cf. Nat.thy *)
  "[|P 0; !!n. P n ==> P (Suc n)|] ==> P x"
by induct_scheme (pat_completeness, lexicographic_order)

lemma nat_induct2: (* cf. Nat.thy *)
  "[| P 0; P (Suc 0); !!k. P k ==> P (Suc (Suc k)) |]
  ==> P n"
by induct_scheme (pat_completeness, lexicographic_order)

lemma minus_one_induct:
  "[|!!n::nat. (n ≠ 0 ==> P (n - 1)) ==> P n|] ==> P x"
by induct_scheme (pat_completeness, lexicographic_order)

theorem diff_induct: (* cf. Nat.thy *)
  "(!!x. P x 0) ==> (!!y. P 0 (Suc y)) ==>
    (!!x y. P x y ==> P (Suc x) (Suc y)) ==> P m n"
by induct_scheme (pat_completeness, lexicographic_order)

lemma list_induct2': (* cf. List.thy *)
  "[| P [] [];
  !!x xs. P (x#xs) [];
  !!y ys. P [] (y#ys);
   !!x xs y ys. P xs ys  ==> P (x#xs) (y#ys) |]
 ==> P xs ys"
by induct_scheme (pat_completeness, lexicographic_order)

theorem even_odd_induct:
  assumes "R 0"
  assumes "Q 0"
  assumes "!!n. Q n ==> R (Suc n)"
  assumes "!!n. R n ==> Q (Suc n)"
  shows "R n" "Q n"
  using assms
by induct_scheme (pat_completeness, lexicographic_order)

end

Some simple induction principles on nat

lemma nat_standard_induct:

  [| P 0; !!n. P n ==> P (Suc n) |] ==> P x

lemma nat_induct2:

  [| P 0; P (Suc 0); !!k. P k ==> P (Suc (Suc k)) |] ==> P n

lemma minus_one_induct:

  (!!n. (n  0 ==> P (n - 1)) ==> P n) ==> P x

theorem diff_induct:

  [| !!x. P x 0; !!y. P 0 (Suc y); !!x y. P x y ==> P (Suc x) (Suc y) |] ==> P m n

lemma list_induct2':

  [| P [] []; !!x xs. P (x # xs) []; !!y ys. P [] (y # ys);
     !!x xs y ys. P xs ys ==> P (x # xs) (y # ys) |]
  ==> P xs ys

theorem even_odd_induct:

  [| R 0; Q 0; !!n. Q n ==> R (Suc n); !!n. R n ==> Q (Suc n) |] ==> R n
  [| R 0; Q 0; !!n. Q n ==> R (Suc n); !!n. R n ==> Q (Suc n) |] ==> Q n