src/HOL/MiniML/Generalize.ML
changeset 4089 96fba19bcbe2
parent 3919 c036caebfc75
child 4153 e534c4c32d54
equal deleted inserted replaced
4088:9be9e39fd862 4089:96fba19bcbe2
    43 
    43 
    44 goal thy "!!A. bound_tv (gen A t1) = (free_tv t1) - (free_tv A)";
    44 goal thy "!!A. bound_tv (gen A t1) = (free_tv t1) - (free_tv A)";
    45 by (typ.induct_tac "t1" 1);
    45 by (typ.induct_tac "t1" 1);
    46 by (Simp_tac 1);
    46 by (Simp_tac 1);
    47 by (case_tac "nat : free_tv A" 1);
    47 by (case_tac "nat : free_tv A" 1);
    48 by (asm_simp_tac (!simpset addsplits [expand_if]) 1);
    48 by (asm_simp_tac (simpset() addsplits [expand_if]) 1);
    49 by (asm_simp_tac (!simpset addsplits [expand_if]) 1);
    49 by (asm_simp_tac (simpset() addsplits [expand_if]) 1);
    50 by (Fast_tac 1);
    50 by (Fast_tac 1);
    51 by (Asm_simp_tac 1);
    51 by (Asm_simp_tac 1);
    52 by (Fast_tac 1);
    52 by (Fast_tac 1);
    53 qed "bound_tv_gen";
    53 qed "bound_tv_gen";
    54 
    54 
    63 by (Asm_full_simp_tac 1);
    63 by (Asm_full_simp_tac 1);
    64 qed_spec_mp "new_tv_compatible_gen";
    64 qed_spec_mp "new_tv_compatible_gen";
    65 
    65 
    66 goalw thy [gen_ML_def] "!!A. gen A t = gen_ML A t";
    66 goalw thy [gen_ML_def] "!!A. gen A t = gen_ML A t";
    67 by (typ.induct_tac "t" 1);
    67 by (typ.induct_tac "t" 1);
    68 by (simp_tac (!simpset addsimps [free_tv_ML_scheme_list]) 1);
    68 by (simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1);
    69 by (asm_simp_tac (!simpset addsimps [free_tv_ML_scheme_list]) 1);
    69 by (asm_simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1);
    70 qed "gen_eq_gen_ML";
    70 qed "gen_eq_gen_ML";
    71 
    71 
    72 goal thy "!!S. (free_tv S) Int ((free_tv t) - (free_tv A)) = {} \
    72 goal thy "!!S. (free_tv S) Int ((free_tv t) - (free_tv A)) = {} \
    73 \          --> gen ($ S A) ($ S t) = $ S (gen A t)";
    73 \          --> gen ($ S A) ($ S t) = $ S (gen A t)";
    74 by (typ.induct_tac "t" 1);
    74 by (typ.induct_tac "t" 1);
    76 by (case_tac "nat:(free_tv A)" 1);
    76 by (case_tac "nat:(free_tv A)" 1);
    77 by (Asm_simp_tac 1);
    77 by (Asm_simp_tac 1);
    78 by (Asm_full_simp_tac 1);
    78 by (Asm_full_simp_tac 1);
    79 by (subgoal_tac "nat ~: free_tv S" 1);
    79 by (subgoal_tac "nat ~: free_tv S" 1);
    80 by (Fast_tac 2);
    80 by (Fast_tac 2);
    81 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def,de_Morgan_disj]) 1);
    81 by (asm_full_simp_tac (simpset() addsimps [free_tv_subst,dom_def,de_Morgan_disj]) 1);
    82 by (split_tac [expand_if] 1);
    82 by (split_tac [expand_if] 1);
    83 by (cut_facts_tac [free_tv_app_subst_scheme_list] 1);
    83 by (cut_facts_tac [free_tv_app_subst_scheme_list] 1);
    84 by (Fast_tac 1);
    84 by (Fast_tac 1);
    85 by (Asm_simp_tac 1);
    85 by (Asm_simp_tac 1);
    86 by (Best_tac 1);
    86 by (Best_tac 1);
    93 qed_spec_mp "bound_typ_inst_gen";
    93 qed_spec_mp "bound_typ_inst_gen";
    94 Addsimps [bound_typ_inst_gen];
    94 Addsimps [bound_typ_inst_gen];
    95 
    95 
    96 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance]
    96 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance]
    97   "gen ($ S A) ($ S t) <= $ S (gen A t)";
    97   "gen ($ S A) ($ S t) <= $ S (gen A t)";
    98 by (safe_tac (!claset));
    98 by (safe_tac (claset()));
    99 by (rename_tac "R" 1);
    99 by (rename_tac "R" 1);
   100 by (res_inst_tac [("x", "(%a. bound_typ_inst R (gen ($S A) (S a)))")] exI 1);
   100 by (res_inst_tac [("x", "(%a. bound_typ_inst R (gen ($S A) (S a)))")] exI 1);
   101 by (typ.induct_tac "t" 1);
   101 by (typ.induct_tac "t" 1);
   102  by (simp_tac (!simpset addsplits [expand_if]) 1);
   102  by (simp_tac (simpset() addsplits [expand_if]) 1);
   103 by (Asm_simp_tac 1);
   103 by (Asm_simp_tac 1);
   104 qed "gen_bound_typ_instance";
   104 qed "gen_bound_typ_instance";
   105 
   105 
   106 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance]
   106 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance]
   107   "!!A B. free_tv B <= free_tv A ==> gen A t <= gen B t";
   107   "!!A B. free_tv B <= free_tv A ==> gen A t <= gen B t";
   108 by (safe_tac (!claset));
   108 by (safe_tac (claset()));
   109 by (rename_tac "S" 1);
   109 by (rename_tac "S" 1);
   110 by (res_inst_tac [("x","%b. if b:free_tv A then TVar b else S b")] exI 1);
   110 by (res_inst_tac [("x","%b. if b:free_tv A then TVar b else S b")] exI 1);
   111 by (typ.induct_tac "t" 1);
   111 by (typ.induct_tac "t" 1);
   112  by (asm_simp_tac (!simpset addsplits [expand_if]) 1);
   112  by (asm_simp_tac (simpset() addsplits [expand_if]) 1);
   113  by (Fast_tac 1);
   113  by (Fast_tac 1);
   114 by (Asm_simp_tac 1);
   114 by (Asm_simp_tac 1);
   115 qed "free_tv_subset_gen_le";
   115 qed "free_tv_subset_gen_le";
   116 
   116 
   117 goalw thy [le_type_scheme_def,is_bound_typ_instance] 
   117 goalw thy [le_type_scheme_def,is_bound_typ_instance] 
   121 by (hyp_subst_tac 1);
   121 by (hyp_subst_tac 1);
   122 by (res_inst_tac [("x","(%x. S (if n <= x then x - n else x))")] exI 1);
   122 by (res_inst_tac [("x","(%x. S (if n <= x then x - n else x))")] exI 1);
   123 by (typ.induct_tac "t" 1);
   123 by (typ.induct_tac "t" 1);
   124 by (Simp_tac 1);
   124 by (Simp_tac 1);
   125 by (case_tac "nat : free_tv A" 1);
   125 by (case_tac "nat : free_tv A" 1);
   126 by (asm_simp_tac (!simpset addsplits [expand_if]) 1);
   126 by (asm_simp_tac (simpset() addsplits [expand_if]) 1);
   127 by (asm_simp_tac (!simpset addsplits [expand_if]) 1);
   127 by (asm_simp_tac (simpset() addsplits [expand_if]) 1);
   128 by (subgoal_tac "n <= n + nat" 1);
   128 by (subgoal_tac "n <= n + nat" 1);
   129 by (forw_inst_tac [("t","A")] new_tv_le 1);
   129 by (forw_inst_tac [("t","A")] new_tv_le 1);
   130 by (assume_tac 1);
   130 by (assume_tac 1);
   131 by (dtac new_tv_not_free_tv 1);
   131 by (dtac new_tv_not_free_tv 1);
   132 by (dtac new_tv_not_free_tv 1);
   132 by (dtac new_tv_not_free_tv 1);
   133 by (asm_simp_tac (!simpset addsimps [diff_add_inverse]) 1);
   133 by (asm_simp_tac (simpset() addsimps [diff_add_inverse]) 1);
   134 by (simp_tac (!simpset addsimps [le_add1]) 1);
   134 by (simp_tac (simpset() addsimps [le_add1]) 1);
   135 by (Asm_simp_tac 1);
   135 by (Asm_simp_tac 1);
   136 qed_spec_mp "gen_t_le_gen_alpha_t";
   136 qed_spec_mp "gen_t_le_gen_alpha_t";
   137 
   137 
   138 Addsimps [gen_t_le_gen_alpha_t];
   138 Addsimps [gen_t_le_gen_alpha_t];