(* 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
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