Added a few lemmas.
authornipkow
Mon, 27 Apr 1998 16:45:11 +0200
changeset 4830 bd73675adbed
parent 4829 aa5ea943f8e3
child 4831 dae4d63a1318
Added a few lemmas. Renamed expand_const -> split_const.
src/HOL/Arith.ML
src/HOL/Finite.ML
src/HOL/Fun.ML
src/HOL/Fun.thy
src/HOL/IsaMakefile
src/HOL/List.ML
src/HOL/NatDef.ML
src/HOL/Prod.ML
src/HOL/Relation.ML
src/HOL/Set.ML
src/HOL/Sum.ML
src/HOL/Trancl.ML
src/HOL/Univ.ML
src/HOL/simpdata.ML
--- a/src/HOL/Arith.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Arith.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -29,7 +29,7 @@
    However, none of the generalizations are currently in the simpset,
    and I dread to think what happens if I put them in *)
 goal thy "!!n. 0 < n ==> Suc(n-1) = n";
-by (asm_simp_tac (simpset() addsplits [expand_nat_case]) 1);
+by (asm_simp_tac (simpset() addsplits [split_nat_case]) 1);
 qed "Suc_pred";
 Addsimps [Suc_pred];
 
@@ -114,7 +114,7 @@
 goal thy "!!n. 0<n ==> m + (n-1) = (m+n)-1";
 by (exhaust_tac "m" 1);
 by (ALLGOALS (asm_simp_tac (simpset() addsimps [diff_Suc]
-                                      addsplits [expand_nat_case])));
+                                      addsplits [split_nat_case])));
 qed "add_pred";
 Addsimps [add_pred];
 
--- a/src/HOL/Finite.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Finite.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -111,23 +111,23 @@
 AddIffs [finite_Diff_singleton];
 
 (*Lemma for proving finite_imageD*)
-goal Finite.thy "!!A. finite B ==> !A. f``A = B --> inj_onto f A --> finite A";
+goal Finite.thy "!!A. finite B ==> !A. f``A = B --> inj_on f A --> finite A";
 by (etac finite_induct 1);
  by (ALLGOALS Asm_simp_tac);
 by (Clarify_tac 1);
 by (subgoal_tac "EX y:A. f y = x & F = f``(A-{y})" 1);
  by (Clarify_tac 1);
- by (full_simp_tac (simpset() addsimps [inj_onto_def]) 1);
+ by (full_simp_tac (simpset() addsimps [inj_on_def]) 1);
  by (Blast_tac 1);
 by (thin_tac "ALL A. ?PP(A)" 1);
 by (forward_tac [[equalityD2, insertI1] MRS subsetD] 1);
 by (Clarify_tac 1);
 by (res_inst_tac [("x","xa")] bexI 1);
 by (ALLGOALS 
-    (asm_full_simp_tac (simpset() addsimps [inj_onto_image_set_diff])));
+    (asm_full_simp_tac (simpset() addsimps [inj_on_image_set_diff])));
 val lemma = result();
 
-goal Finite.thy "!!A. [| finite(f``A);  inj_onto f A |] ==> finite A";
+goal Finite.thy "!!A. [| finite(f``A);  inj_on f A |] ==> finite A";
 by (dtac lemma 1);
 by (Blast_tac 1);
 qed "finite_imageD";
@@ -156,7 +156,7 @@
 by (rtac finite_subset 2);
 by (assume_tac 3);
 by (ALLGOALS
-    (fast_tac (claset() addSDs [rewrite_rule [inj_onto_def] finite_imageD])));
+    (fast_tac (claset() addSDs [rewrite_rule [inj_on_def] finite_imageD])));
 val lemma = result();
 
 goal Finite.thy "finite(Pow A) = finite A";
@@ -174,8 +174,8 @@
 by (subgoal_tac "r^-1 = (%(x,y).(y,x))``r" 1);
  by (Asm_simp_tac 1);
  by (rtac iffI 1);
