src/HOL/W0/Type.ML
changeset 5148 74919e8f221c
parent 5069 3ea049f7979d
child 5184 9b8547a9496a
equal deleted inserted replaced
5147:825877190618 5148:74919e8f221c
     6 
     6 
     7 Addsimps [mgu_eq,mgu_mg,mgu_free];
     7 Addsimps [mgu_eq,mgu_mg,mgu_free];
     8 
     8 
     9 (* mgu does not introduce new type variables *)
     9 (* mgu does not introduce new type variables *)
    10 Goalw [new_tv_def] 
    10 Goalw [new_tv_def] 
    11       "!! n. [|mgu t1 t2 = Ok u; new_tv n t1; new_tv n t2|] ==> \
    11       "[|mgu t1 t2 = Ok u; new_tv n t1; new_tv n t2|] ==> \
    12 \            new_tv n u";
    12 \            new_tv n u";
    13 by (fast_tac (set_cs addDs [mgu_free]) 1);
    13 by (fast_tac (set_cs addDs [mgu_free]) 1);
    14 qed "mgu_new";
    14 qed "mgu_new";
    15 
    15 
    16 (* application of id_subst does not change type expression *)
    16 (* application of id_subst does not change type expression *)
    54 by (Simp_tac 1);
    54 by (Simp_tac 1);
    55 qed "free_tv_id_subst";
    55 qed "free_tv_id_subst";
    56 Addsimps [free_tv_id_subst];
    56 Addsimps [free_tv_id_subst];
    57 
    57 
    58 Goalw [dom_def,cod_def,UNION_def,Bex_def]
    58 Goalw [dom_def,cod_def,UNION_def,Bex_def]
    59   "!!v. [| v : free_tv(s n); v~=n |] ==> v : cod s";
    59   "[| v : free_tv(s n); v~=n |] ==> v : cod s";
    60 by (Simp_tac 1);
    60 by (Simp_tac 1);
    61 by (safe_tac (empty_cs addSIs [exI,conjI,notI]));
    61 by (safe_tac (empty_cs addSIs [exI,conjI,notI]));
    62 by (assume_tac 2);
    62 by (assume_tac 2);
    63 by (rotate_tac 1 1);
    63 by (rotate_tac 1 1);
    64 by (Asm_full_simp_tac 1);
    64 by (Asm_full_simp_tac 1);
   188 by (fast_tac (HOL_cs addIs [new_tv_le] addss simpset()) 1);
   188 by (fast_tac (HOL_cs addIs [new_tv_le] addss simpset()) 1);
   189 qed_spec_mp "new_tv_list_le";
   189 qed_spec_mp "new_tv_list_le";
   190 Addsimps [lessI RS less_imp_le RS new_tv_list_le];
   190 Addsimps [lessI RS less_imp_le RS new_tv_list_le];
   191 
   191 
   192 Goal
   192 Goal
   193   "!! n. [| n<=m; new_tv n (s::subst) |] ==> new_tv m s";
   193   "[| n<=m; new_tv n (s::subst) |] ==> new_tv m s";
   194 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   194 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   195 by (rtac conjI 1);
   195 by (rtac conjI 1);
   196 by (slow_tac (HOL_cs addIs [le_trans]) 1);
   196 by (slow_tac (HOL_cs addIs [le_trans]) 1);
   197 by (safe_tac HOL_cs );
   197 by (safe_tac HOL_cs );
   198 by (res_inst_tac [("P","l < n"),("Q","n <= l")] disjE 1);
   198 by (res_inst_tac [("P","l < n"),("Q","n <= l")] disjE 1);
   201 qed "new_tv_subst_le";
   201 qed "new_tv_subst_le";
   202 Addsimps [lessI RS less_imp_le RS new_tv_subst_le];
   202 Addsimps [lessI RS less_imp_le RS new_tv_subst_le];
   203 
   203 
   204 (* new_tv property remains if a substitution is applied *)
   204 (* new_tv property remains if a substitution is applied *)
   205 Goal
   205 Goal
   206   "!!n. [| n<m; new_tv m (s::subst) |] ==> new_tv m (s n)";
   206   "[| n<m; new_tv m (s::subst) |] ==> new_tv m (s n)";
   207 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   207 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   208 qed "new_tv_subst_var";
   208 qed "new_tv_subst_var";
   209 
   209 
   210 Goal
   210 Goal
   211   "new_tv n s --> new_tv n (t::typ) --> new_tv n ($ s t)";
   211   "new_tv n s --> new_tv n (t::typ) --> new_tv n ($ s t)";
   231 qed "new_tv_Suc_list";
   231 qed "new_tv_Suc_list";
   232 
   232 
   233 
   233 
   234 (* composition of substitutions preserves new_tv proposition *)
   234 (* composition of substitutions preserves new_tv proposition *)
   235 Goal 
   235 Goal 
   236      "!! n. [| new_tv n (s::subst); new_tv n r |] ==> \
   236      "[| new_tv n (s::subst); new_tv n r |] ==> \
   237 \           new_tv n (($ r) o s)";
   237 \           new_tv n (($ r) o s)";
   238 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   238 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   239 qed "new_tv_subst_comp_1";
   239 qed "new_tv_subst_comp_1";
   240 
   240 
   241 Goal
   241 Goal
   242      "!! n. [| new_tv n (s::subst); new_tv n r |] ==>  \ 
   242      "[| new_tv n (s::subst); new_tv n r |] ==>  \ 
   243 \     new_tv n (%v.$ r (s v))";
   243 \     new_tv n (%v.$ r (s v))";
   244 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   244 by (asm_full_simp_tac (simpset() addsimps [new_tv_subst]) 1);
   245 qed "new_tv_subst_comp_2";
   245 qed "new_tv_subst_comp_2";
   246 
   246 
   247 Addsimps [new_tv_subst_comp_1,new_tv_subst_comp_2];
   247 Addsimps [new_tv_subst_comp_1,new_tv_subst_comp_2];
   248 
   248 
   249 (* new type variables do not occur freely in a type structure *)
   249 (* new type variables do not occur freely in a type structure *)
   250 Goalw [new_tv_def] 
   250 Goalw [new_tv_def] 
   251       "!!n. new_tv n ts ==> n~:(free_tv ts)";
   251       "new_tv n ts ==> n~:(free_tv ts)";
   252 by (fast_tac (HOL_cs addEs [less_irrefl]) 1);
   252 by (fast_tac (HOL_cs addEs [less_irrefl]) 1);
   253 qed "new_tv_not_free_tv";
   253 qed "new_tv_not_free_tv";
   254 Addsimps [new_tv_not_free_tv];
   254 Addsimps [new_tv_not_free_tv];
   255 
   255 
   256 Goal
   256 Goal
   283 by (fast_tac (HOL_cs addss simpset()) 1);
   283 by (fast_tac (HOL_cs addss simpset()) 1);
   284 (* case Fun t1 t2 *)
   284 (* case Fun t1 t2 *)
   285 by (fast_tac (HOL_cs addss simpset()) 1);
   285 by (fast_tac (HOL_cs addss simpset()) 1);
   286 qed_spec_mp "eq_free_eq_subst_te";
   286 qed_spec_mp "eq_free_eq_subst_te";
   287 
   287 
   288 Goal
   288 Goal "$s1 (ts::typ list) = $s2 ts --> n:(free_tv ts) --> s1 n = s2 n";
   289   "$s1 (ts::typ list) = $s2 ts --> n:(free_tv ts) --> s1 n = s2 n";
       
   290 by (list.induct_tac "ts" 1);
   289 by (list.induct_tac "ts" 1);
   291 (* case [] *)
   290 (* case [] *)
   292 by (fast_tac (HOL_cs addss simpset()) 1);
   291 by (fast_tac (HOL_cs addss simpset()) 1);
   293 (* case x#xl *)
   292 (* case x#xl *)
   294 by (fast_tac (HOL_cs addIs [eq_subst_te_eq_free] addss (simpset())) 1);
   293 by (fast_tac (HOL_cs addIs [eq_subst_te_eq_free] addss (simpset())) 1);
   295 qed_spec_mp "eq_subst_tel_eq_free";
   294 qed_spec_mp "eq_subst_tel_eq_free";
   296 
   295 
   297 Goal
   296 Goal "(!n. n:(free_tv ts) --> s1 n = s2 n) --> $s1 (ts::typ list) = $s2 ts";
   298   "(!n. n:(free_tv ts) --> s1 n = s2 n) --> $s1 (ts::typ list) = $s2 ts";
       
   299 by (list.induct_tac "ts" 1); 
   297 by (list.induct_tac "ts" 1); 
   300 (* case [] *)
   298 (* case [] *)
   301 by (fast_tac (HOL_cs addss simpset()) 1);
   299 by (fast_tac (HOL_cs addss simpset()) 1);
   302 (* case x#xl *)
   300 (* case x#xl *)
   303 by (fast_tac (HOL_cs addIs [eq_free_eq_subst_te] addss (simpset())) 1);
   301 by (fast_tac (HOL_cs addIs [eq_free_eq_subst_te] addss (simpset())) 1);
   304 qed_spec_mp "eq_free_eq_subst_tel";
   302 qed_spec_mp "eq_free_eq_subst_tel";
   305 
   303 
   306 (* some useful theorems *)
   304 (* some useful theorems *)
   307 Goalw [free_tv_subst] 
   305 Goalw [free_tv_subst] 
   308       "!!v. v : cod s ==> v : free_tv s";
   306       "v : cod s ==> v : free_tv s";
   309 by (fast_tac set_cs 1);
   307 by (fast_tac set_cs 1);
   310 qed "codD";
   308 qed "codD";
   311  
   309  
   312 Goalw [free_tv_subst,dom_def] 
   310 Goalw [free_tv_subst,dom_def] 
   313       "!! x. x ~: free_tv s ==> s x = TVar x";
   311       "x ~: free_tv s ==> s x = TVar x";
   314 by (fast_tac set_cs 1);
   312 by (fast_tac set_cs 1);
   315 qed "not_free_impl_id";
   313 qed "not_free_impl_id";
   316 
   314 
   317 Goalw [new_tv_def] 
   315 Goalw [new_tv_def] "[| new_tv n t; m:free_tv t |] ==> m<n";
   318       "!! n. [| new_tv n t; m:free_tv t |] ==> m<n";
       
   319 by (fast_tac HOL_cs 1 );
   316 by (fast_tac HOL_cs 1 );
   320 qed "free_tv_le_new_tv";
   317 qed "free_tv_le_new_tv";
   321 
   318 
   322 Goal
   319 Goal "free_tv (s (v::nat)) <= insert v (cod s)";
   323      "free_tv (s (v::nat)) <= insert v (cod s)";
       
   324 by (expand_case_tac "v:dom s" 1);
   320 by (expand_case_tac "v:dom s" 1);
   325 by (fast_tac (set_cs addss (simpset() addsimps [cod_def])) 1);
   321 by (fast_tac (set_cs addss (simpset() addsimps [cod_def])) 1);
   326 by (fast_tac (set_cs addss (simpset() addsimps [dom_def])) 1);
   322 by (fast_tac (set_cs addss (simpset() addsimps [dom_def])) 1);
   327 qed "free_tv_subst_var";
   323 qed "free_tv_subst_var";
   328 
   324 
   329 Goal 
   325 Goal "free_tv ($ s (t::typ)) <= cod s Un free_tv t";
   330      "free_tv ($ s (t::typ)) <= cod s Un free_tv t";
       
   331 by (typ.induct_tac "t" 1);
   326 by (typ.induct_tac "t" 1);
   332 (* case TVar n *)
   327 (* case TVar n *)
   333 by (simp_tac (simpset() addsimps [free_tv_subst_var]) 1);
   328 by (simp_tac (simpset() addsimps [free_tv_subst_var]) 1);
   334 (* case Fun t1 t2 *)
   329 (* case Fun t1 t2 *)
   335 by (fast_tac (set_cs addss simpset()) 1);
   330 by (fast_tac (set_cs addss simpset()) 1);
   336 qed "free_tv_app_subst_te";     
   331 qed "free_tv_app_subst_te";     
   337 
   332 
   338 Goal 
   333 Goal "free_tv ($ s (ts::typ list)) <= cod s Un free_tv ts";
   339      "free_tv ($ s (ts::typ list)) <= cod s Un free_tv ts";
       
   340 by (list.induct_tac "ts" 1);
   334 by (list.induct_tac "ts" 1);
   341 (* case [] *)
   335 (* case [] *)
   342 by (Simp_tac 1);
   336 by (Simp_tac 1);
   343 (* case a#al *)
   337 (* case a#al *)
   344 by (cut_facts_tac [free_tv_app_subst_te] 1);
   338 by (cut_facts_tac [free_tv_app_subst_te] 1);