1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
5 (* Author: Dang Tat Dat *)
7 (* ========================================================================== *)
11 Moved into the project on August 2, 2010.
14 module Tarjjuw = struct
17 needs "/home/nyx/flyspeck/working/flyspeck_needs.hl";;
19 flyspeck_needs "general/prove_by_refinement.hl";;
20 flyspeck_needs "general/sphere.hl";;
23 open Prove_by_refinement;;
24 (*-----------Definition------------------------------------------------------*)
25 let weakly_saturated =
27 `weakly_saturated (V:real^3 ->bool) (r:real) (r':real) <=>
28 (!(v:real^3).(&2 <= dist(vec 0,v) ) /\ (dist(vec 0, v) <= r') ==>
29 (?(u:real^3). (u IN V) /\ (~((vec 0) = u)) /\ (dist(u,v) < r)))`;;
33 `half_spaces (a:real^3) (b:real) =
34 {x:real^3| (a dot x) <= b}`;;
36 (*----------------------------------------------------------------------------*)
37 let CHANGE_TARJJUW_1 = prove (`!(v:real^3) (r':real) (p:real^3).(&0 < r') /\ (~(p = vec 0)) /\ (v = (r'/(norm p))% p) ==> (r' = norm v)`,REPEAT GEN_TAC THEN STRIP_TAC THEN
38 SUBGOAL_THEN `norm (v:real^3) = norm (((r':real)/(norm (p:real^3)))%p)` ASSUME_TAC THENL
40 ASM_MESON_TAC [];SUBGOAL_THEN `&0 < norm (p:real^3)` ASSUME_TAC THENL
42 ASM_REWRITE_TAC [NORM_POS_LT];SUBGOAL_THEN `norm (((r':real)/(norm (p:real^3)))%p) = (abs (r'/norm p))*(norm p)` ASSUME_TAC THENL [REWRITE_TAC[] THEN REWRITE_TAC [NORM_MUL];SUBGOAL_THEN `&0 < ((r':real)/(norm (p:real^3)))` ASSUME_TAC THENL [REWRITE_TAC[] THEN ASM_MESON_TAC [REAL_LT_DIV];SUBGOAL_THEN `abs ((r':real) / norm (p:real^3)) = r'/(norm p)` ASSUME_TAC THENL [REWRITE_TAC[] THEN ASM_REWRITE_TAC [REAL_ABS_REFL] THEN ASM_ARITH_TAC;SUBGOAL_THEN `abs ((r':real) / norm (p:real^3)) * norm p = ((r':real) / norm (p:real^3)) * norm p` ASSUME_TAC THENL [ASM_ARITH_TAC;SUBGOAL_THEN `~(norm (p:real^3) = &0)` ASSUME_TAC THENL [ASM_ARITH_TAC;ASM_MESON_TAC [REAL_DIV_RMUL]]]]]]]]);;
44 let CHANGE_TARJJUW_11 = prove (`!(v:real^3) (r':real) (p:real^3). (&0 < r') /\ (~(p = vec 0)) /\ (v = (r'/(norm p))% p) ==> norm (((r')/(norm (p)))%p) = r'`,REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `(r':real) = norm (v:real^3)` ASSUME_TAC THENL
45 [ASM_MESON_TAC [CHANGE_TARJJUW_1];
46 SUBGOAL_THEN `norm (v:real^3) = norm (((r':real)/(norm (p:real^3)))%p)` ASSUME_TAC THENL
48 SUBGOAL_THEN `(r':real) = norm (((r':real)/(norm (p:real^3)))%p)` ASSUME_TAC THENL
49 [ASM_ARITH_TAC;ASM_MESON_TAC [EQ_SYM_EQ]]]]);;
51 let CHANGE_TARJJUW_12 = prove (`!(v:real^3) (r':real) (p:real^3). (&0 < r') /\ (~(p = vec 0)) ==> norm (((r')/(norm (p)))%p) = r'`,REPEAT GEN_TAC THEN STRIP_TAC THEN
52 SUBGOAL_THEN `&0 < norm (p:real^3)` ASSUME_TAC THENL
54 ASM_REWRITE_TAC [NORM_POS_LT];
55 SUBGOAL_THEN `norm (((r':real)/(norm (p:real^3)))%p) = (abs (r'/norm p))*(norm p)` ASSUME_TAC THENL
57 REWRITE_TAC [NORM_MUL];
58 SUBGOAL_THEN `&0 < ((r':real)/(norm (p:real^3)))` ASSUME_TAC THENL
60 ASM_MESON_TAC [REAL_LT_DIV];
61 SUBGOAL_THEN `abs ((r':real) / norm (p:real^3)) = r'/(norm p)` ASSUME_TAC THENL
63 ASM_REWRITE_TAC [REAL_ABS_REFL] THEN ASM_ARITH_TAC;
64 SUBGOAL_THEN `abs ((r':real) / norm (p:real^3)) * norm p = ((r':real) / norm (p:real^3)) * norm p` ASSUME_TAC THENL
66 SUBGOAL_THEN `~(norm (p:real^3) = &0)` ASSUME_TAC THENL
68 SUBGOAL_THEN `norm (((r':real)/(norm (p:real^3)))%p) = ((r':real) / norm (p:real^3)) * norm p` ASSUME_TAC THENL
69 [REWRITE_TAC[] THEN ASM_ARITH_TAC;
70 ASM_MESON_TAC [REAL_DIV_RMUL]]]]]]]]);;
72 (*-------------------------------------------------------------------*)
73 let CHANGE_TARJJUW_2 = prove (`!(v:real^3) (r':real) (p:real^3).(~(p = vec 0)) /\ (v = (r'/(norm p))% p) ==>
74 (r'% p = (norm p)%v)`,REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `(norm (p:real^3)) % (v:real^3) =(norm (p:real^3)) % ((r'/(norm p))% p) ` ASSUME_TAC THENL [REWRITE_TAC [] THEN ASM_MESON_TAC [VECTOR_MUL_LCANCEL];SUBGOAL_THEN `(norm (p:real^3)) % (((r':real)/(norm p))% p) = ((norm p) * (r'/norm p))%p` ASSUME_TAC THENL [REWRITE_TAC[] THEN MESON_TAC[VECTOR_MUL_ASSOC];SUBGOAL_THEN `~(norm (p:real^3) = &0)` ASSUME_TAC THENL [REWRITE_TAC[] THEN REWRITE_TAC[NORM_EQ_0] THEN ASM_MESON_TAC[];SUBGOAL_THEN `(norm (p:real^3)) * ((r':real)/norm p) = r'` ASSUME_TAC THENL [REWRITE_TAC[] THEN ASM_MESON_TAC [REAL_DIV_LMUL];SUBGOAL_THEN `((norm (p:real^3)) * ((r':real)/norm p))%p = r' % p` ASSUME_TAC THENL [REWRITE_TAC[] THEN ASM_MESON_TAC[];ASM_MESON_TAC[]]]]]]);;
76 (*-------------------------------------------------------------------*)
78 let CHANGE_TARJJUW_3 = prove_by_refinement(`!(V:real^3 -> bool)(u:real^3).(packing V) /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (u IN V) ==> &2 <= norm u`,
80 (REPEAT GEN_TAC THEN REWRITE_TAC [ball; DIFF;SUBSET]);
81 (STRIP_TAC THEN REPEAT (POP_ASSUM MP_TAC));
83 (DISCH_THEN (LABEL_TAC "F1"));
84 (REWRITE_TAC [IN] THEN REPEAT STRIP_TAC);
85 (REMOVE_THEN "F1" (MP_TAC o SPEC `u:real^3`));
86 (ASM_REWRITE_TAC [IN;IN_ELIM_THM]);
89 (REWRITE_TAC [DIST_0]);
96 let CHANGE_TARJJUW_31 = prove_by_refinement( `!(V:real^3 -> bool)(u:real^3).(packing V) /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (u IN V) ==> ~(u = vec 0)`,
100 (SUBGOAL_THEN `&2 <= norm (u:real^3)` ASSUME_TAC);
101 (ASM_MESON_TAC [CHANGE_TARJJUW_3]);
102 (MP_TAC (ISPECL [`&0`;`&2`;`norm (u:real^3)`]REAL_LTE_TRANS));
103 (ASM_REWRITE_TAC [ARITH_RULE `&0 < &2`]);
104 (REWRITE_TAC[NORM_POS_LT]);
109 let CHANGE_TARJJUW_32 = prove_by_refinement(`!(V:real^3 -> bool)(u:real^3)(v:real^3).(packing V) /\ (vec 0 IN V) /\ (u IN V) /\ (~(vec 0 = u)) ==> &2 <= norm u`,
111 (REPEAT GEN_TAC THEN REWRITE_TAC [packing;IN] THEN STRIP_TAC THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC "F1") THEN REPEAT STRIP_TAC);
112 (ASM_CASES_TAC `&2 <= norm (u:real^3)` THENL [ASM_ARITH_TAC;POP_ASSUM MP_TAC THEN REWRITE_TAC [GSYM DIST_0]]);
113 (STRIP_TAC THEN REMOVE_THEN "F1" (MP_TAC o SPECL [`(vec 0):real^3`;`u:real^3`]));
117 (*------------------------------------------------------------------------*)
119 let CHANGE_TARJJUW_4 =prove (`!(u:real^3) (v:real^3) (r:real).dist (u,v) < r ==> (dist (u,v)) pow 2 < r pow 2`,REPEAT GEN_TAC THEN REWRITE_TAC [dist] THEN STRIP_TAC THEN SUBGOAL_THEN `&0 <= norm ((u:real^3) - (v:real^3))` ASSUME_TAC THENL [REWRITE_TAC [NORM_POS_LE];SUBGOAL_THEN `&0 <= r` ASSUME_TAC THENL [ASM_ARITH_TAC;SUBGOAL_THEN `abs (norm ((u:real^3) - (v:real^3))) = norm (u - v)` ASSUME_TAC THENL [REWRITE_TAC [REAL_ABS_NORM];SUBGOAL_THEN `abs (r:real) = r` ASSUME_TAC THENL [ASM_ARITH_TAC;SUBGOAL_THEN `abs (norm ((u:real^3) - (v:real^3))) < abs(r:real)` ASSUME_TAC THENL [ASM_ARITH_TAC;ASM_MESON_TAC [REAL_LT_SQUARE_ABS]]]]]]);;
121 (*-------------------------------------------------------------------------*)
123 let CHANGE_TARJJUW_5 =prove (`!(V:real^3 -> bool)(g:real^3->real) (r:real) (r':real) (u:real^3) (v:real^3) (p:real^3).(packing V) /\ V SUBSET (:real^3) DIFF ball (vec 0,&2) /\ (&2 <= r) /\ (r <= r') /\ (~(p = vec 0)) /\ ((((g u) * r')/ &2) < norm p) /\ (v = (r'/(norm p))% p) /\ ((u dot p) <= (g u)) /\ (~(vec 0 = u)) /\ (dist (u,v) < r) /\ (u IN V) ==> (norm p < norm p)`,
126 THEN MP_TAC (ISPECL [`v:real^3`;`r':real`]CHANGE_TARJJUW_1)
127 THEN DISCH_THEN (MP_TAC o SPEC `p:real^3`)
128 THEN MP_TAC (ISPECL [`&2`;`r:real`;`r':real`]REAL_LE_TRANS)
129 THEN ASM_REWRITE_TAC[]
131 THEN MP_TAC (ISPECL [`&0`;`&2`;`r':real`]REAL_LTE_TRANS)
132 THEN ASM_REWRITE_TAC[ARITH_RULE `&0 < &2`]
134 THEN ASM_REWRITE_TAC[]
135 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `(v:real^3) = (r':real) / norm p % (p:real^3)`
137 THEN MP_TAC (ISPECL [`v:real^3`]NORM_POS_LE)
139 THEN MP_TAC (ISPECL [`((u:real^3) dot (p:real^3))`;`((g:real^3->real)(u:real^3))`;`(norm (v:real^3))`]REAL_LE_RMUL)
140 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `((u:real^3) dot (p:real^3)) <= ((g:real^3->real)(u:real^3))`
141 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `&0 <= norm (v:real^3)`
143 THEN MP_TAC (ISPECL [`(((u:real^3) dot (p:real^3)) * (norm (v:real^3)))`;`(((g:real^3->real)(u:real^3)) * norm v)`;`&2`](GSYM REAL_LE_DIV2_EQ))
144 THEN REWRITE_TAC [ARITH_RULE `&0 < &2`]
147 THEN SUBGOAL_THEN `((u dot p) * norm (v:real^3)) / &2 <= (((g:real^3->real)(u:real^3)) * norm v) / &2` ASSUME_TAC
148 THENL [ASM_ARITH_TAC;MP_TAC (ISPECL [`((u:real^3) dot (p:real^3))`;`(r':real)`]REAL_MUL_SYM)
150 THEN MP_TAC (ISPECL [`r':real`;`u:real^3`;`p:real^3`]DOT_RMUL)
152 THEN MP_TAC (ISPECL [`v:real^3`;`r':real`;`p:real^3`]CHANGE_TARJJUW_2)
153 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `~(p:real^3 = vec 0)`
154 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `v:real^3 = (r':real) / norm p % (p:real^3)`
155 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `v:real^3 = (r':real) / norm p % (p:real^3)`
159 SUBGOAL_THEN `(u:real^3) dot ((r':real)% (p:real^3)) = u dot ((norm p)%v)` ASSUME_TAC
160 THENL [ASM_MESON_TAC[];MP_TAC (ISPECL [`(norm (p:real^3))`;`(u:real^3)`;`(v:real^3)`]DOT_RMUL)
161 THEN STRIP_TAC (*]]);;*)
163 THEN SUBGOAL_THEN `((u:real^3) dot (p:real^3)) * (r':real) = norm p * (u dot (v:real^3))` ASSUME_TAC
164 THENL [FIND_ASSUM (fun th -> REWRITE_TAC [th]) `((u:real^3) dot (p:real^3)) * (r':real) = r' * (u dot p)`
165 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `(u:real^3) dot (r':real) % (p:real^3)= r' * (u dot p)`
166 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `(u:real^3) dot (r':real) % (p:real^3)= r' * (u dot p)`
167 THEN POP_ASSUM MP_TAC
168 THEN POP_ASSUM MP_TAC
169 THEN MESON_TAC[EQ_TRANS];
170 MP_TAC (ISPECL [`(u:real^3)`;`(v:real^3)`]DOT_NORM_NEG)
171 THEN STRIP_TAC (*]]]);;*)
173 THEN SUBGOAL_THEN `((norm (p:real^3)) * ((u:real^3) dot (v:real^3))) = (((norm p) *(((norm u pow 2 + norm v pow 2) - (norm (u - v)) pow 2)) / &2))` ASSUME_TAC
174 THENL [POP_ASSUM MP_TAC
176 POP_ASSUM MP_TAC THEN REWRITE_TAC[GSYM dist] THEN STRIP_TAC
177 THEN MP_TAC (ISPECL [`V:real^3->bool`;`u:real^3`]CHANGE_TARJJUW_3)
178 THEN ASM_REWRITE_TAC[]
180 THEN MP_TAC (ISPECL [`&2`]REAL_ABS_REFL)
181 THEN REWRITE_TAC [ARITH_RULE `&0 <= &2`]
183 THEN MP_TAC (ISPECL [`u:real^3`]REAL_ABS_NORM) THEN STRIP_TAC (*]]]]);;*)
185 (*Sub 1.1.1.1.1 ]]]]]*)
186 SUBGOAL_THEN `abs (&2) <= abs (norm (u:real^3))` ASSUME_TAC
187 THENL [ASM_ARITH_TAC;
188 MP_TAC (ISPECL [`&2`;`norm (u:real^3)`]REAL_LE_SQUARE_ABS)
189 THEN POP_ASSUM (fun th -> REWRITE_TAC [th])
190 THEN REWRITE_TAC [ARITH_RULE `&2 pow 2 = &4`]
192 THEN MP_TAC (ISPECL [`u:real^3`;`v:real^3`;`r:real`]CHANGE_TARJJUW_4)
193 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `dist (u:real^3,v:real^3) < r:real`
195 THEN MP_TAC (ISPECL [`((r:real) pow 2)`;`dist (u:real^3,v:real^3) pow 2`]REAL_LT_NEG)
196 THEN FIRST_ASSUM (fun th -> REWRITE_TAC [th])
197 THEN STRIP_TAC (*]]]]]);;*)
198 (*Sub 1.1.1.1.1.1 ]]]]]]*)
199 THEN SUBGOAL_THEN `(norm (v:real^3)) pow 2 = (r':real) pow 2`ASSUME_TAC
200 THENL [UNDISCH_TAC `r':real = norm (v:real^3)`
202 (*Sub 1.1.1.1.1.1.2*)
203 SUBGOAL_THEN `((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) =
204 (norm (u:real^3)) pow 2 + (r':real) pow 2` ASSUME_TAC
205 THENL [ASM_ARITH_TAC;
206 (*Sub 1.1.1.1.1.1.2.2*)
207 SUBGOAL_THEN `&4 + (norm (v:real^3)) pow 2 <= ((norm (u:real^3)) pow 2 + (norm v) pow 2 )` ASSUME_TAC
208 THENL [ASM_ARITH_TAC;
209 (*Sub 1.1.1.1.1.1.2.2.2*)
210 SUBGOAL_THEN `(((u:real^3) dot (p:real^3)) * (r':real)) / &2 < (norm (p))` ASSUME_TAC
211 THENL [UNDISCH_TAC `(((u:real^3) dot (p:real^3)) * norm (v:real^3)) / &2 <= ((g:real^3->real) u * norm v) / &2`
212 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `r':real = norm (v:real^3)`
213 THEN UNDISCH_TAC `((g:real^3->real) (u:real^3) * (r':real)) / &2 < norm (p:real^3)`
215 (*Sub 1.1.1.1.1.1.2.2.2.2*)
216 SUBGOAL_THEN `((norm (p:real^3)) * ((u:real^3) dot (v:real^3))) / &2 < (norm (p))`ASSUME_TAC
217 THENL [ASM_ARITH_TAC;
218 (*Sub 1.1.1.1.1.1.2.2.2.2*)
219 SUBGOAL_THEN `&4 + (r':real) pow 2 <= ((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2 )` ASSUME_TAC
220 THENL [ASM_ARITH_TAC;
221 (*Sub 1.1.1.1.1.1.2.2.2.2*)
222 SUBGOAL_THEN `&4 + (r':real) pow 2 + --(dist ((u:real^3),(v:real^3)) pow 2) <= ((norm (u)) pow 2 + (norm (v)) pow 2 + --(dist (u,v) pow 2) )` ASSUME_TAC
223 THENL [ASM_ARITH_TAC;
224 (*Sub 1.1.1.1.1.1.2.2.2.2*)
225 SUBGOAL_THEN `&4 + (r':real) pow 2 + --((r:real) pow 2) <= &4 + (r':real) pow 2 + --(dist ((u:real^3),(v:real^3)) pow 2)` ASSUME_TAC
226 THENL [ASM_ARITH_TAC;
227 SUBGOAL_THEN `&4 + (r':real) pow 2 + --((r:real) pow 2) <= ((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2 + --(dist (u,v) pow 2))` ASSUME_TAC
228 THENL [ASM_ARITH_TAC;
229 MP_TAC (ISPECL [`&0`;`&2`;`r:real`]REAL_LE_TRANS)
230 THEN ASM_REWRITE_TAC[ARITH_RULE `&0 <= &2`]
232 THEN MP_TAC (ISPECL [`&0`;`r:real`;`r':real`]REAL_LE_TRANS)
233 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `&0 <= r:real`
234 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `r:real <= r':real`
236 THEN MP_TAC (ISPECL [`r':real`]REAL_ABS_REFL)
237 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `&0 <= r':real`
239 THEN MP_TAC (ISPECL [`r:real`]REAL_ABS_REFL)
240 THEN FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `&0 <= r:real`
241 THEN STRIP_TAC(*]]]]]]]]]]]]]]);;*)
243 THEN SUBGOAL_THEN `abs (r:real) <= abs(r':real)` ASSUME_TAC
244 THENL [POP_ASSUM (fun th -> REWRITE_TAC[th])
245 THEN POP_ASSUM (fun th -> REWRITE_TAC[th])
246 THEN ASM_REWRITE_TAC[];
247 MP_TAC (ISPECL [`r:real`;`r':real`]REAL_LE_SQUARE_ABS)
248 THEN POP_ASSUM (fun th -> REWRITE_TAC[th])
250 THEN MP_TAC (ISPECL [`r':real`;`r:real`]REAL_SUB_LE)
251 THEN UNDISCH_TAC `r:real <= r':real`
252 THEN STRIP_TAC THEN POP_ASSUM (fun th -> REWRITE_TAC[th])
254 THEN MP_TAC (ISPECL [`(r':real) pow 2`;`(r:real) pow 2 `]REAL_SUB_LE)
255 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `(r:real) pow 2 <= (r':real) pow 2`
256 THEN STRIP_TAC(*]]]]]]]]]]]]]]]);;*)
258 THEN SUBGOAL_THEN `&4 <= &4 + (r':real) pow 2 - (r:real) pow 2` ASSUME_TAC
259 THENL [MP_TAC (ISPECL [`&4`;`&0`;`(r':real) pow 2 - (r:real) pow 2`]REAL_LE_LADD)
260 THEN POP_ASSUM (fun th -> REWRITE_TAC[th])
261 THEN REWRITE_TAC [ARITH_RULE `&4 + &0 = &4`];
262 MP_TAC (ISPECL [`&4 + ((r':real) pow 2)`;`((r:real) pow 2)`]real_sub)
263 THEN STRIP_TAC(*]]]]]]]]]]]]]]]]);;*)
265 THEN SUBGOAL_THEN `&4 + ((r':real) pow 2) - ((r:real) pow 2) <= ((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) + --(dist (u,v) pow 2)` ASSUME_TAC
266 THENL [ASM_ARITH_TAC;SUBGOAL_THEN `&4 <= ((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) + --(dist (u,v) pow 2)` ASSUME_TAC
267 THENL [ASM_ARITH_TAC;
268 MP_TAC (ISPECL [`(((norm (p:real^3)) * ((u:real^3) dot (v:real^3)))/ &2)`;`(norm (p:real^3))`;`&2`]REAL_LT_RMUL)
269 THEN REWRITE_TAC [ARITH_RULE `&0 < &2`]
270 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `(norm (p:real^3) * ((u:real^3) dot (v:real^3))) / &2 < norm p`
271 THEN REWRITE_TAC [ARITH_RULE `(((norm (p:real^3)) * ((u:real^3) dot (v:real^3)))/ &2) * (&2) = ((norm (p:real^3)) * ((u:real^3) dot (v:real^3)))`]
272 THEN STRIP_TAC(*]]]]]]]]]]]]]]]]]]);;*)
275 THEN SUBGOAL_THEN `(((norm (p:real^3)) * (((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - dist (u,v) pow 2)) / &2) < (norm p) * (&2) ` ASSUME_TAC
276 THENL [ASM_ARITH_TAC;
277 MP_TAC (ISPECL [`((((norm (p:real^3)) * (((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - dist (u,v) pow 2)) / &2))`;`(norm (p:real^3)) * (&2)`;`&2`]REAL_LT_RMUL)
278 THEN REWRITE_TAC [ARITH_RULE `&0 < &2`]
279 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `(norm (p:real^3) * ((norm (u:real^3) pow 2 + norm (v:real^3) pow 2) - dist (u,v) pow 2)) / &2 < norm p * &2`
280 THEN REWRITE_TAC [ARITH_RULE `((((norm (p:real^3)) * (((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - dist (u,v) pow 2)) / &2))*(&2) = ((norm (p:real^3)) * (((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - dist (u,v) pow 2))`]
282 THEN MP_TAC (ISPECL [`((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2)`;`(dist (u:real^3,v:real^3) pow 2)`]real_sub)
283 THEN STRIP_TAC(*]]]]]]]]]]]]]]]]]]]);;*)
287 THEN SUBGOAL_THEN `&4 <= ((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - (dist (u,v) pow 2)` ASSUME_TAC
288 THENL [ASM_ARITH_TAC;
289 MP_TAC (ISPECL [`p:real^3`]NORM_POS_LE) THEN STRIP_TAC
290 THEN MP_TAC (ISPECL [`(norm (p:real^3))`;`&4`;`(((norm (u:real^3)) pow 2 + (norm (v:real^3)) pow 2) - dist (u,v) pow 2)`]REAL_LE_LMUL)
291 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `&4 <= (norm (u:real^3) pow 2 + norm (v:real^3) pow 2) - dist (u,v) pow 2`
292 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `&0 <= norm (p:real^3)`
293 THEN STRIP_TAC(*]]]]]]]]]]]]]]]]]]]]);; *)
294 THEN MP_TAC (ISPECL [`(norm (p:real^3)) * (&4)`;`norm (p:real^3) * ((norm (u:real^3) pow 2 + norm v pow 2) - dist (u,v) pow 2)`;`(norm (p:real^3) * &2) * &2`]REAL_LET_TRANS)
295 THEN POP_ASSUM (fun th -> REWRITE_TAC [th])
296 THEN FIND_ASSUM (fun th -> REWRITE_TAC [th]) `norm (p:real^3) * ((norm (u:real^3) pow 2 + norm v pow 2) - dist (u,v) pow 2) <
298 THEN ARITH_TAC]]]]]]]]]]]]]]]]]]]]);;
301 (*----------------------------------------------------------------*)
302 let CHANGE_TARJJUW_6 = prove_by_refinement(`!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) p:real^3 r r':real. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V /\ (weakly_saturated V r r') /\
303 P = INTERS {half_spaces u (g u)| u IN V} /\ (p IN P) ==>(!u:real^3. u IN V ==> p IN half_spaces u (g u))`,
308 (REWRITE_TAC [INTERS;IN_ELIM_THM] THEN STRIP_TAC);
310 (ASM_REWRITE_TAC[IN_ELIM_THM]);
312 (SUBGOAL_THEN `INTERS {half_spaces u (g u) | u IN V} SUBSET half_spaces (u:real^3) ((g:real^3->real) u)` ASSUME_TAC);
313 (REWRITE_TAC [SUBSET;IN_INTERS]);
315 (DISCH_THEN (LABEL_TAC "F1"));
316 (REMOVE_THEN "F1" (MP_TAC o SPEC `half_spaces (u:real^3) ((g:real^3 -> real) u)`));
318 (SUBGOAL_THEN `half_spaces (u:real^3) ((g:real^3 -> real) u) IN {half_spaces u (g u) | u IN (V:real^3->bool)}` ASSUME_TAC);
319 (REWRITE_TAC [half_spaces]);
320 (REWRITE_TAC [IN_ELIM_THM]);
321 (EXISTS_TAC `u:real^3`);
326 (REWRITE_TAC [SUBSET]);
327 (DISCH_THEN (MP_TAC o SPEC `p:real^3`));
333 let CHANGE_TARJJUW_7 = prove_by_refinement( `!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) u:real^3 r r':real. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V /\ (weakly_saturated V r r') /\
334 P = INTERS {half_spaces u (g u)| u IN V} /\ u IN V ==> (!p:real^3. p IN P ==> (u dot p) <= (g u))`,
336 (REPEAT GEN_TAC THEN STRIP_TAC);
339 (SUBGOAL_THEN `(!u:real^3. u IN (V:real^3->bool) ==> p IN half_spaces u ((g:real^3->real) u))` ASSUME_TAC);
340 (ASM_MESON_TAC[CHANGE_TARJJUW_6]);
342 (REWRITE_TAC [half_spaces;IN_ELIM_THM]);
343 (DISCH_THEN (MP_TAC o SPEC `u:real^3`));
349 let CHANGE_TARJJUW_71 = prove_by_refinement( `!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) r r':real. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V /\ (weakly_saturated V r r') /\
350 P = INTERS {half_spaces u (g u)| u IN V} ==> (!p:real^3 u:real^3. p IN P /\ u IN V ==> (u dot p) <= ((g:real^3->real) u))`,
356 (SUBGOAL_THEN `!p:real^3. p IN (P:real^3->bool) ==> (u dot p) <= ((g:real^3->real)(u:real^3))` ASSUME_TAC);
357 (ASM_MESON_TAC [CHANGE_TARJJUW_7]);
358 (POP_ASSUM (MP_TAC o SPEC `p:real^3`));
363 let CHANGE_TARJJUW_8 = prove_by_refinement( `!(g:real^3->real)(r':real)(u:real^3).(&2 <= r) /\ (r <= r') /\ (&0 <= g u) ==> &0 <= ((g u) * r')/ &2`,
366 (REPEAT GEN_TAC THEN STRIP_TAC);
367 (SUBGOAL_THEN `&2 <= (r':real)` ASSUME_TAC);
369 (SUBGOAL_THEN `&0 <= (r':real)` ASSUME_TAC);
371 (MP_TAC (ARITH_RULE `&0 <= &2`));
372 (MESON_TAC[REAL_LE_TRANS]);
373 (MP_TAC (ISPECL [`(g:real^3->real) (u:real^3)`;`r':real`]REAL_LE_MUL));
376 (MP_TAC (ISPECL [`(((g:real^3->real) (u:real^3)) * (r':real))`;`(&2)`]REAL_LE_DIV));
377 (ASM_REWRITE_TAC[ARITH_RULE `&0 <= &2`]);
381 let FININTE_GFUN = prove_by_refinement(`!(V:real^3 -> bool)(g:real^3->real) r':real.(FINITE V) /\ ~(V = {}) ==> FINITE {(g(u:real^3)*r')/(&2)|u IN V} /\ ~({(g(u:real^3)*r')/(&2)|u IN V} = {})`,
384 (SUBGOAL_THEN `IMAGE (\u. ((g:real^3->real)(u:real^3) * (r':real)) / &2) (V:real^3->bool) = {(g u * r') / &2 | u IN V}` ASSUME_TAC);
385 (REWRITE_TAC [IMAGE;EXTENSION]);
388 (REWRITE_TAC [IN_ELIM_THM]);
389 (REWRITE_TAC [IN_ELIM_THM]);
391 (MP_TAC (ISPECL [`\u. (((g:real^3->real)(u:real^3)) * (r':real)) / (&2)`;`V:real^3->bool`]FINITE_IMAGE));
393 (MP_TAC (ISPECL [`\u. (((g:real^3->real)(u:real^3)) * (r':real)) / (&2)`;`V:real^3->bool`]IMAGE_EQ_EMPTY));
399 (*----------------------------------------------------------------------------*)
400 let CHANGE_TARJJUW_9 = prove_by_refinement(`!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) r r':real. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V/\ ~(V = {}) /\ (weakly_saturated V r r') /\
401 P = INTERS {half_spaces u (g u)| u IN V} ==> polyhedron P`,
405 (ASM_REWRITE_TAC [polyhedron]);
406 (EXISTS_TAC `{half_spaces (u:real^3) ((g:real^3->real) u)| u IN (V:real^3->bool)}`);
409 (MP_TAC (ISPECL [`\u. half_spaces (u:real^3) ((g:real^3->real) u) `;`V:real^3->bool`]FINITE_IMAGE));
411 (SUBGOAL_THEN `IMAGE (\u. half_spaces (u:real^3) ((g:real^3->real)(u))) (V:real^3->bool) = {half_spaces u (g u) | u IN V}` ASSUME_TAC);
412 (REWRITE_TAC [IMAGE;EXTENSION]);
414 (REWRITE_TAC [IN_ELIM_THM]);
417 (EXISTS_TAC `x':real^3`);
419 (REWRITE_TAC [EXTENSION]);
421 (POP_ASSUM (MP_TAC o SPEC `x'':real^3`));
424 (EXISTS_TAC `u:real^3`);
425 (ASM_REWRITE_TAC []);
427 (ASM_REWRITE_TAC[half_spaces;IN_ELIM_THM]);
428 (GEN_TAC THEN STRIP_TAC);
429 (EXISTS_TAC `u:real^3`);
430 (EXISTS_TAC `((g:real^3->real)(u:real^3))`);
431 (MP_TAC (ISPECL [`V:real^3->bool`;`u:real^3`]CHANGE_TARJJUW_31));
436 let CHANGE_TARJJUW_10 = prove_by_refinement( `!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) r r':real u:real^3. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V/\ ~(V = {}) /\ (weakly_saturated V r r') /\
437 P = INTERS {half_spaces u (g u)| u IN V} /\ polyhedron P /\ u IN V ==>
442 (SUBGOAL_THEN `!p:real^3 u:real^3. p IN P /\ u IN V ==> (u dot p) <= ((g:real^3->real) u)` ASSUME_TAC);
443 (ASM_MESON_TAC[CHANGE_TARJJUW_71]);
444 (REPEAT (POP_ASSUM MP_TAC));
445 (REWRITE_TAC [weakly_saturated;polyhedron;half_spaces] THEN STRIP_TAC);
446 (DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC);
448 (DISCH_THEN (LABEL_TAC "F1"));
450 (DISCH_THEN (LABEL_TAC "F2"));
452 (DISCH_THEN (LABEL_TAC "F3"));
454 (ASM_CASES_TAC `(V:real^3->bool) = {}`);
455 (SUBGOAL_THEN `IMAGE (\(u:real^3). {x:real^3 | u dot x <= g u}) (V:real^3->bool) = {{x | u dot x <= g u} | u IN V}` ASSUME_TAC);
456 (REWRITE_TAC[IMAGE;EXTENSION]);
459 (REWRITE_TAC [IN_ELIM_THM]);
461 (EXISTS_TAC `x':real^3`);
463 (POP_ASSUM (LABEL_TAC "B1"));
464 (REWRITE_TAC [EXTENSION]);
466 (REWRITE_TAC[IN_ELIM_THM]);
467 (REMOVE_THEN "B1" (MP_TAC o SPEC `x'':real^3`));
469 (REWRITE_TAC [IN_ELIM_THM]);
471 (EXISTS_TAC `u':real^3`);
474 (REWRITE_TAC [IN_ELIM_THM]);
475 (MP_TAC (ISPECL [`(\(u:real^3). {x:real^3 | u dot x <= g u})`;`V:real^3->bool`]IMAGE_EQ_EMPTY));
476 (FIND_ASSUM (fun th -> REWRITE_TAC [th]) `(V:real^3->bool) = {}`);
480 (POP_ASSUM (fun th -> REWRITE_TAC [GSYM th]));
482 ( POP_ASSUM (fun th -> REWRITE_TAC [th]));
483 (REWRITE_TAC [INTERS_0]);
486 (MP_TAC (ISPECL [`V:real^3->bool`;`(g:real^3->real)`;`r':real`]FININTE_GFUN));
487 (FIND_ASSUM (fun th -> REWRITE_TAC [th]) `~ ((V:real^3->bool) = {})`);
488 (FIND_ASSUM (fun th -> REWRITE_TAC [th]) `FINITE (V:real^3->bool) `);
490 (ASM_CASES_TAC `bounded (P:real^3->bool)`);
493 (REWRITE_TAC [bounded]);
494 (REWRITE_TAC [NOT_EXISTS_THM;NOT_FORALL_THM]);
495 (REWRITE_TAC [NOT_IMP;REAL_NOT_LE]);
496 (DISCH_THEN (LABEL_TAC "F4"));
497 (REWRITE_TAC [GSYM bounded]);
498 (SUBGOAL_THEN `!u:real^3 . u IN (V:real^3->bool) ==> (?p:real^3. p IN (P:real^3->bool) /\ (((g:real^3->real)(u:real^3)) * (r':real)) / (&2) < norm p)` ASSUME_TAC);
500 (REMOVE_THEN "F4" (MP_TAC o SPEC `sup {((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`));
501 (DISCH_THEN (X_CHOOSE_TAC `p:real^3`));
502 (POP_ASSUM MP_TAC THEN STRIP_TAC);
503 (EXISTS_TAC `p:real^3`);
505 (MP_TAC (ISPECL [`{((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`]SUP_FINITE));
508 (POP_ASSUM (MP_TAC o SPEC `((g:real^3->real)(u':real^3) * (r':real)) / &2 `));
509 (REWRITE_TAC [IN_ELIM_THM]);
510 (SUBGOAL_THEN `(?u:real^3. u IN (V:real^3->bool) /\ ((g:real^3->real)(u':real^3) * (r':real)) / &2 = (g u * r') / &2)` ASSUME_TAC);
511 (EXISTS_TAC `u':real^3`);
513 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
515 (MP_TAC (ISPECL [`((g:real^3->real)(u':real^3) * (r':real)) / &2`;`sup {((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`;`norm (p:real^3)`]REAL_LET_TRANS));
516 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
518 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
519 (POP_ASSUM (LABEL_TAC "F5"));
520 (REMOVE_THEN "F4" (MP_TAC o SPEC `sup {((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`));
521 (DISCH_THEN (X_CHOOSE_TAC `p:real^3`));
522 (POP_ASSUM MP_TAC THEN STRIP_TAC);
523 (REMOVE_THEN "F5" (MP_TAC o SPEC `u:real^3`));
524 (FIND_ASSUM (fun th ->REWRITE_TAC [th]) `(u:real^3) IN (V:real^3 -> bool)`);
526 (USE_THEN "F3" (MP_TAC o SPECL [`p:real^3`;`u:real^3`]));
527 (FIND_ASSUM (fun th -> REWRITE_TAC [th])`(p:real^3) IN (P:real^3->bool)`);
528 (FIND_ASSUM (fun th -> REWRITE_TAC [th])`(u:real^3) IN (V:real^3->bool)`);
530 (MP_TAC (ISPECL [`{((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`]SUP_FINITE));
533 (POP_ASSUM (MP_TAC o SPEC `((g:real^3->real)(u:real^3) * (r':real)) / &2`));
534 (REWRITE_TAC [IN_ELIM_THM]);
535 (SUBGOAL_THEN `(?(u':real^3). u' IN (V:real^3->bool) /\ ((g:real^3->real)(u:real^3) * (r':real)) / &2 = (g u' * r') / &2)` ASSUME_TAC);
536 (EXISTS_TAC `u:real^3`);
538 (POP_ASSUM (fun th -> REWRITE_TAC[th]));
540 (MP_TAC (ISPECL [`((g:real^3->real)(u:real^3) * (r':real)) / &2`;`sup {((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`;`norm (p:real^3)`]REAL_LET_TRANS));
543 (ASM_CASES_TAC `(p:real^3) = vec 0`);
544 (SUBGOAL_THEN `((r':real)/(norm (p:real^3)))% p = vec 0` ASSUME_TAC);
545 (POP_ASSUM (fun th -> REWRITE_TAC [th]));
546 (MESON_TAC [VECTOR_MUL_RZERO]);
547 (SUBGOAL_THEN `norm (((r':real)/(norm (p:real^3)))% p) = &0` ASSUME_TAC );
549 (REWRITE_TAC [NORM_EQ_0]);
550 (MP_TAC (ISPECL [`p:real^3`]NORM_EQ_0));
553 (UNDISCH_TAC `((g:real^3->real)(u:real^3) * (r':real)) / (&2) < norm (p:real^3)`);
556 (USE_THEN "F3" (MP_TAC o SPECL [`(vec 0):real^3`;`u:real^3`]));
557 (UNDISCH_TAC `(p:real^3) IN (P:real^3->bool)`);
558 (UNDISCH_TAC `p:real^3 = vec 0`);
559 (DISCH_TAC THEN POP_ASSUM (fun th ->REWRITE_TAC [th]));
560 (DISCH_TAC THEN POP_ASSUM (fun th ->REWRITE_TAC [th]));
561 (FIND_ASSUM (fun th -> REWRITE_TAC [th]) `(u:real^3) IN (V:real^3->bool)`);
562 (UNDISCH_TAC `(P:real^3->bool) = INTERS {{x:real^3 | u dot x <= (g:real^3->real)(u)} | (u:real^3) IN (V:real^3->bool)}`);
564 (POP_ASSUM (fun th -> REWRITE_TAC [GSYM th]));
565 (REWRITE_TAC [DOT_RZERO]);
566 (SUBGOAL_THEN `&2 <= r':real` ASSUME_TAC);
568 (MP_TAC (ISPECL [`&0`;`&2`;`r':real`]REAL_LTE_TRANS));
569 (ASM_REWRITE_TAC [ARITH_RULE `&0 < &2`]);
571 (MP_TAC (ARITH_RULE `(((g:real^3->real))(u:real^3) * (r':real)) / &2 < &0 <=> g u * r' < &0`));
574 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
576 (MP_TAC (ISPECL [`((g:real^3->real))(u:real^3)`;`&0`;`r':real`]REAL_LT_RDIV_EQ));
578 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
579 (POP_ASSUM (fun th ->REWRITE_TAC [th]));
580 (REWRITE_TAC [ARITH_RULE `&0 / (r':real) = &0`]);
582 (SUBGOAL_THEN `~(u:real^3 = vec 0)` ASSUME_TAC);
583 (ASM_MESON_TAC[CHANGE_TARJJUW_31]);
585 (SUBGOAL_THEN `!v:real^3.(v = ((r':real)/(norm p))% (p:real^3)) ==> (r' = norm v)` ASSUME_TAC);
588 (SUBGOAL_THEN `&2 <= r':real` ASSUME_TAC);
590 (MP_TAC (ISPECL [`&0`;`&2`;`r':real`]REAL_LTE_TRANS));
591 (ASM_REWRITE_TAC [ARITH_RULE `&0 < &2`]);
593 (FIND_ASSUM (fun th -> REWRITE_TAC [GSYM th]) `(v:real^3) = (r':real) / norm p % (p:real^3)`);
594 (ASM_MESON_TAC [CHANGE_TARJJUW_1]);
595 (POP_ASSUM (LABEL_TAC "F7"));
596 (USE_THEN "F1" (MP_TAC o SPEC `((r':real)/(norm (p:real^3)))% p`));
597 (REWRITE_TAC [dist;NORM_SUB;VECTOR_SUB_RZERO]);
598 (ABBREV_TAC `v = (r':real) / norm p % (p:real^3)`);
600 (REMOVE_THEN "F7" (MP_TAC o SPEC `v:real^3`));
603 (SUBGOAL_THEN `&2 <= r':real` ASSUME_TAC);
608 (ASM_REWRITE_TAC[ARITH_RULE `norm (v:real^3) <= norm v`]);
611 (REWRITE_TAC [GSYM dist]);
613 (REMOVE_THEN "F3" (MP_TAC o SPECL [`p:real^3`;`u':real^3`]));
616 (MP_TAC (ISPECL [`{((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`]SUP_FINITE));
618 (UNDISCH_TAC `(r':real) = norm (v:real^3)`);
620 (POP_ASSUM (fun th -> REWRITE_TAC[GSYM th]));
622 (POP_ASSUM (MP_TAC o SPEC `((g:real^3->real)(u':real^3) * (r':real)) / &2`));
623 (REWRITE_TAC [IN_ELIM_THM]);
624 (SUBGOAL_THEN `(?(u:real^3). u IN (V:real^3->bool) /\ ((g:real^3->real)(u':real^3) * (r':real)) / &2 = (g u * r') / &2)` ASSUME_TAC);
625 (EXISTS_TAC `u':real^3`);
627 (POP_ASSUM (fun th -> REWRITE_TAC[th]));
629 (MP_TAC (ISPECL [`((g:real^3->real)(u':real^3) * (r':real)) / &2`;`sup {((g:real^3->real)(u:real^3) * (r':real)) / &2 | u IN (V:real^3->bool)}`;`norm (p:real^3)`]REAL_LET_TRANS));
632 (UNDISCH_TAC `(r':real) / norm (p:real^3) % p = v:real^3`);
633 (REWRITE_TAC [EQ_SYM_EQ]);
635 (SUBGOAL_THEN `norm (p:real^3) < norm p` ASSUME_TAC);
636 (ASM_MESON_TAC[CHANGE_TARJJUW_5]);
637 (UNDISCH_TAC `(P:real^3->bool) = INTERS {{x:real^3 | u dot x <= (g:real^3->real)(u:real^3)} | u IN (V:real^3->bool)}`);
639 (POP_ASSUM (fun th -> REWRITE_TAC [GSYM th]));
644 let TARJJUW = prove( `!(V:real^3 -> bool)(P:real^3->bool) (g:real^3->real) r r':real. (&2 <= r) /\ (r <= r') /\ (V SUBSET (:real^3) DIFF ball (vec 0,&2)) /\ (FINITE V) /\ packing V /\ ~(V = {}) /\ (weakly_saturated V r r') /\
645 P = INTERS {half_spaces u (g u)| u IN V} ==>
649 THEN MP_TAC (ISPECL [`V:real^3->bool`]MEMBER_NOT_EMPTY)
650 THEN POP_ASSUM MP_TAC
651 THEN POP_ASSUM MP_TAC
652 THEN FIRST_ASSUM (fun th -> REWRITE_TAC [th])
655 THEN DISCH_THEN (X_CHOOSE_TAC `u:real^3`)
656 THEN MP_TAC (ISPECL [`(V:real^3 -> bool)`;`(P:real^3->bool)`;`(g:real^3->real)`;` r:real`;`r':real`] CHANGE_TARJJUW_9)
657 THEN ASM_REWRITE_TAC[]
658 THEN FIRST_ASSUM (fun th -> REWRITE_TAC [GSYM th])
659 THEN POP_ASSUM MP_TAC
660 THEN FIRST_ASSUM (fun th -> REWRITE_TAC [GSYM th])
661 THEN REPEAT STRIP_TAC
662 THEN MP_TAC (ISPECL [`V:real^3 -> bool`;`P:real^3->bool`;`g:real^3 -> real`;`r:real`;`r':real`;`u:real^3`]CHANGE_TARJJUW_10)
663 THEN ASM_REWRITE_TAC[]);;