-  by (etac (rewrite_rule [inj_onto_def] finite_imageD) 1);
-  by (simp_tac (simpset() addsplits [expand_split]) 1);
+  by (etac (rewrite_rule [inj_on_def] finite_imageD) 1);
+  by (simp_tac (simpset() addsplits [split_split]) 1);
  by (etac finite_imageI 1);
 by (simp_tac (simpset() addsimps [converse_def,image_def]) 1);
 by Auto_tac;
@@ -370,11 +370,11 @@
 qed "card_insert";
 Addsimps [card_insert];
 
-goal Finite.thy "!!A. finite(A) ==> inj_onto f A --> card (f `` A) = card A";
+goal Finite.thy "!!A. finite(A) ==> inj_on f A --> card (f `` A) = card A";
 by (etac finite_induct 1);
 by (ALLGOALS Asm_simp_tac);
 by Safe_tac;
-by (rewtac inj_onto_def);
+by (rewtac inj_on_def);
 by (Blast_tac 1);
 by (stac card_insert_disjoint 1);
 by (etac finite_imageI 1);
@@ -387,9 +387,9 @@
 by (ALLGOALS (asm_simp_tac (simpset() addsimps [Pow_insert])));
 by (stac card_Un_disjoint 1);
 by (EVERY (map (blast_tac (claset() addIs [finite_imageI])) [3,2,1]));
-by (subgoal_tac "inj_onto (insert x) (Pow F)" 1);
+by (subgoal_tac "inj_on (insert x) (Pow F)" 1);
 by (asm_simp_tac (simpset() addsimps [card_image, Pow_insert]) 1);
-by (rewtac inj_onto_def);
+by (rewtac inj_on_def);
 by (blast_tac (claset() addSEs [equalityE]) 1);
 qed "card_Pow";
 Addsimps [card_Pow];
--- a/src/HOL/Fun.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Fun.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -77,52 +77,52 @@
 qed "inj_transfer";
 
 
-(*** inj_onto f A: f is one-to-one over A ***)
+(*** inj_on f A: f is one-to-one over A ***)
 
-val prems = goalw thy [inj_onto_def]
-    "(!! x y. [| f(x) = f(y);  x:A;  y:A |] ==> x=y) ==> inj_onto f A";
+val prems = goalw thy [inj_on_def]
+    "(!! x y. [| f(x) = f(y);  x:A;  y:A |] ==> x=y) ==> inj_on f A";
 by (blast_tac (claset() addIs prems) 1);
-qed "inj_ontoI";
+qed "inj_onI";
 
 val [major] = goal thy 
-    "(!!x. x:A ==> g(f(x)) = x) ==> inj_onto f A";
-by (rtac inj_ontoI 1);
+    "(!!x. x:A ==> g(f(x)) = x) ==> inj_on f A";
+by (rtac inj_onI 1);
 by (etac (apply_inverse RS trans) 1);
 by (REPEAT (eresolve_tac [asm_rl,major] 1));
-qed "inj_onto_inverseI";
+qed "inj_on_inverseI";
 
-val major::prems = goalw thy [inj_onto_def]
-    "[| inj_onto f A;  f(x)=f(y);  x:A;  y:A |] ==> x=y";
+val major::prems = goalw thy [inj_on_def]
+    "[| inj_on f A;  f(x)=f(y);  x:A;  y:A |] ==> x=y";
 by (rtac (major RS bspec RS bspec RS mp) 1);
 by (REPEAT (resolve_tac prems 1));
-qed "inj_ontoD";
+qed "inj_onD";
 
-goal thy "!!x y.[| inj_onto f A;  x:A;  y:A |] ==> (f(x)=f(y)) = (x=y)";
-by (blast_tac (claset() addSDs [inj_ontoD]) 1);
-qed "inj_onto_iff";
+goal thy "!!x y.[| inj_on f A;  x:A;  y:A |] ==> (f(x)=f(y)) = (x=y)";
+by (blast_tac (claset() addSDs [inj_onD]) 1);
+qed "inj_on_iff";
 
 val major::prems = goal thy
