1 (* ========================================================================= *)
\r
2 (* FLYSPECK - BOOK FORMALIZATION *)
\r
4 (* Authour : VU KHAC KY *)
\r
5 (* Book lemma: NJIUTIU *)
\r
6 (* Chaper : Packing (Marchal cells) *)
\r
8 (* ========================================================================= *)
\r
11 (* ========================================================================= *)
\r
13 module Njiutiu = struct
\r
16 open Vukhacky_tactics;;
\r
21 open Marchal_cells;;
\r
23 open Marchal_cells_2_new;;
\r
27 let NJIUTIU_concl =
\r
29 saturated V /\ packing V /\
\r
30 barV V 3 ul /\ barV V 3 vl /\
\r
31 rogers V ul = rogers V vl /\ aff_dim (rogers V ul) = &3
\r
32 ==> (!i. 0 <= i /\ i <= 3
\r
33 ==> omega_list_n V ul i = omega_list_n V vl i)`;;
\r
35 (* ========================================================================= *)
\r
36 (* supporting lemmas *)
\r
38 let CLOSEST_POINT_SUBSET_lemma = prove_by_refinement (
\r
39 `!(a:real^3) x S P.
\r
40 (a = closest_point S x /\ a IN P /\ P SUBSET S /\
\r
41 convex P /\ closed P /\ closed S /\ ~(P = {}))
\r
42 ==> (a = closest_point P x)`,
\r
43 [(REPEAT STRIP_TAC);
\r
44 (ABBREV_TAC `s = closest_point P (x:real^3)`);
\r
45 (ASM_CASES_TAC `~(a:real^3 = s)`);
\r
46 (NEW_GOAL `dist (x:real^3, s) < dist (x, a)`);
\r
48 (MATCH_MP_TAC CLOSEST_POINT_LT);
\r
50 (NEW_GOAL `s:real^3 IN P`);
\r
52 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
\r
53 (ASM_REWRITE_TAC[]);
\r
54 (NEW_GOAL `dist (x, a) <= dist (x, s:real^3)`);
\r
55 (ASM_REWRITE_TAC[]);
\r
56 (MATCH_MP_TAC CLOSEST_POINT_LE);
\r
57 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
\r
59 (ASM_REAL_ARITH_TAC);
\r
61 (ASM_MESON_TAC[])]);;
\r
63 (* ---------------------------------------------------------------------------*)
\r
64 let AFF_DEPENDENT_AFF_DIM_4 = prove_by_refinement (
\r
66 affine_dependent {a,b,c,d} ==> aff_dim {a,b,c,d} <= &2`,
\r
67 [(REWRITE_TAC[affine_dependent]);
\r
70 (ASM_CASES_TAC `x = a:real^3`);
\r
71 (ONCE_REWRITE_TAC [AFF_DIM_INSERT]);
\r
73 (NEW_GOAL `aff_dim {b,c,d:real^3} <= &(CARD {b,c,d}) - &1`);
\r
74 (MATCH_MP_TAC AFF_DIM_LE_CARD);
\r
75 (REWRITE_TAC[Geomdetail.FINITE6]);
\r
76 (NEW_GOAL `&(CARD {b, c, d:real^3}) <= &3:int`);
\r
77 (REWRITE_TAC[INT_OF_NUM_LE; Geomdetail.CARD3]);
\r
80 (NEW_GOAL `affine hull({a, b, c, d:real^3} DELETE x)
\r
81 SUBSET affine hull {b, c, d}`);
\r
82 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
\r
83 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
\r
87 (ASM_CASES_TAC `x = b:real^3`);
\r
88 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
\r
89 (ONCE_REWRITE_TAC [AFF_DIM_INSERT]);
\r
91 (NEW_GOAL `aff_dim {a,c,d:real^3} <= &(CARD {a,c,d}) - &1`);
\r
92 (MATCH_MP_TAC AFF_DIM_LE_CARD);
\r
93 (REWRITE_TAC[Geomdetail.FINITE6]);
\r
94 (NEW_GOAL `&(CARD {a, c, d:real^3}) <= &3:int`);
\r
95 (REWRITE_TAC[INT_OF_NUM_LE; Geomdetail.CARD3]);
\r
98 (NEW_GOAL `affine hull({a, b, c, d:real^3} DELETE x)
\r
99 SUBSET affine hull {a, c, d}`);
\r
100 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
\r
101 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
\r
105 (ASM_CASES_TAC `x = c:real^3`);
\r
106 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {c,a,b,d}`]);
\r
107 (ONCE_REWRITE_TAC [AFF_DIM_INSERT]);
\r
109 (NEW_GOAL `aff_dim {a,b,d:real^3} <= &(CARD {a,b,d}) - &1`);
\r
110 (MATCH_MP_TAC AFF_DIM_LE_CARD);
\r
111 (REWRITE_TAC[Geomdetail.FINITE6]);
\r
112 (NEW_GOAL `&(CARD {a, b, d:real^3}) <= &3:int`);
\r
113 (REWRITE_TAC[INT_OF_NUM_LE; Geomdetail.CARD3]);
\r
116 (NEW_GOAL `affine hull({a, b, c, d:real^3} DELETE x)
\r
117 SUBSET affine hull {a, b, d}`);
\r
118 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
\r
119 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
\r
123 (ASM_CASES_TAC `x = d:real^3`);
\r
124 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {d,a,b,c}`]);
\r
125 (ONCE_REWRITE_TAC [AFF_DIM_INSERT]);
\r
127 (NEW_GOAL `aff_dim {a,b,c:real^3} <= &(CARD {a,b,c}) - &1`);
\r
128 (MATCH_MP_TAC AFF_DIM_LE_CARD);
\r
129 (REWRITE_TAC[Geomdetail.FINITE6]);
\r
130 (NEW_GOAL `&(CARD {a, b,c:real^3}) <= &3:int`);
\r
131 (REWRITE_TAC[INT_OF_NUM_LE; Geomdetail.CARD3]);
\r
134 (NEW_GOAL `affine hull({a, b, c, d:real^3} DELETE x)
\r
135 SUBSET affine hull {a, b, c}`);
\r
136 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
\r
137 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
\r
143 (ASM_MESON_TAC[])]);;
\r
145 (* ========================================================================== *)
\r
147 (* ========================================================================== *)
\r
149 let NJIUTIU = prove_by_refinement (NJIUTIU_concl,
\r
151 [(REPEAT GEN_TAC THEN STRIP_TAC);
\r
155 {HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`);
\r
156 (ASM_MESON_TAC[ROGERS_EXPLICIT]);
\r
160 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
\r
161 (ASM_MESON_TAC[ROGERS_EXPLICIT]);
\r
163 `{HD (ul:(real^3)list), omega_list_n V ul 1, omega_list_n V ul 2,
\r
164 omega_list_n V ul 3}
\r
165 = {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
\r
167 `{HD (ul:(real^3)list), omega_list_n V ul 1, omega_list_n V ul 2,
\r
168 omega_list_n V ul 3}
\r
169 = {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3} <=>
\r
171 {HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}
\r
173 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
\r
174 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
175 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
\r
176 (REPEAT STRIP_TAC);
\r
177 (NEW_GOAL `aff_dim {HD (ul:(real^3)list), omega_list_n V ul 1,
\r
178 omega_list_n V ul 2, omega_list_n V ul 3} <= &2`);
\r
179 (MATCH_MP_TAC AFF_DEPENDENT_AFF_DIM_4);
\r
180 (ASM_REWRITE_TAC[]);
\r
181 (UP_ASM_TAC THEN PURE_ONCE_REWRITE_TAC[GSYM AFF_DIM_CONVEX_HULL]);
\r
182 (REWRITE_TAC[GSYM (ASSUME `rogers V ul =
\r
184 {HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`)]);
\r
186 (NEW_GOAL `aff_dim {HD (vl:(real^3)list), omega_list_n V vl 1,
\r
187 omega_list_n V vl 2, omega_list_n V vl 3} <= &2`);
\r
188 (MATCH_MP_TAC AFF_DEPENDENT_AFF_DIM_4);
\r
189 (ASM_REWRITE_TAC[]);
\r
190 (UP_ASM_TAC THEN PURE_ONCE_REWRITE_TAC[GSYM AFF_DIM_CONVEX_HULL]);
\r
191 (REWRITE_TAC[GSYM (ASSUME `rogers V vl =
\r
193 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`)]);
\r
194 (REWRITE_TAC[GSYM (ASSUME `rogers V ul = rogers V vl`)]);
\r
197 (ABBREV_TAC `W = {HD (ul:(real^3)list), omega_list_n V ul 1,
\r
198 omega_list_n V ul 2, omega_list_n V ul 3}`);
\r
201 i < 4 /\ j < 4 /\ ~(i = j)
\r
202 ==> ~(omega_list_n V ul i = omega_list_n V ul j)`);
\r
203 (MATCH_MP_TAC Rogers.ROGERS_AFF_DIM_FULL);
\r
204 (ASM_REWRITE_TAC[]);
\r
206 `~(omega_list_n V ul 0 = omega_list_n V ul 1) /\
\r
207 ~(omega_list_n V ul 0 = omega_list_n V ul 2) /\
\r
208 ~(omega_list_n V ul 0 = omega_list_n V ul 3) /\
\r
209 ~(omega_list_n V ul 1 = omega_list_n V ul 2) /\
\r
210 ~(omega_list_n V ul 1 = omega_list_n V ul 3) /\
\r
211 ~(omega_list_n V ul 2 = omega_list_n V ul 3)`);
\r
212 (ASM_SIMP_TAC[ARITH_RULE
\r
213 `0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ ~(0 = 1) /\ ~(0 = 2) /\ ~(0 = 3) /\
\r
214 ~(1 = 2) /\ ~(2 = 3) /\ ~(1 = 3)`]);
\r
216 (NEW_GOAL `(omega_list_n V ul 1) IN voronoi_list V (truncate_simplex 1 ul)`);
\r
217 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
218 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
\r
219 (NEW_GOAL `(omega_list_n V ul 2) IN voronoi_list V (truncate_simplex 2 ul)`);
\r
220 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
221 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
\r
222 (NEW_GOAL `(omega_list_n V ul 3) IN voronoi_list V (truncate_simplex 3 ul)`);
\r
223 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
224 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `3 <= 3`]);
\r
225 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
\r
226 (MATCH_MP_TAC BARV_3_EXPLICIT);
\r
227 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
\r
228 (UP_ASM_TAC THEN STRIP_TAC);
\r
229 (NEW_GOAL `voronoi_list V (truncate_simplex 2 ul) SUBSET
\r
230 voronoi_list V (truncate_simplex 1 ul) /\
\r
231 voronoi_list V (truncate_simplex 3 ul) SUBSET
\r
232 voronoi_list V (truncate_simplex 1 ul) /\
\r
233 voronoi_list V (truncate_simplex 3 ul) SUBSET
\r
234 voronoi_list V (truncate_simplex 2 ul)`);
\r
235 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_2; TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST;VORONOI_SET; set_of_list]);
\r
237 (UP_ASM_TAC THEN STRIP_TAC);
\r
240 i < 4 /\ j < 4 /\ ~(i = j)
\r
241 ==> ~(omega_list_n V vl i = omega_list_n V vl j)`);
\r
242 (MATCH_MP_TAC Rogers.ROGERS_AFF_DIM_FULL);
\r
245 `~(omega_list_n V vl 0 = omega_list_n V vl 1) /\
\r
246 ~(omega_list_n V vl 0 = omega_list_n V vl 2) /\
\r
247 ~(omega_list_n V vl 0 = omega_list_n V vl 3) /\
\r
248 ~(omega_list_n V vl 1 = omega_list_n V vl 2) /\
\r
249 ~(omega_list_n V vl 1 = omega_list_n V vl 3) /\
\r
250 ~(omega_list_n V vl 2 = omega_list_n V vl 3)`);
\r
251 (ASM_SIMP_TAC[ARITH_RULE
\r
252 `0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ ~(0 = 1) /\ ~(0 = 2) /\ ~(0 = 3) /\
\r
253 ~(1 = 2) /\ ~(2 = 3) /\ ~(1 = 3)`]);
\r
255 (NEW_GOAL `(omega_list_n V vl 1) IN voronoi_list V (truncate_simplex 1 vl)`);
\r
256 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
257 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
\r
258 (NEW_GOAL `(omega_list_n V vl 2) IN voronoi_list V (truncate_simplex 2 vl)`);
\r
259 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
260 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
\r
261 (NEW_GOAL `(omega_list_n V vl 3) IN voronoi_list V (truncate_simplex 3 vl)`);
\r
262 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
\r
263 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `3 <= 3`]);
\r
264 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
\r
265 (MATCH_MP_TAC BARV_3_EXPLICIT);
\r
266 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
\r
267 (UP_ASM_TAC THEN STRIP_TAC);
\r
268 (NEW_GOAL `voronoi_list V (truncate_simplex 2 vl) SUBSET
\r
269 voronoi_list V (truncate_simplex 1 vl) /\
\r
270 voronoi_list V (truncate_simplex 3 vl) SUBSET
\r
271 voronoi_list V (truncate_simplex 1 vl) /\
\r
272 voronoi_list V (truncate_simplex 3 vl) SUBSET
\r
273 voronoi_list V (truncate_simplex 2 vl)`);
\r
274 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_2; TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST;VORONOI_SET; set_of_list]);
\r
276 (UP_ASM_TAC THEN STRIP_TAC);
\r
278 (NEW_GOAL `HD (ul:(real^3)list) = HD vl`);
\r
279 (MATCH_MP_TAC ROGERS_INTER_V_LEMMA);
\r
280 (EXISTS_TAC `V:real^3->bool`);
\r
281 (REPEAT STRIP_TAC);
\r
282 (ASM_REWRITE_TAC[]);
\r
283 (ASM_REWRITE_TAC[]);
\r
284 (ASM_REWRITE_TAC[]);
\r
285 (NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
\r
286 (MATCH_MP_TAC Packing3.BARV_SUBSET);
\r
287 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
\r
288 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list; HD] THEN SET_TAC[]);
\r
289 (REWRITE_TAC[GSYM (ASSUME `rogers V ul = rogers V vl`)]);
\r
290 (ONCE_REWRITE_TAC[MESON[IN] `rogers V ul s <=> s IN rogers V ul`]);
\r
291 (REWRITE_WITH `rogers V ul =
\r
293 {HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V
\r
296 (ASM_SIMP_TAC[ROGERS_EXPLICIT]);
\r
297 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
299 (NEW_GOAL `omega_list_n V ul 0 = omega_list_n V vl 0`);
\r
300 (REWRITE_TAC[OMEGA_LIST_N]);
\r
303 (* Case 1: i = 1 *)
\r
304 (NEW_GOAL `omega_list_n V ul 1 = omega_list_n V vl 1`);
\r
305 (REWRITE_WITH `omega_list_n V ul 1 =
\r
306 closest_point (convex hull (W DIFF {HD ul})) (omega_list_n V ul 0)`);
\r
307 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
308 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 0) ul)`);
\r
309 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
311 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `1 = SUC 0`]); (* finish subgoal 1 *)
\r
312 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
314 (REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
315 (REWRITE_TAC[OMEGA_LIST_N]);
\r
316 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
318 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 0) ul) =
\r
319 convex hull (voronoi_list V (truncate_simplex (SUC 0) ul))`);
\r
320 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
321 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
322 (ONCE_REWRITE_TAC[ASSUME
\r
323 `voronoi_list V (truncate_simplex (SUC 0) ul) =
\r
324 convex hull (voronoi_list V (truncate_simplex (SUC 0) ul))`]);
\r
325 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
326 (REWRITE_WITH `W:real^3->bool DIFF {HD ul} =
\r
327 {omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`);
\r
328 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
329 (REWRITE_TAC[OMEGA_LIST_N]);
\r
331 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
\r
332 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
333 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
334 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
335 (MATCH_MP_TAC FINITE_DIFF);
\r
336 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
337 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
338 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
339 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
340 (REWRITE_TAC[OMEGA_LIST_N]);
\r
341 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
343 (REWRITE_WITH `omega_list_n V vl 1 =
\r
344 closest_point (convex hull (W DIFF {HD vl})) (omega_list_n V vl 0)`);
\r
345 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
346 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 0) vl)`);
\r
347 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
349 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `1 = SUC 0`]); (* finish subgoal 1 *)
\r
350 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
352 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
353 (REWRITE_TAC[OMEGA_LIST_N]);
\r
354 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
356 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 0) vl) =
\r
357 convex hull (voronoi_list V (truncate_simplex (SUC 0) vl))`);
\r
358 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
359 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
360 (ONCE_REWRITE_TAC[ASSUME
\r
361 `voronoi_list V (truncate_simplex (SUC 0) vl) =
\r
362 convex hull (voronoi_list V (truncate_simplex (SUC 0) vl))`]);
\r
363 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
364 (REWRITE_WITH `W:real^3->bool DIFF {HD vl} =
\r
365 {omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
\r
366 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
367 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
368 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
369 (REWRITE_TAC[OMEGA_LIST_N]);
\r
372 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
\r
373 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
374 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
375 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
376 (MATCH_MP_TAC FINITE_DIFF);
\r
377 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
378 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
379 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
380 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
381 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
382 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
383 (REWRITE_TAC[OMEGA_LIST_N]);
\r
384 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
386 (* ------------------------------------------------------------------------- *)
\r
387 (* Case 2: i = 2 *)
\r
388 (NEW_GOAL `omega_list_n V ul 2 = omega_list_n V vl 2`);
\r
389 (REWRITE_WITH `omega_list_n V ul 2 =
\r
390 closest_point (convex hull (W DIFF {HD ul, omega_list_n V ul 1})) (omega_list_n V ul 1)`);
\r
391 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
392 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 1) ul)`);
\r
393 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
395 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]); (* finish subgoal 1 *)
\r
396 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
398 (REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
399 (REWRITE_TAC[OMEGA_LIST_N]);
\r
400 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
402 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 1) ul) =
\r
403 convex hull (voronoi_list V (truncate_simplex (SUC 1) ul))`);
\r
404 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
405 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
406 (ONCE_REWRITE_TAC[ASSUME
\r
407 `voronoi_list V (truncate_simplex (SUC 1) ul) =
\r
408 convex hull (voronoi_list V (truncate_simplex (SUC 1) ul))`]);
\r
409 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
410 (REWRITE_WITH `W:real^3->bool DIFF {HD ul, omega_list_n V ul 1} =
\r
411 {omega_list_n V ul 2, omega_list_n V ul 3}`);
\r
412 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
413 (REWRITE_TAC[OMEGA_LIST_N]);
\r
415 (REWRITE_TAC[ARITH_RULE `SUC 1 = 2`]);
\r
416 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
417 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
418 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
419 (MATCH_MP_TAC FINITE_DIFF);
\r
420 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
421 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
422 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
423 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
424 (REWRITE_TAC[OMEGA_LIST_N]);
\r
425 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
428 `omega_list_n V vl 2 =
\r
429 closest_point (convex hull (W DIFF {HD vl, omega_list_n V vl 1}))
\r
430 (omega_list_n V vl 1)`);
\r
431 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
432 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 1) vl)`);
\r
433 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
435 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]); (* finish subgoal 1 *)
\r
436 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
437 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
438 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
439 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
440 (REWRITE_TAC[OMEGA_LIST_N]);
\r
441 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
443 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 1) vl) =
\r
444 convex hull (voronoi_list V (truncate_simplex (SUC 1) vl))`);
\r
445 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
446 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
447 (ONCE_REWRITE_TAC[ASSUME
\r
448 `voronoi_list V (truncate_simplex (SUC 1) vl) =
\r
449 convex hull (voronoi_list V (truncate_simplex (SUC 1) vl))`]);
\r
450 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
451 (REWRITE_WITH `W:real^3->bool DIFF {HD vl, omega_list_n V vl 1} =
\r
452 {omega_list_n V vl 2, omega_list_n V vl 3}`);
\r
453 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
454 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
455 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
456 (REWRITE_TAC[OMEGA_LIST_N]);
\r
459 (REWRITE_TAC[ARITH_RULE `SUC 1 = 2`]);
\r
460 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
461 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
462 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
463 (MATCH_MP_TAC FINITE_DIFF);
\r
464 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
465 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
466 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
467 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
468 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
469 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
470 (REWRITE_TAC[OMEGA_LIST_N]);
\r
471 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
474 (* ------------------------------------------------------------------------- *)
\r
475 (* Case 3: i = 3 *)
\r
476 (NEW_GOAL `omega_list_n V ul 3 = omega_list_n V vl 3`);
\r
478 `omega_list_n V ul 3 = closest_point
\r
479 (convex hull (W DIFF {HD ul, omega_list_n V ul 1, omega_list_n V ul 2}))
\r
480 (omega_list_n V ul 2)`);
\r
481 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
482 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 2) ul)`);
\r
483 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
485 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]); (* finish subgoal 1 *)
\r
486 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
488 (REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
489 (REWRITE_TAC[OMEGA_LIST_N]);
\r
490 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
492 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 2) ul) =
\r
493 convex hull (voronoi_list V (truncate_simplex (SUC 2) ul))`);
\r
494 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
495 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
496 (ONCE_REWRITE_TAC[ASSUME
\r
497 `voronoi_list V (truncate_simplex (SUC 2) ul) =
\r
498 convex hull (voronoi_list V (truncate_simplex (SUC 2) ul))`]);
\r
499 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
501 `W:real^3->bool DIFF {HD ul, omega_list_n V ul 1, omega_list_n V ul 2} =
\r
502 {omega_list_n V ul 3}`);
\r
503 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
504 (REWRITE_TAC[OMEGA_LIST_N]);
\r
506 (REWRITE_TAC[ARITH_RULE `SUC 2 = 3`]);
\r
507 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
508 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
509 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
510 (MATCH_MP_TAC FINITE_DIFF);
\r
511 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
512 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
513 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
514 (EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
\r
515 (REWRITE_TAC[OMEGA_LIST_N]);
\r
516 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
519 `omega_list_n V vl 3 =
\r
521 (convex hull (W DIFF {HD vl, omega_list_n V vl 1, omega_list_n V vl 2}))
\r
522 (omega_list_n V vl 2)`);
\r
523 (MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
\r
524 (EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 2) vl)`);
\r
525 (REPEAT STRIP_TAC); (* 7 subgoals *)
\r
527 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]); (* finish subgoal 1 *)
\r
528 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
\r
529 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
530 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
531 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
532 (REWRITE_TAC[OMEGA_LIST_N]);
\r
533 (ASM_SET_TAC[]); (* finish subgoal 2 *)
\r
535 (NEW_GOAL `voronoi_list V (truncate_simplex (SUC 2) vl) =
\r
536 convex hull (voronoi_list V (truncate_simplex (SUC 2) vl))`);
\r
537 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
\r
538 (REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
\r
539 (ONCE_REWRITE_TAC[ASSUME
\r
540 `voronoi_list V (truncate_simplex (SUC 2) vl) =
\r
541 convex hull (voronoi_list V (truncate_simplex (SUC 2) vl))`]);
\r
542 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
\r
544 `W:real^3->bool DIFF {HD vl, omega_list_n V vl 1, omega_list_n V vl 2}
\r
545 = {omega_list_n V vl 3}`);
\r
546 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
547 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
548 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
549 (REWRITE_TAC[OMEGA_LIST_N]);
\r
552 (REWRITE_TAC[ARITH_RULE `SUC 2 = 3`]);
\r
553 (ASM_SET_TAC[]); (* finish subgoal 3 *)
\r
554 (REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
\r
555 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
\r
556 (MATCH_MP_TAC FINITE_DIFF);
\r
557 (EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
\r
558 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
\r
559 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
\r
560 (REWRITE_TAC[ASSUME `W:real^3->bool =
\r
561 {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
\r
562 (REWRITE_WITH `HD vl = omega_list_n V vl 0`);
\r
563 (REWRITE_TAC[OMEGA_LIST_N]);
\r
564 (ASM_SET_TAC[]); (* finish subgoal 7 *)
\r
566 (REPEAT STRIP_TAC);
\r
567 (ASM_CASES_TAC `i = 0`);
\r
569 (ASM_CASES_TAC `i = 1`);
\r
571 (ASM_CASES_TAC `i = 2`);
\r
573 (ASM_CASES_TAC `i = 3`);
\r
577 (ASM_MESON_TAC[])]);;
\r