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); |
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); |