-    "[| inj_onto f A;  ~x=y;  x:A;  y:A |] ==> ~ f(x)=f(y)";
+    "[| inj_on f A;  ~x=y;  x:A;  y:A |] ==> ~ f(x)=f(y)";
 by (rtac contrapos 1);
-by (etac (major RS inj_ontoD) 2);
+by (etac (major RS inj_onD) 2);
 by (REPEAT (resolve_tac prems 1));
-qed "inj_onto_contraD";
+qed "inj_on_contraD";
 
-goalw thy [inj_onto_def]
-    "!!A B. [| A<=B; inj_onto f B |] ==> inj_onto f A";
+goalw thy [inj_on_def]
+    "!!A B. [| A<=B; inj_on f B |] ==> inj_on f A";
 by (Blast_tac 1);
-qed "subset_inj_onto";
+qed "subset_inj_on";
 
 
 (*** Lemmas about inj ***)
 
 goalw thy [o_def]
-    "!!f g. [| inj(f);  inj_onto g (range f) |] ==> inj(g o f)";
-by (fast_tac (claset() addIs [injI] addEs [injD, inj_ontoD]) 1);
+    "!!f g. [| inj(f);  inj_on g (range f) |] ==> inj(g o f)";
+by (fast_tac (claset() addIs [injI] addEs [injD, inj_onD]) 1);
 qed "comp_inj";
 
-val [prem] = goal thy "inj(f) ==> inj_onto f A";
-by (blast_tac (claset() addIs [prem RS injD, inj_ontoI]) 1);
+val [prem] = goal thy "inj(f) ==> inj_on f A";
+by (blast_tac (claset() addIs [prem RS injD, inj_onI]) 1);
 qed "inj_imp";
 
 val [prem] = goalw thy [inv_def] "y : range(f) ==> f(inv f y) = y";
@@ -135,20 +135,20 @@
 by (REPEAT (resolve_tac (prems @ [f_inv_f]) 1));
 qed "inv_injective";
 
