src/HOL/MiniML/W.ML
changeset 3919 c036caebfc75
parent 3842 b55686a7b22c
child 4033 43ec35b5054d
equal deleted inserted replaced
3918:94e0fdcb7b91 3919:c036caebfc75
    16 (* the resulting type variable is always greater or equal than the given one *)
    16 (* the resulting type variable is always greater or equal than the given one *)
    17 goal thy
    17 goal thy
    18         "!A n S t m. W e A n  = Some (S,t,m) --> n<=m";
    18         "!A n S t m. W e A n  = Some (S,t,m) --> n<=m";
    19 by (expr.induct_tac "e" 1);
    19 by (expr.induct_tac "e" 1);
    20 (* case Var(n) *)
    20 (* case Var(n) *)
    21 by (simp_tac (!simpset setloop (split_tac [expand_option_bind,expand_if])) 1);
    21 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1);
    22 by (strip_tac 1);
    22 by (strip_tac 1);
    23 by (etac conjE 1);
    23 by (etac conjE 1);
    24 by (etac conjE 1);
    24 by (etac conjE 1);
    25 by (dtac sym 1);
    25 by (dtac sym 1);
    26 by (dtac sym 1);
    26 by (dtac sym 1);
    27 by (dtac sym 1);
    27 by (dtac sym 1);
    28 by (Asm_full_simp_tac 1);
    28 by (Asm_full_simp_tac 1);
    29 (* case Abs e *)
    29 (* case Abs e *)
    30 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
    30 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    31 by (fast_tac (HOL_cs addDs [Suc_leD]) 1);
    31 by (fast_tac (HOL_cs addDs [Suc_leD]) 1);
    32 (* case App e1 e2 *)
    32 (* case App e1 e2 *)
    33 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
    33 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    34 by (strip_tac 1);
    34 by (strip_tac 1);
    35 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1);
    35 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1);
    36 by (eres_inst_tac [("x","A")] allE 1);
    36 by (eres_inst_tac [("x","A")] allE 1);
    37 by (eres_inst_tac [("x","n")] allE 1);
    37 by (eres_inst_tac [("x","n")] allE 1);
    38 by (eres_inst_tac [("x","$ S A")] allE 1);
    38 by (eres_inst_tac [("x","$ S A")] allE 1);
    48 by (etac conjE 1);
    48 by (etac conjE 1);
    49 by (res_inst_tac [("j","n1")] le_trans 1); 
    49 by (res_inst_tac [("j","n1")] le_trans 1); 
    50 by (Asm_simp_tac 1);
    50 by (Asm_simp_tac 1);
    51 by (Asm_simp_tac 1);
    51 by (Asm_simp_tac 1);
    52 (* case LET e1 e2 *)
    52 (* case LET e1 e2 *)
    53 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
    53 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    54 by (strip_tac 1);
    54 by (strip_tac 1);
    55 by (rename_tac "A n1 S t2 m1 S2 t3 m2 S3 t1 m" 1);
    55 by (rename_tac "A n1 S t2 m1 S2 t3 m2 S3 t1 m" 1);
    56 by (REPEAT (etac conjE 1));
    56 by (REPEAT (etac conjE 1));
    57 by (REPEAT (etac allE 1));
    57 by (REPEAT (etac allE 1));
    58 by (mp_tac 1);
    58 by (mp_tac 1);
    86 by (mp_tac 2);
    86 by (mp_tac 2);
    87 by (mp_tac 2);
    87 by (mp_tac 2);
    88 by (assume_tac 2);
    88 by (assume_tac 2);
    89 by (rtac add_le_mono 1);
    89 by (rtac add_le_mono 1);
    90 by (Simp_tac 1);
    90 by (Simp_tac 1);
    91 by (simp_tac (!simpset setloop (split_tac [expand_if]) addsimps [max_def]) 1);
    91 by (simp_tac (!simpset addsplits [expand_if] addsimps [max_def]) 1);
    92 by (strip_tac 1);
    92 by (strip_tac 1);
    93 by (rtac new_tv_le 1);
    93 by (rtac new_tv_le 1);
    94 by (mp_tac 2);
    94 by (mp_tac 2);
    95 by (mp_tac 2);
    95 by (mp_tac 2);
    96 by (assume_tac 2);
    96 by (assume_tac 2);
    97 by (rtac add_le_mono 1);
    97 by (rtac add_le_mono 1);
    98 by (Simp_tac 1);
    98 by (Simp_tac 1);
    99 by (simp_tac (!simpset setloop (split_tac [expand_if]) addsimps [max_def]) 1);
    99 by (simp_tac (!simpset addsplits [expand_if] addsimps [max_def]) 1);
   100 by (strip_tac 1);
   100 by (strip_tac 1);
   101 by (dtac not_leE 1);
   101 by (dtac not_leE 1);
   102 by (rtac less_or_eq_imp_le 1);
   102 by (rtac less_or_eq_imp_le 1);
   103 by (Fast_tac 1);
   103 by (Fast_tac 1);
   104 qed_spec_mp "new_tv_bound_typ_inst_sch";
   104 qed_spec_mp "new_tv_bound_typ_inst_sch";
   109 goal thy
   109 goal thy
   110      "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) -->    \
   110      "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) -->    \
   111 \                 new_tv m S & new_tv m t";
   111 \                 new_tv m S & new_tv m t";
   112 by (expr.induct_tac "e" 1);
   112 by (expr.induct_tac "e" 1);
   113 (* case Var n *)
   113 (* case Var n *)
   114 by (simp_tac (!simpset setloop (split_tac [expand_option_bind,expand_if])) 1);
   114 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1);
   115 by (strip_tac 1);
   115 by (strip_tac 1);
   116 by (REPEAT (etac conjE 1));
   116 by (REPEAT (etac conjE 1));
   117 by (rtac conjI 1);
   117 by (rtac conjI 1);
   118 by (dtac sym 1);
   118 by (dtac sym 1);
   119 by (Asm_full_simp_tac 1);
   119 by (Asm_full_simp_tac 1);
   123 by (dtac new_tv_nth_nat_A 1);
   123 by (dtac new_tv_nth_nat_A 1);
   124 by (assume_tac 1);
   124 by (assume_tac 1);
   125 by (Asm_full_simp_tac 1);
   125 by (Asm_full_simp_tac 1);
   126 (* case Abs e *)
   126 (* case Abs e *)
   127 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] 
   127 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] 
   128     setloop (split_tac [expand_option_bind])) 1);
   128     addsplits [expand_option_bind]) 1);
   129 by (strip_tac 1);
   129 by (strip_tac 1);
   130 by (eres_inst_tac [("x","Suc n")] allE 1);
   130 by (eres_inst_tac [("x","Suc n")] allE 1);
   131 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   131 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   132 by (fast_tac (HOL_cs addss (!simpset
   132 by (fast_tac (HOL_cs addss (!simpset
   133               addsimps [new_tv_subst,new_tv_Suc_list])) 1);
   133               addsimps [new_tv_subst,new_tv_Suc_list])) 1);
   134 (* case App e1 e2 *)
   134 (* case App e1 e2 *)
   135 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
   135 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   136 by (strip_tac 1);
   136 by (strip_tac 1);
   137 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1);
   137 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1);
   138 by (eres_inst_tac [("x","n")] allE 1);
   138 by (eres_inst_tac [("x","n")] allE 1);
   139 by (eres_inst_tac [("x","A")] allE 1);
   139 by (eres_inst_tac [("x","A")] allE 1);
   140 by (eres_inst_tac [("x","S")] allE 1);
   140 by (eres_inst_tac [("x","S")] allE 1);
   172    new_tv_subst_le,new_tv_le] addss !simpset) 1);
   172    new_tv_subst_le,new_tv_le] addss !simpset) 1);
   173 by (fast_tac (HOL_cs addDs [W_var_geD] addIs
   173 by (fast_tac (HOL_cs addDs [W_var_geD] addIs
   174      [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le]
   174      [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le]
   175      addss (!simpset)) 1);
   175      addss (!simpset)) 1);
   176 (* case LET e1 e2 *)
   176 (* case LET e1 e2 *)
   177 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
   177 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   178 by (strip_tac 1);
   178 by (strip_tac 1);
   179 by (rename_tac "n1 A S1 t1 n2 S2 t2 m2 S t m" 1);
   179 by (rename_tac "n1 A S1 t1 n2 S2 t2 m2 S t m" 1);
   180 by (REPEAT (etac conjE 1));
   180 by (REPEAT (etac conjE 1));
   181 by (eres_inst_tac [("x","n1")] allE 1);
   181 by (eres_inst_tac [("x","n1")] allE 1);
   182 by (eres_inst_tac [("x","A")] allE 1);
   182 by (eres_inst_tac [("x","A")] allE 1);
   237      "!n A S t m v. W e A n = Some (S,t,m) -->            \
   237      "!n A S t m v. W e A n = Some (S,t,m) -->            \
   238 \         (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A";
   238 \         (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A";
   239 by (expr.induct_tac "e" 1);
   239 by (expr.induct_tac "e" 1);
   240 (* case Var n *)
   240 (* case Var n *)
   241 by (simp_tac (!simpset addsimps
   241 by (simp_tac (!simpset addsimps
   242     [free_tv_subst] setloop (split_tac [expand_option_bind,expand_if])) 1);
   242     [free_tv_subst] addsplits [expand_option_bind,expand_if]) 1);
   243 by (strip_tac 1);
   243 by (strip_tac 1);
   244 by (REPEAT (etac conjE 1));
   244 by (REPEAT (etac conjE 1));
   245 by (hyp_subst_tac 1);
   245 by (hyp_subst_tac 1);
   246 by (asm_full_simp_tac (!simpset addsimps [dom_def,cod_def,id_subst_def]) 1);
   246 by (asm_full_simp_tac (!simpset addsimps [dom_def,cod_def,id_subst_def]) 1);
   247 by (case_tac "v : free_tv (nth nat A)" 1);
   247 by (case_tac "v : free_tv (nth nat A)" 1);
   253 by (etac exE 1);
   253 by (etac exE 1);
   254 by (rotate_tac 3 1);
   254 by (rotate_tac 3 1);
   255 by (Asm_full_simp_tac 1);
   255 by (Asm_full_simp_tac 1);
   256 (* case Abs e *)
   256 (* case Abs e *)
   257 by (asm_full_simp_tac (!simpset addsimps
   257 by (asm_full_simp_tac (!simpset addsimps
   258     [free_tv_subst] setloop (split_tac [expand_option_bind]) delsimps all_simps) 1);
   258     [free_tv_subst] addsplits [expand_option_bind] delsimps all_simps) 1);
   259 by (strip_tac 1);
   259 by (strip_tac 1);
   260 by (rename_tac "S t n1 S1 t1 m v" 1);
   260 by (rename_tac "S t n1 S1 t1 m v" 1);
   261 by (eres_inst_tac [("x","Suc n")] allE 1);
   261 by (eres_inst_tac [("x","Suc n")] allE 1);
   262 by (eres_inst_tac [("x","FVar n # A")] allE 1);
   262 by (eres_inst_tac [("x","FVar n # A")] allE 1);
   263 by (eres_inst_tac [("x","S")] allE 1);
   263 by (eres_inst_tac [("x","S")] allE 1);
   265 by (eres_inst_tac [("x","n1")] allE 1);
   265 by (eres_inst_tac [("x","n1")] allE 1);
   266 by (eres_inst_tac [("x","v")] allE 1);
   266 by (eres_inst_tac [("x","v")] allE 1);
   267 by (best_tac (HOL_cs addIs [cod_app_subst]
   267 by (best_tac (HOL_cs addIs [cod_app_subst]
   268                      addss (!simpset addsimps [less_Suc_eq])) 1);
   268                      addss (!simpset addsimps [less_Suc_eq])) 1);
   269 (* case App e1 e2 *)
   269 (* case App e1 e2 *)
   270 by (simp_tac (!simpset setloop (split_tac [expand_option_bind]) delsimps all_simps) 1);
   270 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1);
   271 by (strip_tac 1); 
   271 by (strip_tac 1); 
   272 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1);
   272 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1);
   273 by (eres_inst_tac [("x","n")] allE 1);
   273 by (eres_inst_tac [("x","n")] allE 1);
   274 by (eres_inst_tac [("x","A")] allE 1);
   274 by (eres_inst_tac [("x","A")] allE 1);
   275 by (eres_inst_tac [("x","S")] allE 1);
   275 by (eres_inst_tac [("x","S")] allE 1);
   301     free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD,
   301     free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD,
   302     less_le_trans,subsetD]
   302     less_le_trans,subsetD]
   303   addEs [UnE]
   303   addEs [UnE]
   304   addss !simpset) 1);
   304   addss !simpset) 1);
   305 (* LET e1 e2 *)
   305 (* LET e1 e2 *)
   306 by (simp_tac (!simpset setloop (split_tac [expand_option_bind]) delsimps all_simps) 1);
   306 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1);
   307 by (strip_tac 1); 
   307 by (strip_tac 1); 
   308 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1);
   308 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1);
   309 by (eres_inst_tac [("x","nat")] allE 1);
   309 by (eres_inst_tac [("x","nat")] allE 1);
   310 by (eres_inst_tac [("x","A")] allE 1);
   310 by (eres_inst_tac [("x","A")] allE 1);
   311 by (eres_inst_tac [("x","S1")] allE 1);
   311 by (eres_inst_tac [("x","S1")] allE 1);
   336 (* correctness of W with respect to has_type *)
   336 (* correctness of W with respect to has_type *)
   337 goal W.thy
   337 goal W.thy
   338         "!A S t m n . new_tv n A --> Some (S,t,m) = W e A n --> $S A |- e :: t";
   338         "!A S t m n . new_tv n A --> Some (S,t,m) = W e A n --> $S A |- e :: t";
   339 by (expr.induct_tac "e" 1);
   339 by (expr.induct_tac "e" 1);
   340 (* case Var n *)
   340 (* case Var n *)
   341 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   341 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 1);
   342 by (strip_tac 1);
   342 by (strip_tac 1);
   343 by (rtac has_type.VarI 1);
   343 by (rtac has_type.VarI 1);
   344 by (Simp_tac 1);
   344 by (Simp_tac 1);
   345 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   345 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   346 by (rtac exI 1);
   346 by (rtac exI 1);
   347 by (rtac refl 1);
   347 by (rtac refl 1);
   348 (* case Abs e *)
   348 (* case Abs e *)
   349 by (asm_full_simp_tac (!simpset addsimps [app_subst_list]
   349 by (asm_full_simp_tac (!simpset addsimps [app_subst_list]
   350                         setloop (split_tac [expand_option_bind])) 1);
   350                         addsplits [expand_option_bind]) 1);
   351 by (strip_tac 1);
   351 by (strip_tac 1);
   352 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1);
   352 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1);
   353 by (Asm_full_simp_tac 1);
   353 by (Asm_full_simp_tac 1);
   354 by (rtac has_type.AbsI 1);
   354 by (rtac has_type.AbsI 1);
   355 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1);
   355 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1);
   358 by (etac impE 1);
   358 by (etac impE 1);
   359 by (mp_tac 2);
   359 by (mp_tac 2);
   360 by (Asm_simp_tac 1);
   360 by (Asm_simp_tac 1);
   361 by (assume_tac 1);
   361 by (assume_tac 1);
   362 (* case App e1 e2 *)
   362 (* case App e1 e2 *)
   363 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
   363 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   364 by (strip_tac 1);
   364 by (strip_tac 1);
   365 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   365 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   366 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1);
   366 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1);
   367 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1);
   367 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1);
   368 by (rtac (app_subst_Fun RS subst) 1);
   368 by (rtac (app_subst_Fun RS subst) 1);
   390 by (etac thin_rl 1);
   390 by (etac thin_rl 1);
   391 by (mp_tac 1);
   391 by (mp_tac 1);
   392 by (mp_tac 1);
   392 by (mp_tac 1);
   393 by (assume_tac 1);
   393 by (assume_tac 1);
   394 (* case Let e1 e2 *)
   394 (* case Let e1 e2 *)
   395 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1);
   395 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   396 by (strip_tac 1);
   396 by (strip_tac 1);
   397 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); 
   397 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); 
   398 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1);
   398 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1);
   399 by (simp_tac (!simpset addsimps [o_def]) 1);
   399 by (simp_tac (!simpset addsimps [o_def]) 1);
   400 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1);
   400 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1);
   467 \             (? S t. (? m. W e A n = Some (S,t,m)) &  \
   467 \             (? S t. (? m. W e A n = Some (S,t,m)) &  \
   468 \                     (? R. $S' A = $R ($S A) & t' = $R t))";
   468 \                     (? R. $S' A = $R ($S A) & t' = $R t))";
   469 by (expr.induct_tac "e" 1);
   469 by (expr.induct_tac "e" 1);
   470 (* case Var n *)
   470 (* case Var n *)
   471 by (strip_tac 1);
   471 by (strip_tac 1);
   472 by (simp_tac (!simpset addcongs [conj_cong] 
   472 by (simp_tac (!simpset addcongs [conj_cong] addsplits [expand_if]) 1);
   473     setloop (split_tac [expand_if])) 1);
       
   474 by (eresolve_tac has_type_casesE 1); 
   473 by (eresolve_tac has_type_casesE 1); 
   475 by (asm_full_simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   474 by (asm_full_simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   476 by (etac exE 1);
   475 by (etac exE 1);
   477 by (hyp_subst_tac 1);
   476 by (hyp_subst_tac 1);
   478 by (rename_tac "S" 1);
   477 by (rename_tac "S" 1);
   489 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   488 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   490 by (eres_inst_tac [("x","t2")] allE 1);
   489 by (eres_inst_tac [("x","t2")] allE 1);
   491 by (eres_inst_tac [("x","Suc n")] allE 1);
   490 by (eres_inst_tac [("x","Suc n")] allE 1);
   492 by (best_tac (HOL_cs addSDs [mk_scheme_injective] 
   491 by (best_tac (HOL_cs addSDs [mk_scheme_injective] 
   493                   addss (!simpset addcongs [conj_cong] 
   492                   addss (!simpset addcongs [conj_cong] 
   494                                 setloop (split_tac [expand_option_bind]))) 1);
   493                                 addsplits [expand_option_bind])) 1);
   495 (** LEVEL 19 **)
   494 (** LEVEL 19 **)
   496 
   495 
   497 (* case App e1 e2 *)
   496 (* case App e1 e2 *)
   498 by (strip_tac 1);
   497 by (strip_tac 1);
   499 by (eresolve_tac has_type_casesE 1);
   498 by (eresolve_tac has_type_casesE 1);
   529 by (best_tac (HOL_cs addDs [new_tv_W,sym RS W_var_geD,
   528 by (best_tac (HOL_cs addDs [new_tv_W,sym RS W_var_geD,
   530     new_tv_not_free_tv,new_tv_le]) 3);
   529     new_tv_not_free_tv,new_tv_le]) 3);
   531 by (case_tac "na:free_tv Sa" 2);
   530 by (case_tac "na:free_tv Sa" 2);
   532 (* n1 ~: free_tv S1 *)
   531 (* n1 ~: free_tv S1 *)
   533 by (forward_tac [not_free_impl_id] 3);
   532 by (forward_tac [not_free_impl_id] 3);
   534 by (asm_simp_tac (!simpset 
   533 by (asm_simp_tac (!simpset addsplits [expand_if]) 3);
   535     setloop (split_tac [expand_if])) 3);
       
   536 (* na : free_tv Sa *)
   534 (* na : free_tv Sa *)
   537 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   535 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   538 by (dtac eq_subst_scheme_list_eq_free 2);
   536 by (dtac eq_subst_scheme_list_eq_free 2);
   539 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   537 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   540 by (Asm_simp_tac 2); 
   538 by (Asm_simp_tac 2); 
   541 by (case_tac "na:dom Sa" 2);
   539 by (case_tac "na:dom Sa" 2);
   542 (* na ~: dom Sa *)
   540 (* na ~: dom Sa *)
   543 by (asm_full_simp_tac (!simpset addsimps [dom_def] 
   541 by (asm_full_simp_tac (!simpset addsimps [dom_def] addsplits [expand_if]) 3);
   544     setloop (split_tac [expand_if])) 3);
       
   545 (* na : dom Sa *)
   542 (* na : dom Sa *)
   546 by (rtac eq_free_eq_subst_te 2);
   543 by (rtac eq_free_eq_subst_te 2);
   547 by (strip_tac 2);
   544 by (strip_tac 2);
   548 by (subgoal_tac "nb ~= ma" 2);
   545 by (subgoal_tac "nb ~= ma" 2);
   549 by ((forward_tac [new_tv_W] 3) THEN (atac 3));
   546 by ((forward_tac [new_tv_W] 3) THEN (atac 3));
   551 by (dtac new_tv_subst_scheme_list 3);
   548 by (dtac new_tv_subst_scheme_list 3);
   552 by (fast_tac (HOL_cs addIs [new_scheme_list_le] addDs [sym RS W_var_geD]) 3);
   549 by (fast_tac (HOL_cs addIs [new_scheme_list_le] addDs [sym RS W_var_geD]) 3);
   553 by (fast_tac (set_cs addDs [new_tv_W,new_tv_not_free_tv] addss 
   550 by (fast_tac (set_cs addDs [new_tv_W,new_tv_not_free_tv] addss 
   554     (!simpset addsimps [cod_def,free_tv_subst])) 3);
   551     (!simpset addsimps [cod_def,free_tv_subst])) 3);
   555 by (fast_tac (set_cs addss (!simpset addsimps [cod_def,free_tv_subst] 
   552 by (fast_tac (set_cs addss (!simpset addsimps [cod_def,free_tv_subst] 
   556     setloop (split_tac [expand_if]))) 2);
   553                                      addsplits [expand_if])) 2);
   557 by (Simp_tac 2);  
   554 by (Simp_tac 2);  
   558 by (rtac eq_free_eq_subst_te 2);
   555 by (rtac eq_free_eq_subst_te 2);
   559 by (strip_tac 2 );
   556 by (strip_tac 2 );
   560 by (subgoal_tac "na ~= ma" 2);
   557 by (subgoal_tac "na ~= ma" 2);
   561 by ((forward_tac [new_tv_W] 3) THEN (atac 3));
   558 by ((forward_tac [new_tv_W] 3) THEN (atac 3));
   562 by (etac conjE 3);
   559 by (etac conjE 3);
   563 by (dtac (sym RS W_var_geD) 3);
   560 by (dtac (sym RS W_var_geD) 3);
   564 by (fast_tac (HOL_cs addDs [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_W,new_tv_not_free_tv]) 3);
   561 by (fast_tac (HOL_cs addDs [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_W,new_tv_not_free_tv]) 3);
   565 by (case_tac "na: free_tv t - free_tv Sa" 2);
   562 by (case_tac "na: free_tv t - free_tv Sa" 2);
   566 (* case na ~: free_tv t - free_tv Sa *)
   563 (* case na ~: free_tv t - free_tv Sa *)
   567 by ( asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 3);
   564 by ( asm_full_simp_tac (!simpset addsplits [expand_if]) 3);
   568 by (Fast_tac 3);
   565 by (Fast_tac 3);
   569 (* case na : free_tv t - free_tv Sa *)
   566 (* case na : free_tv t - free_tv Sa *)
   570 by ( asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 2);
   567 by ( asm_full_simp_tac (!simpset addsplits [expand_if]) 2);
   571 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   568 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   572 by (dtac eq_subst_scheme_list_eq_free 2);
   569 by (dtac eq_subst_scheme_list_eq_free 2);
   573 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   570 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   574 (** LEVEL 75 **)
   571 (** LEVEL 75 **)
   575 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2);
   572 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2);
   576 by (asm_simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); 
   573 by (asm_simp_tac (!simpset addsplits [expand_option_bind]) 1); 
   577 by (safe_tac HOL_cs );
   574 by (safe_tac HOL_cs );
   578 by (dtac mgu_Some 1);
   575 by (dtac mgu_Some 1);
   579 by ( fast_tac (HOL_cs addss !simpset) 1);
   576 by ( fast_tac (HOL_cs addss !simpset) 1);
   580 (** LEVEL 80 *)
   577 (** LEVEL 80 *)
   581 by ((dtac mgu_mg 1) THEN (atac 1));
   578 by ((dtac mgu_mg 1) THEN (atac 1));
   601 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 2);
   598 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 2);
   602 by (fast_tac (set_cs addDs [sym RS W_var_geD,new_scheme_list_le,codD,
   599 by (fast_tac (set_cs addDs [sym RS W_var_geD,new_scheme_list_le,codD,
   603     new_tv_not_free_tv]) 2);
   600     new_tv_not_free_tv]) 2);
   604 by (case_tac "na: free_tv t - free_tv Sa" 1);
   601 by (case_tac "na: free_tv t - free_tv Sa" 1);
   605 (* case na ~: free_tv t - free_tv Sa *)
   602 (* case na ~: free_tv t - free_tv Sa *)
   606 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 2);
   603 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 2);
   607 (* case na : free_tv t - free_tv Sa *)
   604 (* case na : free_tv t - free_tv Sa *)
   608 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   605 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 1);
   609 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 1);
   606 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 1);
   610 by (fast_tac (set_cs addDs [codD,subst_comp_scheme_list RSN (2,trans),
   607 by (fast_tac (set_cs addDs [codD,subst_comp_scheme_list RSN (2,trans),
   611     eq_subst_scheme_list_eq_free] addss ((!simpset addsimps 
   608     eq_subst_scheme_list_eq_free] addss ((!simpset addsimps 
   612     [free_tv_subst,dom_def]))) 1);
   609     [free_tv_subst,dom_def]))) 1);
   613 by (Fast_tac 1);
   610 by (Fast_tac 1);