# HG changeset patch # User wenzelm # Date 1132781173 -3600 # Node ID afdba6b3e3833d9d6d7cee3034b86cf7edcfdb71 # Parent 3b72f559e9423e69811dd06ba5e501617e6fce7c tuned induction proofs; diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Isar_examples/Fibonacci.thy --- a/src/HOL/Isar_examples/Fibonacci.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Isar_examples/Fibonacci.thy Wed Nov 23 22:26:13 2005 +0100 @@ -124,7 +124,7 @@ qed lemma gcd_fib_mod: - assumes m: "0 < m" + assumes "0 < m" shows "gcd (fib m, fib (n mod m)) = gcd (fib m, fib n)" proof (induct n rule: nat_less_induct) case (1 n) note hyp = this @@ -137,7 +137,7 @@ case True then show ?thesis by simp next case False then have "m <= n" by simp - from m and False have "n - m < n" by simp + from `0 < m` and False have "n - m < n" by simp with hyp have "gcd (fib m, fib ((n - m) mod m)) = gcd (fib m, fib (n - m))" by simp also have "... = gcd (fib m, fib n)" diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Isar_examples/Hoare.thy --- a/src/HOL/Isar_examples/Hoare.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Isar_examples/Hoare.thy Wed Nov 23 22:26:13 2005 +0100 @@ -160,14 +160,15 @@ semantics of \texttt{WHILE}. *} -theorem while: "|- (P Int b) c P ==> |- P (While b X c) (P Int -b)" +theorem while: + assumes body: "|- (P Int b) c P" + shows "|- P (While b X c) (P Int -b)" proof - assume body: "|- (P Int b) c P" fix s s' assume s: "s : P" assume "Sem (While b X c) s s'" - then obtain n where iter: "iter n b (Sem c) s s'" by auto - have "!!s. iter n b (Sem c) s s' ==> s : P ==> s' : P Int -b" - proof (induct n) + then obtain n where "iter n b (Sem c) s s'" by auto + from this and s show "s' : P Int -b" + proof (induct n fixing: s) case (0 s) thus ?case by auto next @@ -179,7 +180,6 @@ with body sem have "s'' : P" .. with iter show ?case by (rule Suc) qed - from this iter s show "s' : P Int -b" . qed @@ -424,8 +424,8 @@ \ Valid w c1 q \ Valid w' c2 q \ Valid p (Cond b c1 c2) q" by (auto simp: Valid_def) -lemma iter_aux: " - \s s'. Sem c s s' --> s : I & s : b --> s' : I ==> +lemma iter_aux: + "\s s'. Sem c s s' --> s : I & s : b --> s' : I ==> (\s s'. s : I \ iter n b (Sem c) s s' \ s' : I & s' ~: b)" apply(induct n) apply clarsimp diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Isar_examples/MutilatedCheckerboard.thy --- a/src/HOL/Isar_examples/MutilatedCheckerboard.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Isar_examples/MutilatedCheckerboard.thy Wed Nov 23 22:26:13 2005 +0100 @@ -169,24 +169,21 @@ qed lemma domino_singleton: - assumes "d : domino" and "b < 2" - shows "EX i j. evnodd d b = {(i, j)}" -proof - - from `d : domino` - show ?thesis (is "?P d") - proof induct - from `b < 2` have b_cases: "b = 0 | b = 1" by arith - fix i j - note [simp] = evnodd_empty evnodd_insert mod_Suc - from b_cases show "?P {(i, j), (i, j + 1)}" by rule auto - from b_cases show "?P {(i, j), (i + 1, j)}" by rule auto - qed + assumes d: "d : domino" and "b < 2" + shows "EX i j. evnodd d b = {(i, j)}" (is "?P d") + using d +proof induct + from `b < 2` have b_cases: "b = 0 | b = 1" by arith + fix i j + note [simp] = evnodd_empty evnodd_insert mod_Suc + from b_cases show "?P {(i, j), (i, j + 1)}" by rule auto + from b_cases show "?P {(i, j), (i + 1, j)}" by rule auto qed lemma domino_finite: - assumes "d: domino" + assumes d: "d: domino" shows "finite d" - using prems + using d proof induct fix i j :: nat show "finite {(i, j), (i, j + 1)}" by (intro Finites.intros) @@ -197,9 +194,9 @@ subsection {* Tilings of dominoes *} lemma tiling_domino_finite: - assumes "t : tiling domino" (is "t : ?T") + assumes t: "t : tiling domino" (is "t : ?T") shows "finite t" (is "?F t") - using `t : ?T` + using t proof induct show "?F {}" by (rule Finites.emptyI) fix a t assume "?F t" @@ -208,9 +205,9 @@ qed lemma tiling_domino_01: - assumes "t : tiling domino" (is "t : ?T") + assumes t: "t : tiling domino" (is "t : ?T") shows "card (evnodd t 0) = card (evnodd t 1)" - using `t : ?T` + using t proof induct case empty show ?case by (simp add: evnodd_def) diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/Commutation.thy --- a/src/HOL/Lambda/Commutation.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/Commutation.thy Wed Nov 23 22:26:13 2005 +0100 @@ -197,11 +197,11 @@ \d. (b, d) \ R\<^sup>* \ (c, d) \ R\<^sup>*" shows "\b c. (a, b) \ R\<^sup>* \ (a, c) \ R\<^sup>* \ \d. (b, d) \ R\<^sup>* \ (c, d) \ R\<^sup>*" -using wf + using wf proof induct case (less x b c) - have IH: "\y b c. \(y,x) \ R\; (y,b) \ R\<^sup>*; (y,c) \ R\<^sup>*\ - \ \d. (b,d) \ R\<^sup>* \ (c,d) \ R\<^sup>*" by(rule less) + note IH = `\y b c. \(y,x) \ R\; (y,b) \ R\<^sup>*; (y,c) \ R\<^sup>*\ + \ \d. (b,d) \ R\<^sup>* \ (c,d) \ R\<^sup>*` have xc: "(x, c) \ R\<^sup>*" . have xb: "(x, b) \ R\<^sup>*" . thus ?case @@ -223,11 +223,11 @@ assume y'c: "(y', c) \ R\<^sup>*" assume xy': "(x, y') \ R" with xy obtain u where u: "(y, u) \ R\<^sup>*" "(y', u) \ R\<^sup>*" - by (blast dest:lc) + by (blast dest: lc) from yb u y'c show ?thesis - by(blast del: rtrancl_refl - intro:rtrancl_trans - dest:IH[OF xy[symmetric]] IH[OF xy'[symmetric]]) + by (blast del: rtrancl_refl + intro: rtrancl_trans + dest: IH [OF xy [symmetric]] IH [OF xy' [symmetric]]) qed qed qed diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/Eta.thy --- a/src/HOL/Lambda/Eta.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/Eta.thy Wed Nov 23 22:26:13 2005 +0100 @@ -45,24 +45,20 @@ subsection "Properties of eta, subst and free" -lemma subst_not_free [rule_format, simp]: - "\i t u. \ free s i --> s[t/i] = s[u/i]" - apply (induct_tac s) - apply (simp_all add: subst_Var) - done +lemma subst_not_free [simp]: "\ free s i \ s[t/i] = s[u/i]" + by (induct s fixing: i t u) (simp_all add: subst_Var) lemma free_lift [simp]: - "\i k. free (lift t k) i = - (i < k \ free t i \ k < i \ free t (i - 1))" - apply (induct_tac t) + "free (lift t k) i = (i < k \ free t i \ k < i \ free t (i - 1))" + apply (induct t fixing: i k) apply (auto cong: conj_cong) apply arith done lemma free_subst [simp]: - "\i k t. free (s[t/k]) i = + "free (s[t/k]) i = (free s k \ free t i \ free s (if i < k then i else i + 1))" - apply (induct_tac s) + apply (induct s fixing: i k t) prefer 2 apply simp apply blast @@ -71,25 +67,19 @@ apply (simp add: diff_Suc subst_Var split: nat.split) done -lemma free_eta [rule_format]: - "s -e> t ==> \i. free t i = free s i" - apply (erule eta.induct) - apply (simp_all cong: conj_cong) - done +lemma free_eta: "s -e> t ==> (!!i. free t i = free s i)" + by (induct set: eta) (simp_all cong: conj_cong) lemma not_free_eta: "[| s -e> t; \ free s i |] ==> \ free t i" - apply (simp add: free_eta) - done + by (simp add: free_eta) -lemma eta_subst [rule_format, simp]: - "s -e> t ==> \u i. s[u/i] -e> t[u/i]" - apply (erule eta.induct) - apply (simp_all add: subst_subst [symmetric]) - done +lemma eta_subst [simp]: + "s -e> t ==> (!!u i. s[u/i] -e> t[u/i])" + by (induct set: eta) (simp_all add: subst_subst [symmetric]) -theorem lift_subst_dummy: "\i dummy. \ free s i \ lift (s[dummy/i]) i = s" - by (induct s) simp_all +theorem lift_subst_dummy: "\ free s i \ lift (s[dummy/i]) i = s" + by (induct s fixing: i dummy) simp_all subsection "Confluence of eta" @@ -114,56 +104,40 @@ subsection "Congruence rules for eta*" lemma rtrancl_eta_Abs: "s -e>> s' ==> Abs s -e>> Abs s'" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) + (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ lemma rtrancl_eta_AppL: "s -e>> s' ==> s \ t -e>> s' \ t" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) + (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ lemma rtrancl_eta_AppR: "t -e>> t' ==> s \ t -e>> s \ t'" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) (blast intro: rtrancl_refl rtrancl_into_rtrancl)+ lemma rtrancl_eta_App: "[| s -e>> s'; t -e>> t' |] ==> s \ t -e>> s' \ t'" - apply (blast intro!: rtrancl_eta_AppL rtrancl_eta_AppR intro: rtrancl_trans) - done + by (blast intro!: rtrancl_eta_AppL rtrancl_eta_AppR intro: rtrancl_trans) subsection "Commutation of beta and eta" -lemma free_beta [rule_format]: - "s -> t ==> \i. free t i --> free s i" - apply (erule beta.induct) - apply simp_all - done +lemma free_beta: + "s -> t ==> (!!i. free t i \ free s i)" + by (induct set: beta) auto -lemma beta_subst [rule_format, intro]: - "s -> t ==> \u i. s[u/i] -> t[u/i]" - apply (erule beta.induct) - apply (simp_all add: subst_subst [symmetric]) - done +lemma beta_subst [intro]: "s -> t ==> (!!u i. s[u/i] -> t[u/i])" + by (induct set: beta) (simp_all add: subst_subst [symmetric]) -lemma subst_Var_Suc [simp]: "\i. t[Var i/i] = t[Var(i)/i + 1]" - apply (induct_tac t) - apply (auto elim!: linorder_neqE simp: subst_Var) - done +lemma subst_Var_Suc [simp]: "t[Var i/i] = t[Var(i)/i + 1]" + by (induct t fixing: i) (auto elim!: linorder_neqE simp: subst_Var) -lemma eta_lift [rule_format, simp]: - "s -e> t ==> \i. lift s i -e> lift t i" - apply (erule eta.induct) - apply simp_all - done +lemma eta_lift [simp]: "s -e> t ==> (!!i. lift s i -e> lift t i)" + by (induct set: eta) simp_all -lemma rtrancl_eta_subst [rule_format]: - "\s t i. s -e> t --> u[s/i] -e>> u[t/i]" - apply (induct_tac u) +lemma rtrancl_eta_subst: "s -e> t \ u[s/i] -e>> u[t/i]" + apply (induct u fixing: s t i) apply (simp_all add: subst_Var) - apply (blast) + apply blast apply (blast intro: rtrancl_eta_App) apply (blast intro!: rtrancl_eta_Abs eta_lift) done @@ -191,11 +165,10 @@ text {* @{term "Abs (lift s 0 \ Var 0) -e> s"} *} -lemma not_free_iff_lifted [rule_format]: - "\i. (\ free s i) = (\t. s = lift t i)" - apply (induct_tac s) +lemma not_free_iff_lifted: + "(\ free s i) = (\t. s = lift t i)" + apply (induct s fixing: i) apply simp - apply clarify apply (rule iffI) apply (erule linorder_neqE) apply (rule_tac x = "Var nat" in exI) @@ -214,7 +187,6 @@ apply simp apply (erule thin_rl) apply (erule thin_rl) - apply (rule allI) apply (rule iffI) apply (elim conjE exE) apply (rename_tac u1 u2) @@ -229,7 +201,6 @@ apply simp apply simp apply (erule thin_rl) - apply (rule allI) apply (rule iffI) apply (erule exE) apply (rule_tac x = "Abs t" in exI) @@ -246,8 +217,7 @@ theorem explicit_is_implicit: "(\s u. (\ free s 0) --> R (Abs (s \ Var 0)) (s[u/0])) = (\s. R (Abs (lift s 0 \ Var 0)) s)" - apply (auto simp add: not_free_iff_lifted) - done + by (auto simp add: not_free_iff_lifted) subsection {* Parallel eta-reduction *} @@ -270,22 +240,23 @@ app [simp, intro]: "s \\<^sub>\ s' \ t \\<^sub>\ t' \ s \ t \\<^sub>\ s' \ t'" abs [simp, intro]: "s \\<^sub>\ t \ Abs s \\<^sub>\ Abs t" -lemma free_par_eta [simp]: assumes eta: "s \\<^sub>\ t" - shows "\i. free t i = free s i" using eta - by induct (simp_all cong: conj_cong) +lemma free_par_eta [simp]: + assumes eta: "s \\<^sub>\ t" + shows "free t i = free s i" using eta + by (induct fixing: i) (simp_all cong: conj_cong) lemma par_eta_refl [simp]: "t \\<^sub>\ t" by (induct t) simp_all lemma par_eta_lift [simp]: assumes eta: "s \\<^sub>\ t" - shows "\i. lift s i \\<^sub>\ lift t i" using eta - by induct simp_all + shows "lift s i \\<^sub>\ lift t i" using eta + by (induct fixing: i) simp_all lemma par_eta_subst [simp]: assumes eta: "s \\<^sub>\ t" - shows "\u u' i. u \\<^sub>\ u' \ s[u/i] \\<^sub>\ t[u'/i]" using eta - by induct (simp_all add: subst_subst [symmetric] subst_Var) + shows "u \\<^sub>\ u' \ s[u/i] \\<^sub>\ t[u'/i]" using eta + by (induct fixing: u u' i) (simp_all add: subst_subst [symmetric] subst_Var) theorem eta_subset_par_eta: "eta \ par_eta" apply (rule subsetI) @@ -320,16 +291,16 @@ eta_expand_Suc: "eta_expand (Suc n) t = Abs (lift (eta_expand n t) 0 \ Var 0)" lemma eta_expand_Suc': - "\t. eta_expand (Suc n) t = eta_expand n (Abs (lift t 0 \ Var 0))" - by (induct n) simp_all + "eta_expand (Suc n) t = eta_expand n (Abs (lift t 0 \ Var 0))" + by (induct n fixing: t) simp_all theorem lift_eta_expand: "lift (eta_expand k t) i = eta_expand k (lift t i)" by (induct k) (simp_all add: lift_lift) theorem eta_expand_beta: assumes u: "u => u'" - shows "\t t'. t => t' \ eta_expand k (Abs t) \ u => t'[u'/0]" -proof (induct k) + shows "t => t' \ eta_expand k (Abs t) \ u => t'[u'/0]" +proof (induct k fixing: t t') case 0 with u show ?case by simp next case (Suc k) @@ -343,8 +314,8 @@ shows "eta_expand k t => eta_expand k t'" by (induct k) (simp_all add: t) -theorem eta_expand_eta: "\t t'. t \\<^sub>\ t' \ eta_expand k t \\<^sub>\ t'" -proof (induct k) +theorem eta_expand_eta: "t \\<^sub>\ t' \ eta_expand k t \\<^sub>\ t'" +proof (induct k fixing: t t') case 0 show ?case by simp next @@ -358,9 +329,9 @@ subsection {* Elimination rules for parallel eta reduction *} theorem par_eta_elim_app: assumes eta: "t \\<^sub>\ u" - shows "\u1' u2'. u = u1' \ u2' \ + shows "u = u1' \ u2' \ \u1 u2 k. t = eta_expand k (u1 \ u2) \ u1 \\<^sub>\ u1' \ u2 \\<^sub>\ u2'" using eta -proof induct +proof (induct fixing: u1' u2') case (app s s' t t') have "s \ t = eta_expand 0 (s \ t)" by simp with app show ?case by blast @@ -388,9 +359,9 @@ qed theorem par_eta_elim_abs: assumes eta: "t \\<^sub>\ t'" - shows "\u'. t' = Abs u' \ + shows "t' = Abs u' \ \u k. t = eta_expand k (Abs u) \ u \\<^sub>\ u'" using eta -proof induct +proof (induct fixing: u') case (abs s t) have "Abs s = eta_expand 0 (Abs s)" by simp with abs show ?case by blast @@ -420,8 +391,9 @@ Based on a proof by Masako Takahashi \cite{Takahashi-IandC}. *} -theorem par_eta_beta: "\s u. s \\<^sub>\ t \ t => u \ \t'. s => t' \ t' \\<^sub>\ u" -proof (induct t rule: measure_induct [of size, rule_format]) +theorem par_eta_beta: "s \\<^sub>\ t \ t => u \ \t'. s => t' \ t' \\<^sub>\ u" +proof (induct t fixing: s u + rule: measure_induct [of size, rule_format]) case (1 t) from 1(3) show ?case @@ -467,10 +439,10 @@ qed theorem eta_postponement': assumes eta: "s -e>> t" - shows "\u. t => u \ \t'. s => t' \ t' -e>> u" + shows "t => u \ \t'. s => t' \ t' -e>> u" using eta [simplified rtrancl_subset [OF eta_subset_par_eta par_eta_subset_eta, symmetric]] -proof induct +proof (induct fixing: u) case 1 thus ?case by blast next diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/InductTermi.thy --- a/src/HOL/Lambda/InductTermi.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/InductTermi.thy Wed Nov 23 22:26:13 2005 +0100 @@ -45,7 +45,7 @@ done lemma IT_implies_termi: "t : IT ==> t : termi beta" - apply (erule IT.induct) + apply (induct set: IT) apply (drule rev_subsetD) apply (rule lists_mono) apply (rule Int_lower2) @@ -63,16 +63,14 @@ subsection {* Every terminating term is in IT *} -declare Var_apps_neq_Abs_apps [THEN not_sym, simp] +declare Var_apps_neq_Abs_apps [symmetric, simp] lemma [simp, THEN not_sym, simp]: "Var n \\ ss \ Abs r \ s \\ ts" - apply (simp add: foldl_Cons [symmetric] del: foldl_Cons) - done + by (simp add: foldl_Cons [symmetric] del: foldl_Cons) lemma [simp]: "(Abs r \ s \\ ss = Abs r' \ s' \\ ss') = (r = r' \ s = s' \ ss = ss')" - apply (simp add: foldl_Cons [symmetric] del: foldl_Cons) - done + by (simp add: foldl_Cons [symmetric] del: foldl_Cons) inductive_cases [elim!]: "Var n \\ ss : IT" diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/Lambda.thy --- a/src/HOL/Lambda/Lambda.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/Lambda.thy Wed Nov 23 22:26:13 2005 +0100 @@ -86,21 +86,15 @@ lemma rtrancl_beta_Abs [intro!]: "s \\<^sub>\\<^sup>* s' ==> Abs s \\<^sub>\\<^sup>* Abs s'" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) (blast intro: rtrancl_into_rtrancl)+ lemma rtrancl_beta_AppL: "s \\<^sub>\\<^sup>* s' ==> s \ t \\<^sub>\\<^sup>* s' \ t" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) (blast intro: rtrancl_into_rtrancl)+ lemma rtrancl_beta_AppR: "t \\<^sub>\\<^sup>* t' ==> s \ t \\<^sub>\\<^sup>* s \ t'" - apply (erule rtrancl_induct) - apply (blast intro: rtrancl_into_rtrancl)+ - done + by (induct set: rtrancl) (blast intro: rtrancl_into_rtrancl)+ lemma rtrancl_beta_App [intro]: "[| s \\<^sub>\\<^sup>* s'; t \\<^sub>\\<^sup>* t' |] ==> s \ t \\<^sub>\\<^sup>* s' \ t'" @@ -112,72 +106,51 @@ subsection {* Substitution-lemmas *} lemma subst_eq [simp]: "(Var k)[u/k] = u" - apply (simp add: subst_Var) - done + by (simp add: subst_Var) lemma subst_gt [simp]: "i < j ==> (Var j)[u/i] = Var (j - 1)" - apply (simp add: subst_Var) - done + by (simp add: subst_Var) lemma subst_lt [simp]: "j < i ==> (Var j)[u/i] = Var j" - apply (simp add: subst_Var) - done + by (simp add: subst_Var) -lemma lift_lift [rule_format]: - "\i k. i < k + 1 --> lift (lift t i) (Suc k) = lift (lift t k) i" - apply (induct_tac t) - apply auto - done +lemma lift_lift: + "i < k + 1 \ lift (lift t i) (Suc k) = lift (lift t k) i" + by (induct t fixing: i k) auto lemma lift_subst [simp]: - "\i j s. j < i + 1 --> lift (t[s/j]) i = (lift t (i + 1)) [lift s i / j]" - apply (induct_tac t) - apply (simp_all add: diff_Suc subst_Var lift_lift split: nat.split) - done + "j < i + 1 \ lift (t[s/j]) i = (lift t (i + 1)) [lift s i / j]" + by (induct t fixing: i j s) + (simp_all add: diff_Suc subst_Var lift_lift split: nat.split) lemma lift_subst_lt: - "\i j s. i < j + 1 --> lift (t[s/j]) i = (lift t i) [lift s i / j + 1]" - apply (induct_tac t) - apply (simp_all add: subst_Var lift_lift) - done + "i < j + 1 \ lift (t[s/j]) i = (lift t i) [lift s i / j + 1]" + by (induct t fixing: i j s) (simp_all add: subst_Var lift_lift) lemma subst_lift [simp]: - "\k s. (lift t k)[s/k] = t" - apply (induct_tac t) - apply simp_all - done + "(lift t k)[s/k] = t" + by (induct t fixing: k s) simp_all -lemma subst_subst [rule_format]: - "\i j u v. i < j + 1 --> t[lift v i / Suc j][u[v/j]/i] = t[u/i][v/j]" - apply (induct_tac t) - apply (simp_all - add: diff_Suc subst_Var lift_lift [symmetric] lift_subst_lt +lemma subst_subst: + "i < j + 1 \ t[lift v i / Suc j][u[v/j]/i] = t[u/i][v/j]" + by (induct t fixing: i j u v) + (simp_all add: diff_Suc subst_Var lift_lift [symmetric] lift_subst_lt split: nat.split) - done subsection {* Equivalence proof for optimized substitution *} -lemma liftn_0 [simp]: "\k. liftn 0 t k = t" - apply (induct_tac t) - apply (simp_all add: subst_Var) - done +lemma liftn_0 [simp]: "liftn 0 t k = t" + by (induct t fixing: k) (simp_all add: subst_Var) -lemma liftn_lift [simp]: - "\k. liftn (Suc n) t k = lift (liftn n t k) k" - apply (induct_tac t) - apply (simp_all add: subst_Var) - done +lemma liftn_lift [simp]: "liftn (Suc n) t k = lift (liftn n t k) k" + by (induct t fixing: k) (simp_all add: subst_Var) -lemma substn_subst_n [simp]: - "\n. substn t s n = t[liftn n s 0 / n]" - apply (induct_tac t) - apply (simp_all add: subst_Var) - done +lemma substn_subst_n [simp]: "substn t s n = t[liftn n s 0 / n]" + by (induct t fixing: n) (simp_all add: subst_Var) theorem substn_subst_0: "substn t s 0 = t[s/0]" - apply simp - done + by simp subsection {* Preservation theorems *} @@ -187,13 +160,11 @@ theorem subst_preserves_beta [simp]: "r \\<^sub>\ s ==> (\t i. r[t/i] \\<^sub>\ s[t/i])" - apply (induct set: beta) - apply (simp_all add: subst_subst [symmetric]) - done + by (induct set: beta) (simp_all add: subst_subst [symmetric]) theorem subst_preserves_beta': "r \\<^sub>\\<^sup>* s ==> r[t/i] \\<^sub>\\<^sup>* s[t/i]" - apply (erule rtrancl.induct) - apply (rule rtrancl_refl) + apply (induct set: rtrancl) + apply (rule rtrancl_refl) apply (erule rtrancl_into_rtrancl) apply (erule subst_preserves_beta) done @@ -203,23 +174,22 @@ by (induct set: beta) auto theorem lift_preserves_beta': "r \\<^sub>\\<^sup>* s ==> lift r i \\<^sub>\\<^sup>* lift s i" - apply (erule rtrancl.induct) - apply (rule rtrancl_refl) + apply (induct set: rtrancl) + apply (rule rtrancl_refl) apply (erule rtrancl_into_rtrancl) apply (erule lift_preserves_beta) done -theorem subst_preserves_beta2 [simp]: - "\r s i. r \\<^sub>\ s ==> t[r/i] \\<^sub>\\<^sup>* t[s/i]" - apply (induct t) +theorem subst_preserves_beta2 [simp]: "r \\<^sub>\ s ==> t[r/i] \\<^sub>\\<^sup>* t[s/i]" + apply (induct t fixing: r s i) apply (simp add: subst_Var r_into_rtrancl) apply (simp add: rtrancl_beta_App) apply (simp add: rtrancl_beta_Abs) done theorem subst_preserves_beta2': "r \\<^sub>\\<^sup>* s ==> t[r/i] \\<^sub>\\<^sup>* t[s/i]" - apply (erule rtrancl.induct) - apply (rule rtrancl_refl) + apply (induct set: rtrancl) + apply (rule rtrancl_refl) apply (erule rtrancl_trans) apply (erule subst_preserves_beta2) done diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/ListApplication.thy --- a/src/HOL/Lambda/ListApplication.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/ListApplication.thy Wed Nov 23 22:26:13 2005 +0100 @@ -14,19 +14,14 @@ "t \\ ts" == "foldl (op \) t ts" lemma apps_eq_tail_conv [iff]: "(r \\ ts = s \\ ts) = (r = s)" - apply (induct_tac ts rule: rev_induct) - apply auto - done + by (induct ts rule: rev_induct) auto -lemma Var_eq_apps_conv [iff]: - "\s. (Var m = s \\ ss) = (Var m = s \ ss = [])" - apply (induct ss) - apply auto - done +lemma Var_eq_apps_conv [iff]: "(Var m = s \\ ss) = (Var m = s \ ss = [])" + by (induct ss fixing: s) auto lemma Var_apps_eq_Var_apps_conv [iff]: - "\ss. (Var m \\ rs = Var n \\ ss) = (m = n \ rs = ss)" - apply (induct rs rule: rev_induct) + "(Var m \\ rs = Var n \\ ss) = (m = n \ rs = ss)" + apply (induct rs fixing: ss rule: rev_induct) apply simp apply blast apply (induct_tac ss rule: rev_induct) @@ -43,18 +38,14 @@ lemma Abs_eq_apps_conv [iff]: "(Abs r = s \\ ss) = (Abs r = s \ ss = [])" - apply (induct_tac ss rule: rev_induct) - apply auto - done + by (induct ss rule: rev_induct) auto lemma apps_eq_Abs_conv [iff]: "(s \\ ss = Abs r) = (s = Abs r \ ss = [])" - apply (induct_tac ss rule: rev_induct) - apply auto - done + by (induct ss rule: rev_induct) auto lemma Abs_apps_eq_Abs_apps_conv [iff]: - "\ss. (Abs r \\ rs = Abs s \\ ss) = (r = s \ rs = ss)" - apply (induct rs rule: rev_induct) + "(Abs r \\ rs = Abs s \\ ss) = (r = s \ rs = ss)" + apply (induct rs fixing: ss rule: rev_induct) apply simp apply blast apply (induct_tac ss rule: rev_induct) @@ -62,14 +53,12 @@ done lemma Abs_App_neq_Var_apps [iff]: - "\s t. Abs s \ t ~= Var n \\ ss" - apply (induct_tac ss rule: rev_induct) - apply auto - done + "Abs s \ t ~= Var n \\ ss" + by (induct ss fixing: s t rule: rev_induct) auto lemma Var_apps_neq_Abs_apps [iff]: - "\ts. Var n \\ ts ~= Abs r \\ ss" - apply (induct ss rule: rev_induct) + "Var n \\ ts ~= Abs r \\ ss" + apply (induct ss fixing: ts rule: rev_induct) apply simp apply (induct_tac ts rule: rev_induct) apply auto @@ -77,7 +66,7 @@ lemma ex_head_tail: "\ts h. t = h \\ ts \ ((\n. h = Var n) \ (\u. h = Abs u))" - apply (induct_tac t) + apply (induct t) apply (rule_tac x = "[]" in exI) apply simp apply clarify @@ -89,21 +78,18 @@ lemma size_apps [simp]: "size (r \\ rs) = size r + foldl (op +) 0 (map size rs) + length rs" - apply (induct_tac rs rule: rev_induct) - apply auto - done + by (induct rs rule: rev_induct) auto lemma lem0: "[| (0::nat) < k; m <= n |] ==> m < n + k" - apply simp - done + by simp lemma lift_map [simp]: - "\t. lift (t \\ ts) i = lift t i \\ map (\t. lift t i) ts" - by (induct ts) simp_all + "lift (t \\ ts) i = lift t i \\ map (\t. lift t i) ts" + by (induct ts fixing: t) simp_all lemma subst_map [simp]: - "\t. subst (t \\ ts) u i = subst t u i \\ map (\t. subst t u i) ts" - by (induct ts) simp_all + "subst (t \\ ts) u i = subst t u i \\ map (\t. subst t u i) ts" + by (induct ts fixing: t) simp_all lemma app_last: "(t \\ ts) \ u = t \\ (ts @ [u])" by simp @@ -111,60 +97,51 @@ text {* \medskip A customized induction schema for @{text "\\"}. *} -lemma lem [rule_format (no_asm)]: - "[| !!n ts. \t \ set ts. P t ==> P (Var n \\ ts); - !!u ts. [| P u; \t \ set ts. P t |] ==> P (Abs u \\ ts) - |] ==> \t. size t = n --> P t" -proof - - case rule_context - show ?thesis - apply (induct_tac n rule: nat_less_induct) - apply (rule allI) - apply (cut_tac t = t in ex_head_tail) +lemma lem: + assumes "!!n ts. \t \ set ts. P t ==> P (Var n \\ ts)" + and "!!u ts. [| P u; \t \ set ts. P t |] ==> P (Abs u \\ ts)" + shows "size t = n \ P t" + apply (induct n fixing: t rule: nat_less_induct) + apply (cut_tac t = t in ex_head_tail) + apply clarify + apply (erule disjE) + apply clarify + apply (rule prems) apply clarify - apply (erule disjE) - apply clarify - apply (rule prems) - apply clarify - apply (erule allE, erule impE) - prefer 2 - apply (erule allE, erule mp, rule refl) - apply simp - apply (rule lem0) - apply force - apply (rule elem_le_sum) - apply force - apply clarify - apply (rule prems) - apply (erule allE, erule impE) - prefer 2 - apply (erule allE, erule mp, rule refl) - apply simp - apply clarify - apply (erule allE, erule impE) - prefer 2 - apply (erule allE, erule mp, rule refl) - apply simp - apply (rule le_imp_less_Suc) - apply (rule trans_le_add1) - apply (rule trans_le_add2) - apply (rule elem_le_sum) + apply (erule allE, erule impE) + prefer 2 + apply (erule allE, erule mp, rule refl) + apply simp + apply (rule lem0) apply force - done -qed + apply (rule elem_le_sum) + apply force + apply clarify + apply (rule prems) + apply (erule allE, erule impE) + prefer 2 + apply (erule allE, erule mp, rule refl) + apply simp + apply clarify + apply (erule allE, erule impE) + prefer 2 + apply (erule allE, erule mp, rule refl) + apply simp + apply (rule le_imp_less_Suc) + apply (rule trans_le_add1) + apply (rule trans_le_add2) + apply (rule elem_le_sum) + apply force + done theorem Apps_dB_induct: - "[| !!n ts. \t \ set ts. P t ==> P (Var n \\ ts); - !!u ts. [| P u; \t \ set ts. P t |] ==> P (Abs u \\ ts) - |] ==> P t" -proof - - case rule_context - show ?thesis - apply (rule_tac t = t in lem) - prefer 3 - apply (rule refl) - apply (assumption | rule prems)+ - done -qed + assumes "!!n ts. \t \ set ts. P t ==> P (Var n \\ ts)" + and "!!u ts. [| P u; \t \ set ts. P t |] ==> P (Abs u \\ ts)" + shows "P t" + apply (rule_tac t = t in lem) + prefer 3 + apply (rule refl) + apply (assumption | rule prems)+ + done end diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/ListBeta.thy --- a/src/HOL/Lambda/ListBeta.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/ListBeta.thy Wed Nov 23 22:26:13 2005 +0100 @@ -18,8 +18,8 @@ "rs => ss" == "(rs, ss) : step1 beta" lemma head_Var_reduction_aux: - "v -> v' ==> \rs. v = Var n \\ rs --> (\ss. rs => ss \ v' = Var n \\ ss)" - apply (erule beta.induct) + "v -> v' ==> (\rs. v = Var n \\ rs --> (\ss. rs => ss \ v' = Var n \\ ss))" + apply (induct set: beta) apply simp apply (rule allI) apply (rule_tac xs = rs in rev_exhaust) @@ -33,16 +33,14 @@ lemma head_Var_reduction: "Var n \\ rs -> v ==> (\ss. rs => ss \ v = Var n \\ ss)" - apply (drule head_Var_reduction_aux) - apply blast - done + by (drule head_Var_reduction_aux) blast lemma apps_betasE_aux: "u -> u' ==> \r rs. u = r \\ rs --> ((\r'. r -> r' \ u' = r' \\ rs) \ (\rs'. rs => rs' \ u' = r \\ rs') \ (\s t ts. r = Abs s \ rs = t # ts \ u' = s[t/0] \\ ts))" - apply (erule beta.induct) + apply (induct set: beta) apply (clarify del: disjCI) apply (case_tac r) apply simp @@ -70,38 +68,31 @@ done lemma apps_betasE [elim!]: - "[| r \\ rs -> s; !!r'. [| r -> r'; s = r' \\ rs |] ==> R; - !!rs'. [| rs => rs'; s = r \\ rs' |] ==> R; - !!t u us. [| r = Abs t; rs = u # us; s = t[u/0] \\ us |] ==> R |] - ==> R" -proof - - assume major: "r \\ rs -> s" - case rule_context - show ?thesis - apply (cut_tac major [THEN apps_betasE_aux, THEN spec, THEN spec]) - apply (assumption | rule refl | erule prems exE conjE impE disjE)+ - done -qed + assumes major: "r \\ rs -> s" + and "!!r'. [| r -> r'; s = r' \\ rs |] ==> R" + and "!!rs'. [| rs => rs'; s = r \\ rs' |] ==> R" + and "!!t u us. [| r = Abs t; rs = u # us; s = t[u/0] \\ us |] ==> R" + shows R + apply (cut_tac major [THEN apps_betasE_aux, THEN spec, THEN spec]) + apply (assumption | rule refl | erule prems exE conjE impE disjE)+ + done lemma apps_preserves_beta [simp]: "r -> s ==> r \\ ss -> s \\ ss" - apply (induct_tac ss rule: rev_induct) - apply auto - done + by (induct ss rule: rev_induct) auto lemma apps_preserves_beta2 [simp]: "r ->> s ==> r \\ ss ->> s \\ ss" - apply (erule rtrancl_induct) + apply (induct set: rtrancl) apply blast apply (blast intro: apps_preserves_beta rtrancl_into_rtrancl) done -lemma apps_preserves_betas [rule_format, simp]: - "\ss. rs => ss --> r \\ rs -> r \\ ss" - apply (induct_tac rs rule: rev_induct) +lemma apps_preserves_betas [simp]: + "rs => ss \ r \\ rs -> r \\ ss" + apply (induct rs fixing: ss rule: rev_induct) apply simp apply simp - apply clarify apply (rule_tac xs = ss in rev_exhaust) apply simp apply simp diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/ListOrder.thy --- a/src/HOL/Lambda/ListOrder.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/ListOrder.thy Wed Nov 23 22:26:13 2005 +0100 @@ -87,18 +87,17 @@ apply blast done -lemma Cons_acc_step1I [rule_format, intro!]: - "x \ acc r ==> \xs. xs \ acc (step1 r) --> x # xs \ acc (step1 r)" - apply (erule acc_induct) +lemma Cons_acc_step1I [intro!]: + "x \ acc r ==> (!!xs. xs \ acc (step1 r) \ x # xs \ acc (step1 r))" + apply (induct set: acc) apply (erule thin_rl) - apply clarify apply (erule acc_induct) apply (rule accI) apply blast done lemma lists_accD: "xs \ lists (acc r) ==> xs \ acc (step1 r)" - apply (erule lists.induct) + apply (induct set: lists) apply (rule accI) apply simp apply (rule accI) @@ -114,7 +113,7 @@ done lemma lists_accI: "xs \ acc (step1 r) ==> xs \ lists (acc r)" - apply (erule acc_induct) + apply (induct set: acc) apply clarify apply (rule accI) apply (drule ex_step1I, assumption) diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/ParRed.thy --- a/src/HOL/Lambda/ParRed.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/ParRed.thy Wed Nov 23 22:26:13 2005 +0100 @@ -43,13 +43,10 @@ lemma par_beta_varL [simp]: "(Var n => t) = (t = Var n)" - apply blast - done + by blast lemma par_beta_refl [simp]: "t => t" (* par_beta_refl [intro!] causes search to blow up *) - apply (induct_tac t) - apply simp_all - done + by (induct t) simp_all lemma beta_subset_par_beta: "beta <= par_beta" apply (rule subsetI) @@ -70,17 +67,14 @@ subsection {* Misc properties of par-beta *} -lemma par_beta_lift [rule_format, simp]: - "\t' n. t => t' --> lift t n => lift t' n" - apply (induct_tac t) - apply fastsimp+ - done +lemma par_beta_lift [simp]: + "t => t' \ lift t n => lift t' n" + by (induct t fixing: t' n) fastsimp+ -lemma par_beta_subst [rule_format]: - "\s s' t' n. s => s' --> t => t' --> t[s/n] => t'[s'/n]" - apply (induct_tac t) +lemma par_beta_subst: + "s => s' \ t => t' \ t[s/n] => t'[s'/n]" + apply (induct t fixing: s s' t' n) apply (simp add: subst_Var) - apply (intro strip) apply (erule par_beta_cases) apply simp apply (simp add: subst_subst [symmetric]) @@ -110,9 +104,8 @@ "cd (Abs u \ t) = (cd u)[cd t/0]" "cd (Abs s) = Abs (cd s)" -lemma par_beta_cd [rule_format]: - "\t. s => t --> t => cd s" - apply (induct_tac s rule: cd.induct) +lemma par_beta_cd: "s => t \ t => cd s" + apply (induct s fixing: t rule: cd.induct) apply auto apply (fast intro!: par_beta_subst) done diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/Type.thy --- a/src/HOL/Lambda/Type.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/Type.thy Wed Nov 23 22:26:13 2005 +0100 @@ -94,8 +94,8 @@ subsection {* Lists of types *} lemma lists_typings: - "\Ts. e \ ts : Ts \ ts \ lists {t. \T. e \ t : T}" - apply (induct ts) + "e \ ts : Ts \ ts \ lists {t. \T. e \ t : T}" + apply (induct ts fixing: Ts) apply (case_tac Ts) apply simp apply (rule lists.Nil) @@ -108,16 +108,16 @@ apply blast done -lemma types_snoc: "\Ts. e \ ts : Ts \ e \ t : T \ e \ ts @ [t] : Ts @ [T]" - apply (induct ts) +lemma types_snoc: "e \ ts : Ts \ e \ t : T \ e \ ts @ [t] : Ts @ [T]" + apply (induct ts fixing: Ts) apply simp apply (case_tac Ts) apply simp+ done -lemma types_snoc_eq: "\Ts. e \ ts @ [t] : Ts @ [T] = +lemma types_snoc_eq: "e \ ts @ [t] : Ts @ [T] = (e \ ts : Ts \ e \ t : T)" - apply (induct ts) + apply (induct ts fixing: Ts) apply (case_tac Ts) apply simp+ apply (case_tac Ts) @@ -156,8 +156,8 @@ subsection {* n-ary function types *} lemma list_app_typeD: - "\t T. e \ t \\ ts : T \ \Ts. e \ t : Ts \ T \ e \ ts : Ts" - apply (induct ts) + "e \ t \\ ts : T \ \Ts. e \ t : Ts \ T \ e \ ts : Ts" + apply (induct ts fixing: t T) apply simp apply atomize apply simp @@ -176,8 +176,8 @@ by (insert list_app_typeD) fast lemma list_app_typeI: - "\t T Ts. e \ t : Ts \ T \ e \ ts : Ts \ e \ t \\ ts : T" - apply (induct ts) + "e \ t : Ts \ T \ e \ ts : Ts \ e \ t \\ ts : T" + apply (induct ts fixing: t T Ts) apply simp apply atomize apply (case_tac Ts) @@ -201,8 +201,8 @@ *} theorem var_app_type_eq: - "\T U. e \ Var i \\ ts : T \ e \ Var i \\ ts : U \ T = U" - apply (induct ts rule: rev_induct) + "e \ Var i \\ ts : T \ e \ Var i \\ ts : U \ T = U" + apply (induct ts fixing: T U rule: rev_induct) apply simp apply (ind_cases "e \ Var i : T") apply (ind_cases "e \ Var i : T") @@ -220,9 +220,9 @@ apply simp done -lemma var_app_types: "\ts Ts U. e \ Var i \\ ts \\ us : T \ e \ ts : Ts \ +lemma var_app_types: "e \ Var i \\ ts \\ us : T \ e \ ts : Ts \ e \ Var i \\ ts : U \ \Us. U = Us \ T \ e \ us : Us" - apply (induct us) + apply (induct us fixing: ts Ts U) apply simp apply (erule var_app_type_eq) apply assumption @@ -292,8 +292,8 @@ by (induct set: typing) auto lemma lift_types: - "\Ts. e \ ts : Ts \ e\i:U\ \ (map (\t. lift t i) ts) : Ts" - apply (induct ts) + "e \ ts : Ts \ e\i:U\ \ (map (\t. lift t i) ts) : Ts" + apply (induct ts fixing: Ts) apply simp apply (case_tac Ts) apply auto @@ -311,9 +311,9 @@ done lemma substs_lemma: - "\Ts. e \ u : T \ e\i:T\ \ ts : Ts \ + "e \ u : T \ e\i:T\ \ ts : Ts \ e \ (map (\t. t[u/i]) ts) : Ts" - apply (induct ts) + apply (induct ts fixing: Ts) apply (case_tac Ts) apply simp apply simp @@ -352,18 +352,16 @@ subsection {* Alternative induction rule for types *} lemma type_induct [induct type]: + assumes "(\T. (\T1 T2. T = T1 \ T2 \ P T1) \ - (\T1 T2. T = T1 \ T2 \ P T2) \ P T) \ P T" -proof - - case rule_context - show ?thesis - proof (induct T) - case Atom - show ?case by (rule rule_context) simp_all - next - case Fun - show ?case by (rule rule_context) (insert Fun, simp_all) - qed + (\T1 T2. T = T1 \ T2 \ P T2) \ P T)" + shows "P T" +proof (induct T) + case Atom + show ?case by (rule prems) simp_all +next + case Fun + show ?case by (rule prems) (insert Fun, simp_all) qed end diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Lambda/WeakNorm.thy --- a/src/HOL/Lambda/WeakNorm.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Lambda/WeakNorm.thy Wed Nov 23 22:26:13 2005 +0100 @@ -52,14 +52,14 @@ done lemma listall_conj1: "listall (\x. P x \ Q x) xs \ listall P xs" - by (induct xs) simp+ + by (induct xs) simp_all lemma listall_conj2: "listall (\x. P x \ Q x) xs \ listall Q xs" - by (induct xs) simp+ + by (induct xs) simp_all lemma listall_app: "listall P (xs @ ys) = (listall P xs \ listall P ys)" apply (induct xs) - apply (rule iffI, simp, simp) + apply (rule iffI, simp, simp) apply (rule iffI, simp, simp) done diff -r 3b72f559e942 -r afdba6b3e383 src/HOL/Library/Accessible_Part.thy --- a/src/HOL/Library/Accessible_Part.thy Wed Nov 23 22:23:52 2005 +0100 +++ b/src/HOL/Library/Accessible_Part.thy Wed Nov 23 22:26:13 2005 +0100 @@ -32,19 +32,15 @@ subsection {* Induction rules *} theorem acc_induct: - "a \ acc r ==> - (!!x. x \ acc r ==> \y. (y, x) \ r --> P y ==> P x) ==> P a" -proof - - assume major: "a \ acc r" - assume hyp: "!!x. x \ acc r ==> \y. (y, x) \ r --> P y ==> P x" - show ?thesis - apply (rule major [THEN acc.induct]) - apply (rule hyp) - apply (rule accI) - apply fast - apply fast - done -qed + assumes major: "a \ acc r" + assumes hyp: "!!x. x \ acc r ==> \y. (y, x) \ r --> P y ==> P x" + shows "P a" + apply (rule major [THEN acc.induct]) + apply (rule hyp) + apply (rule accI) + apply fast + apply fast + done theorems acc_induct_rule = acc_induct [rule_format, induct set: acc]