-goal thy "!!f. [| inj(f);  A<=range(f) |] ==> inj_onto (inv f) A";
-by (fast_tac (claset() addIs [inj_ontoI] 
+goal thy "!!f. [| inj(f);  A<=range(f) |] ==> inj_on (inv f) A";
+by (fast_tac (claset() addIs [inj_onI] 
                       addEs [inv_injective,injD]) 1);
-qed "inj_onto_inv";
+qed "inj_on_inv";
 
-goalw thy [inj_onto_def]
-   "!!f. [| inj_onto f C;  A<=C;  B<=C |] ==> f``(A Int B) = f``A Int f``B";
+goalw thy [inj_on_def]
+   "!!f. [| inj_on f C;  A<=C;  B<=C |] ==> f``(A Int B) = f``A Int f``B";
 by (Blast_tac 1);
-qed "inj_onto_image_Int";
+qed "inj_on_image_Int";
 
-goalw thy [inj_onto_def]
-   "!!f. [| inj_onto f C;  A<=C;  B<=C |] ==> f``(A-B) = f``A - f``B";
+goalw thy [inj_on_def]
+   "!!f. [| inj_on f C;  A<=C;  B<=C |] ==> f``(A-B) = f``A - f``B";
 by (Blast_tac 1);
-qed "inj_onto_image_set_diff";
+qed "inj_on_image_set_diff";
 
 goalw thy [inj_def] "!!f. inj f ==> f``(A Int B) = f``A Int f``B";
 by (Blast_tac 1);
--- a/src/HOL/Fun.thy	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Fun.thy	Mon Apr 27 16:45:11 1998 +0200
@@ -12,15 +12,15 @@
                        (subset_refl,subset_trans,subset_antisym,psubset_eq)
 consts
 
-  inj, surj     :: ('a => 'b) => bool                   (*inj/surjective*)
-  inj_onto      :: ['a => 'b, 'a set] => bool
-  inv           :: ('a => 'b) => ('b => 'a)
+  inj, surj   :: ('a => 'b) => bool                   (*inj/surjective*)
+  inj_on      :: ['a => 'b, 'a set] => bool
+  inv         :: ('a => 'b) => ('b => 'a)
 
 defs
 
-  inj_def       "inj f          == ! x y. f(x)=f(y) --> x=y"
-  inj_onto_def  "inj_onto f A   == ! x:A. ! y:A. f(x)=f(y) --> x=y"
-  surj_def      "surj f         == ! y. ? x. y=f(x)"
-  inv_def       "inv(f::'a=>'b) == (% y. @x. f(x)=y)"
+  inj_def     "inj f          == ! x y. f(x)=f(y) --> x=y"
+  inj_on_def  "inj_on f A     == ! x:A. ! y:A. f(x)=f(y) --> x=y"
+  surj_def    "surj f         == ! y. ? x. y=f(x)"
+  inv_def     "inv(f::'a=>'b) == (% y. @x. f(x)=y)"
 
 end
--- a/src/HOL/IsaMakefile	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/IsaMakefile	Mon Apr 27 16:45:11 1998 +0200
@@ -104,11 +104,15 @@
 
 HOL-Lex: HOL $(LOG)/HOL-Lex.gz
 
-$(LOG)/HOL-Lex.gz: $(OUT)/HOL Lex/Auto.thy Lex/Auto.ML \
+$(LOG)/HOL-Lex.gz: $(OUT)/HOL \
   Lex/AutoChopper.thy Lex/AutoChopper.ML Lex/AutoChopper1.thy \
-  Lex/Chopper.thy Lex/Prefix.thy Lex/Prefix.ML Lex/ROOT.ML \
-  Lex/Regset_of_auto.ML Lex/Regset_of_auto.thy Lex/MaxChop.thy Lex/MaxChop.ML \
-  Lex/MaxPrefix.thy Lex/MaxPrefix.ML Lex/AutoMaxChop.thy Lex/AutoMaxChop.ML
+  Lex/AutoMaxChop.thy Lex/AutoMaxChop.ML Lex/AutoProj.thy Lex/AutoProj.ML \
+  Lex/Automata.thy Lex/Automata.ML Lex/Chopper.thy Lex/DA.thy Lex/DA.ML \
+  Lex/MaxChop.thy Lex/MaxChop.ML Lex/MaxPrefix.thy Lex/MaxPrefix.ML \
+  Lex/NA.thy Lex/NAe.thy Lex/NAe.ML Lex/NAe_of_RegExp.thy Lex/NAe_of_RegExp.ML\
+  Lex/Prefix.thy Lex/Prefix.ML Lex/ROOT.ML \
+  Lex/RegExp.thy Lex/RegSet.thy Lex/RegSet.ML \
+  Lex/RegSet_of_nat_DA.thy Lex/RegSet_of_nat_DA.ML
 	@$(ISATOOL) usedir $(OUT)/HOL Lex
 
 
--- a/src/HOL/List.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/List.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -19,6 +19,15 @@
 by (Asm_simp_tac 1);
 qed "neq_Nil_conv";
 
+(* Induction over the length of a list: *)
+val prems = goal thy
+ "(!!xs::'a list. (!ys. length ys < length xs --> P ys) ==> P xs) ==> P xs";
+by (res_inst_tac [("P","P"),("r","measure length::('a list * 'a list)set")]
+     wf_induct 1);
+by (Simp_tac 1);
+by (asm_full_simp_tac (simpset() addsimps [measure_def,inv_image_def]) 1);
+by (eresolve_tac prems 1);
+qed "list_length_induct";
 
 (** "lists": the list-forming operator over sets **)
 
@@ -219,6 +228,40 @@
 qed "tl_append2";
 Addsimps [tl_append2];
 
+
+(** Snoc exhaustion and induction **)
+section "Snoc exhaustion and induction";
+
+goal thy "xs ~= [] --> (? ys y. xs = ys@[y])";
+by(induct_tac "xs" 1);
+by(Simp_tac 1);
+by(exhaust_tac "list" 1);
+ by(Asm_simp_tac 1);
+ by(res_inst_tac [("x","[]")] exI 1);
+ by(Simp_tac 1);
+by(Asm_full_simp_tac 1);
+by(Clarify_tac 1);
+by(res_inst_tac [("x","a#ys")] exI 1);
+by(Asm_simp_tac 1);
+val lemma = result();
+
+goal thy  "(xs = [] --> P) -->  (!ys y. xs = ys@[y] --> P) --> P";
+by(cut_facts_tac [lemma] 1);
+by(Blast_tac 1);
+bind_thm ("snoc_exhaust",
+  impI RSN (2,allI RSN (2,allI RSN (2,impI RS (result() RS mp RS mp)))));
+
+val prems = goal thy "[| P []; !!x xs. P xs ==> P(xs@[x]) |] ==> P xs";
+by(res_inst_tac [("xs","xs")] list_length_induct 1);
+by(res_inst_tac [("xs","xs")] snoc_exhaust 1);
+ by(Clarify_tac 1);
+ brs prems 1;
+by(Clarify_tac 1);
+brs prems 1;
+auto();
+qed "snoc_induct";
+
+
 (** map **)
 
 section "map";
--- a/src/HOL/NatDef.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/NatDef.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -85,15 +85,15 @@
 by (rtac Rep_Nat_inverse 1);
 qed "inj_Rep_Nat";
 
-goal thy "inj_onto Abs_Nat Nat";
-by (rtac inj_onto_inverseI 1);
+goal thy "inj_on Abs_Nat Nat";
+by (rtac inj_on_inverseI 1);
 by (etac Abs_Nat_inverse 1);
-qed "inj_onto_Abs_Nat";
+qed "inj_on_Abs_Nat";
 
 (*** Distinctness of constructors ***)
 
 goalw thy [Zero_def,Suc_def] "Suc(m) ~= 0";
-by (rtac (inj_onto_Abs_Nat RS inj_onto_contraD) 1);
+by (rtac (inj_on_Abs_Nat RS inj_on_contraD) 1);
 by (rtac Suc_Rep_not_Zero_Rep 1);
 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI, Zero_RepI] 1));
 qed "Suc_not_Zero";
@@ -109,7 +109,7 @@
 
 goalw thy [Suc_def] "inj(Suc)";
 by (rtac injI 1);
-by (dtac (inj_onto_Abs_Nat RS inj_ontoD) 1);
+by (dtac (inj_on_Abs_Nat RS inj_onD) 1);
 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI] 1));
 by (dtac (inj_Suc_Rep RS injD) 1);
 by (etac (inj_Rep_Nat RS injD) 1);
