1461
|
1 |
(* Title: Residuals.ML
|
1048
|
2 |
ID: $Id$
|
1461
|
3 |
Author: Ole Rasmussen
|
1048
|
4 |
Copyright 1995 University of Cambridge
|
|
5 |
Logic Image: ZF
|
|
6 |
*)
|
|
7 |
|
|
8 |
open Residuals;
|
|
9 |
|
|
10 |
(* ------------------------------------------------------------------------- *)
|
|
11 |
(* Setting up rule lists *)
|
|
12 |
(* ------------------------------------------------------------------------- *)
|
|
13 |
|
2469
|
14 |
AddIs (Sres.intrs@redexes.intrs@Sreg.intrs@
|
|
15 |
[subst_type]@nat_typechecks);
|
|
16 |
AddSEs (redexes.free_SEs @
|
|
17 |
(map (Sres.mk_cases redexes.con_defs)
|
|
18 |
["residuals(Var(n),Var(n),v)",
|
|
19 |
"residuals(Fun(t),Fun(u),v)",
|
|
20 |
"residuals(App(b, u1, u2), App(0, v1, v2),v)",
|
|
21 |
"residuals(App(b, u1, u2), App(1, Fun(v1), v2),v)",
|
|
22 |
"residuals(Var(n),u,v)",
|
|
23 |
"residuals(Fun(t),u,v)",
|
|
24 |
"residuals(App(b, u1, u2), w,v)",
|
|
25 |
"residuals(u,Var(n),v)",
|
|
26 |
"residuals(u,Fun(t),v)",
|
|
27 |
"residuals(w,App(b, u1, u2),v)"]) @
|
|
28 |
(map (Ssub.mk_cases redexes.con_defs)
|
|
29 |
["Var(n) <== u",
|
|
30 |
"Fun(n) <== u",
|
|
31 |
"u <== Fun(n)",
|
|
32 |
"App(1,Fun(t),a) <== u",
|
|
33 |
"App(0,t,a) <== u"]) @
|
|
34 |
[redexes.mk_cases redexes.con_defs "Fun(t):redexes"]);
|
1048
|
35 |
|
2469
|
36 |
Addsimps Sres.intrs;
|
1048
|
37 |
val resD1 =Sres.dom_subset RS subsetD RS SigmaD1;
|
|
38 |
val resD2 =Sres.dom_subset RS subsetD RS SigmaD2 RS SigmaD1;
|
|
39 |
val resD3 =Sres.dom_subset RS subsetD RS SigmaD2 RS SigmaD2;
|
|
40 |
|
|
41 |
|
|
42 |
(* ------------------------------------------------------------------------- *)
|
|
43 |
(* residuals is a partial function *)
|
|
44 |
(* ------------------------------------------------------------------------- *)
|
|
45 |
|
|
46 |
goal Residuals.thy
|
|
47 |
"!!u.residuals(u,v,w) ==> ALL w1.residuals(u,v,w1) --> w1 = w";
|
1732
|
48 |
by (etac Sres.induct 1);
|
2469
|
49 |
by (ALLGOALS Fast_tac);
|
1048
|
50 |
val residuals_function = result();
|
|
51 |
val res_is_func = residuals_function RS spec RS mp;
|
|
52 |
|
|
53 |
goal Residuals.thy
|
|
54 |
"!!u.u~v ==> regular(v) --> (EX w.residuals(u,v,w))";
|
1732
|
55 |
by (etac Scomp.induct 1);
|
2469
|
56 |
by (ALLGOALS Fast_tac);
|
1048
|
57 |
val residuals_intro = result();
|
|
58 |
|
|
59 |
val prems = goal Residuals.thy
|
|
60 |
"[|u~v; residuals(u,v,THE w. residuals(u, v, w))==> R; \
|
|
61 |
\ regular(v)|] ==> R";
|
|
62 |
by (cut_facts_tac prems 1);
|
|
63 |
by (resolve_tac prems 1);
|
|
64 |
by (resolve_tac [residuals_intro RS mp RS exE] 1);
|
|
65 |
by (resolve_tac [the_equality RS ssubst] 3);
|
2469
|
66 |
by (ALLGOALS (fast_tac (!claset addIs [res_is_func])));
|
1048
|
67 |
val comp_resfuncE = result();
|
|
68 |
|
|
69 |
|
|
70 |
(* ------------------------------------------------------------------------- *)
|
|
71 |
(* Residual function *)
|
|
72 |
(* ------------------------------------------------------------------------- *)
|
|
73 |
|
2469
|
74 |
val resfunc_cs = (!claset addIs [the_equality,res_is_func]
|
|
75 |
addSEs [comp_resfuncE]);
|
1048
|
76 |
|
|
77 |
goalw Residuals.thy [res_func_def]
|
|
78 |
"!!n.n:nat ==> Var(n) |> Var(n) = Var(n)";
|
|
79 |
by (fast_tac resfunc_cs 1);
|
|
80 |
val res_Var = result();
|
|
81 |
|
|
82 |
goalw Residuals.thy [res_func_def]
|
|
83 |
"!!n.[|s~t; regular(t)|]==> Fun(s) |> Fun(t) = Fun(s |> t)";
|
|
84 |
by (fast_tac resfunc_cs 1);
|
|
85 |
val res_Fun = result();
|
|
86 |
|
|
87 |
goalw Residuals.thy [res_func_def]
|
|
88 |
"!!n.[|s~u; regular(u); t~v; regular(v); b:bool|]==> \
|
|
89 |
\ App(b,s,t) |> App(0,u,v) = App(b, s |> u, t |> v)";
|
|
90 |
by (fast_tac resfunc_cs 1);
|
|
91 |
val res_App = result();
|
|
92 |
|
|
93 |
goalw Residuals.thy [res_func_def]
|
|
94 |
"!!n.[|s~u; regular(u); t~v; regular(v); b:bool|]==> \
|
|
95 |
\ App(b,Fun(s),t) |> App(1,Fun(u),v) = (t |> v)/ (s |> u)";
|
|
96 |
by (fast_tac resfunc_cs 1);
|
|
97 |
val res_redex = result();
|
|
98 |
|
|
99 |
goal Residuals.thy
|
|
100 |
"!!n.[|s~t; regular(t)|]==> regular(t) --> s |> t:redexes";
|
1732
|
101 |
by (etac Scomp.induct 1);
|
1048
|
102 |
by (ALLGOALS (asm_full_simp_tac
|
2469
|
103 |
(!simpset addsimps [res_Var,res_Fun,res_App,res_redex]
|
|
104 |
setloop (SELECT_GOAL (safe_tac (!claset))))));
|
1048
|
105 |
by (dres_inst_tac [("psi", "Fun(?u) |> ?v : redexes")] asm_rl 1);
|
|
106 |
by (asm_full_simp_tac
|
2469
|
107 |
(!simpset addsimps [res_Fun]
|
|
108 |
setloop (SELECT_GOAL (safe_tac (!claset)))) 1);
|
1048
|
109 |
val resfunc_type = result();
|
|
110 |
|
2469
|
111 |
Addsimps ([res_Var, res_Fun, res_App, res_redex, lift_rec_preserve_comp,
|
|
112 |
lift_rec_preserve_reg, subst_rec_preserve_comp, resfunc_type,
|
|
113 |
subst_rec_preserve_reg] @
|
|
114 |
redexes.free_iffs);
|
1048
|
115 |
|
2469
|
116 |
val res1L_ss = !simpset setloop (SELECT_GOAL (safe_tac (!claset)));
|
1048
|
117 |
|
|
118 |
(* ------------------------------------------------------------------------- *)
|
|
119 |
(* Commutation theorem *)
|
|
120 |
(* ------------------------------------------------------------------------- *)
|
|
121 |
|
|
122 |
goal Residuals.thy
|
|
123 |
"!!u.u<==v ==> u~v";
|
1732
|
124 |
by (etac Ssub.induct 1);
|
2469
|
125 |
by (ALLGOALS Asm_simp_tac);
|
1048
|
126 |
val sub_comp = result();
|
|
127 |
|
|
128 |
goal Residuals.thy
|
|
129 |
"!!u.u<==v ==> regular(v) --> regular(u)";
|
1732
|
130 |
by (etac Ssub.induct 1);
|
1048
|
131 |
by (ALLGOALS (asm_simp_tac res1L_ss));
|
|
132 |
val sub_preserve_reg = result();
|
|
133 |
|
|
134 |
goal Residuals.thy
|
|
135 |
"!!u.[|u~v; k:nat|]==> regular(v)--> (ALL n:nat. \
|
|
136 |
\ lift_rec(u,n) |> lift_rec(v,n) = lift_rec(u |> v,n))";
|
1732
|
137 |
by (etac Scomp.induct 1);
|
2469
|
138 |
by (Step_tac 1);
|
|
139 |
by (ALLGOALS (asm_full_simp_tac ((addsplit (!simpset)) addsimps [lift_subst])));
|
1048
|
140 |
by (dres_inst_tac [("psi", "ALL x:nat.Fun(?u(x)) |> ?v(x) = ?w(x)")] asm_rl 1);
|
2469
|
141 |
by (Asm_full_simp_tac 1);
|
1048
|
142 |
val residuals_lift_rec = result();
|
|
143 |
|
|
144 |
goal Residuals.thy
|
|
145 |
"!!u.u1~u2 ==> ALL v1 v2.v1~v2 --> regular(v2) --> regular(u2) -->\
|
|
146 |
\ (ALL n:nat.subst_rec(v1,u1,n) |> subst_rec(v2,u2,n) = \
|
|
147 |
\ subst_rec(v1 |> v2, u1 |> u2,n))";
|
1732
|
148 |
by (etac Scomp.induct 1);
|
2469
|
149 |
by (Step_tac 1);
|
1048
|
150 |
by (ALLGOALS
|
2469
|
151 |
(asm_full_simp_tac ((addsplit (!simpset)) addsimps ([residuals_lift_rec]))));
|
1048
|
152 |
by (dres_inst_tac [("psi", "ALL x.?P(x)")] asm_rl 1);
|
2469
|
153 |
by (asm_full_simp_tac (!simpset addsimps ([substitution])) 1);
|
1048
|
154 |
val residuals_subst_rec = result();
|
|
155 |
|
|
156 |
|
|
157 |
goal Residuals.thy
|
|
158 |
"!!u.[|u1~u2; v1~v2; regular(u2); regular(v2)|]==>\
|
|
159 |
\ (v1/u1) |> (v2/u2) = (v1 |> v2)/(u1 |> u2)";
|
2469
|
160 |
by (asm_simp_tac (!simpset addsimps ([residuals_subst_rec])) 1);
|
1048
|
161 |
val commutation = result();
|
|
162 |
|
|
163 |
(* ------------------------------------------------------------------------- *)
|
|
164 |
(* Residuals are comp and regular *)
|
|
165 |
(* ------------------------------------------------------------------------- *)
|
|
166 |
|
|
167 |
goal Residuals.thy
|
|
168 |
"!!u.u~v ==> ALL w. u~w --> v~w --> regular(w) --> (u|>w) ~ (v|>w)";
|
1732
|
169 |
by (etac Scomp.induct 1);
|
2469
|
170 |
by (ALLGOALS (asm_simp_tac res1L_ss));
|
1048
|
171 |
by (dresolve_tac [spec RS mp RS mp RS mp] 1
|
|
172 |
THEN resolve_tac Scomp.intrs 1 THEN resolve_tac Scomp.intrs 2
|
|
173 |
THEN resolve_tac Sreg.intrs 3);
|
|
174 |
by (REPEAT(assume_tac 1));
|
|
175 |
by (asm_full_simp_tac res1L_ss 1);
|
|
176 |
val residuals_preserve_comp = result();
|
|
177 |
|
|
178 |
|
|
179 |
goal Residuals.thy
|
|
180 |
"!!u.u~v ==> regular(u) --> regular(v) --> regular(u|>v)";
|
1732
|
181 |
by (etac Scomp.induct 1);
|
2469
|
182 |
by (safe_tac (!claset));
|
1048
|
183 |
by (TRYALL (dres_inst_tac [("psi", "regular(Fun(?u) |> ?v)")] asm_rl));
|
|
184 |
by (ALLGOALS (asm_full_simp_tac res1L_ss));
|
|
185 |
val residuals_preserve_reg = result();
|
|
186 |
|
|
187 |
(* ------------------------------------------------------------------------- *)
|
|
188 |
(* Preservation lemma *)
|
|
189 |
(* ------------------------------------------------------------------------- *)
|
|
190 |
|
|
191 |
goal Residuals.thy
|
|
192 |
"!!u.u~v ==> v ~ (u un v)";
|
1732
|
193 |
by (etac Scomp.induct 1);
|
2469
|
194 |
by (ALLGOALS Asm_full_simp_tac);
|
1048
|
195 |
val union_preserve_comp = result();
|
|
196 |
|
|
197 |
goal Residuals.thy
|
|
198 |
"!!u.u ~ v ==> regular(v) --> u|>v = (u un v)|>v";
|
1732
|
199 |
by (etac Scomp.induct 1);
|
2469
|
200 |
by (safe_tac (!claset));
|
1048
|
201 |
by (dres_inst_tac [("psi", "Fun(?u) |> ?v = ?w")] asm_rl 3);
|
|
202 |
by (ALLGOALS (asm_full_simp_tac (res1L_ss addsimps
|
1461
|
203 |
[union_preserve_comp,comp_sym_iff])));
|
2469
|
204 |
by (asm_full_simp_tac (!simpset addsimps
|
1461
|
205 |
[union_preserve_comp RS comp_sym,
|
|
206 |
comp_sym RS union_preserve_comp RS comp_sym]) 1);
|
1048
|
207 |
val preservation1 = result();
|
|
208 |
|
|
209 |
val preservation = preservation1 RS mp;
|