17 (fn _ => [simp_tac raw_subst_ss 1]) |
17 (fn _ => [simp_tac raw_subst_ss 1]) |
18 in val subst_rews = map mk_thm |
18 in val subst_rews = map mk_thm |
19 ["Const(c) <| al = Const(c)", |
19 ["Const(c) <| al = Const(c)", |
20 "Comb(t,u) <| al = Comb(t <| al, u <| al)", |
20 "Comb(t,u) <| al = Comb(t <| al, u <| al)", |
21 "Nil <> bl = bl", |
21 "Nil <> bl = bl", |
22 "Cons(<a,b>,al) <> bl = Cons(<a,b <| bl>, al <> bl)", |
22 "<a,b>#al <> bl = <a,b <| bl> # (al <> bl)", |
23 "sdom(Nil) = {}", |
23 "sdom(Nil) = {}", |
24 "sdom(Cons(<a,b>,al)) = if(Var(a)=b,sdom(al) Int Compl({a}),sdom(al) Un {a})" |
24 "sdom(<a,b>#al) = if(Var(a)=b,sdom(al) Int Compl({a}),sdom(al) Un {a})" |
25 ]; |
25 ]; |
26 (* This rewrite isn't always desired *) |
26 (* This rewrite isn't always desired *) |
27 val Var_subst = mk_thm "Var(x) <| al = assoc(x,Var(x),al)"; |
27 val Var_subst = mk_thm "Var(x) <| al = assoc(x,Var(x),al)"; |
28 end; |
28 end; |
29 |
29 |
39 goal Subst.thy "t <: u --> t <| s <: u <| s"; |
39 goal Subst.thy "t <: u --> t <| s <: u <| s"; |
40 by (uterm_ind_tac "u" 1); |
40 by (uterm_ind_tac "u" 1); |
41 by (ALLGOALS (asm_simp_tac subst_ss)); |
41 by (ALLGOALS (asm_simp_tac subst_ss)); |
42 val subst_mono = result() RS mp; |
42 val subst_mono = result() RS mp; |
43 |
43 |
44 goal Subst.thy "~ (Var(v) <: t) --> t <| Cons(<v,t <| s>,s) = t <| s"; |
44 goal Subst.thy "~ (Var(v) <: t) --> t <| <v,t <| s>#s = t <| s"; |
45 by (imp_excluded_middle_tac "t = Var(v)" 1); |
45 by (imp_excluded_middle_tac "t = Var(v)" 1); |
46 by (res_inst_tac [("P", |
46 by (res_inst_tac [("P", |
47 "%x.~x=Var(v) --> ~(Var(v) <: x) --> x <| Cons(<v,t<|s>,s)=x<|s")] |
47 "%x.~x=Var(v) --> ~(Var(v) <: x) --> x <| <v,t<|s>#s=x<|s")] |
48 uterm_induct 2); |
48 uterm_induct 2); |
49 by (ALLGOALS (simp_tac (subst_ss addsimps [Var_subst]))); |
49 by (ALLGOALS (simp_tac (subst_ss addsimps [Var_subst]))); |
50 by (fast_tac HOL_cs 1); |
50 by (fast_tac HOL_cs 1); |
51 val Var_not_occs = result() RS mp; |
51 val Var_not_occs = result() RS mp; |
52 |
52 |
56 by (REPEAT (etac rev_mp 3)); |
56 by (REPEAT (etac rev_mp 3)); |
57 by (ALLGOALS (asm_simp_tac subst_ss)); |
57 by (ALLGOALS (asm_simp_tac subst_ss)); |
58 by (ALLGOALS (fast_tac HOL_cs)); |
58 by (ALLGOALS (fast_tac HOL_cs)); |
59 val agreement = result(); |
59 val agreement = result(); |
60 |
60 |
61 goal Subst.thy "~ v: vars_of(t) --> t <| Cons(<v,u>,s) = t <| s"; |
61 goal Subst.thy "~ v: vars_of(t) --> t <| <v,u>#s = t <| s"; |
62 by(simp_tac(subst_ss addsimps [agreement,Var_subst] |
62 by(simp_tac(subst_ss addsimps [agreement,Var_subst] |
63 setloop (split_tac [expand_if])) 1); |
63 setloop (split_tac [expand_if])) 1); |
64 val repl_invariance = result() RS mp; |
64 val repl_invariance = result() RS mp; |
65 |
65 |
66 val asms = goal Subst.thy |
66 val asms = goal Subst.thy |
67 "v : vars_of(t) --> w : vars_of(t <| Cons(<v,Var(w)>,s))"; |
67 "v : vars_of(t) --> w : vars_of(t <| <v,Var(w)>#s)"; |
68 by (uterm_ind_tac "t" 1); |
68 by (uterm_ind_tac "t" 1); |
69 by (ALLGOALS (asm_simp_tac (subst_ss addsimps [Var_subst]))); |
69 by (ALLGOALS (asm_simp_tac (subst_ss addsimps [Var_subst]))); |
70 val Var_in_subst = result() RS mp; |
70 val Var_in_subst = result() RS mp; |
71 |
71 |
72 (**** Equality between Substitutions ****) |
72 (**** Equality between Substitutions ****) |
110 |
110 |
111 goal Subst.thy "q <> r <> s =s= q <> (r <> s)"; |
111 goal Subst.thy "q <> r <> s =s= q <> (r <> s)"; |
112 by (simp_tac (subst_ss addsimps [subst_eq_iff,subst_comp]) 1); |
112 by (simp_tac (subst_ss addsimps [subst_eq_iff,subst_comp]) 1); |
113 val comp_assoc = result(); |
113 val comp_assoc = result(); |
114 |
114 |
115 goal Subst.thy "Cons(<w,Var(w) <| s>,s) =s= s"; |
115 goal Subst.thy "<w,Var(w) <| s>#s =s= s"; |
116 by (rtac (allI RS (subst_eq_iff RS iffD2)) 1); |
116 by (rtac (allI RS (subst_eq_iff RS iffD2)) 1); |
117 by (uterm_ind_tac "t" 1); |
117 by (uterm_ind_tac "t" 1); |
118 by (REPEAT (etac rev_mp 3)); |
118 by (REPEAT (etac rev_mp 3)); |
119 by (ALLGOALS (simp_tac (subst_ss addsimps[Var_subst] |
119 by (ALLGOALS (simp_tac (subst_ss addsimps[Var_subst] |
120 setloop (split_tac [expand_if])))); |
120 setloop (split_tac [expand_if])))); |