@@ -483,7 +483,7 @@
   "m=n ==> nat_rec a f m = nat_rec a f n"
   (fn [prem] => [rtac (prem RS arg_cong) 1]);
 
-qed_goal "expand_nat_case" thy
+qed_goal "split_nat_case" thy
   "P(nat_case z s n) = ((n=0 --> P z) & (!m. n = Suc m --> P(s m)))"
   (fn _ => [nat_ind_tac "n" 1, ALLGOALS Asm_simp_tac]);
 
--- a/src/HOL/Prod.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Prod.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -19,14 +19,14 @@
             rtac conjI, rtac refl, rtac refl]);
 qed "Pair_Rep_inject";
 
-goal Prod.thy "inj_onto Abs_Prod Prod";
-by (rtac inj_onto_inverseI 1);
+goal Prod.thy "inj_on Abs_Prod Prod";
+by (rtac inj_on_inverseI 1);
 by (etac Abs_Prod_inverse 1);
-qed "inj_onto_Abs_Prod";
+qed "inj_on_Abs_Prod";
 
 val prems = goalw Prod.thy [Pair_def]
     "[| (a, b) = (a',b');  [| a=a';  b=b' |] ==> R |] ==> R";
-by (rtac (inj_onto_Abs_Prod RS inj_ontoD RS Pair_Rep_inject RS conjE) 1);
+by (rtac (inj_on_Abs_Prod RS inj_onD RS Pair_Rep_inject RS conjE) 1);
 by (REPEAT (ares_tac (prems@[ProdI]) 1));
 qed "Pair_inject";
 
