src/HOL/MiniML/W.ML
changeset 4072 d0d32dd77440
parent 4033 43ec35b5054d
child 4089 96fba19bcbe2
equal deleted inserted replaced
4071:4747aefbbc52 4072:d0d32dd77440
    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 addsplits [expand_option_bind,expand_if]) 1);
    21 by (simp_tac (!simpset addsplits [split_option_bind,expand_if]) 1);
    22 (* case Abs e *)
    22 (* case Abs e *)
    23 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    23 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
    24 by (fast_tac (HOL_cs addDs [Suc_leD]) 1);
    24 by (fast_tac (HOL_cs addDs [Suc_leD]) 1);
    25 (* case App e1 e2 *)
    25 (* case App e1 e2 *)
    26 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    26 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
    27 by(blast_tac (!claset addIs [le_SucI,le_trans]) 1);
    27 by(blast_tac (!claset addIs [le_SucI,le_trans]) 1);
    28 (* case LET e1 e2 *)
    28 (* case LET e1 e2 *)
    29 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    29 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
    30 by(blast_tac (!claset addIs [le_trans]) 1);
    30 by(blast_tac (!claset addIs [le_trans]) 1);
    31 qed_spec_mp "W_var_ge";
    31 qed_spec_mp "W_var_ge";
    32 
    32 
    33 Addsimps [W_var_ge];
    33 Addsimps [W_var_ge];
    34 
    34 
    79 goal thy
    79 goal thy
    80      "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) -->    \
    80      "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) -->    \
    81 \                 new_tv m S & new_tv m t";
    81 \                 new_tv m S & new_tv m t";
    82 by (expr.induct_tac "e" 1);
    82 by (expr.induct_tac "e" 1);
    83 (* case Var n *)
    83 (* case Var n *)
    84 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1);
    84 by (simp_tac (!simpset addsplits [split_option_bind,expand_if]) 1);
    85 by (strip_tac 1);
    85 by (strip_tac 1);
    86 by (dtac new_tv_nth_nat_A 1);
    86 by (dtac new_tv_nth_nat_A 1);
    87 by (assume_tac 1);
    87 by (assume_tac 1);
    88 by (Asm_simp_tac 1);
    88 by (Asm_simp_tac 1);
    89 (* case Abs e *)
    89 (* case Abs e *)
    90 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] 
    90 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] 
    91     addsplits [expand_option_bind]) 1);
    91     addsplits [split_option_bind]) 1);
    92 by (strip_tac 1);
    92 by (strip_tac 1);
    93 by (eres_inst_tac [("x","Suc n")] allE 1);
    93 by (eres_inst_tac [("x","Suc n")] allE 1);
    94 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
    94 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
    95 by (fast_tac (HOL_cs addss (!simpset
    95 by (fast_tac (HOL_cs addss (!simpset
    96               addsimps [new_tv_subst,new_tv_Suc_list])) 1);
    96               addsimps [new_tv_subst,new_tv_Suc_list])) 1);
    97 (* case App e1 e2 *)
    97 (* case App e1 e2 *)
    98 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
    98 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
    99 by (strip_tac 1);
    99 by (strip_tac 1);
   100 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   100 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   101 by (eres_inst_tac [("x","n")] allE 1);
   101 by (eres_inst_tac [("x","n")] allE 1);
   102 by (eres_inst_tac [("x","A")] allE 1);
   102 by (eres_inst_tac [("x","A")] allE 1);
   103 by (eres_inst_tac [("x","S1")] allE 1);
   103 by (eres_inst_tac [("x","S1")] allE 1);
   135    new_tv_subst_le,new_tv_le] addss !simpset) 1);
   135    new_tv_subst_le,new_tv_le] addss !simpset) 1);
   136 by (fast_tac (HOL_cs addDs [W_var_geD] addIs
   136 by (fast_tac (HOL_cs addDs [W_var_geD] addIs
   137      [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le]
   137      [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le]
   138      addss (!simpset)) 1);
   138      addss (!simpset)) 1);
   139 (* 41: case LET e1 e2 *)
   139 (* 41: case LET e1 e2 *)
   140 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   140 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
   141 by (strip_tac 1);
   141 by (strip_tac 1);
   142 by(EVERY1[etac allE,etac allE,etac allE,etac allE,etac allE,mp_tac,mp_tac]);
   142 by(EVERY1[etac allE,etac allE,etac allE,etac allE,etac allE,mp_tac,mp_tac]);
   143 by (etac conjE 1);
   143 by (etac conjE 1);
   144 by(EVERY[etac allE 1,etac allE 1,etac allE 1,etac allE 1,etac allE 1,
   144 by(EVERY[etac allE 1,etac allE 1,etac allE 1,etac allE 1,etac allE 1,
   145          etac impE 1, mp_tac 2]);
   145          etac impE 1, mp_tac 2]);
   176      "!n A S t m v. W e A n = Some (S,t,m) -->            \
   176      "!n A S t m v. W e A n = Some (S,t,m) -->            \
   177 \         (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A";
   177 \         (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A";
   178 by (expr.induct_tac "e" 1);
   178 by (expr.induct_tac "e" 1);
   179 (* case Var n *)
   179 (* case Var n *)
   180 by (simp_tac (!simpset addsimps
   180 by (simp_tac (!simpset addsimps
   181     [free_tv_subst] addsplits [expand_option_bind,expand_if]) 1);
   181     [free_tv_subst] addsplits [split_option_bind,expand_if]) 1);
   182 by (strip_tac 1);
   182 by (strip_tac 1);
   183 by (case_tac "v : free_tv (nth nat A)" 1);
   183 by (case_tac "v : free_tv (nth nat A)" 1);
   184 by (Asm_full_simp_tac 1);
   184 by (Asm_full_simp_tac 1);
   185 by (dtac free_tv_bound_typ_inst1 1);
   185 by (dtac free_tv_bound_typ_inst1 1);
   186 by (simp_tac (!simpset addsimps [o_def]) 1);
   186 by (simp_tac (!simpset addsimps [o_def]) 1);
   187 by (etac exE 1);
   187 by (etac exE 1);
   188 by (rotate_tac 3 1);
   188 by (rotate_tac 3 1);
   189 by (Asm_full_simp_tac 1);
   189 by (Asm_full_simp_tac 1);
   190 (* case Abs e *)
   190 (* case Abs e *)
   191 by (asm_full_simp_tac (!simpset addsimps
   191 by (asm_full_simp_tac (!simpset addsimps
   192     [free_tv_subst] addsplits [expand_option_bind] delsimps all_simps) 1);
   192     [free_tv_subst] addsplits [split_option_bind] delsimps all_simps) 1);
   193 by (strip_tac 1);
   193 by (strip_tac 1);
   194 by (rename_tac "S t n1 S1 t1 m v" 1);
   194 by (rename_tac "S t n1 S1 t1 m v" 1);
   195 by (eres_inst_tac [("x","Suc n")] allE 1);
   195 by (eres_inst_tac [("x","Suc n")] allE 1);
   196 by (eres_inst_tac [("x","FVar n # A")] allE 1);
   196 by (eres_inst_tac [("x","FVar n # A")] allE 1);
   197 by (eres_inst_tac [("x","S")] allE 1);
   197 by (eres_inst_tac [("x","S")] allE 1);
   199 by (eres_inst_tac [("x","n1")] allE 1);
   199 by (eres_inst_tac [("x","n1")] allE 1);
   200 by (eres_inst_tac [("x","v")] allE 1);
   200 by (eres_inst_tac [("x","v")] allE 1);
   201 by (best_tac (HOL_cs addIs [cod_app_subst]
   201 by (best_tac (HOL_cs addIs [cod_app_subst]
   202                      addss (!simpset addsimps [less_Suc_eq])) 1);
   202                      addss (!simpset addsimps [less_Suc_eq])) 1);
   203 (* case App e1 e2 *)
   203 (* case App e1 e2 *)
   204 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1);
   204 by (simp_tac (!simpset addsplits [split_option_bind] delsimps all_simps) 1);
   205 by (strip_tac 1); 
   205 by (strip_tac 1); 
   206 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1);
   206 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1);
   207 by (eres_inst_tac [("x","n")] allE 1);
   207 by (eres_inst_tac [("x","n")] allE 1);
   208 by (eres_inst_tac [("x","A")] allE 1);
   208 by (eres_inst_tac [("x","A")] allE 1);
   209 by (eres_inst_tac [("x","S")] allE 1);
   209 by (eres_inst_tac [("x","S")] allE 1);
   235     free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD,
   235     free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD,
   236     less_le_trans,subsetD]
   236     less_le_trans,subsetD]
   237   addEs [UnE]
   237   addEs [UnE]
   238   addss !simpset) 1);
   238   addss !simpset) 1);
   239 (* LET e1 e2 *)
   239 (* LET e1 e2 *)
   240 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1);
   240 by (simp_tac (!simpset addsplits [split_option_bind] delsimps all_simps) 1);
   241 by (strip_tac 1); 
   241 by (strip_tac 1); 
   242 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1);
   242 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1);
   243 by (eres_inst_tac [("x","nat")] allE 1);
   243 by (eres_inst_tac [("x","nat")] allE 1);
   244 by (eres_inst_tac [("x","A")] allE 1);
   244 by (eres_inst_tac [("x","A")] allE 1);
   245 by (eres_inst_tac [("x","S1")] allE 1);
   245 by (eres_inst_tac [("x","S1")] allE 1);
   279 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   279 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1);
   280 by (rtac exI 1);
   280 by (rtac exI 1);
   281 by (rtac refl 1);
   281 by (rtac refl 1);
   282 (* case Abs e *)
   282 (* case Abs e *)
   283 by (asm_full_simp_tac (!simpset addsimps [app_subst_list]
   283 by (asm_full_simp_tac (!simpset addsimps [app_subst_list]
   284                         addsplits [expand_option_bind]) 1);
   284                         addsplits [split_option_bind]) 1);
   285 by (strip_tac 1);
   285 by (strip_tac 1);
   286 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1);
   286 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1);
   287 by (Asm_full_simp_tac 1);
   287 by (Asm_full_simp_tac 1);
   288 by (rtac has_type.AbsI 1);
   288 by (rtac has_type.AbsI 1);
   289 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1);
   289 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1);
   292 by (etac impE 1);
   292 by (etac impE 1);
   293 by (mp_tac 2);
   293 by (mp_tac 2);
   294 by (Asm_simp_tac 1);
   294 by (Asm_simp_tac 1);
   295 by (assume_tac 1);
   295 by (assume_tac 1);
   296 (* case App e1 e2 *)
   296 (* case App e1 e2 *)
   297 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   297 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
   298 by (strip_tac 1);
   298 by (strip_tac 1);
   299 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   299 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1);
   300 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1);
   300 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1);
   301 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1);
   301 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1);
   302 by (rtac (app_subst_Fun RS subst) 1);
   302 by (rtac (app_subst_Fun RS subst) 1);
   324 by (etac thin_rl 1);
   324 by (etac thin_rl 1);
   325 by (mp_tac 1);
   325 by (mp_tac 1);
   326 by (mp_tac 1);
   326 by (mp_tac 1);
   327 by (assume_tac 1);
   327 by (assume_tac 1);
   328 (* case Let e1 e2 *)
   328 (* case Let e1 e2 *)
   329 by (simp_tac (!simpset addsplits [expand_option_bind]) 1);
   329 by (simp_tac (!simpset addsplits [split_option_bind]) 1);
   330 by (strip_tac 1);
   330 by (strip_tac 1);
   331 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); 
   331 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); 
   332 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1);
   332 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1);
   333 by (simp_tac (!simpset addsimps [o_def]) 1);
   333 by (simp_tac (!simpset addsimps [o_def]) 1);
   334 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1);
   334 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1);
   422 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   422 by (eres_inst_tac [("x","(FVar n)#A")] allE 1);
   423 by (eres_inst_tac [("x","t2")] allE 1);
   423 by (eres_inst_tac [("x","t2")] allE 1);
   424 by (eres_inst_tac [("x","Suc n")] allE 1);
   424 by (eres_inst_tac [("x","Suc n")] allE 1);
   425 by (best_tac (HOL_cs addSDs [mk_scheme_injective] 
   425 by (best_tac (HOL_cs addSDs [mk_scheme_injective] 
   426                   addss (!simpset addcongs [conj_cong] 
   426                   addss (!simpset addcongs [conj_cong] 
   427                                 addsplits [expand_option_bind])) 1);
   427                                 addsplits [split_option_bind])) 1);
   428 (** LEVEL 19 **)
   428 (** LEVEL 19 **)
   429 
   429 
   430 (* case App e1 e2 *)
   430 (* case App e1 e2 *)
   431 by (strip_tac 1);
   431 by (strip_tac 1);
   432 by (eresolve_tac has_type_casesE 1);
   432 by (eresolve_tac has_type_casesE 1);
   502 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   502 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2);
   503 by (dtac eq_subst_scheme_list_eq_free 2);
   503 by (dtac eq_subst_scheme_list_eq_free 2);
   504 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   504 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2);
   505 (** LEVEL 75 **)
   505 (** LEVEL 75 **)
   506 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2);
   506 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2);
   507 by (asm_simp_tac (!simpset addsplits [expand_option_bind]) 1); 
   507 by (asm_simp_tac (!simpset addsplits [split_option_bind]) 1); 
   508 by (safe_tac HOL_cs );
   508 by (safe_tac HOL_cs );
   509 by (dtac mgu_Some 1);
   509 by (dtac mgu_Some 1);
   510 by ( fast_tac (HOL_cs addss !simpset) 1);
   510 by ( fast_tac (HOL_cs addss !simpset) 1);
   511 (** LEVEL 80 *)
   511 (** LEVEL 80 *)
   512 by ((dtac mgu_mg 1) THEN (atac 1));
   512 by ((dtac mgu_mg 1) THEN (atac 1));