src/ZF/List.thy
changeset 13509 6f168374652a
parent 13396 11219ca224ab
child 13524 604d0f3622d6
--- a/src/ZF/List.thy	Wed Aug 21 15:53:30 2002 +0200
+++ b/src/ZF/List.thy	Wed Aug 21 15:55:40 2002 +0200
@@ -135,6 +135,9 @@
 (*An elimination rule, for type-checking*)
 inductive_cases ConsE: "Cons(a,l) : list(A)"
 
+lemma Cons_type_iff [simp]: "Cons(a,l) \<in> list(A) <-> a \<in> A & l \<in> list(A)"
+by (blast elim: ConsE) 
+
 (*Proving freeness results*)
 lemma Cons_iff: "Cons(a,l)=Cons(a',l') <-> a=a' & l=l'"
 by auto
@@ -420,8 +423,7 @@
 apply (simp_all (no_asm_simp) add: list_add_app)
 done
 
-(** New induction rule **)
-
+(** New induction rules **)
 
 lemma list_append_induct:
     "[| l: list(A);
@@ -434,6 +436,29 @@
 
 lemmas list_append_induct = list_append_induct [case_names Nil snoc, consumes 1]
 
+lemma list_complete_induct_lemma [rule_format]:
+ assumes ih: 
+    "\<And>l. [| l \<in> list(A); 
+             \<forall>l' \<in> list(A). length(l') < length(l) --> P(l')|] 
+          ==> P(l)"
+  shows "n \<in> nat ==> \<forall>l \<in> list(A). length(l) < n --> P(l)"
+apply (induct_tac n, simp)
+apply (blast intro: ih elim!: leE) 
+done
+
+theorem list_complete_induct:
+      "[| l \<in> list(A); 
+          \<And>l. [| l \<in> list(A); 
+                  \<forall>l' \<in> list(A). length(l') < length(l) --> P(l')|] 
+               ==> P(l)
+       |] ==> P(l)"
+apply (rule list_complete_induct_lemma [of A]) 
+   prefer 4 apply (rule le_refl, simp) 
+  apply blast 
+ apply simp 
+apply assumption
+done
+
 
 (*** Thanks to Sidi Ehmety for these results about min, take, etc. ***)
 
@@ -573,13 +598,11 @@
 
 lemma append_self_iff [simp]:
      "[| xs:list(A); ys:list(A); zs:list(A) |] ==> xs@ys=xs@zs <-> ys=zs"
-apply (simp (no_asm_simp))
-done
+by simp
 
 lemma append_self_iff2 [simp]:
      "[| xs:list(A); ys:list(A); zs:list(A) |] ==> ys@xs=zs@xs <-> ys=zs"
-apply (simp (no_asm_simp))
-done
+by simp
 
 (* Can also be proved from append_eq_append_iff2,
 but the proof requires two more hypotheses: x:A and y:A *)
@@ -597,8 +620,7 @@
 
 lemma append_right_is_self_iff [simp]:
      "[| xs:list(A); ys:list(A) |] ==> (xs@ys = ys) <-> (xs=Nil)"
-apply (simp (no_asm_simp) add: append_left_is_Nil_iff)
-done
+by (simp (no_asm_simp) add: append_left_is_Nil_iff)
 
 lemma append_right_is_self_iff2 [simp]:
      "[| xs:list(A); ys:list(A) |] ==> (ys = xs@ys) <-> (xs=Nil)"
@@ -630,8 +652,7 @@
 lemma rev_list_elim [rule_format]:
      "xs:list(A) ==>
       (xs=Nil --> P) --> (\<forall>ys \<in> list(A). \<forall>y \<in> A. xs =ys@[y] -->P)-->P"
-apply (erule list_append_induct, auto)
-done
+by (erule list_append_induct, auto)
 
 
 (** more theorems about drop **)