@@ -150,16 +150,16 @@
 by (stac surjective_pairing 1);
 by (stac split 1);
 by (Blast_tac 1);
-qed "expand_split";
+qed "split_split";
 
 (* could be done after split_tac has been speeded up significantly:
-simpset_ref() := simpset() addsplits [expand_split];
+simpset_ref() := simpset() addsplits [split_split];
    precompute the constants involved and don't do anything unless
    the current goal contains one of those constants
 *)
 
 goal Prod.thy "R (split c p) = (~(? x y. p = (x,y) & (~R (c x y))))";
-by (stac expand_split 1);
+by (stac split_split 1);
 by (Simp_tac 1);
 qed "expand_split_asm";
 
--- a/src/HOL/Relation.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Relation.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -64,6 +64,10 @@
 
 Addsimps [R_O_id,id_O_R];
 
+goal thy "(R O S) O T = R O (S O T)";
+by (Blast_tac 1);
+qed "O_assoc";
+
 goal thy "!!r s. [| r'<=r; s'<=s |] ==> (r' O s') <= (r O s)";
 by (Blast_tac 1);
 qed "comp_mono";
--- a/src/HOL/Set.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Set.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -643,19 +643,19 @@
 
 
 (** Rewrite rules for boolean case-splitting: faster than 
-	addsplits[expand_if]
+	addsplits[split_if]
 **)
 
-bind_thm ("expand_if_eq1", read_instantiate [("P", "%x. x = ?b")] expand_if);
-bind_thm ("expand_if_eq2", read_instantiate [("P", "%x. ?a = x")] expand_if);
+bind_thm ("split_if_eq1", read_instantiate [("P", "%x. x = ?b")] split_if);
+bind_thm ("split_if_eq2", read_instantiate [("P", "%x. ?a = x")] split_if);
 
-bind_thm ("expand_if_mem1", 
-    read_instantiate_sg (sign_of Set.thy) [("P", "%x. x : ?b")] expand_if);
-bind_thm ("expand_if_mem2", 
-    read_instantiate_sg (sign_of Set.thy) [("P", "%x. ?a : x")] expand_if);
+bind_thm ("split_if_mem1", 
+    read_instantiate_sg (sign_of Set.thy) [("P", "%x. x : ?b")] split_if);
+bind_thm ("split_if_mem2", 
+    read_instantiate_sg (sign_of Set.thy) [("P", "%x. ?a : x")] split_if);
 
-val expand_ifs = [if_bool_eq_conj, expand_if_eq1, expand_if_eq2,
-		  expand_if_mem1, expand_if_mem2];
+val split_ifs = [if_bool_eq_conj, split_if_eq1, split_if_eq2,
+		  split_if_mem1, split_if_mem2];
 
 
 (*Each of these has ALREADY been added to simpset() above.*)
--- a/src/HOL/Sum.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Sum.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -19,10 +19,10 @@
 by (EVERY1 [rtac CollectI, rtac disjI2, rtac exI, rtac refl]);
 qed "Inr_RepI";
 
-goal Sum.thy "inj_onto Abs_Sum Sum";
-by (rtac inj_onto_inverseI 1);
+goal Sum.thy "inj_on Abs_Sum Sum";
+by (rtac inj_on_inverseI 1);
 by (etac Abs_Sum_inverse 1);
-qed "inj_onto_Abs_Sum";
+qed "inj_on_Abs_Sum";
 
 (** Distinctness of Inl and Inr **)
 
@@ -34,7 +34,7 @@
 qed "Inl_Rep_not_Inr_Rep";
 
 goalw Sum.thy [Inl_def,Inr_def] "Inl(a) ~= Inr(b)";
-by (rtac (inj_onto_Abs_Sum RS inj_onto_contraD) 1);
+by (rtac (inj_on_Abs_Sum RS inj_on_contraD) 1);
 by (rtac Inl_Rep_not_Inr_Rep 1);
 by (rtac Inl_RepI 1);
 by (rtac Inr_RepI 1);
@@ -63,7 +63,7 @@
 
 goalw Sum.thy [Inl_def] "inj(Inl)";
 by (rtac injI 1);
-by (etac (inj_onto_Abs_Sum RS inj_ontoD RS Inl_Rep_inject) 1);
+by (etac (inj_on_Abs_Sum RS inj_onD RS Inl_Rep_inject) 1);
 by (rtac Inl_RepI 1);
 by (rtac Inl_RepI 1);
 qed "inj_Inl";
@@ -71,7 +71,7 @@
 
 goalw Sum.thy [Inr_def] "inj(Inr)";
 by (rtac injI 1);
-by (etac (inj_onto_Abs_Sum RS inj_ontoD RS Inr_Rep_inject) 1);
+by (etac (inj_on_Abs_Sum RS inj_onD RS Inr_Rep_inject) 1);
 by (rtac Inr_RepI 1);
 by (rtac Inr_RepI 1);
 qed "inj_Inr";
@@ -150,7 +150,7 @@
 \             ((! x. s = Inl(x) --> R(f(x))) & (! y. s = Inr(y) --> R(g(y))))";
 by (res_inst_tac [("s","s")] sumE 1);
 by Auto_tac;
-qed "expand_sum_case";
+qed "split_sum_case";
 
 (*Prevents simplification of f and g: much faster*)
 qed_goal "sum_case_weak_cong" Sum.thy
--- a/src/HOL/Trancl.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Trancl.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -115,6 +115,13 @@
 qed "rtrancl_idemp";
 Addsimps [rtrancl_idemp];
 
+goal thy "R^* O R^* = R^*";
+br set_ext 1;
+by(split_all_tac 1);
+by(blast_tac (claset() addIs [rtrancl_trans]) 1);
+qed "rtrancl_idemp_self_comp";
+Addsimps [rtrancl_idemp_self_comp];
+
 goal Trancl.thy "!!r s. r <= s^* ==> r^* <= s^*";
 by (dtac rtrancl_mono 1);
 by (Asm_full_simp_tac 1);
--- a/src/HOL/Univ.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/Univ.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -58,12 +58,12 @@
 by (rtac Rep_Node_inverse 1);
 qed "inj_Rep_Node";
 
-goal Univ.thy "inj_onto Abs_Node Node";
-by (rtac inj_onto_inverseI 1);
+goal Univ.thy "inj_on Abs_Node Node";
+by (rtac inj_on_inverseI 1);
 by (etac Abs_Node_inverse 1);
-qed "inj_onto_Abs_Node";
+qed "inj_on_Abs_Node";
 
-val Abs_Node_inject = inj_onto_Abs_Node RS inj_ontoD;
+val Abs_Node_inject = inj_on_Abs_Node RS inj_onD;
 
 
 (*** Introduction rules for Node ***)
--- a/src/HOL/simpdata.ML	Mon Apr 27 13:47:46 1998 +0200
+++ b/src/HOL/simpdata.ML	Mon Apr 27 16:45:11 1998 +0200
@@ -209,7 +209,7 @@
 prove "disj_not1" "(~P | Q) = (P --> Q)";
 prove "disj_not2" "(P | ~Q) = (Q --> P)"; (* changes orientation :-( *)
 
-(*Avoids duplication of subgoals after expand_if, when the true and false 
+(*Avoids duplication of subgoals after split_if, when the true and false 
   cases boil down to the same thing.*) 
 prove "cases_simp" "((P --> Q) & (~P --> Q)) = Q";
 
@@ -261,27 +261,29 @@
 qed_goalw "if_not_P" HOL.thy [if_def] "!!P. ~P ==> (if P then x else y) = y"
  (K [Blast_tac 1]);
 
-qed_goal "expand_if" HOL.thy
+qed_goal "split_if" HOL.thy
     "P(if Q then x else y) = ((Q --> P(x)) & (~Q --> P(y)))" (K [
 	res_inst_tac [("Q","Q")] (excluded_middle RS disjE) 1,
          stac if_P 2,
          stac if_not_P 1,
          ALLGOALS (Blast_tac)]);
+(* for backwards compatibility: *)
+val expand_if = split_if;
 
 qed_goal "split_if_asm" HOL.thy
     "P(if Q then x else y) = (~((Q & ~P x) | (~Q & ~P y)))"
-    (K [stac expand_if 1,
+    (K [stac split_if 1,
 	Blast_tac 1]);
 
 (*This form is useful for expanding IFs on the RIGHT of the ==> symbol*)
 qed_goal "if_bool_eq_conj" HOL.thy
     "(if P then Q else R) = ((P-->Q) & (~P-->R))"
-    (K [rtac expand_if 1]);
+    (K [rtac split_if 1]);
 
 (*And this form is useful for expanding IFs on the LEFT*)
 qed_goal "if_bool_eq_disj" HOL.thy
     "(if P then Q else R) = ((P&Q) | (~P&R))"
-    (K [stac expand_if 1,
+    (K [stac split_if 1,
 	Blast_tac 1]);
 
 
@@ -359,10 +361,10 @@
 fun Delsplits splits = (simpset_ref() := simpset() delsplits splits);
 
 qed_goal "if_cancel" HOL.thy "(if c then x else x) = x"
-  (K [split_tac [expand_if] 1, Blast_tac 1]);
+  (K [split_tac [split_if] 1, Blast_tac 1]);
 
 qed_goal "if_eq_cancel" HOL.thy "(if x = y then y else x) = x"
-  (K [split_tac [expand_if] 1, Blast_tac 1]);
+  (K [split_tac [split_if] 1, Blast_tac 1]);
 
 (** 'if' congruence rules: neither included by default! *)
 
@@ -371,7 +373,7 @@
   "[| b=c; c ==> x=u; ~c ==> y=v |] ==>\
 \  (if b then x else y) = (if c then u else v)"
   (fn rew::prems =>
-   [stac rew 1, stac expand_if 1, stac expand_if 1,
+   [stac rew 1, stac split_if 1, stac split_if 1,
     blast_tac (HOL_cs addDs prems) 1]);
 
 (*Prevents simplification of x and y: much faster*)
@@ -418,11 +420,11 @@
      @ ex_simps @ all_simps @ simp_thms)
      addsimprocs [defALL_regroup,defEX_regroup]
      addcongs [imp_cong]
-     addsplits [expand_if];
+     addsplits [split_if];
 
 qed_goal "if_distrib" HOL.thy
   "f(if c then x else y) = (if c then f x else f y)" 
-  (K [simp_tac (HOL_ss setloop (split_tac [expand_if])) 1]);
+  (K [simp_tac (HOL_ss setloop (split_tac [split_if])) 1]);
 
 qed_goalw "o_assoc" HOL.thy [o_def] "f o (g o h) = f o g o h"
   (K [rtac ext 1, rtac refl 1]);