1 needs "Multivariate/vectors.ml";; (* Eventually should load entire *)
\r
4 (* let DOT_BASIS_BASIS_UNEQUAL = prove(`!i j. ~(i = j) ==> (basis i) dot (basis j) = &0`,
\r
5 SIMP_TAC[basis; dot; LAMBDA_BETA] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
\r
6 SIMP_TAC[SUM_0; REAL_MUL_RZERO; REAL_MUL_LZERO; COND_ID]);; *)
\r
8 needs "Examples/analysis.ml";; (* multivariate-complex theory. *)
\r
9 needs "Examples/transc.ml";; (* Then it won't need these three. *)
\r
10 needs "convex_header.ml";;
\r
11 needs "definitions_kepler.ml";;
\r
12 needs "geomdetail.ml";;
\r
16 let ups_x = new_definition ` ups_x x1 x2 x6 =
\r
17 --x1 * x1 - x2 * x2 - x6 * x6 +
\r
21 let rho = new_definition ` rho (x12 :real) x13 x14 x23 x24 x34 =
\r
22 --(x14 * x14 * x23 * x23) -
\r
23 x13 * x13 * x24 * x24 -
\r
24 x12 * x12 * x34 * x34 +
\r
26 (x12 * x14 * x23 * x34 +
\r
27 x12 * x13 * x24 * x34 +
\r
28 x13 * x14 * x23 * x24) `;;
\r
29 let chi = new_definition ` chi x12 x13 x14 x23 x24 x34 =
\r
36 &2 * x23 * x24 * x34 -
\r
40 let delta = new_definition ` delta x12 x13 x14 x23 x24 x34 =
\r
41 --(x12 * x13 * x23) -
\r
45 x12 * x34 * (--x12 + x13 + x14 + x23 + x24 - x34) +
\r
46 x13 * x24 * (x12 - x13 + x14 + x23 - x24 + x34 ) +
\r
47 x14 * x23 * ( x12 + x13 - x14 - x23 + x24 + x34 ) `;;
\r
49 let eta_v = new_definition ` eta_v v1 v2 (v3: real^N) =
\r
50 let e1 = dist (v2, v3) in
\r
51 let e2 = dist (v1, v3) in
\r
52 let e3 = dist (v2, v1) in
\r
53 e1 * e2 * e3 / sqrt ( ups_x (e1 pow 2 ) ( e2 pow 2) ( e3 pow 2 ) ) `;;
\r
56 let max_real3 = new_definition ` max_real3 x y z = max_real (max_real x y ) z `;;
\r
57 let ups_x_pow2 = new_definition` ups_x_pow2 x y z = ups_x ( x*x ) ( y * y) ( z * z)`;;
\r
58 let plane_norm = new_definition `
\r
60 (?n v0. ~(n = vec 0) /\ p = {v | n dot (v - v0) = &0}) `;;
\r
63 let delta_x34 = new_definition ` delta_x34 x12 x13 x14 x23 x24 x34 =
\r
64 -- &2 * x12 * x34 +
\r
76 let plane_3p = new_definition `plane_3p (a:real^3) b c =
\r
77 {x | ~collinear {a, b, c} /\
\r
78 (?ta tb tc. ta + tb + tc = &1 /\ x = ta % a + tb % b + tc % c)}`;;
\r
81 (* end new_definition *)
\r
83 (* NGUYEN DUC PHUONG *)
\r
84 (* Definition of Cayley Menger square cm3 *)
\r
85 let cm3_ups_x = new_definition `!(v1:real^3) (v2:real^3) (v3:real^3).
\r
86 cm3_ups_x v1 v2 v3 =
\r
87 (((v2 - v1)$2 * (v3 - v1)$3 ) - ((v2 - v1)$3 * (v3 - v1)$2)) pow 2 +
\r
88 (((v2 - v1)$3 * (v3 - v1)$1 ) - ((v2 - v1)$1 * (v3 - v1)$3)) pow 2 +
\r
89 (((v2 - v1)$1 * (v3 - v1)$2 ) - ((v2 - v1)$2 * (v3 - v1)$1)) pow 2 `;;
\r
91 (* Nguyen Tuyen Hoang, Nguyen Duc Phuong *)
\r
93 (* The polynomial ups can be expressed as a Cayley- Menger square *)
\r
95 let lemma_cm3 = prove (`!(x:real^3) y.
\r
96 (x-y)$1 = x$1 - y$1 /\ (x-y)$2 = x$2 - y$2 /\ (x-y)$3 = x$3 - y$3`,
\r
98 (REPEAT GEN_TAC) THEN (REPEAT CONJ_TAC) THENL
\r
99 [(MESON_TAC[VECTOR_SUB_COMPONENT;DIMINDEX_3;ARITH_RULE `1 <= 1 /\ 1 <= 3`]);
\r
100 (MESON_TAC[VECTOR_SUB_COMPONENT;DIMINDEX_3;ARITH_RULE `1 <= 2 /\ 2 <= 3`]);
\r
101 (MESON_TAC[VECTOR_SUB_COMPONENT;DIMINDEX_3;ARITH_RULE `1 <= 3 /\ 3 <= 3`])]);;
\r
103 let lemma7 = prove ( `! (v1 : real ^3)(v2: real^3)(v3:real^3).
\r
104 cm3_ups_x v1 v2 v3 =
\r
105 ups_x (norm (v1 -v2) pow 2) (norm (v2 -v3) pow 2) (norm (v3 -v1) pow 2) / &4`,
\r
107 (REPEAT GEN_TAC) THEN
\r
108 (REWRITE_TAC[cm3_ups_x; ups_x]) THEN
\r
109 (REWRITE_TAC[GSYM DOT_SQUARE_NORM;DOT_3;REAL_POW_2]) THEN
\r
110 (REWRITE_TAC[lemma_cm3]) THEN
\r
113 let pow_g = prove ( `! (x:real). &0 <= x pow 2`,
\r
114 GEN_TAC THEN REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE]);;
\r
116 let lemma8 = prove ( `! (v1:real^3)(v2:real^3)(v3:real^3).
\r
117 &0 <= ups_x (norm (v1 - v2) pow 2)(norm (v2 - v3) pow 2)(norm (v3 - v1) pow 2)`,
\r
119 THEN (MATCH_MP_TAC (REAL_ARITH `&0 <= a/ &4 ==> &0 <= a `))
\r
120 THEN (REWRITE_TAC[GSYM lemma7])
\r
121 THEN (REWRITE_TAC[cm3_ups_x])
\r
123 THEN (ABBREV_TAC `(a:real) = (((v2:real^3) - v1)$2 * (v3 - v1)$3 - (v2 - v1)$3 * (v3 - v1)$2) pow 2`)
\r
124 THEN (FIRST_X_ASSUM ((LABEL_TAC "1") o GSYM))
\r
125 THEN (ABBREV_TAC `(b:real) = (((v2:real^3) - v1)$3 * (v3 - v1)$1 - (v2 - v1)$1 * (v3 - v1)$3) pow 2`)
\r
126 THEN (FIRST_X_ASSUM((LABEL_TAC "2") o GSYM))
\r
127 THEN (ABBREV_TAC `(c:real) = (((v2:real^3) - v1)$1 * (v3 - v1)$2 - (v2 - v1)$2 * (v3 - v1)$1) pow 2`)
\r
128 THEN (FIRST_X_ASSUM((LABEL_TAC "3") o GSYM))
\r
130 THEN (MATCH_MP_TAC (SPEC_ALL REAL_LE_ADD))
\r
132 THEN (ASM_REWRITE_TAC[pow_g])
\r
133 THEN (MATCH_MP_TAC (SPEC_ALL REAL_LE_ADD))
\r
135 THEN (ASM_REWRITE_TAC[pow_g]));;
\r
140 let GONTONG = REAL_RING ` ((a + b) + c = a + b + c ) `;;
\r
141 let SUB_SUM_SUB = REAL_RING ` (a - ( b + c ) = a - b - c )/\( a - (b- c) = a - b + c )` ;;
\r
144 let JVUNDLC = prove(`!a b c s.
\r
145 s = (a + b + c) / &2
\r
146 ==> &16 * s * (s - a) * (s - b) * (s - c) =
\r
147 ups_x (a pow 2) (b pow 2) (c pow 2)`, SIMP_TAC [ ups_x] THEN
\r
148 REWRITE_TAC[REAL_FIELD` a / &2 - b = ( a - &2 * b ) / &2 `] THEN
\r
149 REWRITE_TAC[REAL_FIELD ` &16 * ( a / &2 ) * ( b / &2 ) * (c / &2 ) *
\r
150 ( d / &2 ) = a * b * c * d `] THEN REAL_ARITH_TAC);;
\r
154 [NOT_IN_EMPTY; IN_UNIV; IN_UNION; IN_INTER; IN_DIFF; IN_INSERT;
\r
155 IN_DELETE; IN_REST; IN_INTERS; IN_UNIONS; IN_IMAGE] in
\r
156 let allthms = basicthms @ map (REWRITE_RULE[IN]) basicthms @
\r
157 [IN_ELIM_THM; IN] in
\r
159 TRY(POP_ASSUM_LIST(MP_TAC o end_itlist CONJ)) THEN
\r
160 REPEAT COND_CASES_TAC THEN
\r
161 REWRITE_TAC[EXTENSION; SUBSET; PSUBSET; DISJOINT; SING] THEN
\r
162 REWRITE_TAC allthms in
\r
165 (if ths = [] then ALL_TAC else MP_TAC(end_itlist CONJ ths)) THEN
\r
168 let SET_RULE tm = prove(tm,SET_TAC[]);;
\r
170 (* some TRUONG TACTICS *)
\r
172 let PHA = REWRITE_TAC[ MESON[] ` (a/\b)/\c <=> a/\ b /\ c `];;
\r
174 let NGOAC = REWRITE_TAC[ MESON[] ` a/\b/\c <=> (a/\b)/\c `];;
\r
176 let DAO = NGOAC THEN REWRITE_TAC[ MESON[]` a /\ b <=> b /\ a`];;
\r
178 let PHAT = REWRITE_TAC[ MESON[] ` (a\/b)\/c <=> a\/b\/c `];;
\r
180 let NGOACT = REWRITE_TAC[ GSYM (MESON[] ` (a\/b)\/c <=> a\/b\/c `)];;
\r
182 let KHANANG = PHA THEN REWRITE_TAC[ MESON[]` ( a\/ b ) /\ c <=> a /\ c \/ b /\ c `] THEN
\r
183 REWRITE_TAC[ MESON[]` a /\ ( b \/ c ) <=> a /\ b \/ a /\ c `];;
\r
185 let ATTACH thm = MATCH_MP (MESON[]` ! a b. ( a ==> b ) ==> ( a <=> a /\ b )`) thm;;
\r
187 let NHANH tm = ONCE_REWRITE_TAC[ ATTACH (tm)];;
\r
188 let STRIP_TR = REPEAT STRIP_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC)
\r
189 THEN REWRITE_TAC[IMP_IMP] THEN PHA;;
\r
192 let elimin = REWRITE_RULE[IN];;
\r
194 let CONV_EM = prove(`conv {} = {}:real^A->bool`,
\r
195 REWRITE_TAC[conv;sgn_ge;affsign;UNION_EMPTY;FUN_EQ_THM;elimin
\r
196 NOT_IN_EMPTY;lin_combo;SUM_CLAUSES]
\r
197 THEN REAL_ARITH_TAC);;
\r
199 let CONV_SING = prove(`!u. conv {u:real^A} = {u}`,
\r
200 REWRITE_TAC[conv;sgn_ge;affsign;FUN_EQ_THM;UNION_EMPTY;lin_combo;SUM_SING;VSUM_SING;
\r
201 elimin IN_SING] THEN REPEAT GEN_TAC THEN
\r
202 REWRITE_TAC[TAUT `(p <=> q) = ((p ==> q) /\ (q ==> p))`] THEN
\r
203 REPEAT STRIP_TAC THENL [ASM_MESON_TAC[VECTOR_MUL_LID];
\r
204 ASM_REWRITE_TAC[]] THEN EXISTS_TAC `\ (v:real^A). &1` THEN
\r
205 MESON_TAC[VECTOR_MUL_LID;REAL_ARITH `&0 <= &1`] );;
\r
207 let IN_ACT_SING = SET_RULE `! a x. ({a} x <=> a = x ) /\ ( x IN {a} <=> x = a) /\ {a} a`;;
\r
209 let IN_SET2 = SET_RULE `!a b x.
\r
210 (x IN {a, b} <=> x = a \/ x = b) /\ ({a, b} x <=> x = a \/ x = b)`;;
\r
212 let SUM_DIS2 = prove(`! x y f. ~(x=y) ==> sum {x,y} f = f x + f y `,REWRITE_TAC[
\r
213 SET_RULE ` ~( x = y)
\r
214 <=> ~(x IN {y})`] THEN MESON_TAC[ FINITE_RULES; SUM_CLAUSES; SUM_SING]);;
\r
217 let VSUM_DIS2 = prove(` ! x y f. ~(x=y) ==> vsum {x,y} f = f x + f y`, REWRITE_TAC[
\r
218 SET_RULE ` ~( x = y)
\r
219 <=> ~(x IN {y})`] THEN MESON_TAC[ FINITE_RULES; VSUM_CLAUSES; VSUM_SING]);;
\r
221 let NOV10 = prove(` ! x y. (x = y
\r
223 (?a b. &0 <= a /\ &0 <= b /\ a + b = &1 /\ x = a % y + b % y))) `,
\r
224 REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB] THEN
\r
225 REWRITE_TAC[ MESON[VECTOR_MUL_LID]` a + b = &1 /\ x = (a + b) % y <=> a + b = &1 /\
\r
226 x = y`]THEN REPEAT GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN NGOAC THEN
\r
227 REWRITE_TAC[LEFT_EXISTS_AND_THM] THEN MATCH_MP_TAC (MESON[]` a ==> ( x = y <=> a /\
\r
228 y = x )`)THEN EXISTS_TAC `&0` THEN EXISTS_TAC ` &1` THEN REAL_ARITH_TAC);;
\r
231 let TRUONG_LEMMA = prove
\r
233 (?f. x' = f x % x + f y % y /\ (&0 <= f x /\ &0 <= f y) /\
\r
234 f x + f y = &1) <=>
\r
235 (?a b. &0 <= a /\ &0 <= b /\ a + b = &1 /\ x' = a % x + b % y)` ,
\r
236 REPEAT GEN_TAC THEN EQ_TAC
\r
237 THENL [MESON_TAC[]; STRIP_TAC] THEN
\r
238 ASM_CASES_TAC `y:real^N = x` THENL
\r
239 [EXISTS_TAC `\x:real^N. &1 / &2`;
\r
240 EXISTS_TAC `\u:real^N. if u = x then (a:real) else b`] THEN
\r
241 ASM_REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB] THEN
\r
242 CONV_TAC REAL_RAT_REDUCE_CONV);;
\r
244 let CONV_SET2 = prove(` ! x y:real^A. conv {x,y} = {w | ? a b. &0 <= a /\ &0 <= b /\ a + b = &1 /\
\r
246 ONCE_REWRITE_TAC[ MESON[] ` (! a b. P a b ) <=> ( ! a b. a = b \/ ~( a= b)
\r
247 ==> P a b )`] THEN
\r
248 REWRITE_TAC[ MESON[]` a \/ b ==> c <=> ( a==> c) /\ ( b==> c)`] THEN
\r
249 SIMP_TAC[] THEN REWRITE_TAC[ SET_RULE ` {a,a} = {a}`; CONV_SING; FUN_EQ_THM;
\r
250 IN_ELIM_THM] THEN REWRITE_TAC[ IN_ACT_SING] THEN REWRITE_TAC[NOV10] THEN
\r
251 REWRITE_TAC[conv; sgn_ge; affsign; lin_combo] THEN
\r
252 REWRITE_TAC[UNION_EMPTY; IN_SET2] THEN
\r
253 ONCE_REWRITE_TAC[ MESON[]` ~(x = y) ==> (!x'. (?f. P f x') <=> l x') <=>
\r
254 ~(x = y) ==> (!x'. (?f. ~(x=y) /\ P f x') <=> l x')`] THEN
\r
255 REWRITE_TAC[ MESON[VSUM_DIS2; SUM_DIS2]` ~(x = y) /\x' = vsum {x, y} ff /\ l /\
\r
256 sum {x, y} f = &1 <=> ~(x = y) /\ x' = ff x + ff y /\ l /\ f x + f y = &1 `] THEN
\r
257 REWRITE_TAC[ MESON[]` (!w. w = x \/ w = y ==> &0 <= f w) <=> &0 <= f x /\ &0 <= f y`]
\r
258 THEN ONCE_REWRITE_TAC[ GSYM (MESON[]` ~(x = y) ==> (!x'. (?f. P f x') <=> l x') <=>
\r
259 ~(x = y) ==> (!x'. (?f. ~(x=y) /\ P f x') <=> l x')`)] THEN
\r
260 REPEAT GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN REWRITE_TAC[ TRUONG_LEMMA]);;
\r
262 let LE_OF_ZPGPXNN = prove(` ! a b v v1 v2 . &0 <= a /\ &0 <= b /\ a + b = &1 /\
\r
263 v = a % v1 + b % v2 ==> dist ( v,v1) + dist (v,v2) = dist(v1,v2)`,
\r
264 SIMP_TAC[dist; REAL_ARITH ` a + b = &1 <=> b = &1 - a `] THEN
\r
265 REWRITE_TAC[VECTOR_ARITH ` (a % v1 + (&1 - a) % v2) - v1 = ( a - &1 )%( v1 - v2)`] THEN
\r
266 REWRITE_TAC[VECTOR_ARITH` (a % v1 + (&1 - a) % v2) - v2 = a % ( v1 - v2) `] THEN
\r
267 SIMP_TAC[NORM_MUL; GSYM REAL_ABS_REFL] THEN REWRITE_TAC[ REAL_ARITH ` abs ( a - &1 )
\r
268 = abs ( &1 - a ) `] THEN REAL_ARITH_TAC);;
\r
270 let LENGTH_EQUA = prove(` ! v v1 v2. v IN conv {v1,v2} ==> dist (v,v1) +
\r
271 dist (v,v2) = dist (v1,v2) `,REWRITE_TAC[CONV_SET2; IN_ELIM_THM] THEN
\r
272 MESON_TAC[LE_OF_ZPGPXNN]);;
\r
274 let simp_def2 = new_axiom`(!a b v0.
\r
275 aff_gt {a, b} {v0} =
\r
277 ta + tb + t = &1 /\ &0 < t /\ x = ta % a + tb % b + t % v0} /\
\r
278 aff_ge {a, b} {v0} =
\r
280 ta + tb + t = &1 /\
\r
282 x = ta % a + tb % b + t % v0}) /\
\r
290 t = a % x + b % y + c % z}) /\
\r
292 affine hull {x, y, z} =
\r
293 {t | ?a b c. a + b + c = &1 /\ t = a % x + b % y + c % z})/\
\r
295 aff_lt {v2, v3} {v1} =
\r
297 t2 + t3 + t1 = &1 /\
\r
299 x = t2 % v2 + t3 % v3 + t1 % v1}) `;;
\r
301 (* lemma 10. p 14 *)
\r
302 let ZPGPXNN = prove(`!v1 v2 v. dist (v1,v2) < dist (v,v1) + dist (v,v2) ==>
\r
303 ~(v IN conv {v1, v2})`,
\r
304 REWRITE_TAC[MESON[] `a ==> ~ b <=> ~(a /\ b )`] THEN REWRITE_TAC[CONV_SET2; IN_ELIM_THM]
\r
305 THEN MESON_TAC[LE_OF_ZPGPXNN; REAL_ARITH ` a < b ==> ~ ( a = b ) `]);;
\r
307 let REDUCE_T2 = MESON[]` !P Q.
\r
308 (!v1 v2 v3 t1 t2 t3. P v1 t1 v2 t2 v3 t3 <=> P v2 t2 v1 t1 v3 t3) /\
\r
309 (!v1 v2 v3. Q v1 v2 v3 <=> Q v2 v1 v3) /\
\r
310 (!v1 v2 v3 t1 t2 t3.
\r
311 ~(t1 = &0 /\ t3 = &0) /\ P v1 t1 v2 t2 v3 t3 ==> Q v1 v2 v3)
\r
312 ==> (!v1 v2 v3 t1 t2 t3.
\r
313 ~(t1 = &0 /\ t2 = &0 /\ t3 = &0) /\ P v1 t1 v2 t2 v3 t3
\r
316 let VEC_PER2_3 = VECTOR_ARITH `((a:real^N ) + b + c = b + a + c)/\
\r
317 ( (a:real^N ) + b + c = c + b + a )`;;
\r
318 let PER2_IN3 = SET_RULE ` {a,b,c} = {b,a,c} /\ {a,b,c} = {c,b,a}`;;
\r
320 let REDUCE_T3 = MESON[]`!P Q.
\r
321 (!v1 v2 v3 t1 t2 t3. P v1 t1 v2 t2 v3 t3 <=> P v3 t3 v2 t2 v1 t1) /\
\r
322 (!v1 v2 v3. Q v1 v2 v3 <=> Q v3 v2 v1) /\
\r
323 (!v1 v2 v3 t1 t2 t3. ~(t1 = &0) /\ P v1 t1 v2 t2 v3 t3 ==> Q v1 v2 v3)
\r
324 ==> (!v1 v2 v3 t1 t2 t3.
\r
325 ~(t1 = &0 /\ t3 = &0) /\ P v1 t1 v2 t2 v3 t3 ==> Q v1 v2 v3)`;;
\r
328 let SUB_PACKING = prove(`!sub s.
\r
329 packing s /\ sub SUBSET s
\r
330 ==> (!x y. x IN sub /\ y IN sub /\ ~(x = y) ==> &2 <= d3 x y)`,
\r
331 REWRITE_TAC[ packing; GSYM d3] THEN SET_TAC[]);;
\r
334 let PAIR_EQ_EXPAND =
\r
335 SET_RULE `{a,b} = {c,d} <=> a = c /\ b = d \/ a = d /\ b = c`;;
\r
337 let IN_SET3 = SET_RULE ` x IN {a,b,c} <=> x = a \/ x = b \/ x = c `;;
\r
338 let IN_SET4 = SET_RULE ` x IN {a,b,c,d} <=> x = a \/ x = b \/ x = c \/ x = d `;;
\r
341 let SGFCDZO = prove(`! (v1:real^3) v2 v3 t1 t2 t3.
\r
342 t1 % v1 + t2 % v2 + t3 % v3 = vec 0 /\
\r
343 t1 + t2 + t3 = &0 /\
\r
344 ~(t1 = &0 /\ t2 = &0 /\ t3 = &0)
\r
345 ==> collinear {v1, v2, v3}`,
\r
346 ONCE_REWRITE_TAC[MESON[]` a /\ b/\c <=> c /\ a /\ b `] THEN
\r
347 MATCH_MP_TAC REDUCE_T2 THEN
\r
348 CONJ_TAC THENL [SIMP_TAC[VEC_PER2_3; REAL_ADD_AC]; CONJ_TAC THENL
\r
349 [SIMP_TAC[PER2_IN3]; MATCH_MP_TAC REDUCE_T3]] THEN
\r
350 CONJ_TAC THENL [SIMP_TAC[REAL_ADD_AC; VEC_PER2_3];
\r
351 CONJ_TAC THENL [SIMP_TAC[PER2_IN3]; REWRITE_TAC[]]] THEN
\r
352 REPEAT GEN_TAC THEN REWRITE_TAC[collinear] THEN
\r
353 STRIP_TAC THEN EXISTS_TAC `v2 - (v3:real^3)` THEN
\r
354 ONCE_REWRITE_TAC[MESON[]` x IN s /\ y IN s <=>
\r
355 ( x = y \/ ~ ( x = y))/\ x IN s /\ y IN s `] THEN
\r
356 REWRITE_TAC[IN_SET3] THEN REPEAT GEN_TAC THEN
\r
357 REWRITE_TAC[MESON[]` (a \/ b) /\ c ==> d <=> (a /\ c ==> d) /\ (b /\ c ==> d)`]
\r
358 THEN CONJ_TAC THENL [DISCH_TAC THEN EXISTS_TAC `&0` THEN
\r
359 FIRST_X_ASSUM MP_TAC THEN MATCH_MP_TAC (MESON[]` (a ==> c) ==> a /\ b ==> c `) THEN
\r
360 MESON_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ]; STRIP_TAC] THENL [
\r
364 EXISTS_TAC ` t3 / t1 ` THEN ASM_SIMP_TAC[] THEN STRIP_TR THEN
\r
365 ONCE_REWRITE_TAC[MESON[VECTOR_MUL_LCANCEL]`
\r
366 ~(t1 = &0) /\ a ==> x = y <=> ~(t1 = &0) /\ a ==> t1 % x = t1 % y`] THEN
\r
367 REWRITE_TAC[VECTOR_MUL_ASSOC] THEN SIMP_TAC[REAL_DIV_LMUL] THEN
\r
368 ONCE_REWRITE_TAC[GSYM VECTOR_SUB_EQ] THEN
\r
369 REWRITE_TAC[ VECTOR_ARITH ` ( a + b + (c:real^N) ) - vec 0 = vec 0 <=>
\r
370 a = -- ( b + c ) `; REAL_ARITH` a + b + c = &0 <=> a = -- ( b + c ) `] THEN
\r
371 SIMP_TAC[VECTOR_SUB_LDISTRIB] THEN
\r
372 MESON_TAC[VECTOR_ARITH ` --(t2 % v2 + t3 % v3) - --(t2 + t3) % v2 -
\r
373 (t3 % v2 - t3 % v3) = vec 0`];
\r
375 EXISTS_TAC ` ( -- t2 ) / t1 ` THEN ASM_SIMP_TAC[] THEN STRIP_TR THEN
\r
376 ONCE_REWRITE_TAC[MESON[VECTOR_MUL_LCANCEL]`
\r
377 ~(t1 = &0) /\ a ==> x = y <=> ~(t1 = &0) /\ a ==> t1 % x = t1 % y`] THEN
\r
378 REWRITE_TAC[VECTOR_MUL_ASSOC] THEN SIMP_TAC[REAL_DIV_LMUL] THEN
\r
379 ONCE_REWRITE_TAC[GSYM VECTOR_SUB_EQ] THEN
\r
380 REWRITE_TAC[ VECTOR_ARITH ` ( a + b + (c:real^N) ) - vec 0 = vec 0 <=>
\r
381 a = -- ( b + c ) `; REAL_ARITH` a + b + c = &0 <=> a = -- ( b + c ) `] THEN
\r
382 SIMP_TAC[VECTOR_SUB_LDISTRIB] THEN
\r
383 MESON_TAC[VECTOR_ARITH ` --(t2 % v2 + t3 % v3) - --(t2 + t3) % v3 -
\r
384 (--t2 % v2 - --t2 % v3) = vec 0`];
\r
387 EXISTS_TAC ` ( -- t3) / t1 ` THEN ASM_SIMP_TAC[] THEN STRIP_TR THEN
\r
388 ONCE_REWRITE_TAC[MESON[VECTOR_MUL_LCANCEL]`
\r
389 ~(t1 = &0) /\ a ==> x = y <=> ~(t1 = &0) /\ a ==> t1 % x = t1 % y`] THEN
\r
390 REWRITE_TAC[VECTOR_MUL_ASSOC] THEN SIMP_TAC[REAL_DIV_LMUL] THEN
\r
391 ONCE_REWRITE_TAC[GSYM VECTOR_SUB_EQ] THEN
\r
392 REWRITE_TAC[ VECTOR_ARITH ` ( a + b + (c:real^N) ) - vec 0 = vec 0 <=>
\r
393 a = -- ( b + c ) `; REAL_ARITH` a + b + c = &0 <=> a = -- ( b + c ) `] THEN
\r
394 SIMP_TAC[VECTOR_SUB_LDISTRIB] THEN MESON_TAC[VECTOR_ARITH ` --(t2 + t3) % v2
\r
395 - --(t2 % v2 + t3 % v3) - (--t3 % v2 - --t3 % v3) = vec 0`];
\r
401 EXISTS_TAC ` &1 ` THEN ASM_SIMP_TAC[VECTOR_MUL_LID];
\r
404 EXISTS_TAC ` t2 / t1 ` THEN ASM_SIMP_TAC[] THEN STRIP_TR THEN
\r
405 ONCE_REWRITE_TAC[MESON[VECTOR_MUL_LCANCEL]`
\r
406 ~(t1 = &0) /\ a ==> x = y <=> ~(t1 = &0) /\ a ==> t1 % x = t1 % y`] THEN
\r
407 REWRITE_TAC[VECTOR_MUL_ASSOC] THEN SIMP_TAC[REAL_DIV_LMUL] THEN
\r
408 ONCE_REWRITE_TAC[GSYM VECTOR_SUB_EQ] THEN
\r
409 REWRITE_TAC[ VECTOR_ARITH ` ( a + b + (c:real^N) ) - vec 0 = vec 0 <=>
\r
410 a = -- ( b + c ) `; REAL_ARITH` a + b + c = &0 <=> a = -- ( b + c ) `] THEN
\r
411 SIMP_TAC[VECTOR_SUB_LDISTRIB] THEN
\r
412 MESON_TAC[VECTOR_ARITH ` --(t2 + t3) % v3 - --(t2 % v2 + t3 % v3) -
\r
413 (t2 % v2 - t2 % v3) = vec 0`];
\r
415 EXISTS_TAC ` -- &1 ` THEN ASM_MESON_TAC[VECTOR_ARITH ` v3 - v2 = -- &1 % (v2 - v3)`];
\r
418 ASM_MESON_TAC[]]);;
\r
422 let RHUFIIB = prove( ` !x12 x13 x14 x23 x24 x34.
\r
423 rho x12 x13 x14 x23 x24 x34 * ups_x x34 x24 x23 =
\r
424 chi x12 x13 x14 x23 x24 x34 pow 2 +
\r
425 &4 * delta x12 x13 x14 x23 x24 x34 * x34 * x24 * x23 `,
\r
426 REWRITE_TAC[rho; chi; delta; ups_x] THEN REAL_ARITH_TAC);;
\r
429 let RIGHT_END_POINT = prove( `!x aa bb.
\r
430 (?a b. &0 < a /\ b = &0 /\ a + b = &1 /\ x = a % aa + b % bb) <=> x = aa`,
\r
431 REPEAT GEN_TAC THEN EQ_TAC THENL [STRIP_TR THEN
\r
432 REWRITE_TAC[ MESON[REAL_ARITH `b = &0 /\ a + b = &1 <=> b= &0 /\ a = &1 `]`
\r
433 b = &0 /\ a + b = &1 /\ P a b <=> b = &0 /\ a = &1 /\ P (&1 ) ( &0 ) `] THEN
\r
434 MESON_TAC[VECTOR_ARITH ` &1 % aa + &0 % bb = aa `];
\r
435 DISCH_TAC THEN EXISTS_TAC ` &1 ` THEN EXISTS_TAC ` &0 ` THEN
\r
436 REWRITE_TAC[REAL_ARITH ` &0 < &1 /\ &1 + &0 = &1 `] THEN
\r
437 ASM_MESON_TAC[VECTOR_ARITH ` &1 % aa + &0 % bb = aa `]]);;
\r
439 let LEFT_END_POINT = prove(` !x aa bb.
\r
440 (?a b. a = &0 /\ &0 < b /\ a + b = &1 /\ x = &0 % aa + &1 % bb)
\r
442 REWRITE_TAC[VECTOR_ARITH ` &0 % aa + &1 % bb = bb `] THEN
\r
443 MESON_TAC[REAL_ARITH ` &0 = &0 /\ &0 < &1 /\ &0 + &1 = &1 `]);;
\r
446 let CONV_CONV0 = prove(`! x a b. x IN conv {a,b} <=> x = a \/ x = b \/ x IN conv0 {a,b} `,
\r
447 REWRITE_TAC[CONV_SET2; CONV0_SET2; IN_ELIM_THM] THEN
\r
448 REWRITE_TAC[REAL_ARITH ` &0 <= a <=> a = &0 \/ &0 < a `] THEN
\r
449 KHANANG THEN REWRITE_TAC[EXISTS_OR_THM] THEN
\r
450 SIMP_TAC[MESON[REAL_ARITH ` ~(a = &0 /\ b = &0 /\ a + b = &1)`]`
\r
451 ~(a = &0 /\ b = &0 /\ a + b = &1 /\ las )` ] THEN
\r
452 REWRITE_TAC[MESON[REAL_ARITH ` a = &0 /\ a + b = &1 <=> a = &0 /\ b = &1 `]`
\r
453 a = &0 /\ &0 < b /\ a + b = &1 /\ x = a % aa + b % ba <=>
\r
454 a = &0 /\ &0 < b /\ a + b = &1 /\ x = &0 % aa + &1 % ba`] THEN
\r
455 MESON_TAC[ RIGHT_END_POINT; LEFT_END_POINT]);;
\r
460 let CON3_SUB_CONE3 = prove(` ! w1 v1 v2 v3. conv {v1, v2, v3} SUBSET cone w1 {v1,v2,v3}`,
\r
461 REWRITE_TAC[CONV_SET3; cone; GSYM aff_ge_def; simp_def] THEN
\r
462 REWRITE_TAC[ SET_RULE ` {x | p x} SUBSET {x | q x} <=> ( ! x. p x ==> q x)`] THEN
\r
463 MESON_TAC[ REAL_ARITH ` &0 + a = a `; VECTOR_ARITH ` &0 % x + y = y `]);;
\r
467 let QHSEWMI = prove (` !v1 v2 v3 w1 w2.
\r
468 ~(conv {w1, w2} INTER conv {v1, v2, v3} = {}) /\
\r
469 ~(w1 IN conv {v1, v2, v3})
\r
470 ==> w2 IN cone w1 {v1, v2, v3}`,
\r
471 REWRITE_TAC[INTER_DIF_EM_EX] THEN REPEAT GEN_TAC THEN REWRITE_TAC[CONV_CONV0] THEN
\r
472 STRIP_TAC THENL [ASM_MESON_TAC[];
\r
473 ASM_MESON_TAC[CON3_SUB_CONE3;SET_RULE`a SUBSET b <=> (! x. x IN a ==> x IN b )`];
\r
474 ASM_MESON_TAC[REWRITE_RULE[INTER_DIF_EM_EX] AFF_LE_CONE ]]);;
\r
477 let GONTONG = REWRITE_TAC[REAL_ARITH ` ( a + b ) + c = a + b + c `];;
\r
480 let MAEWNPU = prove(` ?b c.
\r
481 !x12 x13 x14 x23 x24 x34.
\r
482 delta x12 x13 x14 x23 x24 x34 =
\r
483 --x12 * x34 pow 2 +
\r
484 b x12 x13 x14 x23 x24 * x34 +
\r
485 c x12 x13 x14 x23 x24 `,
\r
486 REWRITE_TAC[delta; REAL_ARITH ` a - b = a + -- b `;
\r
487 REAL_ARITH ` a * (b + c )= a * b + a * c ` ] THEN
\r
488 REWRITE_TAC[REAL_ARITH ` a * b * -- c = -- a * b * c /\ -- ( a * b ) = -- a * b `] THEN
\r
489 REWRITE_TAC[REAL_ARITH` x12 * x34 * x23 + x12 * x34 * x24 +
\r
490 --x12 * x34 * x34 = x12 * x34 * x23 + x12 * x34 * x24 +
\r
491 -- x12 * ( x34 pow 2 ) `] THEN
\r
492 REWRITE_TAC[REAL_ARITH ` ( a + b ) + c = a + b + c `] THEN
\r
493 REWRITE_TAC[REAL_ARITH ` a + b * c pow 2 + d = b * c pow 2 + a + d `] THEN
\r
494 ONCE_REWRITE_TAC[REAL_ARITH `a + b + c + d + e = a + d + b + c + e `] THEN
\r
495 REWRITE_TAC[REAL_ARITH ` a * b * c = ( a * b ) * c `] THEN
\r
496 REPLICATE_TAC 30 ( ONCE_REWRITE_TAC[REAL_ARITH ` a * x pow 2 + b * x + d + e
\r
497 = a * x pow 2 + b * x + e + d `] THEN GONTONG THEN REWRITE_TAC[ REAL_ARITH
\r
498 ` a * x pow 2 + b * x + d * x + e = a * x pow 2 + ( b + d) * x + e`]) THEN
\r
499 REPLICATE_TAC 50 ( ONCE_REWRITE_TAC[REAL_ARITH ` a * x pow 2 + b * x + d + e
\r
500 = a * x pow 2 + b * x + e + d `] THEN GONTONG THEN ONCE_REWRITE_TAC[ REAL_ARITH ` a * x pow 2 + b * x + (d * x) * h + e
\r
501 = a * x pow 2 + ( b + d * h ) * x + e`]) THEN
\r
502 EXISTS_TAC ` (\ x12 x13 x14 x23 x24. --x13 * x14 +
\r
510 x12 * x23 ) ` THEN
\r
511 EXISTS_TAC ` (\ x12 x13 x14 x23 x24. (x14 * x23) * x12 +
\r
512 (x14 * x23) * x13 +
\r
513 (--x14 * x23) * x14 +
\r
514 (--x14 * x23) * x23 +
\r
515 (x14 * x23) * x24 +
\r
516 (--x12 * x13) * x23 +
\r
517 (--x12 * x14) * x24 +
\r
518 (x13 * x24) * x12 +
\r
519 (--x13 * x24) * x13 +
\r
520 (x13 * x24) * x14 +
\r
521 (x13 * x24) * x23 +
\r
522 (--x13 * x24) * x24 ) ` THEN
\r
525 (* ----new ------- *)
\r
527 let DELTA_COEFS = new_specification ["b_coef"; "c_coef"] MAEWNPU;;
\r
530 let DELTA_X34 = prove(` !x12 x13 x14 x23 x24 x34.
\r
531 delta x12 x13 x14 x23 x24 x34 =
\r
532 --x12 * x34 pow 2 +
\r
543 (x14 * x23) * x12 +
\r
544 (x14 * x23) * x13 +
\r
545 (--x14 * x23) * x14 +
\r
546 (--x14 * x23) * x23 +
\r
547 (x14 * x23) * x24 +
\r
548 (--x12 * x13) * x23 +
\r
549 (--x12 * x14) * x24 +
\r
550 (x13 * x24) * x12 +
\r
551 (--x13 * x24) * x13 +
\r
552 (x13 * x24) * x14 +
\r
553 (x13 * x24) * x23 +
\r
554 (--x13 * x24) * x24`, REWRITE_TAC[delta] THEN REAL_ARITH_TAC);;
\r
556 let C_COEF_FORMULA = prove(`! x12 x13 x14 x23 x24. c_coef x12 x13 x14 x23 x24
\r
557 = (x14 * x23) * x12 +
\r
558 (x14 * x23) * x13 +
\r
559 (--x14 * x23) * x14 +
\r
560 (--x14 * x23) * x23 +
\r
561 (x14 * x23) * x24 +
\r
562 (--x12 * x13) * x23 +
\r
563 (--x12 * x14) * x24 +
\r
564 (x13 * x24) * x12 +
\r
565 (--x13 * x24) * x13 +
\r
566 (x13 * x24) * x14 +
\r
567 (x13 * x24) * x23 +
\r
568 (--x13 * x24) * x24`, MP_TAC DELTA_COEFS THEN
\r
569 NHANH (MESON[]` (!x12 x13 x14 x23 x24 x34. p x12 x13 x14 x23 x24 x34)
\r
570 ==> (! x12 x13 x14 x23 x24. p x12 x13 x14 x23 x24 (&0) ) `) THEN
\r
571 REWRITE_TAC[DELTA_X34] THEN
\r
572 REWRITE_TAC[REAL_ARITH ` &0 pow 2 = &0 `; REAL_MUL_RZERO; REAL_ADD_LID] THEN
\r
575 let BC_DEL_FOR = prove(` ! x12 x13 x14 x23 x24. b_coef x12 x13 x14 x23 x24 =
\r
585 c_coef x12 x13 x14 x23 x24 =
\r
586 (x14 * x23) * x12 +
\r
587 (x14 * x23) * x13 +
\r
588 (--x14 * x23) * x14 +
\r
589 (--x14 * x23) * x23 +
\r
590 (x14 * x23) * x24 +
\r
591 (--x12 * x13) * x23 +
\r
592 (--x12 * x14) * x24 +
\r
593 (x13 * x24) * x12 +
\r
594 (--x13 * x24) * x13 +
\r
595 (x13 * x24) * x14 +
\r
596 (x13 * x24) * x23 +
\r
597 (--x13 * x24) * x24 `, REWRITE_TAC[C_COEF_FORMULA] THEN
\r
598 MP_TAC DELTA_COEFS THEN NHANH (MESON[]` (!x12 x13 x14 x23 x24 x34.
\r
599 p x12 x13 x14 x23 x24 x34)
\r
600 ==> (! x12 x13 x14 x23 x24. p x12 x13 x14 x23 x24 (&1) ) `) THEN
\r
601 REWRITE_TAC[DELTA_X34; C_COEF_FORMULA] THEN
\r
602 REWRITE_TAC[REAL_ARITH ` a + b + c = a + b' + c <=> b = b' `] THEN
\r
603 SIMP_TAC[REAL_RING` a * &1 = a `]);;
\r
605 let AGBWHRD = prove(` !x12 x13 x14 x23 x24 x12 x13 x14 x23 x24.
\r
606 b_coef x12 x13 x14 x23 x24 pow 2 +
\r
607 &4 * x12 * c_coef x12 x13 x14 x23 x24 =
\r
608 ups_x x12 x23 x13 * ups_x x12 x24 x14`, REWRITE_TAC[BC_DEL_FOR; ups_x] THEN
\r
612 let COLLINEAR_EX = prove(` ! x y (z:real^3) . collinear {x,y,z} <=> ( ? a b c. a + b + c = &0 /\ ~ ( a = &0 /\
\r
613 b = &0 /\ c = &0 ) /\ a % x + b % y + c % z = vec 0 ) `,
\r
614 REWRITE_TAC[collinear] THEN
\r
615 REPEAT GEN_TAC THEN
\r
618 NHANH (SET_RULE` (!x' y'. x' IN {x, y, z} /\ y' IN {x, y, z} ==> P x' y' )
\r
619 ==> P x y /\ P x z `) THEN
\r
621 DISJ_CASES_TAC (MESON[]` c = &0 /\ c' = &0 \/ ~( c = &0 /\ c' = &0 ) `) THENL [
\r
622 ASM_SIMP_TAC[VECTOR_ARITH ` x - y = &0 % t <=> y = x`] THEN
\r
624 EXISTS_TAC ` &1 ` THEN EXISTS_TAC ` &1 ` THEN
\r
625 EXISTS_TAC ` -- &2 ` THEN
\r
626 REWRITE_TAC[REAL_ARITH ` &1 + &1 + -- &2 = &0 /\
\r
627 ~(&1 = &0 /\ &1 = &0 /\ -- &2 = &0)`; VECTOR_ARITH` &1 % x + &1 % x +
\r
628 -- &2 % x = vec 0`];
\r
632 NHANH (MESON[VECTOR_MUL_LCANCEL]` x = c % u /\
\r
633 y = c' % u ==> c' % x = c' % (c % u) /\ c % y = c % c' % u `) THEN
\r
634 REWRITE_TAC[VECTOR_ARITH ` x = c' % c % u /\ y = c % c' % u <=>
\r
635 x = y /\ y = c % c' % u`] THEN
\r
636 REWRITE_TAC[VECTOR_ARITH ` c' % (x - y) = c % (x - z) <=> (c - c' ) % x + c' % y +
\r
637 -- c % z = vec 0 `] THEN
\r
638 ASM_MESON_TAC[REAL_ARITH ` (( c - b ) + b + -- c = &0 ) /\ (~( c = &0 )
\r
639 <=> ~( -- c = &0 ))`]];REWRITE_TAC[GSYM collinear] THEN MESON_TAC[SGFCDZO]]);;
\r
642 let MAX_REAL_LESS_EX = prove(`!x y a. max_real x y <= a <=> x <= a /\ y <= a`,
\r
643 REWRITE_TAC[max_real; COND_EXPAND; COND_ELIM_THM;COND_RAND; COND_RATOR] THEN
\r
644 REPEAT GEN_TAC THEN
\r
645 MESON_TAC[REAL_ARITH ` (~ ( b < a ) /\ b <= c ==> a <= c)`; REAL_ARITH ` a < b /\ b <= c ==> a <= c `]);;
\r
648 let MAX_REAL3_LESS_EX = prove(`! x y z a. max_real3 x y z <= a <=> x <= a /\
\r
649 y <= a /\ z <= a `, REWRITE_TAC[max_real3; MAX_REAL_LESS_EX] THEN MESON_TAC[]);;
\r
653 (P x y z <=> P y x z) /\
\r
654 (P x y z <=> P x z y) /\
\r
655 (Q x y z <=> Q y x z) /\
\r
656 (Q x y z <=> Q x z y)) /\
\r
657 (!x y z. P x y z ==> Q x y z)
\r
658 ==> (!x y z. P x y z ==> Q x y z /\ Q y x z /\ Q z x y)`;;
\r
661 let UPS_X_SYM = prove(` ! x y z. ups_x x y z = ups_x y x z /\
\r
662 ups_x x y z = ups_x x z y `, REWRITE_TAC[ups_x] THEN REAL_ARITH_TAC);;
\r
664 let PER_MUL3 = REAL_ARITH ` a*b*c = b * a * c /\ a *b *c = a * c * b `;;
\r
666 let ETA_X_SYM = prove(` ! x y z. &0 <= x /\ &0 <= y /\ &0 <= z /\ &0 <= ups_x x y z ==>
\r
667 eta_x x y z = eta_x y x z /\ eta_x x y z = eta_x x z y `,
\r
668 REWRITE_TAC[eta_x] THEN
\r
669 NHANH (MESON[UPS_X_SYM]` &0 <= ups_x x y z ==> &0 <= ups_x y x z
\r
670 /\ &0 <= ups_x x z y `) THEN
\r
671 NHANH (MESON[REAL_LE_MUL]`&0 <= x /\ &0 <= y /\ &0 <= z /\ las ==>
\r
672 &0 <= x * y * z`) THEN
\r
673 PHA THEN NHANH (MESON[REAL_LE_DIV; REAL_ARITH ` a * b * c = b * a * c
\r
674 /\ a * b * c = a * c * b `]`
\r
675 &0 <= ups_x x y z /\ &0 <= aa /\ &0 <= bb /\ &0 <= x * y * z
\r
676 ==> &0 <= (x * y * z) / ups_x x y z /\
\r
677 &0 <= (y * x * z) / aa /\
\r
678 &0 <= (x * z * y) / bb`) THEN
\r
679 SIMP_TAC[SQRT_INJ] THEN
\r
680 MESON_TAC[UPS_X_SYM; PER_MUL3]);;
\r
682 let ETA_Y_SYM = prove(` ! x y z. &0 <= ups_x (x * x) (y * y) (z * z) ==>
\r
683 eta_y x y z = eta_y y x z /\ eta_y x y z = eta_y x z y `,
\r
684 REWRITE_TAC[eta_y] THEN REPEAT LET_TAC THEN MESON_TAC[ETA_X_SYM; REAL_LE_SQUARE]);;
\r
688 let ETA_Y_SYMM = MESON[UPS_X_SYM; ETA_Y_SYM]` ! x y z. &0 <= ups_x (x * x) (y * y) (z * z)
\r
689 ==> eta_y x y z = eta_y x z y /\
\r
690 eta_y x y z = eta_y y x z /\
\r
691 eta_y x y z = eta_y z x y /\
\r
692 eta_y x y z = eta_y y z x /\
\r
693 eta_y x y z = eta_y z y x`;;
\r
696 let IMPLY_POS = prove(`! x y z . &0 <= ups_x (x * x) (y * y) (z * z) ==>
\r
697 &0 <= ((z * z) * (x * x) * y * y) / ups_x (z * z) (x * x) (y * y) /\
\r
698 &0 <= ((x * x) * (y * y) * z * z) / ups_x (x * x) (y * y) (z * z) /\
\r
699 &0 <= ((y * y) * (z * z) * x * x) / ups_x (y * y) (z * z) (x * x) `, MP_TAC
\r
700 REAL_LE_SQUARE THEN MP_TAC REAL_LE_MUL THEN MESON_TAC[UPS_X_SYM; REAL_LE_DIV]);;
\r
702 let POW2_COND = MESON[REAL_ABS_REFL; REAL_LE_SQUARE_ABS]` ! a b. &0 <= a /\ &0 <= b ==>
\r
703 ( a <= b <=> a pow 2 <= b pow 2 ) `;;
\r
706 let TRUONGG = prove(`! x y z. &0 < ups_x_pow2 z x y ==>
\r
707 ((z * z) * (x * x) * y * y) / ups_x (z * z) (x * x) (y * y) -
\r
708 z pow 2 / &4 = ( z pow 2 * (( z pow 2 - x pow 2 - y pow 2 ) pow 2 ))
\r
709 / (&4 * ups_x_pow2 z x y )`,
\r
710 REWRITE_TAC[ups_x; ups_x_pow2] THEN CONV_TAC REAL_FIELD);;
\r
712 let RE_TRUONGG = REWRITE_RULE[GSYM ups_x_pow2] TRUONGG;;
\r
714 let HVXIKHW = prove(` !x y z.
\r
715 &0 <= x /\ &0 <= y /\ &0 <= z /\ &0 < ups_x_pow2 x y z
\r
716 ==> max_real3 x y z / &2 <= eta_y x y z`,
\r
717 REWRITE_TAC[REAL_ARITH` a / &2 <= b <=> a <= &2 * b `; MAX_REAL3_LESS_EX] THEN
\r
718 REWRITE_TAC[eta_x; ups_x_pow2] THEN
\r
719 NHANH (REAL_ARITH` &0 < a ==> &0 <= a `) THEN
\r
720 DAO THEN REPEAT GEN_TAC THEN
\r
721 REWRITE_TAC[MESON[ETA_Y_SYMM]` &0 <= ups_x (x * x) (y * y) (z * z) /\ las
\r
722 ==> z <= &2 * eta_y x y z /\ x <= &2 * eta_y x y z /\ y <= &2 * eta_y x y z
\r
723 <=> &0 <= ups_x (x * x) (y * y) (z * z) /\ las
\r
724 ==> z <= &2 * eta_y z x y /\ x <= &2 * eta_y x y z /\ y <= &2 * eta_y y z x`] THEN
\r
725 REWRITE_TAC[eta_y] THEN CONV_TAC (TOP_DEPTH_CONV let_CONV) THEN REWRITE_TAC[eta_x]
\r
726 THEN NHANH (SPEC_ALL IMPLY_POS) THEN
\r
727 NHANH (SPEC_ALL (prove(` ! a b x y. &0 <= a / b /\ &0 <= x /\ &0 <= y ==>
\r
728 &0 <= &2 * sqrt ( a/b) /\ &0 <= &2 * sqrt x /\ &0 <= &2 * sqrt y `,
\r
729 REWRITE_TAC[REAL_ARITH ` &0 <= &2 * a <=> &0 <= a `] THEN
\r
730 SIMP_TAC[SQRT_WORKS]))) THEN SIMP_TAC[POW2_COND] THEN
\r
731 REWRITE_TAC[REAL_ARITH ` x <= ( &2 * y ) pow 2 <=> x / &4 <= y pow 2 `] THEN
\r
732 SIMP_TAC[ SQRT_POW_2] THEN REWRITE_TAC[ GSYM ups_x_pow2] THEN
\r
733 REWRITE_TAC[REAL_FIELD` a / b <= c <=> &0 <= c - a / b `] THEN
\r
734 SIMP_TAC[ups_x_pow2; UPS_X_SYM; RE_TRUONGG] THEN DAO THEN
\r
735 MATCH_MP_TAC (MESON[]` (a4 ==> l) ==> (a1/\a2/\a3/\a4/\a5) ==> l `) THEN
\r
736 MP_TAC REAL_LE_SQUARE THEN MP_TAC REAL_LE_MUL THEN MP_TAC REAL_LE_DIV THEN
\r
737 REWRITE_TAC[GSYM REAL_POW_2] THEN MESON_TAC[REAL_ARITH ` &0 < a ==> &0 <= &4 * a `]);;
\r
740 let EXISTS_INV = REAL_FIELD` ~( a = &0 ) <=> a * &1 / a = &1 /\ &1 / a * a = &1 `;;
\r
743 let MIDDLE_POINT = prove(` ! x y (z:real^3) . collinear {x,y,z} ==> x IN conv {y,z} \/
\r
744 y IN conv {x,z} \/ z IN conv {x,y} `, REWRITE_TAC[COLLINEAR_EX] THEN REPEAT
\r
746 MATCH_MP_TAC (prove(`(!(a:real) (b:real) (c:real). P a b c <=> P (--a) (--b) (--c)) /\
\r
747 ((?a b c. &0 <= a /\ P a b c) ==> l) ==> ( ? a b c. P a b c ) ==> l `,
\r
748 DISCH_TAC THEN ASM_MESON_TAC[REAL_ARITH ` ! a. a <= &0 \/ &0 <= a`;
\r
749 REAL_ARITH ` a <= &0 <=> &0 <= -- a `])) THEN
\r
750 CONJ_TAC THENL [MESON_TAC[REAL_ARITH` a = &0 <=> -- a = &0 `; REAL_ARITH ` a + b + c = &0
\r
751 <=> --a + --b + --c = &0`; VECTOR_ARITH ` a % x + b % y + c % z = vec 0
\r
752 <=> --a % x + --b % y + --c % z = vec 0 `]; STRIP_TAC] THEN
\r
753 DISJ_CASES_TAC (REAL_ARITH ` &0 < b \/ b <= &0`) THENL
\r
754 [STRIP_TR THEN REWRITE_TAC[VECTOR_ARITH ` a + b + c % z = vec 0 <=>
\r
755 --c % z = a + b `] THEN
\r
756 NHANH (MESON[VECTOR_MUL_LCANCEL]` a % x = y ==> (&1 / a) % a % x = &1 / a % y `) THEN
\r
757 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC] THEN
\r
758 REWRITE_TAC[MESON[]` a1/\a2/\a3/\a4/\a5 ==> l <=> a1 /\ a5 /\ a2 ==>
\r
759 a3/\a4 ==> l `] THEN
\r
760 NHANH (REAL_FIELD ` &0 <= a /\ &0 < b /\ a + b + c = &0 ==>
\r
761 a / ( -- c ) + b /( -- c ) = &1 /\ ~ ( -- c = &0 )/\ &0 < -- c `) THEN
\r
762 SIMP_TAC[EXISTS_INV] THEN
\r
763 ONCE_REWRITE_TAC[MESON[POS_EQ_INV_POS]` a /\ &0 < c <=> a /\ &0 < &1 / c `] THEN
\r
764 REWRITE_TAC[VECTOR_MUL_LID; CONV_SET2; IN_ELIM_THM; GSYM (REAL_ARITH` a / b =
\r
765 &1 / b * a `)] THEN
\r
766 ONCE_REWRITE_TAC[REAL_ARITH` a / b = &1 / b * a `] THEN
\r
767 MP_TAC (GEN_ALL (MESON[REAL_ARITH`( a * &1 = a ) /\ ( &0 < a ==> &0 <= a )`;
\r
768 REAL_LE_MUL]` &0 < &1 / c * &1 /\ ( &0 <= a \/ &0 < a ) ==> &0 <= &1 / c * a `)) THEN
\r
769 MESON_TAC[]; STRIP_TR THEN
\r
770 NHANH (MESON[REAL_ARITH` &0 <= c \/ c <= &0`]` a + b + v = &0 ==>
\r
771 &0 <= v \/ v <= &0 `) THEN
\r
772 REWRITE_TAC[MESON[]` a1/\(a2 /\ (aa\/ bb))/\ dd <=>
\r
773 (aa\/bb) /\ a1/\a2/\dd`] THEN SPEC_TAC (`a:real`, `a:real`) THEN
\r
774 SPEC_TAC (`b:real`, `b:real`) THEN SPEC_TAC (`c:real`, `c:real`) THEN
\r
775 KHANANG THEN REWRITE_TAC[(prove( `&0 <= c /\ &0 <= a /\ a + b + c = &0 /\
\r
776 ~(a = &0 /\ b = &0 /\ c = &0) /\ a % x + b % y + c % z = vec 0 /\
\r
777 b <= &0 <=> --a <= &0 /\ &0 <= --b /\ --b + --c + --a = &0 /\
\r
778 ~(--b = &0 /\ --c = &0 /\ --a = &0) /\ --b % y + --c % z + -- a % x = vec 0 /\
\r
779 --c <= &0`, MESON_TAC[
\r
780 REAL_ARITH ` (a = &0 <=> --a = &0) /\ ( b <= &0 <=> &0 <= -- b ) /\
\r
781 (&0 <= a <=> --a <= &0) /\
\r
782 (a + b + c = &0 <=> --b + --c + -- a = &0)`;
\r
783 VECTOR_ARITH` a % x + b % y + c % z = vec 0 <=>
\r
784 --b % y + --c % z + --a % x = vec 0 `]))] THEN
\r
785 REWRITE_TAC[MESON[]` a \/ b ==> c <=> (a ==> c) /\(b==>c)`] THEN
\r
786 REWRITE_TAC[MESON[REAL_ARITH `&0 <= a <=> a = &0 \/ &0 < a `]`
\r
787 c <= &0 /\ &0 <= a /\ l <=> ( a = &0 \/ &0 < a ) /\ c <= &0 /\ l`] THEN
\r
789 REWRITE_TAC[MESON[REAL_ARITH `a = &0 /\ c <= &0 /\ a + b + c = &0 /\ b <= &0
\r
790 ==> a = &0 /\ b = &0 /\ c = &0`]`a = &0 /\ c <= &0 /\
\r
791 a + b + c = &0 /\ ~(a = &0 /\ b = &0 /\ c = &0) /\a2/\ b <= &0 <=> F `] THEN
\r
792 NHANH (MESON[REAL_FIELD ` &0 < a /\
\r
793 a + b + c = &0 ==> -- b / a + -- c / a = &1 `]`&0 < a /\ c <= &0 /\
\r
794 a + b + c = &0 /\ l ==> --b / a + --c / a = &1 `) THEN
\r
795 REWRITE_TAC[VECTOR_ARITH ` a % x + b % y + c % z = vec 0 <=>
\r
796 a % x = -- b % y + -- c % z `] THEN
\r
797 NHANH (MESON[VECTOR_MUL_LCANCEL]` a % x = y ==> &1 / a % a % x = &1 / a % y `) THEN
\r
798 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH ` &1 / a * b
\r
799 = b / a `;VECTOR_MUL_LID ] THEN PHA THEN
\r
800 PURE_ONCE_REWRITE_TAC[MESON[REAL_FIELD ` &0 < a ==> a / a = &1`]`
\r
801 &0 < a /\ P ( a / a) <=> &0 < a /\ P ( &1 ) `] THEN
\r
802 REWRITE_TAC[VECTOR_MUL_LID ] THEN
\r
803 REWRITE_TAC[MESON[SET_RULE ` {a,b} = {b,a}`]` y IN conv {x, z} \/ z IN conv {x, y}
\r
804 <=> y IN conv {z,x} \/ z IN conv {x,y} `] THEN
\r
805 REWRITE_TAC[CONV_SET2; IN_ELIM_THM] THEN
\r
806 REWRITE_TAC[ REAL_ARITH ` a <= &0 <=> &0 <= -- a `] THEN
\r
807 MESON_TAC[REAL_LE_DIV; REAL_ARITH ` &0 < a ==> &0 <= a `]]);;
\r
810 let REAL_SQRTSOSFIELD =
\r
811 let inv_tm = `inv:real->real`
\r
812 and sqrt_tm = `sqrt:real->real` in
\r
814 TOP_DEPTH_CONV BETA_CONV THENC
\r
815 PURE_REWRITE_CONV[FORALL_SIMP; EXISTS_SIMP; real_div;
\r
816 REAL_INV_INV; REAL_INV_MUL; GSYM REAL_POW_INV] THENC
\r
817 NNFC_CONV THENC DEPTH_BINOP_CONV `(/\)` CONDS_CELIM_CONV THENC
\r
819 and setup_conv = NNF_CONV THENC WEAK_CNF_CONV THENC CONJ_CANON_CONV
\r
822 with Failure _ -> try REAL_RING t
\r
823 with Failure _ -> REAL_SOS t
\r
825 let is_div = is_binop `(/):real->real->real` in
\r
826 fun tm -> (is_div tm or (is_comb tm & rator tm = inv_tm)) &
\r
827 not(is_ratconst(rand tm))
\r
828 and is_sqrt tm = is_comb tm & rator tm = sqrt_tm in
\r
829 let SQRT_HYP_THM = prove
\r
830 (`!x. &0 <= x ==> &0 <= sqrt x /\ (sqrt x) * (sqrt x) = x`,
\r
831 MESON_TAC[SQRT_POS_LE; SQRT_POW_2; REAL_POW_2]) in
\r
832 let BASIC_REAL_FIELD tm =
\r
833 let is_freeinv t = is_inv t & free_in t tm
\r
834 and is_freesqrt t = is_sqrt t & free_in t tm in
\r
835 let itms = setify(map rand (find_terms is_freeinv tm)) in
\r
836 let hyps = map (fun t -> SPEC t REAL_MUL_RINV) itms in
\r
837 let tm' = itlist (fun th t -> mk_imp(concl th,t)) hyps tm in
\r
838 let itms' = map (curry mk_comb inv_tm) itms in
\r
839 let gvs = map (genvar o type_of) itms' in
\r
840 let tm'' = subst (zip gvs itms') tm' in
\r
841 let stms = setify(map rand (find_terms is_freesqrt tm'')) in
\r
842 let syps = map (fun t -> SPEC t SQRT_HYP_THM) stms in
\r
843 let tm''' = itlist (fun th t -> mk_imp(concl th,t)) syps tm'' in
\r
844 let stms' = map (curry mk_comb sqrt_tm) stms in
\r
845 let hvs = map (genvar o type_of) stms' in
\r
846 let tm'''' = subst (zip hvs stms') tm''' in
\r
847 let th1 = setup_conv tm'''' in
\r
848 let cjs = conjuncts(rand(concl th1)) in
\r
849 let ths = map core_rule cjs in
\r
850 let th2 = EQ_MP (SYM th1) (end_itlist CONJ ths) in
\r
851 rev_itlist (C MP) (syps @ hyps)
\r
852 (INST (zip itms' gvs @ zip stms' hvs) th2) in
\r
854 let th0 = prenex_conv tm in
\r
855 let tm0 = rand(concl th0) in
\r
856 let avs,bod = strip_forall tm0 in
\r
857 let th1 = setup_conv bod in
\r
858 let ths = map BASIC_REAL_FIELD (conjuncts(rand(concl th1))) in
\r
859 EQ_MP (SYM th0) (GENL avs (EQ_MP (SYM th1) (end_itlist CONJ ths)));;
\r
862 let IN_CONV_COLLINEAR = prove(` ! (v:real^3) v1 v2. v IN conv {v1,v2} ==>
\r
863 collinear {v,v1,v2} `, REWRITE_TAC[COLLINEAR_EX] THEN
\r
864 REWRITE_TAC[COLLINEAR_EX; CONV_SET2; IN_ELIM_THM] THEN
\r
865 REWRITE_TAC[VECTOR_ARITH ` v = a % v1 + b % v2 <=>
\r
866 &1 % v + -- a % v1 + -- b % v2 = vec 0 `] THEN
\r
867 MESON_TAC[REAL_ARITH `~ ( &1 = &0 ) /\ (a + b = &1 <=> &1 + --a + --b = &0 )`]);;
\r
869 let COLLINERA_AS_IN_CONV2 = prove(` ! x y (z:real^3) . collinear {x,y,z} <=>
\r
870 x IN conv {y,z} \/
\r
871 y IN conv {x,z} \/ z IN conv {x,y}`,
\r
872 MESON_TAC[PER_SET3; IN_CONV_COLLINEAR; MIDDLE_POINT]);;
\r
875 let LENGTH_EQ_EX = prove(`!v v1 v2.
\r
876 dist (v1,v) + dist (v,v2) = dist (v1,v2) <=>
\r
877 ~(dist (v1,v2) < dist (v1,v) + dist (v,v2))`,
\r
878 REPEAT GEN_TAC THEN
\r
879 REWRITE_TAC[REAL_ARITH ` ~( a < b) <=> b <= a `] THEN
\r
880 EQ_TAC THENL [REAL_ARITH_TAC;
\r
881 NHANH (MESON[DIST_TRIANGLE]` dist (v1,v) + dist (v,v2) <= dist (v1,v2)
\r
882 ==> dist(v1,v2) <= dist (v1,v) + dist (v,v2)`) THEN
\r
886 let BETWEEN_IMP_IN_CONVEX_HULL = new_axiom` !v v1 v2. dist(v1,v) + dist(v,v2) =
\r
888 ==> (?a b. &0 <= a /\ &0 <= b /\ a + b = &1 /\ v = a % v1 + b % v2)`;;
\r
889 (* HARRISON have proved this lemma as following, but it must be loaded after convex.ml *)
\r
890 (* let BETWEEN_IFF_IN_CONVEX_HULL = prove
\r
892 dist(v1,v) + dist(v,v2) = dist(v1,v2) <=> v IN convex hull {v1,v2}`,
\r
893 REPEAT GEN_TAC THEN ASM_CASES_TAC `v1:real^N = v2` THENL
\r
894 [ASM_REWRITE_TAC[INSERT_AC; CONVEX_HULL_SING; IN_SING] THEN NORM_ARITH_TAC;
\r
895 REWRITE_TAC[CONVEX_HULL_2_ALT; IN_ELIM_THM] THEN EQ_TAC THENL
\r
896 [DISCH_TAC THEN EXISTS_TAC `dist(v1:real^N,v) / dist(v1,v2)` THEN
\r
897 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; DIST_POS_LT] THEN CONJ_TAC
\r
898 THENL [FIRST_ASSUM(SUBST1_TAC o SYM) THEN NORM_ARITH_TAC; ALL_TAC] THEN
\r
899 MATCH_MP_TAC VECTOR_MUL_LCANCEL_IMP THEN
\r
900 EXISTS_TAC `dist(v1:real^N,v2)` THEN
\r
901 ASM_SIMP_TAC[VECTOR_MUL_ASSOC; VECTOR_ADD_LDISTRIB; REAL_SUB_LDISTRIB;
\r
902 REAL_DIV_LMUL; DIST_EQ_0] THEN
\r
903 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [DIST_TRIANGLE_EQ] o SYM) THEN
\r
904 FIRST_ASSUM(SUBST1_TAC o SYM) THEN
\r
905 REWRITE_TAC[dist; REAL_ARITH `(a + b) * &1 - a = b`] THEN
\r
907 STRIP_TAC THEN ASM_REWRITE_TAC[dist] THEN
\r
908 REWRITE_TAC[VECTOR_ARITH `a - (a + b:real^N) = --b`;
\r
909 VECTOR_ARITH `(a + u % (b - a)) - b = (&1 - u) % (a - b)`;
\r
910 NORM_NEG; NORM_MUL; GSYM REAL_ADD_LDISTRIB] THEN
\r
911 REWRITE_TAC[NORM_SUB] THEN REPEAT(POP_ASSUM MP_TAC) THEN
\r
912 CONV_TAC REAL_FIELD]]);;
\r
914 From this, your version follows easily:
\r
916 let BETWEEN_IMP_IN_CONVEX_HULL = prove
\r
917 (`!v v1 v2. dist(v1,v) + dist(v,v2) = dist(v1,v2)
\r
918 ==> (?a b. &0 <= a /\ &0 <= b /\ a + b = &1 /\
\r
919 v = a % v1 + b % v2)`,
\r
920 REWRITE_TAC[BETWEEN_IFF_IN_CONVEX_HULL; CONVEX_HULL_2; IN_ELIM_THM] THEN
\r
921 REWRITE_TAC[CONJ_ASSOC]);;
\r
926 let PRE_HE = prove(` ! x y z. let p = ( x + y + z ) / &2 in
\r
927 ups_x_pow2 x y z = &16 * p * ( p - x ) * ( p - y ) * ( p - z ) `,
\r
928 CONV_TAC (TOP_DEPTH_CONV let_CONV) THEN
\r
929 REWRITE_TAC[ups_x_pow2; ups_x] THEN REAL_ARITH_TAC);;
\r
931 let PRE_HER = prove(`!x y z.
\r
935 ((x + y + z) / &2 - x) *
\r
936 ((x + y + z) / &2 - y) *
\r
937 ((x + y + z) / &2 - z)`,
\r
938 REWRITE_TAC[ups_x_pow2; ups_x] THEN REAL_ARITH_TAC);;
\r
941 let TRIVIVAL_LE = prove(`!v1 v2 v3.
\r
942 ~(v2 = v3 /\ v1 = v2)
\r
943 ==> ~(dist (v1,v2) + dist (v1,v3) + dist (v2,v3) = &0)`,
\r
944 SIMP_TAC[DE_MORGAN_THM; DIST_NZ] THEN
\r
945 NHANH (MESON[DIST_POS_LE]`&0 < dist (v2,v3) \/ &0 < dist (v1,v2) ==>
\r
946 &0 <= dist(v1,v3) `) THEN MP_TAC DIST_POS_LE THEN KHANANG THEN
\r
947 REWRITE_TAC[OR_IMP_EX] THEN
\r
948 NHANH (MESON[DIST_POS_LE]`&0 < dist (v2,v3) /\ &0 <= dist (v1,v3)
\r
949 ==> &0 <= dist(v1,v2) `) THEN
\r
950 SIMP_TAC[REAL_ARITH`( &0 < a /\ &0 <= b ) /\ &0 <= c ==> ~(c + b + a = &0 ) `] THEN
\r
951 NHANH (MESON[DIST_POS_LE]`&0 < dist (v1,v2) /\ &0 <= dist (v1,v3) ==>
\r
952 &0 <= dist(v2,v3) `) THEN
\r
953 MESON_TAC[REAL_ARITH ` &0 < a /\ &0 <= b /\ &0 <= c ==> ~( a + b + c = &0 ) `]);;
\r
957 let MID_COND = prove(` ! v v1 v2. v IN conv {v1,v2} <=> dist(v1,v) + dist(v,v2)
\r
958 = dist(v1,v2) `, REPEAT GEN_TAC THEN EQ_TAC THENL [MESON_TAC[LENGTH_EQUA; DIST_SYM];
\r
959 REWRITE_TAC[CONV_SET2; IN_ELIM_THM] THEN
\r
960 MESON_TAC[DIST_SYM; BETWEEN_IMP_IN_CONVEX_HULL]]);;
\r
963 (* lemma 9. p 13 *)
\r
964 let FHFMKIY = prove(`!(v1:real^3) v2 v3 x12 x13 x23.
\r
965 x12 = dist (v1,v2) pow 2 /\
\r
966 x13 = dist (v1,v3) pow 2 /\
\r
967 x23 = dist (v2,v3) pow 2
\r
968 ==> (collinear {v1, v2, v3} <=> ups_x x12 x13 x23 = &0)`,
\r
969 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[] THEN REWRITE_TAC[COLLINERA_AS_IN_CONV2]
\r
970 THEN REWRITE_TAC[REAL_ARITH ` x pow 2 = x * x `; GSYM ups_x_pow2] THEN
\r
971 REWRITE_TAC[PRE_HER] THEN REWRITE_TAC[REAL_ENTIRE] THEN
\r
972 ONCE_REWRITE_TAC[MESON[]`( v1 IN conv {v2, v3} \/ a \/ b <=> l ) <=>
\r
973 (v1 = v2 /\ v1 = v3 ) \/ ~(v1 = v2 /\ v1 = v3) ==> ( v1 IN conv {v2, v3}
\r
974 \/ a \/ b <=> l )`] THEN REWRITE_TAC[OR_IMP_EX] THEN
\r
975 SIMP_TAC[DIST_SYM; DIST_REFL; MESON[]` a= b/\ a= c <=> b = c /\ a= b`] THEN
\r
976 SIMP_TAC[SET_RULE ` {a,a} = {a} /\ a IN {a} `; CONV_SING;
\r
977 REAL_ARITH ` (&0 + &0 + &0)/ &2 = &0 `] THEN SIMP_TAC[ TRIVIVAL_LE;
\r
978 REAL_ARITH `~( &16 = &0) /\(~( a = &0) ==> ~( a / &2 = &0))`] THEN
\r
979 REWRITE_TAC[REAL_ARITH ` (a+ b + c ) / &2 - a = &0 <=> b + c = a `] THEN
\r
980 REWRITE_TAC[REAL_ARITH ` (a+ b + c ) / &2 - b = &0 <=> c + a = b `] THEN
\r
981 REWRITE_TAC[REAL_ARITH ` (a+ b + c ) / &2 - c = &0 <=> a + b = c `] THEN
\r
982 REWRITE_TAC[MESON[SET_RULE `{a,b} = {b,a} `]`v2 IN conv {v1, v3} \/ v3 IN
\r
983 conv {v1, v2} <=> v2 IN conv {v3,v1} \/ v3 IN conv {v1, v2}`] THEN
\r
984 REWRITE_TAC[MID_COND] THEN MESON_TAC[DIST_SYM]);;
\r
987 (* NGUYEN QUANG TRUONG *)
\r
990 (* These following lemma are Multivariate/convex.ml *)
\r
991 let AFFINE_HULL_EXPLICIT = new_axiom`
\r
992 !p. affine hull p =
\r
998 vsum s (\v. u v % v) = y}` ;;
\r
1000 let affine_dependent = new_definition
\r
1001 `affine_dependent (s:real^N -> bool) <=>
\r
1002 ?x. x IN s /\ x IN (affine hull (s DELETE x))`;;
\r
1004 let AFFINE_DEPENDENT_EXPLICIT_FINITE = new_axiom
\r
1005 `!s. FINITE(s:real^N -> bool)
\r
1006 ==> (affine_dependent s <=>
\r
1007 ?u. sum s u = &0 /\
\r
1008 (?v. v IN s /\ ~(u v = &0)) /\
\r
1009 vsum s (\v. u v % v) = vec 0)`;;
\r
1011 let AFFINE_HULL_FINITE = prove
\r
1012 (`!s:real^N->bool.
\r
1014 ==> affine hull s = {y | ?u. sum s u = &1 /\ vsum s (\v. u v % v) = y}`,
\r
1015 GEN_TAC THEN DISCH_TAC THEN
\r
1016 REWRITE_TAC[EXTENSION; AFFINE_HULL_EXPLICIT; IN_ELIM_THM] THEN
\r
1017 X_GEN_TAC `x:real^N` THEN EQ_TAC THEN REWRITE_TAC[LEFT_IMP_EXISTS_THM] THENL
\r
1018 [MAP_EVERY X_GEN_TAC [`t:real^N->bool`; `f:real^N->real`] THEN
\r
1020 EXISTS_TAC `\x:real^N. if x IN t then f x else &0` THEN
\r
1021 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
\r
1022 ONCE_REWRITE_TAC[COND_RATOR] THEN REWRITE_TAC[VECTOR_MUL_LZERO] THEN
\r
1023 ASM_SIMP_TAC[GSYM VSUM_RESTRICT_SET; GSYM SUM_RESTRICT_SET] THEN
\r
1024 ASM_SIMP_TAC[SET_RULE `t SUBSET s ==> {x | x IN s /\ x IN t} = t`];
\r
1025 X_GEN_TAC `f:real^N->real` THEN
\r
1026 ASM_CASES_TAC `s:real^N->bool = {}` THEN
\r
1027 ASM_REWRITE_TAC[SUM_CLAUSES; REAL_OF_NUM_EQ; ARITH] THEN STRIP_TAC THEN
\r
1028 MAP_EVERY EXISTS_TAC [`s:real^N->bool`; `f:real^N->real`] THEN
\r
1029 ASM_REWRITE_TAC[GSYM EXTENSION; SUBSET_REFL]]);;
\r
1031 let IN_AFFINE_HULL_IMP_COLLINEAR = prove
\r
1032 (`!a b c:real^N. a IN (affine hull {b,c}) ==> collinear {a,b,c}`,
\r
1033 REPEAT GEN_TAC THEN MAP_EVERY ASM_CASES_TAC
\r
1034 [`a:real^N = b`; `a:real^N = c`; `b:real^N = c`] THEN
\r
1035 TRY(ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_SING; COLLINEAR_2] THEN NO_TAC) THEN
\r
1036 SIMP_TAC[AFFINE_HULL_FINITE; FINITE_INSERT; FINITE_SING] THEN
\r
1037 SIMP_TAC[SUM_CLAUSES; VSUM_CLAUSES; FINITE_RULES; REAL_ADD_RID] THEN
\r
1038 ASM_REWRITE_TAC[IN_INSERT; IN_ELIM_THM; NOT_IN_EMPTY; VECTOR_ADD_RID] THEN
\r
1039 DISCH_THEN(X_CHOOSE_THEN `f:real^N->real` STRIP_ASSUME_TAC) THEN
\r
1040 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {c,b,a}`] THEN
\r
1041 ASM_REWRITE_TAC[COLLINEAR_3; COLLINEAR_LEMMA; VECTOR_SUB_EQ] THEN
\r
1042 EXISTS_TAC `(f:real^N->real) c` THEN EXPAND_TAC "a" THEN
\r
1043 FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP (REAL_ARITH
\r
1044 `b + c = &1 ==> b = &1 - c`)) THEN VECTOR_ARITH_TAC);;
\r
1047 let AFFINE_DEPENDENT_3_IMP_COLLINEAR = prove
\r
1048 (`!a b c:real^N. affine_dependent{a,b,c} ==> collinear{a,b,c}`,
\r
1049 REPEAT GEN_TAC THEN
\r
1050 MAP_EVERY ASM_CASES_TAC
\r
1051 [`a:real^N = b`; `a:real^N = c`; `b:real^N = c`] THEN
\r
1052 TRY(ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_SING; COLLINEAR_2] THEN NO_TAC) THEN
\r
1053 REWRITE_TAC[affine_dependent; IN_INSERT; NOT_IN_EMPTY] THEN STRIP_TAC THEN
\r
1054 FIRST_X_ASSUM SUBST_ALL_TAC THENL
\r
1056 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {b,a,c}`];
\r
1057 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {c,b,a}`]] THEN
\r
1058 MATCH_MP_TAC IN_AFFINE_HULL_IMP_COLLINEAR THEN
\r
1059 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (MESON[]
\r
1060 `x IN s ==> s = t ==> x IN t`)) THEN
\r
1061 AP_TERM_TAC THEN ASM SET_TAC[]);;
\r
1064 let FAFKVLR = prove
\r
1065 (`!v1 v2 v3 v:real^N.
\r
1066 ~collinear{v1,v2,v3} /\ v IN (affine hull {v1,v2,v3})
\r
1068 ==> ?t1 t2 t3. v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1069 t1 + t2 + t3 = &1 /\
\r
1070 !ta tb tc. v = ta % v1 + tb % v2 + tc % v3 /\
\r
1073 ==> ta = t1 /\ tb = t2 /\ tc = t3`,
\r
1074 REPEAT GEN_TAC THEN
\r
1075 MAP_EVERY ASM_CASES_TAC
\r
1076 [`v1:real^N = v2`; `v2:real^N = v3`; `v1:real^N = v3`] THEN
\r
1077 TRY(ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_SING; COLLINEAR_2] THEN NO_TAC) THEN
\r
1078 SIMP_TAC[AFFINE_HULL_FINITE; FINITE_INSERT; FINITE_SING; IN_ELIM_THM] THEN
\r
1079 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
\r
1080 SIMP_TAC[SUM_CLAUSES; VSUM_CLAUSES; FINITE_INSERT; FINITE_SING;
\r
1081 SUM_SING; VSUM_SING] THEN
\r
1082 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; LEFT_IMP_EXISTS_THM] THEN
\r
1083 X_GEN_TAC `f:real^N->real` THEN STRIP_TAC THEN
\r
1084 MAP_EVERY EXISTS_TAC
\r
1085 [`(f:real^N->real) v1`; `(f:real^N->real) v2`; `(f:real^N->real) v3`] THEN
\r
1086 ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN EXPAND_TAC "v" THEN
\r
1087 DISCH_TAC THEN MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN
\r
1088 UNDISCH_TAC `~collinear{v1:real^N,v2,v3}` THEN REWRITE_TAC[] THEN
\r
1089 MATCH_MP_TAC AFFINE_DEPENDENT_3_IMP_COLLINEAR THEN
\r
1090 SIMP_TAC[AFFINE_DEPENDENT_EXPLICIT_FINITE; FINITE_INSERT; FINITE_RULES;
\r
1091 SUM_CLAUSES; VSUM_CLAUSES] THEN
\r
1092 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
\r
1093 EXISTS_TAC `\x. if x = v1 then f v1 - ta
\r
1094 else if x = v2 then f v2 - tb
\r
1095 else (f:real^N->real) v3 - tc` THEN
\r
1096 ASM_REWRITE_TAC[REAL_ADD_RID; VECTOR_ADD_RID] THEN REPEAT CONJ_TAC THENL
\r
1097 [ASM_REAL_ARITH_TAC;
\r
1098 ASM_REWRITE_TAC[EXISTS_OR_THM; RIGHT_OR_DISTRIB; UNWIND_THM2] THEN
\r
1099 ASM_REWRITE_TAC[REAL_SUB_0] THEN ASM_MESON_TAC[];
\r
1100 ASM_REWRITE_TAC[VECTOR_ARITH
\r
1101 `(a - a') % x + (b - b') % y + (c - c') % z = vec 0 <=>
\r
1102 a % x + b % y + c % z = a' % x + b' % y + c' % z`] THEN
\r
1103 ASM_MESON_TAC[]]);;
\r
1107 let FAFKVLR_ALT = prove
\r
1108 (`!v1 v2 v3 v:real^N.
\r
1109 ~collinear{v1,v2,v3} /\ v IN (affine hull {v1,v2,v3})
\r
1110 ==> ?!(t1,t2,t3). v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1111 t1 + t2 + t3 = &1`,
\r
1112 REWRITE_TAC(map(REWRITE_RULE[ETA_AX])
\r
1113 [EXISTS_UNIQUE; FORALL_PAIR_THM; EXISTS_PAIR_THM]) THEN
\r
1114 REWRITE_TAC[PAIR_EQ; GSYM CONJ_ASSOC; FAFKVLR]);;
\r
1117 let equivalent_lemma = prove(` (?t1 t2 t3.
\r
1118 !v1 v2 v3 (v:real^N).
\r
1119 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
1121 t1 v1 v2 v3 v % v1 + t2 v1 v2 v3 v % v2 + t3 v1 v2 v3 v % v3 /\
\r
1122 t1 v1 v2 v3 v + t2 v1 v2 v3 v + t3 v1 v2 v3 v = &1 /\
\r
1124 v = ta % v1 + tb % v2 + tc % v3 /\ ta + tb + tc = &1
\r
1125 ==> ta = t1 v1 v2 v3 v /\
\r
1126 tb = t2 v1 v2 v3 v /\
\r
1127 tc = t3 v1 v2 v3 v)) <=>
\r
1129 ( !v1 v2 v3 (v:real^N).
\r
1130 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
1132 v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1133 t1 + t2 + t3 = &1 /\
\r
1135 v = ta % v1 + tb % v2 + tc % v3 /\ ta + tb + tc = &1
\r
1136 ==> ta = t1 /\ tb = t2 /\ tc = t3))) `,
\r
1137 REWRITE_TAC[GSYM SKOLEM_THM; LEFT_FORALL_IMP_THM; RIGHT_EXISTS_IMP_THM]);;
\r
1140 let LAMBDA_TRIPLED_THM = prove
\r
1141 (`!t. (\(x,y,z). t x y z) = (\p. t (FST p) (FST(SND p)) (SND(SND p)))`,
\r
1142 REWRITE_TAC[FUN_EQ_THM; FORALL_PAIR_THM]);;
\r
1144 let FORALL_TRIPLED_THM = prove
\r
1145 (`!P. (!(x,y,z). P x y z) <=> (!x y z. P x y z)`,
\r
1146 REWRITE_TAC[LAMBDA_TRIPLED_THM] THEN REWRITE_TAC[FORALL_PAIR_THM]);;
\r
1148 let EXISTS_TRIPLED_THM = prove
\r
1149 (`!P. (?(x,y,z). P x y z) <=> (?x y z. P x y z)`,
\r
1150 REWRITE_TAC[LAMBDA_TRIPLED_THM] THEN REWRITE_TAC[EXISTS_PAIR_THM]);;
\r
1152 let EXISTS_UNIQUE_TRIPLED_THM = prove
\r
1153 (`!P. (?!(x,y,z). P x y z) <=>
\r
1154 (?x y z. P x y z /\
\r
1155 (!x' y' z'. P x' y' z' ==> x' = x /\ y' = y /\ z' = z))`,
\r
1156 REWRITE_TAC[REWRITE_RULE[ETA_AX] EXISTS_UNIQUE] THEN
\r
1157 REWRITE_TAC[FORALL_TRIPLED_THM; EXISTS_TRIPLED_THM] THEN
\r
1158 REWRITE_TAC[EXISTS_PAIR_THM; FORALL_PAIR_THM; PAIR_EQ]);;
\r
1161 let theoremmm = prove
\r
1162 (`( !v1 v2 v3 v:real^N.
\r
1163 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
1165 v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1166 t1 + t2 + t3 = &1 /\
\r
1168 v = ta % v1 + tb % v2 + tc % v3 /\
\r
1170 ==> ta = t1 /\ tb = t2 /\ tc = t3)) )
\r
1172 ( !v1 v2 v3 v:real^N.
\r
1173 ~collinear {v1, v2, v3} /\ v IN affine hull {v1, v2, v3}
\r
1174 ==> (?!(t1,t2,t3). v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1175 t1 + t2 + t3 = &1))`,
\r
1176 REWRITE_TAC[EXISTS_UNIQUE_TRIPLED_THM] THEN REWRITE_TAC[CONJ_ACI]);;
\r
1181 let FAFKVLR = prove(` (?t1 t2 t3.
\r
1182 !v1 v2 v3 (v:real^N).
\r
1183 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
1185 t1 v1 v2 v3 v % v1 + t2 v1 v2 v3 v % v2 + t3 v1 v2 v3 v % v3 /\
\r
1186 t1 v1 v2 v3 v + t2 v1 v2 v3 v + t3 v1 v2 v3 v = &1 /\
\r
1188 v = ta % v1 + tb % v2 + tc % v3 /\ ta + tb + tc = &1
\r
1189 ==> ta = t1 v1 v2 v3 v /\
\r
1190 tb = t2 v1 v2 v3 v /\
\r
1191 tc = t3 v1 v2 v3 v)) `,
\r
1192 SIMP_TAC[equivalent_lemma; FAFKVLR]);;
\r
1193 let LEMMA11 = FAFKVLR;;
\r
1194 let lemma11 = REWRITE_RULE[equivalent_lemma] FAFKVLR;;
\r
1195 let COEFS = new_specification ["coef1"; "coef2"; "coef3"] FAFKVLR;;
\r
1197 let lem11 = REWRITE_RULE[simp_def2; IN_ELIM_THM] lemma11;;
\r
1199 let REAL_PER3 = REAL_ARITH `!a b c. a + b + c = b + a + c /\ a + b + c = c + b + a `;;
\r
1202 MESON[VEC_PER2_3]` (!ta tb tc.
\r
1203 v = ta % v1 + tb % v2 + tc % v3 ==> ta = t1 /\ tb = t2 /\ tc = t3) /\bbb/\
\r
1204 v = ta''' % v1 + tb''' % v2 + t''' % v3 /\
\r
1205 v = ta'' % v3 + tb'' % v1 + t'' % v2 /\
\r
1206 v = ta' % v2 + tb' % v3 + t' % v1 /\
\r
1207 aa ==> t' = t1 /\ t'' = t2 /\ t''' = t3 `;;
\r
1210 let IN_CONV3_EQ = prove(`! (v:real^3) v1 v2 v3. ~collinear {v1,v2,v3} ==> (v IN conv {v1, v2, v3} <=>
\r
1211 v IN aff_ge {v1,v2} {v3} /\
\r
1212 v IN aff_ge {v2,v3} {v1} /\ v IN aff_ge {v3,v1} {v2} )`,
\r
1213 REWRITE_TAC[CONV_SET3; simp_def2; IN_ELIM_THM] THEN
\r
1214 REPEAT GEN_TAC THEN DISCH_TAC THEN EQ_TAC THENL [
\r
1215 MESON_TAC[REAL_ARITH` a + b + c = b + a + c /\ a + b + c = c + b + a `;
\r
1216 VECTOR_ARITH `(a:real^N) + b + c = b + a + c /\ a + b + c = c + b + a `; lem11];
\r
1217 NHANH (MESON[]` (? a b c. P a b c /\ Q c /\ R a b c) /\ aa /\ bb ==>
\r
1218 (? a b c. P a b c /\ R a b c) `) THEN
\r
1219 FIRST_X_ASSUM MP_TAC THEN
\r
1220 REWRITE_TAC[IMP_IMP] THEN
\r
1221 REWRITE_TAC[MESON[]` ~a/\ b <=> b /\ ~ a `] THEN
\r
1223 NHANH (SPEC_ALL lem11) THEN
\r
1224 STRIP_TR THEN REWRITE_TAC[MESON[]` (v = w:real^N) /\ a <=> a /\ v = w `] THEN PHA] THEN
\r
1225 NHANH (MESON[VEC_PER2_3; REAL_PER3]` ta + tb + t = &1 /\
\r
1227 ta' + tb' + t' = &1 /\
\r
1229 ta'' + tb'' + t'' = &1 /\
\r
1233 t1 + t2 + t3 = &1 /\
\r
1235 ta + tb + tc = &1 /\ v = ta % v1 + tb % v2 + tc % v3
\r
1236 ==> ta = t1 /\ tb = t2 /\ tc = t3) /\
\r
1237 v = t1 % v1 + t2 % v2 + t3 % v3 /\
\r
1239 v = ta'' % v3 + tb'' % v1 + t'' % v2 /\
\r
1240 v = ta' % v2 + tb' % v3 + t' % v1 /\
\r
1241 v = ta % v1 + tb % v2 + t % v3 ==> t1 = t' /\ t2 = t'' /\ t3 = t`) THEN
\r
1245 let IN_CONV03_EQ = prove(
\r
1246 `! (v:real^3) v1 v2 v3. ~collinear {v1,v2,v3} ==>
\r
1247 (v IN conv0 {v1, v2, v3} <=> v IN aff_gt {v1,v2} {v3} /\
\r
1248 v IN aff_gt {v2,v3} {v1} /\ v IN aff_gt {v3,v1} {v2} )`,
\r
1249 REWRITE_TAC[CONV_SET3; simp_def2; IN_ELIM_THM] THEN
\r
1250 REPEAT GEN_TAC THEN DISCH_TAC THEN EQ_TAC THENL [
\r
1251 MESON_TAC[REAL_ARITH` a + b + c = b + a + c /\ a + b + c = c + b + a `;
\r
1252 VECTOR_ARITH `(a:real^N) + b + c = b + a + c /\ a + b + c = c + b + a `; lem11];
\r
1253 NHANH (MESON[]` (? a b c. P a b c /\ Q c /\ R a b c) /\ aa /\ bb ==>
\r
1254 (? a b c. P a b c /\ R a b c) `) THEN
\r
1255 FIRST_X_ASSUM MP_TAC THEN
\r
1256 REWRITE_TAC[IMP_IMP] THEN
\r
1257 REWRITE_TAC[MESON[]` ~a/\ b <=> b /\ ~ a `] THEN
\r
1259 NHANH (SPEC_ALL lem11) THEN
\r
1260 STRIP_TR THEN REWRITE_TAC[MESON[]` (v = w:real^N) /\ a <=> a /\ v = w `]]
\r
1261 THEN PHA THEN NHANH (MESON[VEC_PER2_3; REAL_PER3]`
\r
1262 ta + tb + t = &1 /\
\r
1264 ta' + tb' + t' = &1 /\
\r
1266 ta'' + tb'' + t'' = &1 /\
\r
1267 &0 < t'' /\ a33 /\ a22 /\
\r
1268 t1 + t2 + t3 = &1 /\
\r
1270 ta + tb + tc = &1 /\ v = ta % v1 + tb % v2 + tc % v3
\r
1271 ==> ta = t1 /\ tb = t2 /\ tc = t3) /\
\r
1272 v = t1 % v1 + t2 % v2 + t3 % v3 /\ a11 /\
\r
1273 v = ta'' % v3 + tb'' % v1 + t'' % v2 /\
\r
1274 v = ta' % v2 + tb' % v3 + t' % v1 /\
\r
1275 v = ta % v1 + tb % v2 + t % v3 ==>
\r
1276 t1 = t' /\ t2 = t'' /\ t3 = t `) THEN MESON_TAC[]);;
\r
1280 let AFFINE_SET_GEN_BY_TWO_POINTS =
\r
1281 prove(`! a b. affine {x | ?ta tb. ta + tb = &1 /\ x = ta % a + tb % b}`,
\r
1282 REWRITE_TAC[affine; IN_ELIM_THM] THEN
\r
1283 REPEAT GEN_TAC THEN
\r
1285 EXISTS_TAC ` u * ta + v * ta' ` THEN
\r
1286 EXISTS_TAC ` u * tb + v * tb' ` THEN
\r
1287 REWRITE_TAC[REAL_ARITH ` (u * ta + v * ta') + u * tb + v * tb' =
\r
1288 u * (ta + tb) + v * (ta' + tb' ) `] THEN
\r
1289 ASM_SIMP_TAC[REAL_ARITH ` a * &1 = a `] THEN
\r
1290 CONV_TAC VECTOR_ARITH);;
\r
1294 let GENERATING_POINT_IN_SET_AFF = prove(` ! a b. {a,b} SUBSET {x | ?ta tb.
\r
1295 ta + tb = &1 /\ x = ta % a + tb % b}`,REWRITE_TAC[SET2_SU_EX; IN_ELIM_THM]
\r
1296 THEN REPEAT GEN_TAC THEN
\r
1297 MESON_TAC[REAL_ARITH` &0 + &1 = &1 /\ a + b = b + a`; VECTOR_ARITH `
\r
1298 a = &0 % b + &1 % a /\ a = &1 % a + &0 % b `]);;
\r
1301 let AFF_2POINTS_INTERPRET = prove(`!a b. aff {a, b} = {x | ?ta tb. ta + tb = &1 /\ x = ta % a + tb % b}`,
\r
1302 REWRITE_TAC[aff; hull] THEN
\r
1303 REPEAT GEN_TAC THEN
\r
1304 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ] THEN
\r
1305 SIMP_TAC[INTERS_SUBSET; AFFINE_SET_GEN_BY_TWO_POINTS;
\r
1306 GENERATING_POINT_IN_SET_AFF] THEN
\r
1307 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
\r
1308 REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS; affine] THEN
\r
1312 let IN_AFF_GE_INTERPRET_TO_AFF_GT_AND_AFF = prove(` ! v v1 v2 v3 .
\r
1313 v IN aff_ge {v1,v2} {v3} <=> v IN aff_gt {v1,v2} {v3} \/
\r
1314 v IN aff {v1,v2} `,
\r
1315 REWRITE_TAC[simp_def2; AFF_2POINTS_INTERPRET; IN_ELIM_THM ] THEN
\r
1316 REWRITE_TAC [REAL_ARITH ` &0 <= a <=> &0 < a \/ a = &0 `] THEN
\r
1317 MESON_TAC[REAL_ARITH ` (&0 <= a <=> &0 < a \/ a = &0 )/\( a + &0 = a ) `;
\r
1318 VECTOR_ARITH ` a + &0 % c = a `]);;
\r
1320 let DOWN_TAC = REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[IMP_IMP] THEN PHA;;
\r
1321 let IMP_IMP_TAC = REWRITE_TAC[IMP_IMP] THEN PHA;;
\r
1324 let AFFINE_AFF_HULL = prove(` ! s. affine ( aff s ) `,
\r
1325 REWRITE_TAC[aff; AFFINE_AFFINE_HULL]);;
\r
1328 let AFFINE_CONTAIN_LINE = prove(`! a b s. affine s /\ {a,b} SUBSET s ==>
\r
1329 aff {a,b} SUBSET s `,
\r
1330 REWRITE_TAC[affine ; AFF_2POINTS_INTERPRET; IN_ELIM_THM] THEN SET_TAC[]);;
\r
1332 let VECTOR_SUB_DISTRIBUTE = VECTOR_ARITH ` ! a x y. a % x - a % y = a % ( x - y ) `;;
\r
1335 let CHANGE_SIDE = prove(` ~( a = &0 ) ==> ( x = a % y <=> ( &1 / a) % x = y )`,
\r
1336 MESON_TAC[ VECTOR_ARITH ` ( a * b ) % x = a % b % x `; VECTOR_MUL_LID;
\r
1337 REAL_FIELD `~( a = &0 ) ==> a * &1 / a = &1 `; VECTOR_MUL_LCANCEL]);;
\r
1340 let PRE_INVERSE_SUB = prove(` ! a b v w. {a, b} SUBSET aff {v, w} /\ ~(a = b)
\r
1341 ==> {v, w} SUBSET aff {a, b}`,
\r
1342 REWRITE_TAC[AFF_2POINTS_INTERPRET; SET2_SU_EX; IN_ELIM_THM] THEN
\r
1343 REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN
\r
1344 REWRITE_TAC[IMP_IMP] THEN PHA THEN
\r
1345 NHANH (MESON[]` (a:real^N) = b /\ gg /\ a' = b' /\ ll ==> a - a' = b - b' `) THEN
\r
1346 REWRITE_TAC[VECTOR_ARITH` (ta % v + tb % w) - (ta' % v + tb' % w) =
\r
1347 ( ta - ta') % v + ( tb - tb' ) % w `] THEN
\r
1348 PHA THEN REWRITE_TAC[MESON[]` a = &1 /\ b <=> b /\ a = &1 `] THEN PHA THEN
\r
1349 NHANH (REAL_ARITH ` ta + tb = &1 /\ ta' + tb' = &1 ==> ta' - ta = tb - tb' `) THEN
\r
1350 REWRITE_TAC[VECTOR_ARITH ` a + ( x - y ) % b = a - ( y - x) % b `] THEN
\r
1351 REWRITE_TAC[MESON[]` a - b = ta % v - tb % w /\aa/\
\r
1352 ta = tb <=> a - b = ta % v - ta % w /\ aa /\ ta = tb `] THEN
\r
1353 ASM_CASES_TAC `(ta:real) = ta' ` THENL [ASM_SIMP_TAC[REAL_SUB_REFL;
\r
1354 VECTOR_MUL_LZERO; VECTOR_SUB_RZERO; VECTOR_SUB_EQ] THEN MESON_TAC[]; ALL_TAC] THEN
\r
1355 REWRITE_TAC[VECTOR_SUB_DISTRIBUTE] THEN FIRST_X_ASSUM MP_TAC THEN
\r
1356 ONCE_REWRITE_TAC[REAL_ARITH` ~( a = b) <=> ~( a - b = &0 )`] THEN IMP_IMP_TAC THEN
\r
1357 REWRITE_TAC[MESON[]` ~( a = b:real) /\ l <=> l /\ ~(a = b) `; MESON[]`
\r
1358 a = d % b /\ l <=> l /\ a = d % b `] THEN PHA THEN
\r
1359 REWRITE_TAC[MESON[CHANGE_SIDE]` x = a % y /\ ~( a = &0 ) <=> &1 / a % x = y /\
\r
1360 ~( a = &0 )`] THEN NHANH (MESON[VECTOR_MUL_LCANCEL]` ta - ta' = tb' - tb /\
\r
1361 a = b /\ l ==> tb % a = tb % b /\ ta % a = ta % b `) THEN
\r
1362 ONCE_REWRITE_TAC[MESON[]` a = (b:real^n) /\ l <=> l /\ a = b `] THEN PHA
\r
1363 THEN REWRITE_TAC[GSYM VECTOR_SUB_DISTRIBUTE] THEN
\r
1364 ONCE_REWRITE_TAC[VECTOR_ARITH` a = (b:real^N) /\ a1 = (b1:real^N) /\ a2 =
\r
1365 (b2:real^N) <=> a2 = b2 /\ a + a2 = b + b2 /\ a2 - a1 = b2 - b1 `] THEN
\r
1366 REWRITE_TAC[VECTOR_ARITH` (ta % v + tb % w) - (ta % v - ta % w) = ( ta + tb ) % w `;
\r
1367 VECTOR_ARITH` tb % v - tb % w + ta % v + tb % w = ( ta + tb ) % v `] THEN
\r
1368 REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_ARITH` a - ( x % a - y % b ) =
\r
1369 (&1 - x ) % a + y % b `] THEN REWRITE_TAC[VECTOR_ARITH` a % x - b % y + x =
\r
1370 (a + &1 ) % x + --b % y `] THEN
\r
1371 REWRITE_TAC[MESON[]` a = &1 /\ b = &1 /\ l <=> a = &1 /\ l /\b = &1 `] THEN
\r
1372 DAO THEN MATCH_MP_TAC (MESON[]`( a1 /\a2/\a3/\a5 ==> l) ==>
\r
1373 (a1/\a2/\a3/\a4/\a5/\a6 ==> l ) `) THEN PURE_ONCE_REWRITE_TAC[ MESON[]`
\r
1374 a + b = &1 /\ P ( a + b ) <=> a + b = &1 /\ P (&1) `] THEN
\r
1375 REWRITE_TAC[VECTOR_MUL_LID] THEN MESON_TAC[REAL_FIELD ` ~(ta - ta' = &0)
\r
1376 ==> (tb * &1 / (ta - ta') + &1) + --(tb * &1 / (ta - ta')) = &1 /\
\r
1377 &1 - ta * &1 / (ta - ta') + ta * &1 / (ta - ta') = &1 `]);;
\r
1381 let LEMMA5 = prove(
\r
1382 `!(a:real^N) b x. line x /\ {a, b} SUBSET x /\ ~(a = b) ==> x = aff {a, b}`,
\r
1383 REWRITE_TAC[line; GSYM aff] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
\r
1384 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ] THEN ASM_SIMP_TAC[AFFINE_AFF_HULL;
\r
1385 AFFINE_CONTAIN_LINE] THEN STRIP_TR THEN
\r
1386 ABBREV_TAC ` (ki : bool ) = aff {(v:real^N), (w:real^N)}
\r
1387 SUBSET aff {(a:real^N), (b:real^N)}` THEN
\r
1388 REWRITE_TAC[MESON[]` a/\b/\c ==> d <=> b ==> a/\c ==> d `] THEN SIMP_TAC[]
\r
1389 THEN DISCH_TAC THEN IMP_IMP_TAC THEN
\r
1390 NHANH (MESON[PRE_INVERSE_SUB]`{a, b} SUBSET aff {v, w} /\ aa /\ ~(a = b)
\r
1391 ==> {v, w} SUBSET aff {a, b} `) THEN
\r
1392 NHANH (MESON[AFFINE_AFF_HULL]` aa /\ v SUBSET aff {a, b} ==> affine (aff {a,b})`)
\r
1393 THEN DOWN_TAC THEN MESON_TAC[AFFINE_CONTAIN_LINE]);;
\r
1395 let RCEABUJ = LEMMA5;;
\r
1398 let COL_EQ_UPS_0 = GEN_ALL (MESON[FHFMKIY]` collinear {(v1:real^3), v2, v3} <=>
\r
1399 ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) = &0`);;
\r
1403 let EQ_POW2_COND = prove(`!a b. &0 <= a /\ &0 <= b ==> (a = b <=> a pow 2 = b pow 2)`,
\r
1404 REWRITE_TAC[REAL_ARITH` a = b <=> a <= b /\ b <= a `] THEN SIMP_TAC[POW2_COND]);;
\r
1407 let D3_POS_LE = MESON[d3; DIST_POS_LE]` ! x y. &0 <= d3 x y `;;
\r
1410 let delta_x12 = new_definition ` delta_x12 x12 x13 x14 x23 x24 x34 =
\r
1411 -- x13 * x23 + -- x14 * x24 + x34 * ( -- x12 + x13 + x14 + x23 + x24 + -- x34 )
\r
1412 + -- x12 * x34 + x13 * x24 + x14 * x23 `;;
\r
1414 let delta_x13 = new_definition` delta_x13 x12 x13 x14 x23 x24 x34 =
\r
1415 -- x12 * x23 + -- x14 * x34 + x12 * x34 + x24 * ( x12 + -- x13 + x14 + x23 +
\r
1416 -- x24 + x34 ) + -- x13 * x24 + x14 * x23 `;;
\r
1418 let delta_x14 = new_definition`delta_x14 x12 x13 x14 x23 x24 x34 =
\r
1423 x23 * (x12 + x13 + --x14 + --x23 + x24 + x34) +
\r
1428 let DIST_POW2_DOT =
\r
1429 prove(` ! a (b:real^N) . dist (a,b) pow 2 = ( a - b ) dot ( a- b) `,
\r
1430 SIMP_TAC[dist; vector_norm; DOT_POS_LE; SQRT_WORKS]);;
\r
1434 (* the following lemma is in Multivariate/convex.ml *)
\r
1435 let AFFINE_HULL_3 = new_axiom` affine hull {a,b,c} =
\r
1436 { u % a + v % b + w % c | u + v + w = &1}`;;
\r
1439 let LET_TR = CONV_TAC (TOP_DEPTH_CONV let_CONV);;
\r
1443 (* lemma 16 SDIHJZK *)
\r
1445 let TO_UYCH = prove(` &0 < ups_x a12 a13 a23 ==>
\r
1446 delta_x12 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 +
\r
1447 delta_x13 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 +
\r
1448 delta_x14 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 =
\r
1450 REWRITE_TAC[ups_x; delta_x12; delta_x13; delta_x14] THEN CONV_TAC REAL_FIELD);;
\r
1455 let NOT_UPS_X_ZERO_IMP_SMT = prove(`~(ups_x a12 a13 a23 = &0)
\r
1456 ==> (delta_x13 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a12 +
\r
1457 delta_x13 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1458 delta_x14 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1459 (a12 + a13 - a23) +
\r
1460 (delta_x14 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a13
\r
1462 a01 - delta a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 /\
\r
1464 (delta_x14 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a23 +
\r
1465 delta_x14 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1466 delta_x12 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1467 (a23 + a12 - a13) +
\r
1468 (delta_x12 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a12
\r
1470 a02 - delta a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 /\
\r
1472 (delta_x12 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a13 +
\r
1473 delta_x12 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1474 delta_x13 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23 *
\r
1475 (a13 + a23 - a12) +
\r
1476 (delta_x13 a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23) pow 2 * a23 =
\r
1477 a03 - delta a01 a02 a03 a12 a13 a23 / ups_x a12 a13 a23`,
\r
1478 ONCE_REWRITE_TAC[REAL_FIELD` ~( a = &0 ) ==> ( x = y ) /\ ( xx = yy ) /\ ( xxx = yyy)
\r
1479 <=> ~( a = &0 ) ==> ( x * a pow 2 = y * a pow 2 ) /\
\r
1480 ( xx * a pow 2 = yy * a pow 2 ) /\
\r
1481 ( xxx * a pow 2 = yyy * a pow 2 ) `] THEN
\r
1482 SIMP_TAC[REAL_FIELD` ~( a = &0 ) ==> ( b - c / a ) * a pow 2 = b * a pow 2 - c * a `
\r
1483 ; REAL_ADD_RDISTRIB] THEN
\r
1484 SIMP_TAC[REAL_ARITH` ( a * b ) * c = a * b * c `;
\r
1485 REAL_FIELD` ~ ( a = &0 ) ==> ( b / a ) pow 2 * c * a pow 2 =
\r
1486 b pow 2 * c `; REAL_FIELD ` ~ ( a = &0 ) ==> b / a * c / a * d *
\r
1487 a pow 2 = b * c * d `] THEN DISCH_TAC THEN
\r
1488 REWRITE_TAC[delta_x12; delta_x13; delta_x14; delta; ups_x] THEN REAL_ARITH_TAC);;
\r
1491 let TROI_OI_DAT_HOI = MESON[ lemma8; dist; DIST_SYM]` &0 <=
\r
1492 ups_x ( dist((v1:real^3),v2) pow 2) (dist(v2,v3) pow 2)
\r
1493 (dist(v1,v3) pow 2)`;;
\r
1497 let ZERO_LE_UPS_X = MESON[TROI_OI_DAT_HOI; d3; DIST_SYM]`
\r
1498 &0 <= ups_x (d3 x y pow 2) (d3 x z pow 2) (d3 y z pow 2) `;;
\r
1501 let UPS_X_EQ_ZERO_COND = prove(` ! v1 v2 (v3: real^3). (collinear {v1, v2, v3} <=>
\r
1502 ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2)
\r
1503 (dist (v2,v3) pow 2) =
\r
1505 MP_TAC FHFMKIY THEN MESON_TAC[]);;
\r
1509 let NORM_POW2_SUM2 = prove(` norm ( a % x + b % y ) pow 2 =
\r
1510 a pow 2 * norm x pow 2 + &2 * ( a * b ) * ( x dot y ) +
\r
1511 b pow 2 * norm y pow 2 `, REWRITE_TAC[vector_norm] THEN
\r
1512 SIMP_TAC[DOT_POS_LE; SQRT_WORKS] THEN CONV_TAC VECTOR_ARITH);;
\r
1516 let X_DOT_X_EQ = prove( ` x dot x = norm x pow 2 `,
\r
1517 SIMP_TAC[vector_norm; DOT_POS_LE; SQRT_WORKS]);;
\r
1521 let SUB_DIST_POW2_INTERPRETE = prove(`! x y (v:real^N) c.
\r
1522 dist(x,v) pow 2 - dist(y,v) pow 2 = c <=>
\r
1523 ( &2 % v - ( x + y )) dot ( y - x ) = c `,
\r
1524 SIMP_TAC[DIST_POW2_DOT; DOT_SUB_ADD; VECTOR_ARITH`
\r
1525 (x - v - (y - v)) dot (x - v + y - v) = (&2 % v - (x + y)) dot (y - x) `]);;
\r
1528 let SDIHJZK = prove(`! (v1:real^3) v2 v3 (a01: real) a02 a03.
\r
1529 ~collinear {v1, v2, v3} /\
\r
1530 (let x12 = d3 v1 v2 pow 2 in
\r
1531 let x13 = d3 v1 v3 pow 2 in
\r
1532 let x23 = d3 v2 v3 pow 2 in delta a01 a02 a03 x12 x13 x23 = &0)
\r
1533 ==> (?!v0. a01 = d3 v0 v1 pow 2 /\
\r
1534 a02 = d3 v0 v2 pow 2 /\
\r
1535 a03 = d3 v0 v3 pow 2 /\
\r
1536 (let x12 = d3 v1 v2 pow 2 in
\r
1537 let x13 = d3 v1 v3 pow 2 in
\r
1538 let x23 = d3 v2 v3 pow 2 in
\r
1539 let vv = ups_x x12 x13 x23 in
\r
1540 let t1 = delta_x12 a01 a02 a03 x12 x13 x23 / vv in
\r
1541 let t2 = delta_x13 a01 a02 a03 x12 x13 x23 / vv in
\r
1542 let t3 = delta_x14 a01 a02 a03 x12 x13 x23 / vv in
\r
1543 v0 = t1 % v1 + t2 % v2 + t3 % v3 /\ t1 + t2 + t3 = &1 ))`,
\r
1544 REPEAT GEN_TAC THEN
\r
1547 REWRITE_TAC[EXISTS_UNIQUE] THEN
\r
1548 EXISTS_TAC ` delta_x12 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1549 (d3 v2 v3 pow 2) /
\r
1550 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1552 delta_x13 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1553 (d3 v2 v3 pow 2) /
\r
1554 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1556 delta_x14 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1557 (d3 v2 v3 pow 2) /
\r
1558 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1560 UNDISCH_TAC `~collinear {(v1:real^3), v2, v3}` THEN
\r
1561 MP_TAC (GEN_ALL ZERO_LE_UPS_X) THEN
\r
1562 REWRITE_TAC[UPS_X_EQ_ZERO_COND] THEN
\r
1563 REWRITE_TAC[MESON[]` a ==> b ==> c <=> a /\ b ==> c `; d3] THEN
\r
1564 NHANH (MESON[REAL_ARITH ` &0 <= a <=> &0 < a \/ a = &0 `]`
\r
1566 &0 <= ups_x (dist (x,y) pow 2) (dist (x,z) pow 2) (dist (y,z) pow 2)) /\
\r
1567 ~(ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) = &0)
\r
1568 ==> &0 < ups_x (dist ((v1:real^3),v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) `) THEN
\r
1569 REWRITE_TAC[ GSYM d3] THEN
\r
1573 UNDISCH_TAC ` &0 < ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2)` THEN
\r
1574 ABBREV_TAC ` a12 = d3 v1 v2 pow 2 ` THEN ABBREV_TAC ` a13 = d3 v1 v3 pow 2 ` THEN
\r
1575 ABBREV_TAC ` a23 = d3 v2 v3 pow 2 ` THEN SIMP_TAC[TO_UYCH] THEN
\r
1576 REWRITE_TAC[MESON[d3; dist] ` aa = d3 a b pow 2 <=> aa = norm ( a- b ) pow 2 `] THEN
\r
1577 ONCE_REWRITE_TAC[VECTOR_ARITH ` a - b = a - &1 % b `] THEN
\r
1578 NHANH (GSYM TO_UYCH) THEN SIMP_TAC[] THEN
\r
1579 SIMP_TAC[VECTOR_ARITH ` (a % v1 + b % v2 + c % v3) - (a + b + c) % v2 =
\r
1580 (b % v2 + c % v3 + a % v1) - (b + c + a) % v2 /\
\r
1581 (a % v1 + b % v2 + c % v3) - (a + b + c) % v3 =
\r
1582 (c % v3 + a % v1 + b % v2 ) - ( c + a + b ) % v3 `] THEN
\r
1583 REWRITE_TAC[VECTOR_ARITH` ( a % v1 + b % v2 + c % v3) -
\r
1584 ( a + b + c ) % v1 = b % ( v2 - v1 ) + c % ( v3 - v1 ) `] THEN
\r
1585 REWRITE_TAC[NORM_POW2_SUM2 ; REAL_ARITH ` &2 * ( a * b ) * c = a * b * &2 * c `] THEN
\r
1586 REWRITE_TAC[VECTOR_ARITH ` &2 * ( x dot y ) = x dot x + y dot y - ( x - y ) dot ( x - y ) `] THEN
\r
1587 REWRITE_TAC[VECTOR_ARITH` v1 - v3 - (v2 - v3) = (v1:real^3) - v2 `] THEN
\r
1588 REWRITE_TAC[X_DOT_X_EQ; GSYM dist; GSYM d3] THEN
\r
1589 SIMP_TAC[D3_SYM] THEN ASM_SIMP_TAC[] THEN STRIP_TAC THEN
\r
1590 UNDISCH_TAC ` ~(ups_x a12 a13 a23 = &0)` THEN NHANH NOT_UPS_X_ZERO_IMP_SMT THEN
\r
1591 ASM_SIMP_TAC[REAL_DIV_LZERO; REAL_SUB_RZERO];
\r
1596 let HALF_OF_LE16 = prove(` ! (v1:real^3) v2 v3 (a01: real) a02 a03.
\r
1597 ~collinear {v1, v2, v3} /\
\r
1598 (let x12 = d3 v1 v2 pow 2 in
\r
1599 let x13 = d3 v1 v3 pow 2 in
\r
1600 let x23 = d3 v2 v3 pow 2 in delta a01 a02 a03 x12 x13 x23 = &0)
\r
1601 ==> ?v0. (v0 IN aff {v1, v2, v3} /\
\r
1602 a01 = d3 v0 v1 pow 2 /\
\r
1603 a02 = d3 v0 v2 pow 2 /\
\r
1604 a03 = d3 v0 v3 pow 2 /\
\r
1605 (let x12 = d3 v1 v2 pow 2 in
\r
1606 let x13 = d3 v1 v3 pow 2 in
\r
1607 let x23 = d3 v2 v3 pow 2 in
\r
1608 let vv = ups_x x12 x13 x23 in
\r
1609 let t1 = delta_x12 a01 a02 a03 x12 x13 x23 / vv in
\r
1610 let t2 = delta_x13 a01 a02 a03 x12 x13 x23 / vv in
\r
1611 let t3 = delta_x14 a01 a02 a03 x12 x13 x23 / vv in
\r
1612 v0 = t1 % v1 + t2 % v2 + t3 % v3)) `,
\r
1613 REPEAT GEN_TAC THEN LET_TR THEN STRIP_TAC THEN REWRITE_TAC[EXISTS_UNIQUE] THEN
\r
1614 EXISTS_TAC ` delta_x12 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1615 (d3 v2 v3 pow 2) /
\r
1616 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1618 delta_x13 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1619 (d3 v2 v3 pow 2) /
\r
1620 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1622 delta_x14 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1623 (d3 v2 v3 pow 2) /
\r
1624 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1626 UNDISCH_TAC `~collinear {(v1:real^3), v2, v3}` THEN
\r
1627 MP_TAC (GEN_ALL ZERO_LE_UPS_X) THEN
\r
1628 REWRITE_TAC[UPS_X_EQ_ZERO_COND] THEN
\r
1629 REWRITE_TAC[MESON[]` a ==> b ==> c <=> a /\ b ==> c `; d3] THEN
\r
1630 NHANH (MESON[REAL_ARITH ` &0 <= a <=> &0 < a \/ a = &0 `]`
\r
1632 &0 <= ups_x (dist (x,y) pow 2) (dist (x,z) pow 2) (dist (y,z) pow 2)) /\
\r
1633 ~(ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) = &0)
\r
1634 ==> &0 < ups_x (dist ((v1:real^3),v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) `) THEN
\r
1635 REWRITE_TAC[ GSYM d3] THEN
\r
1637 UNDISCH_TAC ` &0 < ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2)` THEN
\r
1638 ABBREV_TAC ` a12 = d3 v1 v2 pow 2 ` THEN ABBREV_TAC ` a13 = d3 v1 v3 pow 2 ` THEN
\r
1639 ABBREV_TAC ` a23 = d3 v2 v3 pow 2 ` THEN SIMP_TAC[TO_UYCH] THEN
\r
1640 REWRITE_TAC[MESON[d3; dist] ` aa = d3 a b pow 2 <=> aa = norm ( a- b ) pow 2 `] THEN
\r
1641 ONCE_REWRITE_TAC[VECTOR_ARITH ` a - b = a - &1 % b `] THEN
\r
1642 NHANH (GSYM TO_UYCH) THEN SIMP_TAC[] THEN
\r
1643 SIMP_TAC[VECTOR_ARITH ` (a % v1 + b % v2 + c % v3) - (a + b + c) % v2 =
\r
1644 (b % v2 + c % v3 + a % v1) - (b + c + a) % v2 /\
\r
1645 (a % v1 + b % v2 + c % v3) - (a + b + c) % v3 =
\r
1646 (c % v3 + a % v1 + b % v2 ) - ( c + a + b ) % v3 `] THEN
\r
1647 REWRITE_TAC[VECTOR_ARITH` ( a % v1 + b % v2 + c % v3) -
\r
1648 ( a + b + c ) % v1 = b % ( v2 - v1 ) + c % ( v3 - v1 ) `] THEN
\r
1649 REWRITE_TAC[NORM_POW2_SUM2 ; REAL_ARITH ` &2 * ( a * b ) * c = a * b * &2 * c `] THEN
\r
1650 REWRITE_TAC[VECTOR_ARITH ` &2 * ( x dot y ) = x dot x + y dot y - ( x - y ) dot ( x - y ) `] THEN
\r
1651 REWRITE_TAC[VECTOR_ARITH` v1 - v3 - (v2 - v3) = (v1:real^3) - v2 `] THEN
\r
1652 REWRITE_TAC[X_DOT_X_EQ; GSYM dist; GSYM d3] THEN
\r
1653 SIMP_TAC[D3_SYM] THEN ASM_SIMP_TAC[] THEN STRIP_TAC THEN
\r
1654 UNDISCH_TAC ` ~(ups_x a12 a13 a23 = &0)` THEN NHANH NOT_UPS_X_ZERO_IMP_SMT THEN
\r
1655 ASM_SIMP_TAC[REAL_DIV_LZERO; REAL_SUB_RZERO] THEN
\r
1656 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM] THEN ASM_MESON_TAC[]);;
\r
1661 let EQ_SUB_DIST_POW2_IMP_IDENTIFIED = prove(` ! v1 v2 v3 (u:real^N) w.
\r
1662 {u,w} SUBSET affine hull {v1,v2,v3} /\
\r
1663 dist (u,v2) pow 2 - dist (u,v1) pow 2 = dist (w,v2) pow 2 - dist (w,v1) pow 2 /\
\r
1664 dist (u,v3) pow 2 - dist (u,v1) pow 2 = dist (w,v3) pow 2 - dist (w,v1) pow 2 ==>
\r
1666 REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
\r
1667 SIMP_TAC[SUB_DIST_POW2_INTERPRETE ] THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
1668 SIMP_TAC[SUB_DIST_POW2_INTERPRETE ] THEN
\r
1669 ONCE_REWRITE_TAC[REAL_ARITH` a = b <=> a - b = &0 `] THEN
\r
1670 SIMP_TAC[GSYM DOT_LSUB] THEN
\r
1671 SIMP_TAC[GSYM DOT_LSUB; VECTOR_ARITH` a - b - ( aa - b ) =
\r
1672 (a:real^N) - aa `; GSYM VECTOR_SUB_LDISTRIB; AFFINE_HULL_3;
\r
1673 SET2_SU_EX; IN_ELIM_THM] THEN STRIP_TAC THEN
\r
1674 REPEAT (FIRST_X_ASSUM MP_TAC ) THEN
\r
1675 REWRITE_TAC[MESON[]` a ==> b ==> c <=> b /\ a ==> c `] THEN
\r
1676 NHANH (MESON[]` a = (aa:real^N) /\ la /\ b = bb /\ lb ==>
\r
1677 a - b = aa - bb `) THEN
\r
1678 REWRITE_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `] THEN PHA THEN
\r
1679 STRIP_TAC THEN FIRST_X_ASSUM MP_TAC THEN UNDISCH_TAC`u' = &1 - (v + w')` THEN
\r
1680 UNDISCH_TAC`u'' = &1 - (v' + w'')` THEN SIMP_TAC[] THEN
\r
1681 SIMP_TAC[VECTOR_ARITH` ((&1 - (v' + w'')) % v1 + v' % v2 + w'' % v3) -
\r
1682 ((&1 - (v + w')) % v1 + v % v2 + w' % v3) =
\r
1683 ( v - v' ) % ( v1 - v2 ) + (w' - w'' ) % ( v1 - v3 ) `] THEN
\r
1684 REPEAT STRIP_TAC THEN
\r
1685 ONCE_REWRITE_TAC[VECTOR_ARITH ` a = b <=> b - a = vec 0` ] THEN
\r
1686 REWRITE_TAC[GSYM DOT_EQ_0] THEN FIRST_X_ASSUM MP_TAC THEN
\r
1687 REWRITE_TAC[MESON[]` a = b ==> a dot a = &0 <=> a = b ==>
\r
1688 a dot b = &0 `] THEN
\r
1689 REWRITE_TAC[DOT_RADD; DOT_RMUL; REAL_ARITH ` a * ( b dot c ) + aa * bb = &0
\r
1690 <=> a * &2 * ( b dot c ) + aa * &2 * bb = &0 `] THEN
\r
1691 ONCE_REWRITE_TAC[GSYM DOT_LMUL] THEN
\r
1692 ABBREV_TAC ` as = &2 % ((w:real^N) - u) dot (v1 - v2)` THEN
\r
1693 ABBREV_TAC ` bs = &2 % ((w:real^N) - u) dot (v1 - v3)` THEN
\r
1694 DISCH_TAC THEN ASM_SIMP_TAC[] THEN REAL_ARITH_TAC);;
\r
1696 (* lemma 16 SDIHJZK *)
\r
1698 let SDIHJZK = prove(`! (v1:real^3) v2 v3 (a01: real) a02 a03.
\r
1699 ~collinear {v1, v2, v3} /\
\r
1700 (let x12 = d3 v1 v2 pow 2 in
\r
1701 let x13 = d3 v1 v3 pow 2 in
\r
1702 let x23 = d3 v2 v3 pow 2 in delta a01 a02 a03 x12 x13 x23 = &0)
\r
1703 ==> (?v0. v0 IN aff {v1,v2,v3} /\
\r
1704 a01 = d3 v0 v1 pow 2 /\
\r
1705 a02 = d3 v0 v2 pow 2 /\
\r
1706 a03 = d3 v0 v3 pow 2 /\
\r
1707 (! vv0. vv0 IN aff {v1,v2,v3} /\
\r
1708 a01 = d3 vv0 v1 pow 2 /\
\r
1709 a02 = d3 vv0 v2 pow 2 /\
\r
1710 a03 = d3 vv0 v3 pow 2 ==> vv0 = v0 ) /\
\r
1711 (let x12 = d3 v1 v2 pow 2 in
\r
1712 let x13 = d3 v1 v3 pow 2 in
\r
1713 let x23 = d3 v2 v3 pow 2 in
\r
1714 let vv = ups_x x12 x13 x23 in
\r
1715 let t1 = delta_x12 a01 a02 a03 x12 x13 x23 / vv in
\r
1716 let t2 = delta_x13 a01 a02 a03 x12 x13 x23 / vv in
\r
1717 let t3 = delta_x14 a01 a02 a03 x12 x13 x23 / vv in
\r
1718 v0 = t1 % v1 + t2 % v2 + t3 % v3))`,
\r
1719 REPEAT GEN_TAC THEN NHANH (SPEC_ALL HALF_OF_LE16 ) THEN STRIP_TAC THEN
\r
1720 EXISTS_TAC `v0:real^3` THEN ASM_SIMP_TAC[] THEN
\r
1721 GEN_TAC THEN UNDISCH_TAC ` (v0:real^3) IN aff {v1, v2, v3}` THEN
\r
1722 ONCE_REWRITE_TAC[REAL_ARITH ` a1 = b1 /\ a2 = b2 /\ a3 = b3 <=>
\r
1723 a2 - a1 = b2 - b1 /\ a3 - a1 = b3 - b1 /\ a1 = b1 `] THEN
\r
1724 REWRITE_TAC[aff; SET2_SU_EX] THEN REWRITE_TAC[d3] THEN
\r
1725 PHA THEN MESON_TAC[SET2_SU_EX; EQ_SUB_DIST_POW2_IMP_IDENTIFIED]);;
\r
1729 let SDIHJZK_INTERPRETE = prove(`!(v1:real^3) v2 v3 a01 a02 a03.
\r
1730 ~collinear {v1, v2, v3} /\
\r
1731 delta a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) =
\r
1733 ==> (?v0. v0 IN aff {v1, v2, v3} /\
\r
1734 a01 = d3 v0 v1 pow 2 /\
\r
1735 a02 = d3 v0 v2 pow 2 /\
\r
1736 a03 = d3 v0 v3 pow 2 /\
\r
1737 (!vv0. vv0 IN aff {v1, v2, v3} /\
\r
1738 a01 = d3 vv0 v1 pow 2 /\
\r
1739 a02 = d3 vv0 v2 pow 2 /\
\r
1740 a03 = d3 vv0 v3 pow 2
\r
1743 delta_x12 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1744 (d3 v2 v3 pow 2) /
\r
1745 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1747 delta_x13 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1748 (d3 v2 v3 pow 2) /
\r
1749 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1751 delta_x14 a01 a02 a03 (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
1752 (d3 v2 v3 pow 2) /
\r
1753 ups_x (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) %
\r
1754 v3)`, MP_TAC SDIHJZK THEN LET_TR THEN SIMP_TAC[]);;
\r
1758 let DELTA_RRR_INTERPRETE = prove(` delta r r r a b c = -- a * b * c + r * ups_x a b c `,
\r
1759 REWRITE_TAC[delta; ups_x] THEN REAL_ARITH_TAC);;
\r
1762 let NOT_UPS_X_EQ_0_IMP = prove(` ~( ups_x a b c = &0 )
\r
1763 ==> delta ( ( a * b * c ) / ups_x a b c ) ( ( a * b * c ) / ups_x a b c )
\r
1764 ( ( a * b * c ) / ups_x a b c ) a b c = &0 `,
\r
1765 REWRITE_TAC[DELTA_RRR_INTERPRETE ] THEN CONV_TAC REAL_FIELD);;
\r
1770 let COL_EQ_UPS_0 = GEN_ALL (MESON[FHFMKIY]` collinear {(v1:real^3), v2, v3} <=>
\r
1771 ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) = &0`);;
\r
1774 (* CDEUSDF POST ZERO_LE_UPS_X *)
\r
1779 let PROVE_EXISTS_RADV = prove(`!(va:real^3) vb vc.
\r
1780 ~collinear {va, vb, vc}
\r
1781 ==> (?p. p IN affine hull {va, vb, vc} /\
\r
1782 (?c. ( !w. w IN {va, vb, vc} ==> c = dist (p,w)) /\
\r
1783 (!p'. p' IN affine hull {va, vb, vc} /\
\r
1784 ( !w. w IN {va, vb, vc} ==> c = dist (p',w))
\r
1786 REWRITE_TAC[COL_EQ_UPS_0] THEN
\r
1787 NHANH (NOT_UPS_X_EQ_0_IMP ) THEN
\r
1788 REWRITE_TAC[GSYM COL_EQ_UPS_0] THEN
\r
1789 REWRITE_TAC[GSYM d3] THEN
\r
1790 NHANH (SPEC_ALL SDIHJZK_INTERPRETE) THEN
\r
1791 REWRITE_TAC[EXISTS_UNIQUE] THEN
\r
1792 REPEAT STRIP_TAC THEN
\r
1793 ABBREV_TAC ` r = (d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1794 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) ` THEN
\r
1795 EXISTS_TAC ` v0 :real^3` THEN
\r
1796 UNDISCH_TAC ` (v0:real^3) IN aff {va, vb, vc}` THEN
\r
1797 SIMP_TAC[aff; SET_RULE ` (! x. x IN {a,b,c} ==> P x ) <=>
\r
1798 P a /\ P b /\ P c `] THEN
\r
1799 DISCH_TAC THEN EXISTS_TAC ` sqrt ( r ) ` THEN
\r
1800 UNDISCH_TAC ` (d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1801 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) = r` THEN
\r
1802 NHANH (MESON[REAL_LE_SQUARE_POW; REAL_LE_DIV; REAL_LE_MUL;
\r
1803 ZERO_LE_UPS_X ]` (d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1804 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) =
\r
1805 r ==> &0 <= r `) THEN
\r
1806 SIMP_TAC[SQRT_WORKS; EQ_POW2_COND; D3_POS_LE] THEN
\r
1807 ASM_MESON_TAC[aff]);;
\r
1812 let COND_FOR_CIRCUMCENTER_PROPERTIESS = prove(`~collinear {(v1:real^3), v2, v3}
\r
1813 ==> circumcenter {v1, v2, v3} IN affine hull {v1, v2, v3} /\
\r
1814 (?c. !v. v IN {v1, v2, v3} ==> c = dist (circumcenter {v1, v2, v3}, v))`,
\r
1815 NHANH (MESON[PROVE_EXISTS_RADV]`~collinear {(va:real^3), vb, vc}
\r
1816 ==> (?p. p IN affine hull {va, vb, vc} /\
\r
1817 (?c. (!w. w IN {va, vb, vc} ==> c = dist (p,w)))) `) THEN
\r
1818 REWRITE_TAC[IN; circumcenter] THEN MESON_TAC[EXISTS_THM]);;
\r
1821 let DELTA_X14_RRR = prove(` delta_x14 r r r a b c = a * ( b + c - a ) `,
\r
1822 REWRITE_TAC[delta_x14] THEN REAL_ARITH_TAC);;
\r
1825 let DELTA_X1I_RRR = prove(` delta_x12 r r r a b c = c * ( b + a - c ) /\
\r
1826 delta_x13 r r r a b c = b * ( c + a - b ) /\
\r
1827 delta_x14 r r r a b c = a * (c + b - a) `,
\r
1828 REWRITE_TAC[delta_x12; delta_x13; delta_x14] THEN REAL_ARITH_TAC);;
\r
1834 let PRE_RADV_COND = prove(` ~ collinear {va,vb,vc} ==>
\r
1835 (? c. ! w. {va,vb,(vc:real^3)} w ==> c = dist(circumcenter {va,vb,vc} , w )) `,
\r
1836 NHANH (COND_FOR_CIRCUMCENTER_PROPERTIESS ) THEN MESON_TAC[IN]);;
\r
1839 let NOT_COL_IMP_RADV_PROPERTIY = prove(` ~collinear {(va:real^3), vb, vc}
\r
1840 ==> ( ! w. {va, vb, vc} w ==>
\r
1841 radV {va, vb, vc} = dist (circumcenter {va, vb, vc},w)) `,
\r
1842 NHANH (PRE_RADV_COND ) THEN SIMP_TAC[EXISTS_THM; radV]);;
\r
1847 let CIRCUMCENTER_FORMULAR2 = prove(`! (va:real^3) vb vc a b c.
\r
1848 a = d3 vb vc /\ b = d3 va vc /\ c = d3 va vb /\ ~collinear {va, vb, vc}
\r
1851 (a pow 2 * (b pow 2 + c pow 2 - a pow 2)) /
\r
1852 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1854 (b pow 2 * (a pow 2 + c pow 2 - b pow 2)) /
\r
1855 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1857 (c pow 2 * (a pow 2 + b pow 2 - c pow 2)) /
\r
1858 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1859 al_a % va + al_b % vb + al_c % vc = circumcenter {va, vb, vc})`,
\r
1860 REWRITE_TAC[COL_EQ_UPS_0] THEN
\r
1861 NHANH (NOT_UPS_X_EQ_0_IMP) THEN
\r
1862 REWRITE_TAC[GSYM COL_EQ_UPS_0; GSYM d3] THEN
\r
1863 NHANH (SPEC_ALL SDIHJZK_INTERPRETE ) THEN
\r
1864 REPEAT STRIP_TAC THEN
\r
1865 ABBREV_TAC ` r = (d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1866 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) ` THEN
\r
1867 UNDISCH_TAC ` v0 =
\r
1868 delta_x12 r r r (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) /
\r
1869 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) %
\r
1871 delta_x13 r r r (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) /
\r
1872 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) %
\r
1874 delta_x14 r r r (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) /
\r
1875 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) %
\r
1878 UNDISCH_TAC ` a = d3 vb vc ` THEN
\r
1879 UNDISCH_TAC ` b = d3 va vc ` THEN
\r
1880 UNDISCH_TAC ` c = d3 va vb ` THEN
\r
1881 SIMP_TAC[DELTA_X1I_RRR] THEN
\r
1882 SIMP_TAC[MESON[UPS_X_SYM]` ups_x a b c = ups_x c b a `] THEN
\r
1883 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
1885 REPEAT STRIP_TAC THEN
\r
1886 UNDISCH_TAC ` ~collinear {(va:real^3), vb, vc} ` THEN
\r
1887 NHANH (COND_FOR_CIRCUMCENTER_PROPERTIESS) THEN
\r
1888 REWRITE_TAC[SET_RULE ` (! x. x IN {a,b,c} ==> P x )
\r
1889 <=> P a /\ P b /\ P c `] THEN
\r
1890 REWRITE_TAC[SET_RULE ` (! x. x IN {a,b,c} ==> P x )
\r
1891 <=> P a /\ P b /\ P c `; MESON[]` (? cc. cc = a /\ cc = b /\ cc = c)
\r
1892 <=> a = b /\ a = c `] THEN
\r
1893 UNDISCH_TAC ` v0 IN aff {va, vb, (vc:real^3)}` THEN
\r
1894 REWRITE_TAC[aff; SET_RULE ` a IN s ==> b /\ aa IN s /\ l ==>
\r
1895 ll <=> b ==> {a,aa} SUBSET s /\ l ==> ll `] THEN
\r
1897 UNDISCH_TAC` r = d3 v0 va pow 2 ` THEN
\r
1898 UNDISCH_TAC` r = d3 v0 vb pow 2 ` THEN
\r
1899 UNDISCH_TAC` r = d3 v0 vc pow 2 ` THEN
\r
1900 REWRITE_TAC[MESON[]` r = a1 ==> r = a2 ==> r = a3 ==> l ==> ll <=>
\r
1901 r = a1 /\ l /\ a2 = a3 /\ a1 = a3 ==> ll `;d3] THEN
\r
1902 ONCE_REWRITE_TAC[MESON[]` dist(a,b) = s <=> s = dist(a,b) `] THEN
\r
1903 SIMP_TAC[DIST_POS_LE; EQ_POW2_COND] THEN
\r
1904 ONCE_REWRITE_TAC[REAL_ARITH` a = b <=> a - b = &0 `] THEN
\r
1905 MESON_TAC[EQ_SUB_DIST_POW2_IMP_IDENTIFIED ]);;
\r
1910 let NOT_COLL_IMP_RADV_FORMULAR = prove(`! (va:real^3) vb vc a b c.
\r
1911 a = d3 vb vc /\ b = d3 va vc /\ c = d3 va vb /\ ~collinear {va, vb, vc}
\r
1912 ==> radV {va, vb, vc} = eta_y a b c`,
\r
1913 REWRITE_TAC[COL_EQ_UPS_0] THEN
\r
1914 NHANH (NOT_UPS_X_EQ_0_IMP) THEN
\r
1915 REWRITE_TAC[GSYM COL_EQ_UPS_0; GSYM d3] THEN
\r
1916 NHANH (SPEC_ALL SDIHJZK_INTERPRETE ) THEN
\r
1917 REPEAT STRIP_TAC THEN
\r
1918 ABBREV_TAC ` r = (d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1919 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2) ` THEN
\r
1921 UNDISCH_TAC ` a = d3 vb vc ` THEN
\r
1922 UNDISCH_TAC ` b = d3 va vc ` THEN
\r
1923 UNDISCH_TAC ` c = d3 va vb ` THEN
\r
1924 SIMP_TAC[DELTA_X1I_RRR] THEN
\r
1925 SIMP_TAC[MESON[UPS_X_SYM]` ups_x a b c = ups_x c b a `] THEN
\r
1926 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
1928 REPEAT STRIP_TAC THEN
\r
1929 UNDISCH_TAC ` ~collinear {(va:real^3), vb, vc} ` THEN
\r
1930 NHANH (COND_FOR_CIRCUMCENTER_PROPERTIESS) THEN
\r
1931 REWRITE_TAC[SET_RULE ` (! x. x IN {a,b,c} ==> P x )
\r
1932 <=> P a /\ P b /\ P c `] THEN
\r
1933 REWRITE_TAC[SET_RULE ` (! x. x IN {a,b,c} ==> P x )
\r
1934 <=> P a /\ P b /\ P c `; MESON[]` (? cc. cc = a /\ cc = b /\ cc = c)
\r
1935 <=> a = b /\ a = c `] THEN
\r
1936 UNDISCH_TAC ` v0 IN aff {va, vb, (vc:real^3)}` THEN
\r
1937 REWRITE_TAC[aff; SET_RULE ` a IN s ==> b /\ aa IN s /\ l ==>
\r
1938 ll <=> b ==> {a,aa} SUBSET s /\ l ==> ll `] THEN
\r
1940 UNDISCH_TAC` r = d3 v0 va pow 2 ` THEN
\r
1941 UNDISCH_TAC` r = d3 v0 vb pow 2 ` THEN
\r
1942 UNDISCH_TAC` r = d3 v0 vc pow 2 ` THEN
\r
1943 REWRITE_TAC[MESON[]` r = a1 ==> r = a2 ==> r = a3 ==> l ==> ll <=>
\r
1944 r = a1 /\ l /\ a2 = a3 /\ a1 = a3 ==> ll `;d3] THEN
\r
1945 ONCE_REWRITE_TAC[MESON[]` dist(a,b) = s <=> s = dist(a,b) `] THEN
\r
1946 SIMP_TAC[DIST_POS_LE; EQ_POW2_COND] THEN
\r
1947 ONCE_REWRITE_TAC[REAL_ARITH` a = b <=> a - b = &0 `] THEN
\r
1948 REWRITE_TAC[MESON[]` ( a /\ a1 = &0 /\ a2 = &0 ) /\ b1 = &0 /\ b2 = &0 <=>
\r
1949 b1 = &0 /\ b2 = &0 /\ a /\ b1 = a1 /\ b2 = a2 `] THEN
\r
1950 NHANH (SPEC_ALL EQ_SUB_DIST_POW2_IMP_IDENTIFIED ) THEN
\r
1952 UNDISCH_TAC ` ~collinear {(va:real^3), vb, vc}` THEN
\r
1953 NHANH (NOT_COL_IMP_RADV_PROPERTIY ) THEN
\r
1954 FIRST_X_ASSUM MP_TAC THEN
\r
1956 SIMP_TAC[SET_RULE ` (!w. {va, vb, vc} w ==> P w ) <=>
\r
1957 P va /\ P vb /\ P vc `] THEN
\r
1958 REPEAT STRIP_TAC THEN
\r
1959 EXPAND_TAC "a" THEN
\r
1960 EXPAND_TAC "b" THEN
\r
1961 EXPAND_TAC "c" THEN
\r
1962 UNDISCH_TAC ` r - dist ((v0:real^3),vc) pow 2 = &0 ` THEN
\r
1963 SIMP_TAC[REAL_ARITH` a - b = &0 <=> b = a `] THEN
\r
1964 EXPAND_TAC "r" THEN
\r
1965 REWRITE_TAC[eta_y; eta_x] THEN
\r
1967 MP_TAC (GEN_ALL ZERO_LE_UPS_X) THEN
\r
1968 SIMP_TAC[GSYM REAL_POW_2] THEN
\r
1969 SIMP_TAC[REAL_ARITH` a * b * c = c * b * a `;
\r
1970 UPS_X_SYM; d3] THEN
\r
1971 MP_TAC (MESON[d3; DIST_POS_LE]` &0 <= d3 v0 vc `) THEN
\r
1972 MP_TAC (MESON[REAL_LE_DIV; REAL_LE_MUL_EQ; REAL_LE_POW_2;REAL_LE_MUL; ZERO_LE_UPS_X;
\r
1973 SQRT_WORKS]` &0 <= ((d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1974 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2)) /\
\r
1975 &0 <= sqrt ((d3 va vb pow 2 * d3 va vc pow 2 * d3 vb vc pow 2) /
\r
1976 ups_x (d3 va vb pow 2) (d3 va vc pow 2) (d3 vb vc pow 2)) `) THEN
\r
1977 REWRITE_TAC[MESON[]` a ==> b ==> c <=> b /\ a ==> c `] THEN
\r
1978 MATCH_MP_TAC (MESON[]` (a1 /\ a3 ==> l) ==> a1 /\a2 /\a3 ==> l`) THEN
\r
1979 SIMP_TAC[d3; EQ_POW2_COND; SQRT_WORKS]);;
\r
1982 let CDEUSDF = prove(`!(va:real^3) vb vc a b c.
\r
1983 a = d3 vb vc /\ b = d3 va vc /\ c = d3 va vb /\ ~collinear {va, vb, vc}
\r
1984 ==> (?p. p IN affine hull {va, vb, vc} /\
\r
1985 (?c. ( !w. w IN {va, vb, vc} ==> c = dist (p,w)) /\
\r
1986 (!p'. p' IN affine hull {va, vb, vc} /\
\r
1987 ( !w. w IN {va, vb, vc} ==> c = dist (p',w))
\r
1990 (a pow 2 * (b pow 2 + c pow 2 - a pow 2)) /
\r
1991 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1993 (b pow 2 * (a pow 2 + c pow 2 - b pow 2)) /
\r
1994 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1996 (c pow 2 * (a pow 2 + b pow 2 - c pow 2)) /
\r
1997 (ups_x (a pow 2) (b pow 2) (c pow 2)) in
\r
1998 al_a % va + al_b % vb + al_c % vc = circumcenter {va, vb, vc}) /\
\r
1999 radV {va, vb, vc} = eta_y a b c`,
\r
2000 SIMP_TAC[PROVE_EXISTS_RADV; CIRCUMCENTER_FORMULAR2; NOT_COLL_IMP_RADV_FORMULAR ]);;
\r
2002 let LEMMA17 = CDEUSDF;;
\r
2004 let DIST_EQ_IS_UNIQUE = prove(` {u, w} SUBSET affine hull {v1, v2, v3} /\
\r
2005 dist (u,v2) = dist (u,v1) /\ dist (u,v3) = dist (u,v1) /\
\r
2006 dist (w,v2) = dist (w,v1) /\ dist (w,v3) = dist (w,v1) ==>
\r
2008 SIMP_TAC[EQ_POW2_COND; DIST_POS_LE] THEN ONCE_REWRITE_TAC[REAL_ARITH`
\r
2009 a = b <=> a - b = &0 `] THEN MESON_TAC[EQ_SUB_DIST_POW2_IMP_IDENTIFIED]);;
\r
2012 let NEVER_USED_AGAIN = prove(` p IN affine hull {va, vb, vc} /\ c = dist (p,va)
\r
2013 /\ c = dist (p,vb) /\ c = dist (p,vc) ==>
\r
2014 (! p'. p' IN affine hull {va, vb, vc} /\
\r
2015 dist (p',vb) = dist (p',va) /\
\r
2016 dist (p',vc) = dist (p',va) <=>
\r
2017 p' IN affine hull {va, vb, vc} /\
\r
2018 c = dist (p',va) /\
\r
2019 c = dist (p',vb) /\
\r
2020 c = dist (p',vc) )`,
\r
2021 MESON_TAC[DIST_EQ_IS_UNIQUE; SET2_SU_EX]);;
\r
2025 let TRUONG_WELL = prove(`! (va:real^3) vb vc. ~collinear {va, vb, vc}
\r
2026 ==> (?p. p IN affine hull {va, vb, vc} /\
\r
2027 (?c. !w. w IN {va, vb, vc} ==> c = dist (p,w)) /\
\r
2028 (!p'. p' IN affine hull {va, vb, vc} /\
\r
2029 (?c. !w. w IN {va, vb, vc} ==> c = dist (p',w))
\r
2031 NHANH (SPEC_ALL PROVE_EXISTS_RADV) THEN REPEAT STRIP_TAC THEN EXISTS_TAC `p:real^3`
\r
2032 THEN CONJ_TAC THENL [ASM_SIMP_TAC[]; CONJ_TAC] THENL [ASM_MESON_TAC[];
\r
2033 REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN
\r
2034 REWRITE_TAC[SET_RULE` (!a. a IN {x,y,z} ==> p a)
\r
2035 <=> p x /\ p y /\ p z `] THEN
\r
2036 REWRITE_TAC[MESON[]` (?c. c = a /\ c = b /\ c = cc ) <=>
\r
2037 b = a /\ cc = a `]] THEN
\r
2038 REWRITE_TAC[MESON[]` a ==> b ==> c <=> a /\b ==> c `] THEN
\r
2039 PHA THEN MESON_TAC[NEVER_USED_AGAIN ]);;
\r
2044 let NGAY_MONG6 = MESON[TRUONG_WELL] `! va vb (vc:real^3).
\r
2045 ~collinear {va, vb, vc} ==> (?p. p IN affine hull {va, vb, vc} /\
\r
2046 (?c. !w. w IN {va, vb, vc} ==> c = dist (p,w)) ) `;;
\r
2049 let CIRCUMCENTER_PROPTIES = prove(`!va vb (vc:real^3).
\r
2050 ~collinear {va, vb, vc}
\r
2051 ==> circumcenter {va, vb, vc} IN affine hull {va, vb, vc} /\
\r
2052 (?c. !w. w IN {va, vb, vc}
\r
2053 ==> c = dist (circumcenter {va, vb, vc},w))`,
\r
2054 NHANH (SPEC_ALL NGAY_MONG6) THEN REWRITE_TAC[IN;
\r
2055 circumcenter; EXISTS_THM] THEN SIMP_TAC[]);;
\r
2062 let SIMP_DOT_ALEM = prove( `&0 < (b - a) dot x <=> x dot (a - b) < &0`,
\r
2063 SIMP_TAC[DOT_SYM] THEN
\r
2064 REWRITE_TAC[ REAL_ARITH ` a < &0 <=> &0 < -- a `; GSYM DOT_RNEG] THEN
\r
2065 REWRITE_TAC[VECTOR_ARITH ` -- ((a:real^N) - b) = b - a `]);;
\r
2070 let MONG7_ROI = prove(` ! p a (b:real^A). dist (p,a) = dist (p,b) <=>
\r
2071 (p - &1 / &2 % ( a + b )) dot ( a - b) = &0 `,
\r
2072 REWRITE_TAC[ REAL_ARITH ` a = b <=> ~ ( a < b) /\ ~( b < a ) `;
\r
2073 DIST_LT_HALF_PLANE] THEN
\r
2074 REWRITE_TAC[VECTOR_ARITH` (p - &1 / &2 % (a + b)) dot (a - b)
\r
2075 = &1 / &2 * ( (&2 % p - (a + b ) ) dot ( a- b ) ) `] THEN
\r
2076 REWRITE_TAC[REAL_ARITH `( &1 / &2 * a < &0 <=> a < &0) /\
\r
2077 (&0 < &1 / &2 * a <=> &0 < a )`] THEN
\r
2078 REWRITE_TAC[SIMP_DOT_ALEM] THEN
\r
2079 SIMP_TAC[VECTOR_ARITH` (a - b) dot (c - d) = (b - a) dot (d - c)`; DOT_SYM;
\r
2080 VECTOR_ADD_SYM] THEN MESON_TAC[]);;
\r
2082 let LEMMA26 = prove(`!v1 v2 (v3:real^3) p.
\r
2083 ~collinear {v1, v2, v3} /\ p = circumcenter {v1, v2, v3}
\r
2084 ==> (p - &1 / &2 % (v1 + v2)) dot (v1 - v2) = &0 /\
\r
2085 (p - &1 / &2 % (v2 + v3)) dot (v2 - v3) = &0 /\
\r
2086 (p - &1 / &2 % (v3 + v1)) dot (v3 - v1) = &0`,
\r
2087 NHANH (SPEC_ALL CIRCUMCENTER_PROPTIES) THEN
\r
2088 NHANH (SET_RULE` (?c. !w. w IN {v1, v2, v3} ==> c = P w) ==> P v1 = P v2
\r
2089 /\ P v2 = P v3 /\ P v3 = P v1 `) THEN
\r
2090 SIMP_TAC[MONG7_ROI]);;
\r
2092 let POXDVXO = LEMMA26;;
\r
2096 let NOT_COLL_IMP_RADV_EQ_ETA_Y = MESON[prove(`!va vb vc a b c.
\r
2097 a = d3 vb vc /\ b = d3 va vc /\ c = d3 va vb /\ ~collinear {va, vb, vc}
\r
2098 ==> radV {va, vb, vc} = eta_y (d3 vb vc) (d3 va vc) (d3 va vb)`,
\r
2099 SIMP_TAC[CDEUSDF])]`
\r
2100 !va vb vc . ~collinear {va, vb, vc}
\r
2101 ==> radV {va, vb, vc} = eta_y (d3 vb vc) (d3 va vc) (d3 va vb)`;;
\r
2104 g ` ! x (y:real^N). collinear {x,y} `;;
\r
2105 e (REPEAT GEN_TAC THEN REWRITE_TAC[collinear]);;
\r
2106 e (EXISTS_TAC ` x -(y: real^N)`);;
\r
2107 e (ASM_SIMP_TAC[SET_RULE` a = b ==> {a,b,c} = {a,c} `]);;
\r
2108 e (REWRITE_TAC[IN_SET2]);;
\r
2109 e (REPEAT GEN_TAC);;
\r
2112 e (ASM_SIMP_TAC[] THEN EXISTS_TAC ` &0 ` THEN CONV_TAC VECTOR_ARITH);;
\r
2114 e (ASM_SIMP_TAC[] THEN EXISTS_TAC ` &1 ` THEN CONV_TAC VECTOR_ARITH);;
\r
2116 e (ASM_SIMP_TAC[] THEN EXISTS_TAC ` -- &1 ` THEN CONV_TAC VECTOR_ARITH);;
\r
2118 e (ASM_SIMP_TAC[] THEN EXISTS_TAC ` &0 ` THEN CONV_TAC VECTOR_ARITH);;
\r
2119 let COLLINEAR2 = top_thm();;
\r
2122 let TWO_EQ_IMP_COL3 = prove(` ! (x:real^N) y z . x = y ==> collinear {x, y, z} `,
\r
2123 STRIP_TR THEN SIMP_TAC[SET_RULE` a = b ==> {a,b,c} = {a,c} `; COLLINEAR2]);;
\r
2126 let NOT_CO_IMP_DIST_POS = prove(`! x y z. ~ collinear {x,y,z} ==> &0 < dist (x,y) `,
\r
2127 NHANH (MESON[TWO_EQ_IMP_COL3]` ~collinear {x, y, z} ==> ~( x= y) `) THEN
\r
2128 SIMP_TAC[DIST_POS_LT]);;
\r
2131 let NOT_COLL_IMP_POS_SUM = prove( ` !x y z.
\r
2132 ~collinear {x, y, z} ==> &0 < ( d3 x y + d3 y z + d3 z x) / &2 `,
\r
2133 NHANH (SPEC_ALL NOT_CO_IMP_DIST_POS) THEN
\r
2134 NHANH (MESON[DIST_POS_LE]` ~collinear {x, y, z} ==>
\r
2135 &0 <= dist (y,z) /\ &0 <= dist (z,x) `) THEN
\r
2136 SIMP_TAC[d3] THEN REAL_ARITH_TAC);;
\r
2138 let PER_SET2 = SET_RULE ` {a,b} = {b,a} `;;
\r
2141 let COLLINEAR_AS_IN_CONV2 = MESON[PER_SET2; COLLINERA_AS_IN_CONV2]`! x y (z:real^3). collinear {x, y, z} <=>
\r
2142 x IN conv {y, z} \/ y IN conv {z, x} \/ z IN conv {x, y}`;;
\r
2144 let COLLINEAR_IMP_POS_UPS2 = prove(` ! x y (z:real^3). ~ collinear {x,y,z} ==>
\r
2145 &0 < ups_x_pow2 ( d3 x y ) ( d3 y z ) ( d3 z x ) `,
\r
2146 REWRITE_TAC[PRE_HER] THEN NHANH (SPEC_ALL NOT_COLL_IMP_POS_SUM ) THEN
\r
2147 REWRITE_TAC[COLLINEAR_AS_IN_CONV2] THEN REWRITE_TAC[MID_COND] THEN
\r
2148 REWRITE_TAC[LENGTH_EQ_EX] THEN REWRITE_TAC[DE_MORGAN_THM] THEN
\r
2149 SIMP_TAC[d3] THEN REPEAT GEN_TAC THEN SIMP_TAC[
\r
2150 prove(` &0 < a ==> ( &0 < &16 * a * b <=> &0 < b ) `,
\r
2151 REWRITE_TAC[REAL_ARITH ` &0 < &16 * a <=> &0 < a `] THEN
\r
2152 REWRITE_TAC[REAL_LT_MUL_EQ])] THEN
\r
2153 REWRITE_TAC[REAL_ARITH ` (a + b + c ) / &2 - a = ( b + c - a ) / &2 `] THEN
\r
2154 REWRITE_TAC[REAL_ARITH ` (a + b + c ) / &2 - b = ( c + a - b ) / &2 `] THEN
\r
2155 REWRITE_TAC[REAL_ARITH ` (a + b + c ) / &2 - c = ( a + b - c ) / &2 `] THEN
\r
2156 REWRITE_TAC[REAL_ARITH ` a < b + c <=> &0 < ( b + c - a ) / &2 `] THEN
\r
2157 SIMP_TAC[DIST_SYM] THEN SIMP_TAC[REAL_ARITH ` a + b - c = b + a - c `] THEN
\r
2158 SIMP_TAC[REAL_LT_MUL]);;
\r
2162 let RADV_FORMULAR = MESON[CDEUSDF]` !(va:real^3) vb vc.
\r
2163 ~collinear {va, vb, vc}
\r
2164 ==> radV {va, vb, vc} = eta_y (d3 vb vc) (d3 va vc) (d3 va vb)`;;
\r
2168 let MUL3_SYM = REAL_ARITH ` ! a b c. a * b * c = b * a * c /\
\r
2169 a * b * c = c * b * a `;;
\r
2171 let ETA_X_SYMM = prove(` ! a b c. eta_x a b c = eta_x b a c /\
\r
2172 eta_x a b c = eta_x c b a `,SIMP_TAC[eta_x; MUL3_SYM; UPS_X_SYM]);;
\r
2174 let ETA_Y_SYYM = prove(` ! x y z. eta_y x y z = eta_y y x z /\
\r
2175 eta_y x y z = eta_y z y x `, REWRITE_TAC[eta_y] THEN
\r
2176 CONV_TAC (TOP_DEPTH_CONV let_CONV) THEN MESON_TAC[ETA_X_SYMM]);;
\r
2180 let NOT_COL3_IMP_DIFF = MESON[PER_SET3; TWO_EQ_IMP_COL3]`!a b c.
\r
2181 ~collinear {a, b, c} ==> ~(a = b \/ a = c \/ b = c)`;;
\r
2183 let LET_TR = CONV_TAC (TOP_DEPTH_CONV let_CONV);;
\r
2186 let POW2_COND_LT = MESON[POW2_COND; REAL_ARITH ` &0 < a ==> &0 <= a `]`
\r
2187 !a b. &0 < a /\ &0 < b ==> (a <= b <=> a pow 2 <= b pow 2)`;;
\r
2190 let ETA_Y_2 = prove(` eta_y (&2) (&2) (&2) = &2 / sqrt (&3) `,
\r
2191 REWRITE_TAC[eta_y; eta_x; ups_x] THEN
\r
2193 REWRITE_TAC[REAL_ARITH ` ((&2 * &2) * (&2 * &2) * &2 * &2) /
\r
2194 (--(&2 * &2) * &2 * &2 - (&2 * &2) * &2 * &2 - (&2 * &2) * &2 * &2 +
\r
2195 &2 * (&2 * &2) * &2 * &2 +
\r
2196 &2 * (&2 * &2) * &2 * &2 +
\r
2197 &2 * (&2 * &2) * &2 * &2) = &4 / &3 `] THEN
\r
2198 MP_TAC (MESON[REAL_LT_DIV; MESON[SQRT_POS_LT; REAL_ARITH` &0 < &3 `] `
\r
2199 &0 < sqrt (&3) `; REAL_ARITH ` &0 < &2 /\ &0 < &4 /\ &0 < &3 `] ` &0 < &4 / &3
\r
2200 /\ &0 < &2 / sqrt (&3) `) THEN
\r
2201 REWRITE_TAC[REAL_ARITH` a = b <=> a <= b /\ b <= a `] THEN
\r
2202 SIMP_TAC[SQRT_POS_LT; POW2_COND_LT] THEN
\r
2203 REWRITE_TAC[GSYM (REAL_ARITH` a = b <=> a <= b /\ b <= a `)] THEN
\r
2204 SIMP_TAC[REAL_LT_IMP_LE; SQRT_POW_2] THEN
\r
2205 REWRITE_TAC[REAL_FIELD` (a/ b) pow 2 = a pow 2 / ( b pow 2 ) `] THEN
\r
2206 SIMP_TAC[REAL_ARITH ` &0 <= &3 `; SQRT_POW_2] THEN
\r
2209 let D3_POS_LE = MESON[d3; DIST_POS_LE]` ! x y. &0 <= d3 x y `;;
\r
2213 let BYOWBDF = new_axiom`! a b c a' b' ( c':real). &0 < a /\
\r
2219 a' pow 2 <= b pow 2 + c pow 2 /\
\r
2220 b' pow 2 <= a pow 2 + c pow 2 /\
\r
2221 c' pow 2 <= a pow 2 + b pow 2
\r
2222 ==> eta_y a b c <= eta_y a' b' c' `;;
\r
2225 let LEMMA25 = prove(` !(a:real^3) b c.
\r
2226 packing {a, b, c} /\ ~ collinear {a,b,c}
\r
2227 ==> &2 / sqrt (&3) <= radV {a, b, c} `,
\r
2228 SIMP_TAC[RADV_FORMULAR] THEN REPEAT GEN_TAC THEN
\r
2229 ASM_CASES_TAC ` (? x. x IN { d3 b c, d3 c a, d3 a b } /\ &4 / sqrt (&3)
\r
2230 <= x ) ` THENL [DOWN_TAC THEN STRIP_TAC THEN DOWN_TAC THEN
\r
2231 NHANH (SPEC_ALL COLLINEAR_IMP_POS_UPS2) THEN
\r
2232 REWRITE_TAC[d3] THEN NHANH (MESON[DIST_POS_LE; HVXIKHW]`
\r
2233 &0 < ups_x_pow2 (dist (a,b)) (dist (b,c)) (dist (c,a))
\r
2234 ==> max_real3 (dist (a,b)) (dist (b,c)) (dist (c,a)) / &2 <=
\r
2235 eta_y (dist (a,b)) (dist (b,c)) (dist (c,a)) `) THEN
\r
2236 REWRITE_TAC[REAL_ARITH` a / &2 <= b <=> a <= &2 * b `; MAX_REAL3_LESS_EX] THEN
\r
2237 NHANH (SET_RULE ` x IN { a , b, c } /\ a1/\a2/\a3/\a4 /\ c <= aa /\ a <= aa
\r
2238 /\ b <= aa ==> x <= aa `) THEN REWRITE_TAC[MESON[]` a/ b <= aa /\ l <=> l
\r
2239 /\ a/b <= aa `] THEN PHA THEN DAO THEN
\r
2240 NHANH (MESON[REAL_LE_TRANS]` a <= b /\ c <= a /\ l ==> c <= b `) THEN
\r
2241 MATCH_MP_TAC (MESON[]` ( b ==> c ) ==> a/\b ==> c `) THEN
\r
2242 REWRITE_TAC[REAL_ARITH ` &4 / a <= &2 * b <=> &2 / a <= b `] THEN
\r
2243 MESON_TAC[DIST_SYM; ETA_Y_SYYM]; REWRITE_TAC[packing] THEN
\r
2244 NHANH (SPEC_ALL NOT_COL3_IMP_DIFF) THEN
\r
2245 NHANH (SET_RULE` (!u v. {a, b, c} u /\ {a, b, c} v /\ ~(u = v) ==> P u v )
\r
2246 /\ l /\ ~(a = b \/ a = c \/ b = c) ==> P a b /\ P b c /\ P c a `) THEN
\r
2247 DOWN_TAC THEN REWRITE_TAC[NOT_EXISTS_THM] THEN
\r
2248 NHANH (SET_RULE` (! x. ~( x IN {a,b,c} /\ P x )) ==> ~ P a /\ ~P b /\ ~P c`) THEN
\r
2249 SIMP_TAC[MESON[REAL_LE_DIV; SQRT_POS_LE; REAL_ARITH ` &0 <= &3 /\ &0 <= &4 `]`
\r
2250 &0 <= &4 / sqrt (&3) `; D3_POS_LE; POW2_COND] THEN
\r
2251 REWRITE_TAC[REAL_ARITH` ~( a <= b ) <=> b < a `] THEN
\r
2252 REWRITE_TAC[REAL_FIELD` ( &4 / a ) pow 2 = &16 / ( a pow 2 ) `] THEN
\r
2253 SIMP_TAC[REAL_ARITH` &0 <= &3 `; SQRT_POW_2] THEN
\r
2254 NHANH (REAL_ARITH ` a < &16 / &3 ==> a <= &2 pow 2 + &2 pow 2 `) THEN
\r
2255 PHA THEN REWRITE_TAC[MESON[]` a <= b + c /\ d <=> d /\ a <= b + c `] THEN
\r
2256 REWRITE_TAC[GSYM d3] THEN PHA THEN
\r
2257 NHANH (MESON[REAL_ARITH `&0 < &2 `; BYOWBDF]`&2 <= d3 a b /\
\r
2258 &2 <= d3 b c /\ &2 <= d3 c a /\ d3 a b pow 2 <= &2 pow 2 + &2 pow 2 /\
\r
2259 d3 c a pow 2 <= &2 pow 2 + &2 pow 2 /\ d3 b c pow 2 <= &2 pow 2 + &2 pow 2
\r
2260 ==> eta_y (&2) (&2) (&2) <= eta_y (d3 a b) (d3 b c) (d3 c a) `) THEN
\r
2261 DAO THEN MATCH_MP_TAC (TAUT` (a ==> b) ==> a /\ c ==> b `) THEN
\r
2262 SIMP_TAC[ETA_Y_2;D3_SYM; ETA_Y_SYYM] THEN MESON_TAC[ETA_Y_SYYM]]);;
\r
2264 let HMWTCNS = LEMMA25;;
\r
2267 let COEF1_POS_EQ_V1_IN = prove(`!v1 v2 v3 (v:real^3). ~collinear {v1, v2, v3} /\
\r
2268 v IN affine hull {v1, v2, v3} ==>
\r
2269 ( &0 < coef1 v1 v2 v3 v <=> v IN aff_gt {v2, v3} {v1} ) `, DAO THEN
\r
2270 NHANH (SPEC_ALL COEFS) THEN REWRITE_TAC[simp_def2; IN_ELIM_THM] THEN
\r
2271 MESON_TAC[REAL_ADD_AC; VEC_PER2_3]);;
\r
2274 let COEFS1_EQ_0_IFF_V_IN_AFF = prove(` !v1 v2 v3 v.
\r
2275 ~collinear {v1, v2, v3} /\ v IN affine hull {v1, v2, v3} ==>
\r
2276 (&0 = coef1 v1 v2 v3 v <=> v IN aff {v2, v3}) `,
\r
2277 DAO THEN NHANH (SPEC_ALL COEFS) THEN
\r
2278 REWRITE_TAC[AFF_2POINTS_INTERPRET; IN_ELIM_THM] THEN
\r
2279 REPEAT GEN_TAC THEN STRIP_TAC THEN EQ_TAC THENL [
\r
2280 DOWN_TAC THEN DAO THEN PURE_ONCE_REWRITE_TAC[MESON[]` &0 = a /\
\r
2281 P a <=> &0 = a /\ P ( &0 ) `] THEN REWRITE_TAC[VECTOR_MUL_LZERO;
\r
2282 VECTOR_ADD_LID; REAL_ADD_LID] THEN MESON_TAC[];
\r
2283 STRIP_TAC THEN DOWN_TAC THEN DAO THEN
\r
2284 MESON_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID; REAL_ADD_LID]]);;
\r
2287 let cayleytr = new_definition `
\r
2288 cayleytr x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 =
\r
2289 &2 * x23 * x25 * x34 +
\r
2290 &2 * x23 * x24 * x35 +
\r
2291 -- &1 * x23 pow 2 * x45 +
\r
2292 -- &2 * x15 * x23 * x34 +
\r
2293 -- &2 * x15 * x23 * x24 +
\r
2294 &2 * x15 * x23 pow 2 +
\r
2295 -- &2 * x14 * x23 * x35 +
\r
2296 -- &2 * x14 * x23 * x25 +
\r
2297 &2 * x14 * x23 pow 2 +
\r
2298 &4 * x14 * x15 * x23 +
\r
2299 -- &2 * x13 * x25 * x34 +
\r
2300 -- &2 * x13 * x24 * x35 +
\r
2301 &4 * x13 * x24 * x25 +
\r
2302 &2 * x13 * x23 * x45 +
\r
2303 -- &2 * x13 * x23 * x25 +
\r
2304 -- &2 * x13 * x23 * x24 +
\r
2305 &2 * x13 * x15 * x34 +
\r
2306 -- &2 * x13 * x15 * x24 +
\r
2307 -- &2 * x13 * x15 * x23 +
\r
2308 &2 * x13 * x14 * x35 +
\r
2309 -- &2 * x13 * x14 * x25 +
\r
2310 -- &2 * x13 * x14 * x23 +
\r
2311 -- &1 * x13 pow 2 * x45 +
\r
2312 &2 * x13 pow 2 * x25 +
\r
2313 &2 * x13 pow 2 * x24 +
\r
2314 &4 * x12 * x34 * x35 +
\r
2315 -- &2 * x12 * x25 * x34 +
\r
2316 -- &2 * x12 * x24 * x35 +
\r
2317 &2 * x12 * x23 * x45 +
\r
2318 -- &2 * x12 * x23 * x35 +
\r
2319 -- &2 * x12 * x23 * x34 +
\r
2320 -- &2 * x12 * x15 * x34 +
\r
2321 &2 * x12 * x15 * x24 +
\r
2322 -- &2 * x12 * x15 * x23 +
\r
2323 -- &2 * x12 * x14 * x35 +
\r
2324 &2 * x12 * x14 * x25 +
\r
2325 -- &2 * x12 * x14 * x23 +
\r
2326 &2 * x12 * x13 * x45 +
\r
2327 -- &2 * x12 * x13 * x35 +
\r
2328 -- &2 * x12 * x13 * x34 +
\r
2329 -- &2 * x12 * x13 * x25 +
\r
2330 -- &2 * x12 * x13 * x24 +
\r
2331 &4 * x12 * x13 * x23 +
\r
2332 -- &1 * x12 pow 2 * x45 +
\r
2333 &2 * x12 pow 2 * x35 +
\r
2334 &2 * x12 pow 2 * x34 `;;
\r
2337 let LTCTBAN = prove(` cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 =
\r
2338 ups_x x12 x13 x23 * x45 pow 2 + cayleytr x12 x13 x14 x15 x23 x24 x25 x34 x35 ( &0 )
\r
2339 * x45 + cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 ( &0 ) `,
\r
2340 REWRITE_TAC[ups_x; cayleyR;cayleytr] THEN REAL_ARITH_TAC);;
\r
2343 let COEF1_NEG_IFF_V1_IN_AFF_LT = prove(` ! v1 v2 v3 v. ~collinear {v1, v2, v3} /\
\r
2344 v IN affine hull {v1, v2, v3}
\r
2345 ==> (coef1 v1 v2 v3 v < &0 <=> v IN aff_lt {v2, v3} {v1}) `,
\r
2346 DAO THEN NHANH (SPEC_ALL COEFS) THEN REWRITE_TAC[simp_def2; IN_ELIM_THM] THEN
\r
2347 MESON_TAC[REAL_ADD_AC; VEC_PER2_3]);;
\r
2349 let condA = new_definition `condA (v1:real^3) v2 v3 v4 x12 x13 x14 x23 x24 x34 =
\r
2350 ( ~ ( v1 = v2 ) /\ coplanar {v1,v2,v3,v4} /\
\r
2351 ( dist ( v1, v2) pow 2 ) = x12 /\
\r
2352 dist (v1,v3) pow 2 = x13 /\
\r
2353 dist (v1,v4) pow 2 = x14 /\
\r
2354 dist (v2,v3) pow 2 = x23 /\ dist (v2,v4) pow 2 = x24 )`;;
\r
2357 let det_vec3 = new_definition ` det_vec3 (a:real^3) (b:real^3) (c:real^3) =
\r
2358 a$1 * b$2 * c$3 + b$1 * c$2 * a$3 + c$1 * a$2 * b$3 -
\r
2359 ( a$1 * c$2 * b$3 + b$1 * a$2 * c$3 + c$1 * b$2 * a$3 ) `;;
\r
2362 (* the following lemmas has been proved as follow, but it
\r
2363 run after some files that are not conmpatibale here *)
\r
2365 let COPLANAR_DET_VEC3_EQ_0 = new_axiom `!v0 v1 (v2: real^3) v3.
\r
2366 coplanar {v0,v1,v2,v3} <=>
\r
2367 det_vec3 ( v1 - v0 ) ( v2 - v0 ) ( v3 - v0 ) = &0`;;
\r
2370 let NONCOPLANAR_3_BASIS = new_axiom
\r
2371 (`!v1 v2 v3 v0 v:real^3.
\r
2372 ~coplanar {v0, v1, v2, v3}
\r
2374 v = t1 % (v1 - v0) + t2 % (v2 - v0) + t3 % (v3 - v0) /\
\r
2376 v = ta % (v1 - v0) + tb % (v2 - v0) + tc % (v3 - v0)
\r
2377 ==> ta = t1 /\ tb = t2 /\ tc = t3))`);;
\r
2380 let COPLANAR = new_axiom`2 <= dimindex(:N)
\r
2381 ==> !s:real^N->bool. coplanar s <=> ?u v w. s SUBSET affine hull {u,v,w}`;;
\r
2384 let COPLANAR_3 = new_axiom `!a b c:real^N. 2 <= dimindex(:N) ==> coplanar {a,b,c}`;;
\r
2387 needs "Multivariate/determinants.ml";;
\r
2388 needs "Multivariate/convex.ml";;
\r
2390 (* ------------------------------------------------------------------------- *)
\r
2391 (* Flyspeck definitions we use. *)
\r
2392 (* ------------------------------------------------------------------------- *)
\r
2394 let plane = new_definition
\r
2395 `plane x = (?u v w. ~(collinear {u,v,w}) /\ (x = affine hull {u,v,w}))`;;
\r
2397 let coplanar = new_definition `coplanar S = (?x. plane x /\ S SUBSET x)`;;
\r
2401 let COPLANAR_DET_EQ_0 = prove
\r
2402 (`!v0 v1 (v2: real^3) v3.
\r
2403 coplanar {v0,v1,v2,v3} <=>
\r
2404 det(vector[v1 - v0; v2 - v0; v3 - v0]) = &0`,
\r
2405 REPEAT GEN_TAC THEN REWRITE_TAC[DET_EQ_0_RANK; RANK_ROW] THEN
\r
2406 REWRITE_TAC[rows; row; LAMBDA_ETA] THEN
\r
2407 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
\r
2408 REWRITE_TAC[GSYM numseg; DIMINDEX_3] THEN
\r
2409 CONV_TAC(ONCE_DEPTH_CONV NUMSEG_CONV) THEN
\r
2410 SIMP_TAC[IMAGE_CLAUSES; VECTOR_3] THEN EQ_TAC THENL
\r
2411 [REWRITE_TAC[coplanar; plane; LEFT_AND_EXISTS_THM; LEFT_IMP_EXISTS_THM] THEN
\r
2412 MAP_EVERY X_GEN_TAC
\r
2413 [`p:real^3->bool`; `a:real^3`; `b:real^3`; `c:real^3`] THEN
\r
2414 DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
\r
2415 FIRST_X_ASSUM SUBST1_TAC THEN
\r
2416 W(MP_TAC o PART_MATCH lhand AFFINE_HULL_INSERT_SUBSET_SPAN o
\r
2417 rand o lhand o snd) THEN
\r
2418 REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
\r
2419 DISCH_THEN(MP_TAC o MATCH_MP SUBSET_TRANS) THEN
\r
2420 DISCH_THEN(MP_TAC o ISPEC `\x:real^3. x - a` o MATCH_MP IMAGE_SUBSET) THEN
\r
2421 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
\r
2422 REWRITE_TAC[IMAGE_CLAUSES; GSYM IMAGE_o; o_DEF; VECTOR_ADD_SUB; IMAGE_ID;
\r
2423 SIMPLE_IMAGE] THEN
\r
2424 REWRITE_TAC[INSERT_SUBSET] THEN STRIP_TAC THEN
\r
2425 GEN_REWRITE_TAC LAND_CONV [GSYM DIM_SPAN] THEN MATCH_MP_TAC LET_TRANS THEN
\r
2426 EXISTS_TAC `CARD {b - a:real^3,c - a}` THEN
\r
2428 [MATCH_MP_TAC SPAN_CARD_GE_DIM;
\r
2429 SIMP_TAC[CARD_CLAUSES; FINITE_RULES] THEN ARITH_TAC] THEN
\r
2430 REWRITE_TAC[FINITE_INSERT; FINITE_RULES] THEN
\r
2431 GEN_REWRITE_TAC RAND_CONV [GSYM SPAN_SPAN] THEN
\r
2432 MATCH_MP_TAC SPAN_MONO THEN REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET] THEN
\r
2433 MP_TAC(VECTOR_ARITH `!x y:real^3. x - y = (x - a) - (y - a)`) THEN
\r
2434 DISCH_THEN(fun th -> REPEAT CONJ_TAC THEN
\r
2435 GEN_REWRITE_TAC LAND_CONV [th]) THEN
\r
2436 MATCH_MP_TAC SPAN_SUB THEN ASM_REWRITE_TAC[];
\r
2439 MP_TAC(ISPECL [`{v1 - v0,v2 - v0,v3 - v0}:real^3->bool`; `2`]
\r
2440 LOWDIM_EXPAND_BASIS) THEN
\r
2441 ASM_REWRITE_TAC[ARITH_RULE `n <= 2 <=> n < 3`; DIMINDEX_3; ARITH] THEN
\r
2442 DISCH_THEN(X_CHOOSE_THEN `t:real^3->bool`
\r
2443 (CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC)) THEN
\r
2444 CONV_TAC(LAND_CONV HAS_SIZE_CONV) THEN
\r
2445 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
\r
2446 MAP_EVERY X_GEN_TAC [`a:real^3`; `b:real^3`] THEN
\r
2447 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC SUBST_ALL_TAC) THEN
\r
2448 REWRITE_TAC[coplanar; plane] THEN
\r
2449 EXISTS_TAC `affine hull {v0,v0 + a,v0 + b}:real^3->bool` THEN
\r
2451 [MAP_EVERY EXISTS_TAC [`v0:real^3`; `v0 + a:real^3`; `v0 + b:real^3`] THEN
\r
2452 REWRITE_TAC[COLLINEAR_3; COLLINEAR_LEMMA;
\r
2453 VECTOR_ARITH `--x = vec 0 <=> x = vec 0`;
\r
2454 VECTOR_ARITH `u - (u + a):real^3 = --a`;
\r
2455 VECTOR_ARITH `(u + b) - (u + a):real^3 = b - a`] THEN
\r
2456 REWRITE_TAC[DE_MORGAN_THM; VECTOR_SUB_EQ;
\r
2457 VECTOR_ARITH `b - a = c % -- a <=> (c - &1) % a + &1 % b = vec 0`] THEN
\r
2458 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
\r
2459 [ASM_MESON_TAC[IN_INSERT; INDEPENDENT_NONZERO]; ALL_TAC] THEN
\r
2460 DISCH_THEN(X_CHOOSE_TAC `u:real`) THEN
\r
2461 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [independent]) THEN
\r
2462 REWRITE_TAC[DEPENDENT_EXPLICIT] THEN
\r
2463 MAP_EVERY EXISTS_TAC [`{a:real^3,b}`;
\r
2464 `\x:real^3. if x = a then u - &1 else &1`] THEN
\r
2465 REWRITE_TAC[FINITE_INSERT; FINITE_RULES; SUBSET_REFL] THEN
\r
2467 [EXISTS_TAC `b:real^3` THEN ASM_REWRITE_TAC[IN_INSERT] THEN
\r
2470 SIMP_TAC[VSUM_CLAUSES; FINITE_RULES] THEN
\r
2471 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; VECTOR_ADD_RID];
\r
2473 W(MP_TAC o PART_MATCH (lhs o rand) AFFINE_HULL_INSERT_SPAN o
\r
2476 [REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
\r
2477 REWRITE_TAC[VECTOR_ARITH `u = u + a <=> a = vec 0`] THEN
\r
2478 ASM_MESON_TAC[INDEPENDENT_NONZERO; IN_INSERT];
\r
2480 DISCH_THEN SUBST1_TAC THEN
\r
2481 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
\r
2482 REWRITE_TAC[SIMPLE_IMAGE; IMAGE_CLAUSES; IMAGE_ID; VECTOR_ADD_SUB] THEN
\r
2483 MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC
\r
2484 `IMAGE (\v:real^3. v0 + v) (span{v1 - v0, v2 - v0, v3 - v0})` THEN
\r
2485 ASM_SIMP_TAC[IMAGE_SUBSET] THEN
\r
2486 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_IMAGE] THEN CONJ_TAC THENL
\r
2487 [EXISTS_TAC `vec 0:real^3` THEN REWRITE_TAC[SPAN_0] THEN VECTOR_ARITH_TAC;
\r
2488 REWRITE_TAC[VECTOR_ARITH `v1:real^N = v0 + x <=> x = v1 - v0`] THEN
\r
2489 REWRITE_TAC[UNWIND_THM2] THEN REPEAT CONJ_TAC THEN
\r
2490 MATCH_MP_TAC SPAN_SUPERSET THEN REWRITE_TAC[IN_INSERT]]]);;
\r
2494 let COPLANAR = prove
\r
2495 (`2 <= dimindex(:N)
\r
2496 ==> !s:real^N->bool. coplanar s <=> ?u v w. s SUBSET affine hull {u,v,w}`,
\r
2497 DISCH_TAC THEN GEN_TAC THEN REWRITE_TAC[coplanar; plane] THEN
\r
2498 REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
\r
2499 ONCE_REWRITE_TAC[MESON[]
\r
2500 `(?x u v w. p x u v w) <=> (?u v w x. p x u v w)`] THEN
\r
2501 REWRITE_TAC[GSYM CONJ_ASSOC; RIGHT_EXISTS_AND_THM; UNWIND_THM2] THEN
\r
2502 EQ_TAC THENL [MESON_TAC[]; REWRITE_TAC[LEFT_IMP_EXISTS_THM]] THEN
\r
2503 MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`; `w:real^N`] THEN DISCH_TAC THEN
\r
2505 `s SUBSET {u + x:real^N | x | x IN span {y - u | y IN {v,w}}}`
\r
2507 [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
\r
2508 (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN
\r
2509 REWRITE_TAC[AFFINE_HULL_INSERT_SUBSET_SPAN];
\r
2511 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
\r
2512 DISCH_THEN(MP_TAC o ISPEC `\x:real^N. x - u` o MATCH_MP IMAGE_SUBSET) THEN
\r
2513 REWRITE_TAC[GSYM IMAGE_o; o_DEF; VECTOR_ADD_SUB; IMAGE_ID; SIMPLE_IMAGE] THEN
\r
2514 REWRITE_TAC[IMAGE_CLAUSES] THEN
\r
2515 MP_TAC(ISPECL [`{v - u:real^N,w - u}`; `2`] LOWDIM_EXPAND_BASIS) THEN
\r
2517 [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC LE_TRANS THEN
\r
2518 EXISTS_TAC `CARD{v - u:real^N,w - u}` THEN
\r
2519 SIMP_TAC[DIM_LE_CARD; FINITE_INSERT; FINITE_RULES] THEN
\r
2520 SIMP_TAC[CARD_CLAUSES; FINITE_RULES] THEN ARITH_TAC;
\r
2522 DISCH_THEN(X_CHOOSE_THEN `t:real^N->bool`
\r
2523 (CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC)) THEN
\r
2524 CONV_TAC(LAND_CONV HAS_SIZE_CONV) THEN
\r
2525 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
\r
2526 MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN
\r
2527 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC SUBST_ALL_TAC) THEN
\r
2528 UNDISCH_TAC `span {v - u, w - u} SUBSET span {a:real^N, b}` THEN
\r
2529 REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
\r
2530 DISCH_THEN(ASSUME_TAC o MATCH_MP SUBSET_TRANS) THEN
\r
2531 MAP_EVERY EXISTS_TAC [`u:real^N`; `u + a:real^N`; `u + b:real^N`] THEN
\r
2533 [REWRITE_TAC[COLLINEAR_3; COLLINEAR_LEMMA;
\r
2534 VECTOR_ARITH `--x = vec 0 <=> x = vec 0`;
\r
2535 VECTOR_ARITH `u - (u + a):real^N = --a`;
\r
2536 VECTOR_ARITH `(u + b) - (u + a):real^N = b - a`] THEN
\r
2537 REWRITE_TAC[DE_MORGAN_THM; VECTOR_SUB_EQ;
\r
2538 VECTOR_ARITH `b - a = c % -- a <=> (c - &1) % a + &1 % b = vec 0`] THEN
\r
2539 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
\r
2540 [ASM_MESON_TAC[IN_INSERT; INDEPENDENT_NONZERO]; ALL_TAC] THEN
\r
2541 DISCH_THEN(X_CHOOSE_TAC `u:real`) THEN
\r
2542 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [independent]) THEN
\r
2543 REWRITE_TAC[DEPENDENT_EXPLICIT] THEN
\r
2544 MAP_EVERY EXISTS_TAC [`{a:real^N,b}`;
\r
2545 `\x:real^N. if x = a then u - &1 else &1`] THEN
\r
2546 REWRITE_TAC[FINITE_INSERT; FINITE_RULES; SUBSET_REFL] THEN
\r
2548 [EXISTS_TAC `b:real^N` THEN ASM_REWRITE_TAC[IN_INSERT] THEN
\r
2551 SIMP_TAC[VSUM_CLAUSES; FINITE_RULES] THEN
\r
2552 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; VECTOR_ADD_RID];
\r
2554 W(MP_TAC o PART_MATCH (lhs o rand) AFFINE_HULL_INSERT_SPAN o rand o snd) THEN
\r
2556 [REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY] THEN
\r
2557 REWRITE_TAC[VECTOR_ARITH `u = u + a <=> a = vec 0`] THEN
\r
2558 ASM_MESON_TAC[INDEPENDENT_NONZERO; IN_INSERT];
\r
2560 DISCH_THEN SUBST1_TAC THEN
\r
2561 FIRST_ASSUM(MP_TAC o ISPEC `\x:real^N. u + x` o MATCH_MP IMAGE_SUBSET) THEN
\r
2562 REWRITE_TAC[GSYM IMAGE_o; o_DEF; IMAGE_ID;
\r
2563 ONCE_REWRITE_RULE[VECTOR_ADD_SYM] VECTOR_SUB_ADD] THEN
\r
2564 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS) THEN
\r
2565 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
\r
2566 REWRITE_TAC[SIMPLE_IMAGE; IMAGE_CLAUSES; VECTOR_ADD_SUB] THEN
\r
2569 (* this LEMMA in determinants.ml *)
\r
2570 let DET_3 = new_axiom`!A:real^3^3.
\r
2571 det(A) = A$1$1 * A$2$2 * A$3$3 +
\r
2572 A$1$2 * A$2$3 * A$3$1 +
\r
2573 A$1$3 * A$2$1 * A$3$2 -
\r
2574 A$1$1 * A$2$3 * A$3$2 -
\r
2575 A$1$2 * A$2$1 * A$3$3 -
\r
2576 A$1$3 * A$2$2 * A$3$1`;;
\r
2579 let det_vec3 = new_definition ` det_vec3 (a:real^3) (b:real^3) (c:real^3) =
\r
2580 a$1 * b$2 * c$3 + b$1 * c$2 * a$3 + c$1 * a$2 * b$3 -
\r
2581 ( a$1 * c$2 * b$3 + b$1 * a$2 * c$3 + c$1 * b$2 * a$3 ) `;;
\r
2584 let DET_VEC3_EXPAND = prove
\r
2585 (`det (vector [a; b; (c:real^3)] ) = det_vec3 a b c`,
\r
2586 REWRITE_TAC[det_vec3; DET_3; VECTOR_3] THEN REAL_ARITH_TAC);;
\r
2588 let COPLANAR_DET_VEC3_EQ_0 = prove( `!v0 v1 (v2: real^3) v3.
\r
2589 coplanar {v0,v1,v2,v3} <=>
\r
2590 det_vec3 ( v1 - v0 ) ( v2 - v0 ) ( v3 - v0 ) = &0`, REWRITE_TAC[COPLANAR_DET_EQ_0; DET_VEC3_EXPAND]);;
\r
2594 let COPLANAR_3 = prove
\r
2595 (`!a b c:real^N. 2 <= dimindex(:N) ==> coplanar {a,b,c}`,
\r
2596 SIMP_TAC[COPLANAR; SUBSET] THEN MESON_TAC[HULL_INC]);;
\r
2598 let NONCOPLANAR_4_DISTINCT = prove
\r
2599 (`!a b c d:real^N.
\r
2600 ~(coplanar{a,b,c,d}) /\ 2 <= dimindex(:N)
\r
2601 ==> ~(a = b) /\ ~(a = c) /\ ~(a = d) /\
\r
2602 ~(b = c) /\ ~(b = d) /\ ~(c = d)`,
\r
2603 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
\r
2604 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REWRITE_TAC[DE_MORGAN_THM] THEN
\r
2605 STRIP_TAC THEN ASM_SIMP_TAC[INSERT_AC; COPLANAR_3]);;
\r
2609 let NONCOPLANAR_3_BASIS = prove
\r
2610 (`!v1 v2 v3 v0 v:real^3.
\r
2611 ~coplanar {v0, v1, v2, v3}
\r
2613 v = t1 % (v1 - v0) + t2 % (v2 - v0) + t3 % (v3 - v0) /\
\r
2615 v = ta % (v1 - v0) + tb % (v2 - v0) + tc % (v3 - v0)
\r
2616 ==> ta = t1 /\ tb = t2 /\ tc = t3))`,
\r
2617 REPEAT STRIP_TAC THEN
\r
2618 FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
\r
2619 NONCOPLANAR_4_DISTINCT)) THEN
\r
2620 REWRITE_TAC[DIMINDEX_3; ARITH] THEN STRIP_TAC THEN
\r
2621 SUBGOAL_THEN `independent {v1 - v0:real^3,v2 - v0,v3 - v0}` ASSUME_TAC THENL
\r
2622 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [COPLANAR_DET_EQ_0]) THEN
\r
2623 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN REWRITE_TAC[independent] THEN
\r
2624 DISCH_TAC THEN MATCH_MP_TAC DET_DEPENDENT_ROWS THEN
\r
2625 REWRITE_TAC[rows; row; LAMBDA_ETA; GSYM IN_NUMSEG; DIMINDEX_3] THEN
\r
2626 ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
\r
2627 CONV_TAC(ONCE_DEPTH_CONV NUMSEG_CONV) THEN
\r
2628 ASM_REWRITE_TAC[IMAGE_CLAUSES; VECTOR_3];
\r
2630 MP_TAC(ISPECL [`(:real^3)`; `{v1 - v0:real^3,v2 - v0,v3 - v0}`]
\r
2631 CARD_GE_DIM_INDEPENDENT) THEN
\r
2632 ASM_REWRITE_TAC[DIM_UNIV; SUBSET_UNIV] THEN ANTS_TAC THENL
\r
2633 [SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_RULES] THEN
\r
2634 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; DIMINDEX_3; ARITH;
\r
2635 VECTOR_ARITH `x - a:real^N = y - a <=> x = y`];
\r
2637 REWRITE_TAC[SUBSET; IN_UNIV; SPAN_BREAKDOWN_EQ; SPAN_EMPTY] THEN
\r
2638 DISCH_THEN(MP_TAC o SPEC `v:real^3`) THEN
\r
2639 MAP_EVERY (fun t -> MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC t)
\r
2640 [`t1:real`; `t2:real`; `t3:real`] THEN
\r
2641 REWRITE_TAC[IN_SING; VECTOR_ARITH
\r
2642 `a - b - c - d:real^N = vec 0 <=> a = b + c + d`] THEN
\r
2643 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[] THEN
\r
2644 MAP_EVERY X_GEN_TAC [`ta:real`; `tb:real`; `tc:real`] THEN
\r
2645 REWRITE_TAC[VECTOR_ARITH
\r
2646 `t1 % x + t2 % y + t3 % z = ta % x + tb % y + tc % z <=>
\r
2647 (t1 - ta) % x + (t2 - tb) % y + (t3 - tc) % z = vec 0`] THEN
\r
2648 STRIP_TAC THEN FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [independent]) THEN
\r
2649 REWRITE_TAC[DEPENDENT_EXPLICIT; NOT_EXISTS_THM] THEN
\r
2650 DISCH_THEN(MP_TAC o SPECL
\r
2651 [`{v1 - v0:real^3,v2 - v0,v3 - v0}`;
\r
2652 `\v:real^3. if v = v1 - v0 then t1 - ta
\r
2653 else if v = v2 - v0 then t2 - tb
\r
2654 else t3 - tc`]) THEN
\r
2655 SIMP_TAC[FINITE_INSERT; FINITE_RULES; SUBSET_REFL; VSUM_CLAUSES] THEN
\r
2656 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; VECTOR_ADD_RID;
\r
2657 RIGHT_OR_DISTRIB; EXISTS_OR_THM; UNWIND_THM2;
\r
2658 VECTOR_ARITH `x - a:real^N = y - a <=> x = y`] THEN
\r
2659 SIMP_TAC[DE_MORGAN_THM; REAL_SUB_0]);;
\r
2668 let DET_VEC3_AND_DELTA = prove(`!(a:real^3) b c d.
\r
2669 &4 * ( det_vec3 (a - d) (b - d) (c - d) ) pow 2 =
\r
2670 delta ( d3 a d pow 2)
\r
2672 (d3 c d pow 2) (d3 a b pow 2) (d3 a c pow 2) (d3 b c pow 2) `,
\r
2673 SIMP_TAC[d3; dist] THEN
\r
2674 REWRITE_TAC[GSYM (MESON[VECTOR_ARITH ` (a :real^N) - b = ( a - x ) - ( b - x ) `]`
\r
2675 delta (norm (a - d) pow 2) (norm (b - d) pow 2)
\r
2676 (norm (c - d) pow 2) (norm ((a - d) - (b - d )) pow 2)
\r
2677 (norm ((a - d) - ( c - d )) pow 2) (norm ((b - d ) - ( c - d )) pow 2) =
\r
2678 delta (norm (a - d) pow 2) (norm (b - d) pow 2) (norm (c - d) pow 2)
\r
2679 (norm (a - b) pow 2) (norm (a - c) pow 2) (norm (b - c) pow 2) `)] THEN
\r
2680 SIMP_TAC[ vector_norm; DOT_POS_LE; SQRT_WORKS] THEN
\r
2681 REWRITE_TAC[DOT_3] THEN
\r
2682 REWRITE_TAC[MESON[lemma_cm3]`((a:real^3) - d - (b - d))$1 = (a - d)$1 - (b - d)$1 /\
\r
2683 (a - d - (b - d))$2 = (a - d)$2 - (b - d)$2 /\
\r
2684 (a - d - (b - d))$3 = (a - d)$3 - (b - d)$3 `] THEN
\r
2685 REWRITE_TAC[delta; det_vec3] THEN
\r
2690 let POLFLZY = prove(` !(x1:real^3) x2 x3 x4.
\r
2691 let x12 = dist (x1,x2) pow 2 in
\r
2692 let x13 = dist (x1,x3) pow 2 in
\r
2693 let x14 = dist (x1,x4) pow 2 in
\r
2694 let x23 = dist (x2,x3) pow 2 in
\r
2695 let x24 = dist (x2,x4) pow 2 in
\r
2696 let x34 = dist (x3,x4) pow 2 in
\r
2697 coplanar {x1, x2, x3, x4} <=> delta x12 x13 x14 x23 x24 x34 = &0 `,
\r
2698 LET_TR THEN REPEAT GEN_TAC THEN MP_TAC (GSYM (SPECL [` x2 :real^3`;
\r
2699 ` x3:real^3`;` x4:real^3`; ` x1 :real^3`] DET_VEC3_AND_DELTA)) THEN
\r
2700 SIMP_TAC[d3; DIST_SYM] THEN REWRITE_TAC[REAL_ARITH ` &4 * a = &0 <=> a = &0 `]
\r
2701 THEN SIMP_TAC[GSYM ( REAL_FIELD ` x = &0 <=> x pow 2 = &0 `);
\r
2702 COPLANAR_DET_VEC3_EQ_0]);;
\r
2705 let LEMMA15 = POLFLZY;;
\r
2707 let muy_delta = new_definition ` muy_delta = delta `;;
\r
2710 let VCRJIHC = prove(`!(v1:real^3) v2 v3 v4 x34 x12 x13 x14 x23 x24.
\r
2711 condA v1 v2 v3 v4 x12 x13 x14 x23 x24 x34
\r
2712 ==> muy_delta x12 x13 x14 x23 x24 (dist (v3,v4) pow 2) = &0`,
\r
2713 REWRITE_TAC[condA; muy_delta] THEN MP_TAC POLFLZY THEN LET_TR THEN MESON_TAC[]);;
\r
2716 let ZERO_NEUTRAL = REAL_ARITH ` ! x. &0 * x = &0 /\ x * &0 = &0 /\ &0 + x = x /\ x + &0 = x /\ x - &0 = x /\
\r
2719 let EQUATE_CONEFS_POLINOMIAL_POW2 = prove( `!a b c aa bb cc. ( ! x.
\r
2720 a * x pow 2 + b * x + c = aa * x pow 2 + bb * x + cc ) <=>
\r
2721 a = aa /\ b = bb /\ c = cc`, REPEAT GEN_TAC THEN EQ_TAC THENL [
\r
2722 NHANH (MESON[]` (! (x:real). P x ) ==> P ( &0 ) /\ P ( &1 ) /\ P ( -- &1 )`) THEN
\r
2723 REAL_ARITH_TAC THEN REAL_ARITH_TAC; SIMP_TAC[]]);;
\r
2725 let GJWYYPS = prove(`!x12 x13 x14 x15 x23 x24 x25 x34 x35 a b c.
\r
2726 (! x45. cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 =
\r
2727 a * x45 pow 2 + b * x45 + c )
\r
2728 ==> b pow 2 - &4 * a * c =
\r
2729 &16 * delta x12 x13 x14 x23 x24 x34 * delta x12 x13 x15 x23 x25 x35`,
\r
2730 ONCE_REWRITE_TAC[LTCTBAN] THEN REPEAT GEN_TAC THEN
\r
2731 REWRITE_TAC[EQUATE_CONEFS_POLINOMIAL_POW2] THEN ONCE_REWRITE_TAC[EQ_SYM_EQ]
\r
2732 THEN SIMP_TAC[] THEN DISCH_TAC THEN REWRITE_TAC[ups_x; cayleytr; cayleyR;
\r
2733 delta; ZERO_NEUTRAL] THEN REAL_ARITH_TAC);;
\r
2735 let LEMMA51 = GJWYYPS ;;
\r
2737 g `!v1 v2 (v:real^3). ~(v1 = v2) ==> (collinear {v, v1, v2} <=> v IN aff {v1, v2})`;;
\r
2738 e (REWRITE_TAC[COLLINEAR_EX]);;
\r
2739 e (NHANH (MESON[]` a % b + c = vec 0 ==> ( a = &0 \/ ~(a = &0 ))`));;
\r
2741 e (NGOAC THEN PURE_ONCE_REWRITE_TAC[MESON[]` P a /\ a = &0 <=> P ( &0 )
\r
2743 e (REWRITE_TAC[REAL_ADD_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID]);;
\r
2744 e (REWRITE_TAC[REAL_ARITH ` a + b= &0 <=> a = -- b `; VECTOR_ARITH` a % x + b % y = vec 0
\r
2745 <=> a % x = ( -- b) % y`]);;
\r
2746 e (NHANH (MESON[REAL_ARITH ` a = &0 <=> -- a = &0 `; VECTOR_MUL_LCANCEL]` (b = --c /\ ~(b = &0 /\ c = &0)) /\ b % v1 = --c % v2
\r
2749 e (REWRITE_TAC[AFF_2POINTS_INTERPRET; IN_ELIM_THM]);;
\r
2750 e (REPEAT GEN_TAC THEN DISCH_TAC THEN EQ_TAC);;
\r
2751 e (REWRITE_TAC[VECTOR_ARITH ` a % v + b % v1 + c % v2 = vec 0 <=>
\r
2752 a % v = ( -- b) % v1 + ( --c ) % v2 `]);;
\r
2753 e (PHA THEN REWRITE_TAC[MESON[CHANGE_SIDE]` a % v = v1 /\
\r
2754 ~(a = &0) <=> v = &1 / a % v1 /\ ~( a = &0 ) `]);;
\r
2755 e (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * b = b / a`]);;
\r
2756 e (REWRITE_TAC[AFF_2POINTS_INTERPRET; IN_ELIM_THM]);;
\r
2757 e (MESON_TAC[REAL_FIELD ` ~ ( a = &0 ) /\ a = -- (b + c) ==>
\r
2758 ( -- b) / a + ( -- c) / a = &1 `]);;
\r
2760 e (EXISTS_TAC ` &1 `);;
\r
2761 e (EXISTS_TAC ` -- ta`);;
\r
2762 e (EXISTS_TAC ` -- tb`);;
\r
2764 e (ASM_SIMP_TAC[REAL_ARITH` ~(&1 = &0 ) /\ -- ( -- a + -- b ) = a + b `]);;
\r
2765 e (CONV_TAC VECTOR_ARITH);;
\r
2767 let NOT_TOW_EQ_IMP_COL_EQUAVALENT = top_thm();;
\r
2770 let LEMMA30 = prove(`!v1 v2 v3 v4 x12 x13 x14 x23 x24 x34 a b c.
\r
2771 condA v1 v2 v3 v4 x12 x13 x14 x23 x24 x34 /\
\r
2772 (!x12 x13 x14 x23 x24 x34.
\r
2773 muy_delta x12 x13 x14 x23 x24 x34 =
\r
2774 a x12 x13 x14 x23 x24 * x34 pow 2 +
\r
2775 b x12 x13 x14 x23 x24 * x34 +
\r
2776 c x12 x13 x14 x23 x24 )
\r
2777 ==> (v3 IN aff {v1, v2} \/ v4 IN aff {v1, v2} <=>
\r
2778 b x12 x13 x14 x23 x24 pow 2 -
\r
2779 &4 * a x12 x13 x14 x23 x24 * c x12 x13 x14 x23 x24 =
\r
2781 REWRITE_TAC[muy_delta; DELTA_COEFS; EQUATE_CONEFS_POLINOMIAL_POW2 ] THEN
\r
2782 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN SIMP_TAC[] THEN REPEAT GEN_TAC THEN
\r
2783 DISCH_TAC THEN REWRITE_TAC[REAL_ARITH` a - b * -- c * d = a + b * c * d `;
\r
2784 AGBWHRD] THEN DOWN_TAC THEN SIMP_TAC[condA; REAL_ENTIRE;
\r
2785 GSYM NOT_TOW_EQ_IMP_COL_EQUAVALENT] THEN ONCE_REWRITE_TAC[MESON[PER_SET3]`
\r
2786 p {v3, v1, v2} \/ p {v4, v1, v2} <=> p {v1,v2,v3} \/ p {v1,v2,v4} `] THEN
\r
2787 ONCE_REWRITE_TAC[MESON[UPS_X_SYM]` ups_x x12 x23 x13 = &0 \/
\r
2788 ups_x x12 x24 x14 = &0 <=> ups_x x12 x13 x23 = &0 \/
\r
2789 ups_x x12 x14 x24 = &0 `] THEN MESON_TAC[UPS_X_SYM; PER_SET3; FHFMKIY]);;
\r
2791 let EWVIFXW = LEMMA30;;
\r
2795 let WITH_COEF1 = prove(` ! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3).
\r
2796 ~ collinear {v1,v2,v3} /\ v IN affine hull {v1, v2, v3}
\r
2797 ==> ( &0 < coef1 v1 v2 v3 v <=> v IN aff_gt {v2,v3} {v1} ) /\
\r
2798 ( &0 = coef1 v1 v2 v3 v <=> v IN aff {v2,v3} ) /\
\r
2799 ( coef1 v1 v2 v3 v < &0 <=> v IN aff_lt {v2,v3} {v1} ) `,
\r
2800 SIMP_TAC[COEF1_POS_EQ_V1_IN; COEFS1_EQ_0_IFF_V_IN_AFF; COEF1_NEG_IFF_V1_IN_AFF_LT]);;
\r
2802 let PER_COEF1_COEF2 = prove(` ! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3).
\r
2803 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
2804 ==> coef1 v2 v3 v1 v = coef2 v1 v2 v3 v ` ,
\r
2805 NHANH (SPEC_ALL COEFS) THEN
\r
2806 ONCE_REWRITE_TAC[MESON[PER_SET3]` p {a,b,c} = p {b,c,a} `] THEN
\r
2807 NHANH (SPEC_ALL COEFS) THEN MESON_TAC[VEC_PER2_3; REAL_PER3]);;
\r
2810 let PER_COEF1_COEF3 = prove(` ! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3).
\r
2811 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
2812 ==> coef1 v3 v1 v2 v = coef3 v1 v2 v3 v `, NHANH (SPEC_ALL COEFS) THEN
\r
2813 ONCE_REWRITE_TAC[MESON[PER_SET3]` p {a,b,c} = p {c,a,b} `] THEN
\r
2814 NHANH (SPEC_ALL COEFS) THEN MESON_TAC[VEC_PER2_3; REAL_PER3]);;
\r
2816 let PER_COEF1 = prove( ` ! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3).
\r
2817 v IN affine hull {v1, v2, v3} /\ ~collinear {v1, v2, v3}
\r
2818 ==> coef1 v3 v1 v2 v = coef3 v1 v2 v3 v /\ coef1 v2 v3 v1 v = coef2 v1 v2 v3 v `,
\r
2819 SIMP_TAC[PER_COEF1_COEF2; PER_COEF1_COEF3]);;
\r
2823 let LEMMA12 = prove(`! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3).
\r
2824 ~ collinear {v1,v2,v3} /\ v IN affine hull {v1, v2, v3}
\r
2825 ==> ( &0 < coef1 v1 v2 v3 v <=> v IN aff_gt {v2,v3} {v1} ) /\
\r
2826 ( &0 = coef1 v1 v2 v3 v <=> v IN aff {v2,v3} ) /\
\r
2827 ( coef1 v1 v2 v3 v < &0 <=> v IN aff_lt {v2,v3} {v1} ) /\
\r
2828 ( &0 < coef2 v1 v2 v3 v <=> v IN aff_gt {v3,v1} {v2} ) /\
\r
2829 ( &0 = coef2 v1 v2 v3 v <=> v IN aff {v3,v1} ) /\
\r
2830 ( coef2 v1 v2 v3 v < &0 <=> v IN aff_lt {v3,v1} {v2} )/\
\r
2831 ( &0 < coef3 v1 v2 v3 v <=> v IN aff_gt {v1,v2} {v3} ) /\
\r
2832 ( &0 = coef3 v1 v2 v3 v <=> v IN aff {v1,v2} ) /\
\r
2833 ( coef3 v1 v2 v3 v < &0 <=> v IN aff_lt {v1,v2} {v3})`,
\r
2834 MP_TAC WITH_COEF1 THEN SIMP_TAC[PER_SET3; GSYM PER_COEF1_COEF3; PER_COEF1]);;
\r
2836 let CNXIFFC = LEMMA12;;
\r
2839 let NGAY_23_THANG1 = prove(`! (v1:real^3) (v2:real^3) (v3:real^3) (v:real^3). ~collinear {v1, v2, v3} /\ v IN affine hull {v1, v2, v3} ==>
\r
2840 ( v IN aff_ge {v2, v3} {v1} <=> &0 <= coef1 v1 v2 v3 v ) /\
\r
2841 ( v IN aff_ge {v3,v1} {v2} <=> &0 <= coef2 v1 v2 v3 v ) /\
\r
2842 ( v IN aff_ge {v1,v2} {v3} <=> &0 <= coef3 v1
\r
2844 REWRITE_TAC[IN_AFF_GE_INTERPRET_TO_AFF_GT_AND_AFF; REAL_ARITH ` &0 <= a
\r
2845 <=> &0 < a \/ &0 = a `] THEN SIMP_TAC[CNXIFFC]);;
\r
2848 let MYOQCBS = prove(` !(v1:real^3) v2 v3 v.
\r
2849 ~collinear {v1, v2, v3} /\ v IN affine hull {v1, v2, v3}
\r
2850 ==> (v IN conv {v1, v2, v3} <=>
\r
2851 &0 <= coef1 v1 v2 v3 v /\
\r
2852 &0 <= coef2 v1 v2 v3 v /\
\r
2853 &0 <= coef3 v1 v2 v3 v) /\
\r
2854 (v IN conv0 {v1, v2, v3} <=>
\r
2855 &0 < coef1 v1 v2 v3 v /\
\r
2856 &0 < coef2 v1 v2 v3 v /\
\r
2857 &0 < coef3 v1 v2 v3 v) `,
\r
2858 SIMP_TAC[IN_CONV3_EQ; IN_CONV03_EQ; NGAY_23_THANG1; CNXIFFC ] THEN MESON_TAC[]);;
\r
2860 let LEMMA51 = GJWYYPS;;
\r
2861 let LEMMA50 = LTCTBAN;;
\r
2862 let muy_v = new_definition ` muy_v (x1: real^N ) (x2:real^N) (x3:real^N) (x4:real^N)
\r
2863 (x5:real^N) x45 =
\r
2864 (let x12 = dist (x1,x2) pow 2 in
\r
2865 let x13 = dist (x1,x3) pow 2 in
\r
2866 let x14 = dist (x1,x4) pow 2 in
\r
2867 let x15 = dist (x1,x5) pow 2 in
\r
2868 let x23 = dist (x2,x3) pow 2 in
\r
2869 let x24 = dist (x2,x4) pow 2 in
\r
2870 let x25 = dist (x2,x5) pow 2 in
\r
2871 let x34 = dist (x3,x4) pow 2 in
\r
2872 let x35 = dist (x3,x5) pow 2 in
\r
2873 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45) `;;
\r
2875 let REMOVE_TAC = MATCH_MP_TAC (MESON[]` a ==> b ==> a `);;
\r
2877 let ALE = MESON[LTCTBAN]`!x12 x13 x14 x15 x23 x24 x25 x34 x35.
\r
2879 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x =
\r
2880 a * x pow 2 + b * x + c )
\r
2881 ==> b pow 2 - &4 * a * c = &0)
\r
2882 ==> cayleytr x12 x13 x14 x15 x23 x24 x25 x34 x35 (&0) pow 2 -
\r
2884 ups_x x12 x13 x23 *
\r
2885 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 (&0) =
\r
2888 let DISCRIMINANT_OF_CAY = MESON[LTCTBAN; GJWYYPS]`cayleytr x12 x13 x14 x15 x23 x24 x25 x34 x35 (&0) pow 2 -
\r
2889 &4 * ups_x x12 x13 x23 * cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 (&0) =
\r
2890 &16 * delta x12 x13 x14 x23 x24 x34 * delta x12 x13 x15 x23 x25 x35`;;
\r
2892 let NOT_TWO_EQ_IMP_COL_EQUAVALENT = NOT_TOW_EQ_IMP_COL_EQUAVALENT;;
\r
2894 let GDLRUZB = prove(` ! (v1:real^3) (v2:real^3) (v3:real^3) (v4:real^3) (v5:real^3) a b c.
\r
2895 coplanar {v1, v2, v3, v4} \/ coplanar {v1, v2, v3, v5} <=>
\r
2896 (! a b c. (! x. muy_v v1 v2 v3 v4 v5 x = a * x pow 2 + b * x + c )
\r
2897 ==> b pow 2 - &4 * a * c = &0) `,REWRITE_TAC[muy_v] THEN LET_TR THEN
\r
2898 REPEAT GEN_TAC THEN EQ_TAC THENL [DISCH_TAC THEN
\r
2899 NHANH (MESON[GJWYYPS]` (!x45. cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 =
\r
2900 a * x45 pow 2 + b * x45 + c)
\r
2901 ==> b pow 2 - &4 * a * c =
\r
2903 delta x12 x13 x14 x23 x24 x34 *
\r
2904 delta x12 x13 x15 x23 x25 x35`) THEN SIMP_TAC[] THEN
\r
2905 UNDISCH_TAC ` coplanar {(v1:real^3), v2, v3, v4}\/ coplanar {v1, v2, v3, v5}` THEN
\r
2906 MP_TAC LEMMA15 THEN LET_TR THEN REWRITE_TAC[REAL_FIELD` &16 * a * b = &0
\r
2907 <=> a = &0 \/ b = &0 `] THEN SIMP_TAC[]; NHANH (SPEC_ALL ALE) THEN
\r
2908 REWRITE_TAC[DISCRIMINANT_OF_CAY ] THEN MP_TAC POLFLZY THEN LET_TR THEN
\r
2909 REWRITE_TAC[REAL_FIELD` &16 * a * b = &0 <=> a = &0 \/ b = &0 `] THEN
\r
2913 let DET_VECC3_AND_DELTA = prove(` (! d a b c .
\r
2914 delta (d3 d a pow 2) (d3 d b pow 2) (d3 d c pow 2) (d3 a b pow 2)
\r
2917 &4 * det_vec3 (a - d) (b - d) (c - d) pow 2) `, MESON_TAC[D3_SYM;
\r
2918 DET_VEC3_AND_DELTA]);;
\r
2921 let DELTA_POS_4POINTS = prove(`!x1 x2 x3 (x4:real^3).
\r
2923 delta (dist (x1,x2) pow 2) (dist (x1,x3) pow 2) (dist (x1,x4) pow 2)
\r
2924 (dist (x2,x3) pow 2)
\r
2925 (dist (x2,x4) pow 2)
\r
2926 (dist (x3,x4) pow 2)`, REWRITE_TAC[GSYM d3] THEN SIMP_TAC[D3_SYM] THEN
\r
2927 MP_TAC (DET_VECC3_AND_DELTA) THEN SIMP_TAC[] THEN DISCH_TAC THEN MP_TAC
\r
2928 REAL_LE_SQUARE_POW THEN MESON_TAC[REAL_ARITH` &0 <= x <=> &0 <= &4 * x `]);;
\r
2932 let DIST_POW2_DOT =
\r
2933 prove(` ! a (b:real^N) . dist (a,b) pow 2 = ( a - b ) dot ( a- b) `,
\r
2934 SIMP_TAC[dist; vector_norm; DOT_POS_LE; SQRT_WORKS]);;
\r
2936 (* this lemma is proved as below, but it take quite a long time to run it *)
\r
2937 let CAYLEYR_5POINTS = new_axiom` !x1 x2 x3 x4 (x5 :real^3).
\r
2938 let x12 = dist (x1,x2) pow 2 in
\r
2939 let x13 = dist (x1,x3) pow 2 in
\r
2940 let x14 = dist (x1,x4) pow 2 in
\r
2941 let x15 = dist (x1,x5) pow 2 in
\r
2942 let x23 = dist (x2,x3) pow 2 in
\r
2943 let x24 = dist (x2,x4) pow 2 in
\r
2944 let x25 = dist (x2,x5) pow 2 in
\r
2945 let x34 = dist (x3,x4) pow 2 in
\r
2946 let x35 = dist (x3,x5) pow 2 in
\r
2947 let x45 = dist (x4,x5) pow 2 in
\r
2948 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 = &0 `;;
\r
2950 (* let CAYLEYR_5POINTS = prove(` !x1 x2 x3 x4 (x5 :real^3).
\r
2951 let x12 = dist (x1,x2) pow 2 in
\r
2952 let x13 = dist (x1,x3) pow 2 in
\r
2953 let x14 = dist (x1,x4) pow 2 in
\r
2954 let x15 = dist (x1,x5) pow 2 in
\r
2955 let x23 = dist (x2,x3) pow 2 in
\r
2956 let x24 = dist (x2,x4) pow 2 in
\r
2957 let x25 = dist (x2,x5) pow 2 in
\r
2958 let x34 = dist (x3,x4) pow 2 in
\r
2959 let x35 = dist (x3,x5) pow 2 in
\r
2960 let x45 = dist (x4,x5) pow 2 in
\r
2961 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 = &0 `,
\r
2962 LET_TR THEN REWRITE_TAC[ DIST_POW2_DOT] THEN REPEAT GEN_TAC THEN
\r
2963 REWRITE_TAC[ MESON[VECTOR_ARITH` (a:real^n) - b = a - x - ( b - x ) `]`
\r
2964 AA ( (x1 - x5 ) dot ( x1 - x5)) ((x2 - x3) dot (x2 - x3))
\r
2965 ((x2 - x4) dot (x2 - x4))
\r
2966 ((x2 - x5) dot (x2 - x5))
\r
2967 ((x3 - x4) dot (x3 - x4))
\r
2968 ((x3 - x5) dot (x3 - x5))
\r
2969 ((x4 - x5) dot (x4 - x5)) =
\r
2970 AA ( (x1 - x5 ) dot ( x1 - x5)) ((x2 - x1 - ( x3 - x1 )) dot (x2 - x1 - ( x3 - x1 )))
\r
2971 ((x2 - x1 - ( x4 - x1 )) dot (x2 - x1 - ( x4 - x1 )))
\r
2972 ((x2 - x1 - ( x5 - x1 )) dot (x2 - x1 - ( x5 - x1 )))
\r
2973 ((x3 - x1 - ( x4 - x1 )) dot (x3 - x1 - ( x4 - x1 )))
\r
2974 ((x3 - x1 - ( x5 - x1 )) dot (x3 - x1 - ( x5 - x1 )))
\r
2975 ((x4 - x1 - ( x5 - x1 )) dot (x4 - x1 - ( x5 - x1 ))) ` ] THEN
\r
2976 SIMP_TAC[VECTOR_ARITH ` ((x4: real^N) - x1 - (x5 - x1)) = x1 - x5 - ( x1 - x4 ) `] THEN
\r
2977 ABBREV_TAC ` x12 = (x1 - ( x2:real^3)) ` THEN
\r
2978 ABBREV_TAC ` x13 = (x1 - ( x3:real^3)) ` THEN
\r
2979 ABBREV_TAC ` x14 = (x1 - ( x4:real^3)) ` THEN
\r
2980 ABBREV_TAC ` x15 = (x1 - ( x5:real^3)) ` THEN
\r
2981 REWRITE_TAC[DOT_3] THEN REWRITE_TAC[lemma_cm3; cayleyR] THEN REAL_AROTH_TAC);; *)
\r
2984 let UPS_X_POS = MESON[lemma8; UPS_X_SYM; NORM_SUB]` &0 <=
\r
2985 ups_x (norm ((x1 : real^3) - x2) pow 2) (norm (x1 - x3) pow 2)
\r
2986 (norm (x2 - x3) pow 2) `;;
\r
2988 let UPS_X_SYM = MESON[UPS_X_SYM]` !x y z. ups_x x y z = ups_x y x z /\ ups_x x y z = ups_x x z y
\r
2989 /\ ups_x x y z = ups_x x z y `;;
\r
2991 let LEMMA3 = prove(` !x1 x2 x3 x4 (x5 :real^3).
\r
2992 let x12 = dist (x1,x2) pow 2 in
\r
2993 let x13 = dist (x1,x3) pow 2 in
\r
2994 let x14 = dist (x1,x4) pow 2 in
\r
2995 let x15 = dist (x1,x5) pow 2 in
\r
2996 let x23 = dist (x2,x3) pow 2 in
\r
2997 let x24 = dist (x2,x4) pow 2 in
\r
2998 let x25 = dist (x2,x5) pow 2 in
\r
2999 let x34 = dist (x3,x4) pow 2 in
\r
3000 let x35 = dist (x3,x5) pow 2 in
\r
3001 let x45 = dist (x4,x5) pow 2 in
\r
3002 &0 <= ups_x x12 x13 x23 /\
\r
3003 &0 <= delta x12 x13 x14 x23 x24 x34 /\
\r
3004 cayleyR x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 = &0 `, MP_TAC
\r
3005 CAYLEYR_5POINTS THEN LET_TR THEN
\r
3006 SIMP_TAC[ dist; UPS_X_POS; DELTA_POS_4POINTS]);;
\r
3010 let NUHSVLM = LEMMA3;;
\r
3012 let LEMMA52 = prove( `! v1 v2 v3 v4 (v5:real^3).
\r
3013 muy_v v1 v2 v3 v4 v5 ( (d3 v4 v5) pow 2 ) = &0 `,
\r
3014 REWRITE_TAC[muy_v; d3] THEN MP_TAC LEMMA3 THEN
\r
3015 LET_TR THEN SIMP_TAC[]);;
\r
3017 let PFDFWWV = LEMMA52;;
\r
3020 REAL_ARITH `!x x1 x2. (x - x1) * (x - x2) = x pow 2 - (x1 + x2) * x + x1 * x2 /\
\r
3021 a * (x - x1) * (x - x2) = a * x pow 2 + ( -- a * (x1 + x2)) * x + a * x1 * x2 `;;
\r
3024 let VIET_THEOREM = prove(`! x1 x2 a b c. (!x. a * x pow 2 + b * x + c =
\r
3025 a * (x - x1) * (x - x2)) ==> -- b = a * ( x1 + x2 ) /\ c = a * x1 * x2 `,
\r
3026 REWRITE_TAC[PRE_VIET; REAL_LDISTRIB;REAL_SUB_LDISTRIB;
\r
3027 REAL_ARITH ` a - b * c = a + -- b * c `; REAL_ARITH` ( a + b ) + c =
\r
3028 a + b + c `] THEN
\r
3029 REWRITE_TAC[REAL_MUL_ASSOC; EQUATE_CONEFS_POLINOMIAL_POW2] THEN
\r
3030 SIMP_TAC[] THEN REAL_ARITH_TAC);;
\r
3032 let ADD_SUB_POW2_EX = REAL_RING ` ( a + b ) pow 2 = a pow 2 + &2 * a * b + b pow 2 /\
\r
3033 ( a - b ) pow 2 = a pow 2 - &2 * a * b + b pow 2 `;;
\r
3035 let PRESENT_SUB_POW2 = REAL_RING` ! a b. ( a - b ) pow 2 = ( a + b ) pow 2
\r
3038 let DIST_ROOT_AND_DISCRIMINANT = prove(` ! a b c x1 x2. ( ! x. a * x pow 2 + b * x + c =
\r
3039 a * ( x - x1 ) * ( x - x2 ) )
\r
3040 ==> ( a pow 2 ) * ( x1 - x2 ) pow 2 = b pow 2 - &4 * a * c `,
\r
3041 NHANH (SPEC_ALL VIET_THEOREM) THEN REWRITE_TAC[PRESENT_SUB_POW2] THEN
\r
3042 SIMP_TAC[REAL_ARITH ` -- b = a <=> b = -- a `] THEN REAL_ARITH_TAC);;
\r
3044 (* le 33. P 22 MARKED *)
\r
3046 let REAL_EQ_TO_LE_LT = REAL_ARITH `
\r
3047 ( a = b <=> ~( a < b \/ b < a ) )`;;
\r
3049 let FEBRUARY_13_09 = prove(` &0 < (u - v) dot (&2 % x - (u + v)) <=>
\r
3050 &0 < (u - v) dot (x - &1 / &2 % (u + v)) `,
\r
3051 ONCE_REWRITE_TAC[MESON[REAL_ARITH ` &0 < a <=> &0 < &2 * a `]` (a <=> &0 < b ) <=>
\r
3052 ( a <=> &0 < &2 * b ) `] THEN ONCE_REWRITE_TAC[VECTOR_ARITH ` x * (a dot b) =
\r
3053 a dot x % b `] THEN
\r
3054 REWRITE_TAC[GSYM VECTOR_SUB_DISTRIBUTE; VECTOR_MUL_ASSOC] THEN
\r
3055 REWRITE_TAC[REAL_ARITH ` &2 * &1 / &2 = &1 `; VECTOR_MUL_LID]);;
\r
3057 let SUB_DOT_NEG_TO_POS = MESON[VECTOR_ARITH ` ( a - b ) dot x =
\r
3058 -- (( b - a ) dot x ) `; REAL_ARITH ` -- a < &0 <=> &0 < a `]
\r
3059 `! a b. ( a - b ) dot x < &0 <=> &0 < ( b - a ) dot x `;;
\r
3062 let LEMMA6 = prove(` !(u:real^3) v. ~(u = v) ==> plane_norm (bis u v) `,
\r
3063 REWRITE_TAC[plane_norm; bis] THEN REPEAT STRIP_TAC THEN
\r
3064 EXISTS_TAC ` (u: real^3) - v ` THEN
\r
3065 EXISTS_TAC ` &1 / &2 % ((u: real^3) + v )` THEN
\r
3066 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN ASM_SIMP_TAC[VECTOR_SUB_EQ] THEN
\r
3067 REWRITE_TAC[REAL_EQ_TO_LE_LT; DIST_LT_HALF_PLANE;FEBRUARY_13_09;
\r
3068 SUB_DOT_NEG_TO_POS] THEN SIMP_TAC[VECTOR_ADD_SYM] THEN MESON_TAC[]);;
\r
3070 let BXVMKNF = LEMMA6;;
\r
3073 let b_coef = BC_DEL_FOR;;
\r
3074 let c_coef = b_coef ;;
\r
3076 let DELTA_X34_B = prove(` ! x12 x13 x14 x23 x24 x. delta_x34 x12 x13 x14 x23 x24 x =
\r
3077 -- &2 * x12 * x + b_coef x12 x13 x14 x23 x24 `, REWRITE_TAC[ delta_x34; b_coef]);;
\r
3082 let EQ_POW2_COND = prove(`!a b. &0 <= a /\ &0 <= b ==> (a = b <=> a pow 2 = b pow 2)`,
\r
3083 REWRITE_TAC[REAL_ARITH` a = b <=> a <= b /\ b <= a `] THEN SIMP_TAC[POW2_COND]);;
\r
3086 let EQ_SQRT_POW2_EQ = prove(` &0 <= a /\ &0 <= b ==> ( a = sqrt b <=> a pow 2 = b ) `,
\r
3087 SIMP_TAC[SQRT_WORKS; EQ_POW2_COND]);;
\r
3090 let LEMMA33 = prove(` !x34 x12 x13 v1 x14 v3 x23 v2 v4 x24 x34' x34'' a.
\r
3091 condA v1 v2 v3 v4 x12 x13 x14 x23 x24 x34 /\
\r
3092 (! x. muy_delta x12 x13 x14 x23 x24 x = a * ( x - x34' ) * ( x - x34''))
\r
3094 ==> delta_x34 x12 x13 x14 x23 x24 x34' =
\r
3095 sqrt (ups_x x12 x13 x23 * ups_x x12 x14 x24) /\
\r
3096 delta_x34 x12 x13 x14 x23 x24 x34'' =
\r
3097 --sqrt (ups_x x12 x13 x23 * ups_x x12 x14 x24) `,
\r
3098 REWRITE_TAC[muy_delta; DELTA_X34_B; DELTA_COEFS] THEN
\r
3099 SIMP_TAC[EQUATE_CONEFS_POLINOMIAL_POW2; PRE_VIET;
\r
3100 REAL_ARITH ` -- a = b <=> b = -- a`] THEN
\r
3101 SIMP_TAC[REAL_RING `-- &2 * x12 * x34' + -- --x12 * (x34' + x34'') = a <=>
\r
3102 -- &2 * x12 * x34'' + -- --x12 * (x34' + x34'') = -- a `] THEN
\r
3103 REWRITE_TAC[REAL_ARITH` -- &2 * x12 * x34'' + -- --x12 * (x34' + x34'')
\r
3104 = x12 * ( x34' - x34'' ) `; condA] THEN REPEAT STRIP_TAC THEN
\r
3105 EXPAND_TAC "x12" THEN EXPAND_TAC "x13" THEN EXPAND_TAC "x23" THEN
\r
3106 EXPAND_TAC "x14" THEN EXPAND_TAC "x24" THEN
\r
3107 UNDISCH_TAC ` x34' <= (x34'':real)` THEN
\r
3108 ONCE_REWRITE_TAC[REAL_ARITH ` a <= b <=> &0 <= b - a `] THEN
\r
3109 ONCE_REWRITE_TAC[ REAL_ARITH ` a * ( b - c ) = -- ( a * ( c - b ) ) `] THEN
\r
3110 MP_TAC (GEN_ALL TROI_OI_DAT_HOI) THEN MP_TAC REAL_LE_POW_2 THEN
\r
3111 REWRITE_TAC[REAL_ARITH` -- a = -- b <=> a = b `] THEN
\r
3112 SIMP_TAC[UPS_X_SYM; REAL_LE_MUL; EQ_SQRT_POW2_EQ ] THEN
\r
3113 ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC THEN
\r
3114 ONCE_REWRITE_TAC[ REAL_ARITH ` ( a * b ) pow 2 = a pow 2 * b pow 2 `] THEN
\r
3115 REWRITE_TAC[PRESENT_SUB_POW2] THEN
\r
3116 REWRITE_TAC[REAL_SUB_LDISTRIB; REAL_ARITH ` a pow 2 * b pow 2 =
\r
3117 ( -- a * b ) pow 2 /\ a pow 2 * &4 * b = -- a * &4 * -- a * b `] THEN
\r
3118 UNDISCH_TAC `b_coef x12 x13 x14 x23 x24 = --a * (x34' + x34'')` THEN
\r
3119 UNDISCH_TAC `c_coef x12 x13 x14 x23 x24 = a * x34' * x34''` THEN
\r
3120 UNDISCH_TAC `(a: real) = --x12` THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
3121 SIMP_TAC[] THEN SIMP_TAC[REAL_ARITH` -- -- a = a /\ ( -- a * b) pow 2 =
\r
3122 ( a * b ) pow 2 /\ ( a * -- b) pow 2 = ( a * b ) pow 2 `; REAL_ADD_SYM;
\r
3123 REAL_MUL_SYM] THEN SIMP_TAC[REAL_ADD_SYM; REAL_MUL_SYM] THEN
\r
3124 ONCE_REWRITE_TAC[REAL_ARITH ` ( a * b ) pow 2 = ( b * -- a ) pow 2 `] THEN
\r
3125 SIMP_TAC[] THEN REPEAT STRIP_TAC THEN EXPAND_TAC "a" THEN
\r
3126 REWRITE_TAC[REAL_RING ` a - -- c * b * &4 = a + &4 * c * b `] THEN
\r
3127 MESON_TAC[AGBWHRD; UPS_X_SYM]);;
\r
3129 let CMUDPKT = LEMMA33;;
\r
3131 (* ============= *)
\r
3134 let LEMMA_OF_LE20 = prove(` ! x y z: real^3.
\r
3136 d3 x y <= #2.52 /\
\r
3141 ==> ~collinear {x, y, z} `,
\r
3142 MP_TAC JVUNDLC THEN
\r
3144 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
3145 REWRITE_TAC[MESON[]` (! a b c s. P a b c = s ==> Q a b c ) <=>
\r
3146 (! a b c . Q a b c ) `] THEN
\r
3147 SIMP_TAC[COL_EQ_UPS_0] THEN
\r
3148 MATCH_MP_TAC (TAUT` a ==> b ==> a `) THEN
\r
3149 REWRITE_TAC[GSYM d3] THEN
\r
3150 REWRITE_TAC[REAL_ENTIRE] THEN
\r
3151 CONV_TAC REAL_FIELD);;
\r
3155 let LT_POW2_EQ_LT = MESON[POW2_COND_LT; REAL_ARITH ` a <= b <=> ~ ( b < a ) `]
\r
3156 `&0 < a /\ &0 < b ==> ( a < b <=> a pow 2 < b pow 2 ) `;;
\r
3161 let ETA_Y_LT_SQRT2 = prove(`eta_y #2.2 #2.2 #2.52 < sqrt #2`,
\r
3162 REWRITE_TAC[eta_y; eta_x; ups_x] THEN LET_TR THEN
\r
3163 CONV_TAC REAL_RAT_REDUCE_CONV THEN MP_TAC (REAL_FIELD ` &14641 / &8131< &2 `)
\r
3164 THEN MP_TAC (REAL_FIELD ` &0 < &2 /\ &0 < &14641 / &8131 `) THEN
\r
3165 NHANH (SPEC_ALL SQRT_POS_LT) THEN REWRITE_TAC[ REAL_ARITH ` #2 = &2 `] THEN
\r
3166 SIMP_TAC[REAL_ARITH ` &0 < a ==> &0 <= a `;SQRT_POS_LT; LT_POW2_EQ_LT; SQRT_WORKS]);;
\r
3168 let ETA_YY_LT_SQRT2 = MESON[ETA_Y_LT_SQRT2; REAL_ARITH ` #2 = &2 `]`
\r
3169 eta_y #2.2 #2.2 #2.52 < sqrt ( &2 ) `;;
\r
3171 let THANG_DEU = prove(` &2 <= x ==> &2 pow 2 <= x pow 2 `,
\r
3172 NHANH (REAL_ARITH ` &2 <= x ==> &0 <= &2 /\ &0 <= x `)
\r
3173 THEN MESON_TAC[POW2_COND]);;
\r
3175 let LEMMA19 = BYOWBDF;;
\r
3177 MESON[BYOWBDF; REAL_ARITH ` a + b = b + a `]` !a b c a' b' c'.
\r
3184 a' pow 2 <= b pow 2 + c pow 2 /\
\r
3185 b' pow 2 <= c pow 2 + a pow 2 /\
\r
3186 c' pow 2 <= a pow 2 + b pow 2
\r
3187 ==> eta_y a b c <= eta_y a' b' c' `;;
\r
3192 let LEMMA20 = prove(` ! x y z: real^3.
\r
3194 d3 x y <= #2.52 /\
\r
3199 ==> ~collinear {x, y, z} /\ radV {x, y, z} < sqrt (&2)`,
\r
3200 REPEAT GEN_TAC THEN
\r
3201 NHANH (SPEC_ALL LEMMA_OF_LE20) THEN
\r
3202 SIMP_TAC[RADV_FORMULAR] THEN
\r
3203 MP_TAC (REAL_ARITH ` #2.2 pow 2 <= &2 pow 2 + &2 pow 2 /\
\r
3204 #2.52 pow 2 <= &2 pow 2 + &2 pow 2 `) THEN
\r
3206 NHANH THANG_DEU THEN
\r
3208 NHANH (MESON[REAL_ARITH `
\r
3209 a <= b + c /\ b <= bb /\ c <= cc ==> a <= bb + cc `]`
\r
3210 #2.2 pow 2 <= &2 pow 2 + &2 pow 2 /\
\r
3211 #2.52 pow 2 <= &2 pow 2 + &2 pow 2 /\
\r
3213 &2 pow 2 <= d3 x y pow 2 /\
\r
3216 &2 pow 2 <= d3 x z pow 2 /\
\r
3219 &2 pow 2 <= d3 y z pow 2 /\ last
\r
3220 ==> #2.2 pow 2 <= d3 x z pow 2 + d3 x y pow 2 /\
\r
3221 #2.2 pow 2 <= d3 x y pow 2 + d3 y z pow 2 /\
\r
3222 #2.52 pow 2 <= d3 y z pow 2 + d3 x z pow 2 `) THEN
\r
3223 MP_TAC (REAL_ARITH`! a b c. a <= b /\ b < c ==> a < c`) THEN
\r
3224 MESON_TAC[BYOWBDF; ETA_YY_LT_SQRT2 ; REAL_ARITH ` b + c = c + b /\
\r
3225 ( &2 <= a ==> &0 < a) `]);;
\r
3227 let BFYVLKP = LEMMA20;;
\r
3229 let NGAY23_THANG2_09 = prove(` &2 <= y /\ y <= sqrt (&8) ==>
\r
3230 &2 pow 2 <= y * y /\ y * y <= &8 `,
\r
3231 REWRITE_TAC[ GSYM REAL_POW_2] THEN DISCH_TAC THEN CONJ_TAC THENL
\r
3232 [ASM_MESON_TAC[REAL_ARITH ` &2 <= a ==> &0 <= &2 /\ &0 <= a `;POW2_COND];
\r
3233 ASM_MESON_TAC[ SQRT_WORKS; REAL_ARITH ` &0 <= &8 `;
\r
3234 POW2_COND; REAL_ARITH `&2 <= a /\ a <= b ==> &0 <= b /\ &0 <= a `]]);;
\r
3238 let ETA_Y_SQRT8_2_251 = prove(` eta_y ( sqrt (&8) ) (&2) #2.51 < #1.453`,
\r
3239 REWRITE_TAC[eta_y; eta_x; ups_x; GSYM POW_2] THEN
\r
3241 REWRITE_TAC[MESON[SQRT_WORKS; REAL_ARITH ` &0 <= &8 `]` sqrt (&8) pow 2 = &8 `] THEN
\r
3242 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3243 MP_TAC (REAL_FIELD ` &0 < &20160320000 / &9551113999 /\ &0 < #1.453 `) THEN
\r
3244 NHANH (SPEC_ALL SQRT_POS_LT) THEN
\r
3245 SIMP_TAC[LT_POW2_EQ_LT; REAL_ARITH ` &0 < a ==> &0 <= a `; SQRT_POW_2] THEN
\r
3247 CONV_TAC REAL_FIELD );;
\r
3249 MESON[BYOWBDF; REAL_ARITH ` a + b = b + a `]` !a b c a' b' c'.
\r
3256 a' pow 2 <= b pow 2 + c pow 2 /\
\r
3257 b' pow 2 <= c pow 2 + a pow 2 /\
\r
3258 c' pow 2 <= a pow 2 + b pow 2
\r
3259 ==> eta_y a b c <= eta_y a' b' c' `;;
\r
3263 let LEMMA21 = prove(` ! y. &2 <= y /\ y <= sqrt8 ==> eta_y y (&2) #2.51 < #1.453`,
\r
3264 REWRITE_TAC[sqrt8; GSYM POW_2] THEN
\r
3265 NHANH (NGAY23_THANG2_09) THEN
\r
3266 REWRITE_TAC[sqrt8; GSYM POW_2] THEN
\r
3267 NHANH (REAL_ARITH ` &2 pow 2 <= y pow 2 /\ y pow 2 <= &8
\r
3268 ==> &2 pow 2 <= #2.51 pow 2 + y pow 2 /\
\r
3269 #2.51 pow 2 <= y pow 2 + &2 pow 2 /\
\r
3270 &8 <= &2 pow 2 + #2.51 pow 2 `) THEN
\r
3271 NHANH (REAL_ARITH ` &2 <= a ==> &0 < a /\ &0 < &2 /\ &0 < #2.51 /\ (! a. a <= a ) `) THEN
\r
3273 MP_TAC (MESON[SQRT_WORKS; REAL_ARITH ` &0 <= &8 `]` sqrt (&8) pow 2 = &8 `) THEN
\r
3274 MESON_TAC[REAL_ADD_SYM; BYOWBDF; ETA_Y_SQRT8_2_251;
\r
3275 REAL_ARITH ` a <= b /\ b < c ==> a < c `]);;
\r
3277 let WDOMZXH = LEMMA21;;
\r
3282 let CDEUSDF_CHANGE = CDEUSDF;;
\r
3285 let CIRCUMCENTER_FORMULAR = prove(` ! va vb vc. ~collinear {va, vb, vc}
\r
3286 ==> circumcenter {va, vb, vc} =
\r
3288 (d3 va vc pow 2 + d3 va vb pow 2 - d3 vb vc pow 2)) /
\r
3289 (ups_x (d3 vb vc pow 2) (d3 va vc pow 2) (d3 va vb pow 2)) %
\r
3292 (d3 vb vc pow 2 + d3 va vb pow 2 - d3 va vc pow 2)) /
\r
3293 (ups_x (d3 vb vc pow 2) (d3 va vc pow 2) (d3 va vb pow 2)) %
\r
3296 (d3 vb vc pow 2 + d3 va vc pow 2 - d3 va vb pow 2)) /
\r
3297 (ups_x (d3 vb vc pow 2) (d3 va vc pow 2) (d3 va vb pow 2)) %
\r
3299 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
3300 MP_TAC CDEUSDF_CHANGE THEN LET_TR THEN MESON_TAC[]);;
\r
3302 let LE_EX = REAL_ARITH ` &0 <= a <=> a = &0 \/ &0 < a `;;
\r
3304 let SUM_UPS_X_1 = prove(`!a b c.
\r
3306 ==> (c * (b + a - c)) / ups_x a b c +
\r
3307 (a * (c + b - a)) / ups_x a b c +
\r
3308 (b * (c + a - b)) / ups_x a b c =
\r
3309 &1`, REWRITE_TAC[ups_x] THEN CONV_TAC REAL_FIELD);;
\r
3312 let LEMMA18 = prove(` !x (y:real^3) z p.
\r
3313 d3 x z pow 2 < d3 x y pow 2 + d3 y z pow 2 /\
\r
3314 ~collinear {x, y, z} /\
\r
3315 p = circumcenter {x, y, z}
\r
3316 ==> p IN aff_gt {x, z} {y} `,
\r
3317 SIMP_TAC[CIRCUMCENTER_FORMULAR] THEN
\r
3318 REWRITE_TAC[ UPS_X_EQ_ZERO_COND; GSYM d3 ] THEN
\r
3319 REPEAT GEN_TAC THEN MP_TAC ZERO_LE_UPS_X THEN
\r
3320 IMP_IMP_TAC THEN REWRITE_TAC[LE_EX] THEN
\r
3321 REWRITE_TAC[MESON[]`( a \/ b ) /\ c /\ ~a /\ e <=>
\r
3322 b /\ c /\ ~a /\ e `] THEN ONCE_REWRITE_TAC[REAL_ARITH
\r
3323 ` a < b + c <=> &0 < b + c - a `] THEN
\r
3324 REWRITE_TAC[d3; GSYM UPS_X_EQ_ZERO_COND] THEN
\r
3325 ONCE_REWRITE_TAC[VECTOR_ARITH` (a:real^N) + b + c = a + c + b `] THEN
\r
3326 NHANH (MESON[TWO_EQ_IMP_COL3; PER_SET3]`~collinear {x, y, z} ==> ~ ( x = z)`)
\r
3327 THEN REWRITE_TAC[DIST_NZ; simp_def2; IN_ELIM_THM] THEN
\r
3328 STRIP_TAC THEN SIMP_TAC[DIST_SYM] THEN UNDISCH_TAC
\r
3329 ` &0 < ups_x (dist (x,y) pow 2) (dist (x,z) pow 2)
\r
3330 (dist ((y:real^3),z) pow 2) ` THEN
\r
3331 SIMP_TAC [MESON[UPS_X_SYM]` ups_x x y z = ups_x z y x `] THEN
\r
3333 ONCE_REWRITE_TAC[MESON[REAL_ARITH `a + b - c = b + a - c `]` ( &0
\r
3334 < a + b - c /\ l ==> ll ) <=> ( &0 < b + a - c /\ l ==> ll )`] THEN
\r
3335 STRIP_TAC THEN EXISTS_TAC ` (dist ((y:real^3),z) pow 2 *
\r
3336 (dist (x,z) pow 2 + dist (x,y) pow 2 - dist (y,z) pow 2)) /
\r
3337 ups_x (dist (x,y) pow 2) (dist (x,z) pow 2) (dist (y,z) pow 2) ` THEN
\r
3338 EXISTS_TAC `(dist ((x:real^3),y) pow 2 *
\r
3339 (dist (y,z) pow 2 + dist (x,z) pow 2 - dist (x,y) pow 2)) /
\r
3340 ups_x (dist (x,y) pow 2) (dist (x,z) pow 2) (dist (y,z) pow 2)` THEN
\r
3341 EXISTS_TAC ` (dist ((x:real^3),z) pow 2 *
\r
3342 (dist (y,z) pow 2 + dist (x,y) pow 2 - dist (x,z) pow 2)) /
\r
3343 ups_x (dist (x,y) pow 2) (dist (x,z) pow 2) (dist (y,z) pow 2) ` THEN
\r
3344 CONJ_TAC THENL [UNDISCH_TAC `&0 < ups_x (dist (x,y) pow 2)
\r
3345 (dist (x,z) pow 2) (dist ((y:real^3),z) pow 2)` THEN
\r
3346 REWRITE_TAC[SUM_UPS_X_1]; CONJ_TAC] THENL [DOWN_TAC THEN
\r
3347 REWRITE_TAC[MESON[POW_2]` ( a pow 2) * b = ( a * a ) * b `] THEN
\r
3348 MESON_TAC[REAL_LT_MUL; REAL_LT_DIV]; SIMP_TAC[]]);;
\r
3350 let WSMRDKN = LEMMA18;;
\r
3351 let LEMMA19 = BYOWBDF;;
\r
3355 MESON[POW2_COND; REAL_ARITH `&2 <= a /\ a <= b ==> &0 <= b /\ &0 <= a `]`
\r
3356 &2 <= y /\ y <= b ==> y pow 2 <= b pow 2 `;;
\r
3359 let FACTOR_OF_QUADRARTIC = prove(`! a b c x. ~(a = &0) /\
\r
3360 &0 <= b pow 2 - &4 * a * c ==> a * x pow 2 + b * x + c =
\r
3362 (x - (--b + sqrt (b pow 2 - &4 * a * c)) / (&2 * a)) *
\r
3363 (x - (--b - sqrt (b pow 2 - &4 * a * c)) / (&2 * a))` ,
\r
3364 REWRITE_TAC[PRE_VIET] THEN SIMP_TAC[REAL_FIELD ` ~( a = &0 ) ==>
\r
3365 -- a * ( ( --b + del) / ( &2 * a ) + ( --b - del) / ( &2 * a )) = b `] THEN
\r
3366 REWRITE_TAC[REAL_FIELD ` a / b * a' / b = ( a * a' ) / ( b pow 2 ) `] THEN
\r
3367 REWRITE_TAC[REAL_FIELD ` a / b * a' / b = ( a * a' ) / ( b pow 2 ) `;
\r
3368 REAL_DIFFSQ; GSYM REAL_POW_2] THEN SIMP_TAC[SQRT_WORKS] THEN
\r
3369 SIMP_TAC[REAL_FIELD ` ~ ( a = &0 ) ==> a * (--b pow 2 -
\r
3370 (b pow 2 - &4 * a * c)) / (&2 * a) pow 2 = c `]);;
\r
3373 let COMPUTE_TO_QUA_POLY = prove(` #2.696 <= x /\ x <= sqrt8 ==>
\r
3374 x pow 2 * ( &1 / eta_y x #2.45 #2.45 pow 2 -
\r
3375 &1 / eta_y x ( &2 ) #2.51 pow 2 ) = &4331842500 / &363188227801 * x pow 4 +
\r
3376 -- &45702201 / &302530802 * x pow 2 +
\r
3377 &529046001 / &2520040000 `, REWRITE_TAC[eta_y; eta_x; ups_x] THEN
\r
3379 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3380 NHANH (MESON[REAL_ARITH ` #2.696 <= x /\ x <= sqrt8 ==>
\r
3381 &0 <= #2.696 /\ &0 <= x `; REAL_LE_MUL2] ` #2.696 <= x /\ x <= sqrt8 ==>
\r
3382 #2.696 * #2.696 <= x * x /\ x * x <= sqrt8 * sqrt8 `) THEN
\r
3383 NHANH (MESON[REAL_ARITH ` #2.696 * #2.696 <= x ==> &0 <= #2.696 * #2.696 /\ &0 <= x `; REAL_LE_MUL2] `
\r
3384 #2.696 * #2.696 <= x /\ x <= hh ==> (#2.696 * #2.696) * #2.696 * #2.696 <= x * x /\
\r
3385 x * x <= hh * hh `) THEN
\r
3386 REWRITE_TAC[sqrt8] THEN
\r
3387 REWRITE_TAC[REAL_POLY_CONV ` (--(x * x) * x * x - &16 - &3969126001 / &100000000 +
\r
3388 &2 * (x * x) * &63001 / &10000 +
\r
3389 &2 * (x * x) * &4 +
\r
3390 &63001 / &1250) `] THEN
\r
3391 REWRITE_TAC[REAL_POLY_CONV `
\r
3392 (--(x * x) * x * x - &5764801 / &160000 - &5764801 / &160000 +
\r
3393 &2 * (x * x) * &2401 / &400 +
\r
3394 &2 * (x * x) * &2401 / &400 +
\r
3395 &5764801 / &80000) `] THEN
\r
3396 REWRITE_TAC[REAL_ARITH ` x pow 4 = ( x pow 2 ) pow 2 `] THEN
\r
3397 MP_TAC (REAL_ARITH ` ~ ( -- &1 = &0 ) /\ &0 <= ( &103001 / &5000 ) pow 2 - &4 * ( -- &1 ) * -- &529046001 / &100000000 `) THEN
\r
3398 SIMP_TAC[FACTOR_OF_QUADRARTIC] THEN
\r
3399 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3400 REWRITE_TAC[REAL_ARITH ` (&252004 / &625) = ( &502 / &25 ) * ( &502 / &25 ) `] THEN
\r
3401 REWRITE_TAC[MESON[REAL_ARITH ` &0 <= &502 / &25 /\ x * x = x pow 2 `; POW_2_SQRT]`
\r
3402 sqrt ( ( &502 / &25 ) * ( &502 / &25 )) = ( &502 / &25 ) `] THEN
\r
3403 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3404 REWRITE_TAC[ GSYM POW_2] THEN
\r
3405 REWRITE_TAC[REAL_ARITH ` a * x pow 2 + b * x = ( a * x + b ) * x `] THEN
\r
3406 REWRITE_TAC[MESON[SQRT_WORKS; REAL_ARITH ` &0 <= &8`]` sqrt (&8) pow 2 = &8 `] THEN
\r
3407 NHANH (REAL_FIELD ` (&113569 / &15625 <= x pow 2 /\ x pow 2 <= &8)
\r
3408 ==> &0 <= (-- &1 * x pow 2 + &2401 / &100) /\
\r
3409 &0 <= (x pow 2 - &2601 / &10000 ) /\
\r
3410 &0 <= -- ((x pow 2 - &203401 / &10000) )/\ &0 <= &5764801 / &160000 /\
\r
3411 &0 <= &63001 / &2500`) THEN
\r
3412 MP_TAC REAL_LE_POW_2 THEN
\r
3413 REWRITE_TAC[REAL_ARITH ` -- &1 * a * b = a * -- b `] THEN
\r
3414 REWRITE_TAC[REAL_FIELD ` ( &1 / a ) pow 2 = &1 / ( a pow 2 ) `] THEN
\r
3415 MP_TAC REAL_LE_MUL THEN
\r
3416 MP_TAC REAL_LE_DIV THEN
\r
3417 SIMP_TAC[ SQRT_WORKS] THEN
\r
3418 REWRITE_TAC[REAL_SUB_LDISTRIB] THEN
\r
3419 REWRITE_TAC[REAL_FIELD ` &1 / ( a / b ) = b / a `] THEN
\r
3420 SIMP_TAC[REAL_FIELD ` &113569 / &15625 <= a ==> a * ( b / ( a * c )) = b / c `] THEN
\r
3421 REWRITE_TAC[REAL_POLY_CONV ` ((-- &1 * x pow 2 + &2401 / &100) * x pow 2) / (&5764801 / &160000) -
\r
3422 ((x pow 2 - &2601 / &10000) * --(x pow 2 - &203401 / &10000)) /
\r
3423 (&63001 / &2500) `] THEN
\r
3424 REWRITE_TAC[REAL_ARITH ` a pow 4 = a pow 2 pow 2 `]);;
\r
3426 REAL_ARITH ` &4650694416 = ( &68196 ) pow 2 `;;
\r
3427 REAL_ARITH` &4650694416 / &363188227801 = ( &68196 / &602651 ) pow 2 `;;
\r
3430 let PHAN_TICH = prove( `! x. &4331842500 / &363188227801 *
\r
3431 (x pow 2 - &488365801 / &44090000) *
\r
3432 (x pow 2 - &2081667 / &1310000) =
\r
3433 &4331842500 / &363188227801 * x pow 4 +
\r
3434 -- &45702201 / &302530802 * x pow 2 +
\r
3435 &529046001 / &2520040000` , REAL_ARITH_TAC);;
\r
3437 let Q_TR = prove(`! x. #2.696 <= x /\ x <= sqrt8 ==>
\r
3439 (&1 / eta_y x #2.45 #2.45 pow 2 - &1 / eta_y x (&2) #2.51 pow 2) <= &0 `,
\r
3440 SIMP_TAC[COMPUTE_TO_QUA_POLY; GSYM PHAN_TICH ] THEN
\r
3441 NHANH (MESON[REAL_ARITH ` #2.696 <= x /\ x <= hh ==> &0 <= #2.696 /\ &0 <= x`
\r
3442 ; REAL_LE_MUL2] ` #2.696 <= x /\ x <= hh ==>
\r
3443 #2.696 * #2.696 <= x * x /\ x * x <= hh * hh `) THEN
\r
3444 REWRITE_TAC[REAL_ARITH `
\r
3445 &4331842500 / &363188227801 * a <= &0 <=> a <= &0 `] THEN
\r
3446 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3447 REWRITE_TAC[REAL_ARITH ` &0 <=
\r
3448 &4331842500 / &363188227801 * a <=> &0 <= a `; sqrt8; GSYM POW_2;
\r
3449 MESON[SQRT_WORKS; REAL_ARITH ` &0 <= &8 `]` sqrt (&8) pow 2 = &8 `] THEN
\r
3450 NHANH (REAL_ARITH ` &113569 / &15625 <= x pow 2 /\
\r
3451 x pow 2 <= &8 ==> x pow 2 - &488365801 / &44090000 <= &0 /\
\r
3452 x pow 2 - &2081667 / &1310000 >= &0 `) THEN
\r
3453 REWRITE_TAC[ REAL_ARITH ` ( a >= &0 <=> &0 <= a)/\ (a <= &0 <=> &0 <= -- a ) `] THEN
\r
3454 REWRITE_TAC[REAL_ARITH ` -- ( a * b ) = -- a * b `] THEN
\r
3455 MESON_TAC[REAL_LE_MUL]);;
\r
3457 let SQRT8_LT = prove(` sqrt (&8) < &4 * #2.45 `,
\r
3458 MP_TAC (REAL_ARITH ` &0 < &8 /\ &0 < &4 * #2.45`) THEN
\r
3459 SIMP_TAC[SQRT_POS_LT; LT_POW2_EQ_LT] THEN
\r
3460 SIMP_TAC[REAL_LT_IMP_LE; SQRT_WORKS] THEN REAL_ARITH_TAC);;
\r
3464 let SQRT8_POW2 = MESON[SQRT_WORKS; REAL_ARITH ` &0 <= &8 `]` sqrt (&8) pow 2 = &8 `;;
\r
3467 let IM_UP_POS = prove(`! x. #2.696 <= x /\ x <= sqrt8 ==>
\r
3468 &0 < ups_x (x * x) (#2.45 * #2.45) (#2.45 * #2.45) /\
\r
3469 &0 < ups_x (x * x) (&2 * &2) (#2.51 * #2.51) `,
\r
3470 REWRITE_TAC[ups_x] THEN
\r
3471 REWRITE_TAC[REAL_IDEAL_CONV [` (x:real) pow 2 `]`
\r
3472 --(x * x) * x * x -
\r
3473 (#2.45 * #2.45) * #2.45 * #2.45 -
\r
3474 (#2.45 * #2.45) * #2.45 * #2.45 +
\r
3475 &2 * (x * x) * #2.45 * #2.45 +
\r
3476 &2 * (x * x) * #2.45 * #2.45 +
\r
3477 &2 * (#2.45 * #2.45) * #2.45 * #2.45 `] THEN
\r
3478 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3479 REWRITE_TAC[REAL_POLY_CONV ` --(x * x) * x * x - &16 - &3969126001 / &100000000 +
\r
3480 &2 * (x * x) * &63001 / &10000 +
\r
3481 &2 * (x * x) * &4 +
\r
3482 &63001 / &1250 `] THEN
\r
3483 NHANH (REAL_ARITH` #2.696 <= x /\ x <= s ==> &0 <= #2.696 /\
\r
3484 &0 <= x /\ &0 <= s `) THEN
\r
3485 ONCE_REWRITE_TAC[MESON[]` a /\ b ==> c <=> b ==> a ==> c `] THEN
\r
3486 SIMP_TAC[POW2_COND; sqrt8; SQRT8_POW2] THEN
\r
3487 NHANH (REAL_ARITH` #2.696 pow 2 <= x /\ x <= &8 ==>
\r
3488 &0 < &2401 / &100 + -- &1 * x /\ &0 < x /\
\r
3489 ~ ( -- &1 = &0 ) /\ &0 <= ( &103001 / &5000 ) pow 2 - &4 * -- &1 *
\r
3490 -- &529046001 / &100000000 `) THEN
\r
3491 SIMP_TAC[REAL_ARITH ` x pow 4 = x pow 2 pow 2 `; FACTOR_OF_QUADRARTIC] THEN
\r
3492 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3493 REWRITE_TAC[REAL_ARITH ` &252004 / &625 = ( &502 / &25) pow 2 `] THEN
\r
3494 REWRITE_TAC[MESON[POW_2_SQRT; REAL_ARITH ` &0 <= &502 / &25 `]`
\r
3495 sqrt ((&502 / &25) pow 2) = &502 / &25 `] THEN
\r
3496 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3497 NHANH (REAL_ARITH ` &113569 / &15625 <= x pow 2 /\ x pow 2 <= &8 ==>
\r
3498 &0 < x pow 2 - &2601 / &10000 /\ &0 < -- (x pow 2 - &203401 / &10000) `) THEN
\r
3499 REWRITE_TAC[REAL_ARITH ` -- &1 * a * b = a * --b `] THEN
\r
3500 SIMP_TAC[REAL_LT_MUL]);;
\r
3503 let IMP_ETAY_POS = prove( `! x. #2.696 <= x /\ x <= sqrt8 ==>
\r
3504 &0 < eta_y x #2.45 #2.45 /\ &0 < eta_y x (&2) #2.51 `,
\r
3505 REWRITE_TAC[eta_y; eta_x] THEN
\r
3507 NHANH (MESON[REAL_ARITH ` &0 <= #2.696`; REAL_LE_MUL2]`
\r
3508 #2.696 <= x ==> #2.696 * #2.696 <= x * x `) THEN
\r
3509 NHANH (REAL_ARITH ` #2.696 * #2.696 <= x * x ==>
\r
3510 &0 < ((x * x) * (#2.45 * #2.45) * #2.45 * #2.45) /\
\r
3511 &0 < ((x * x) * (&2 * &2) * #2.51 * #2.51) `) THEN
\r
3512 MESON_TAC[IM_UP_POS; REAL_LT_DIV; SQRT_POS_LT]);;
\r
3515 let REAL_LE_RDIV_0 = prove(` ! a b. &0 < b ==> ( &0 <= a / b <=> &0 <= a ) `,
\r
3516 REWRITE_TAC[REAL_ARITH ` &0 <= a <=> &0 < a \/ a = &0 `] THEN
\r
3517 SIMP_TAC[REAL_LT_RDIV_0] THEN
\r
3518 SIMP_TAC[REAL_FIELD `&0 < b ==> ( a / b = &0 <=> a = &0 ) `]);;
\r
3521 let NHSJMDH = prove(` ! y. #2.696 <= y /\ y <= sqrt8 ==>
\r
3522 eta_y y (&2) (#2.51) <= eta_y y #2.45 (#2.45) `,
\r
3523 NHANH (SPEC_ALL Q_TR) THEN
\r
3524 ONCE_REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `] THEN
\r
3525 NHANH (MESON[REAL_ARITH ` &0 <= #2.696`; REAL_LE_MUL2]`
\r
3526 #2.696 <= x ==> #2.696 * #2.696 <= x * x `) THEN
\r
3527 REWRITE_TAC[POW_2] THEN
\r
3528 NHANH (REAL_ARITH `#2.696 * #2.696 <= y ==> &0 < y `) THEN
\r
3529 REWRITE_TAC[REAL_ARITH ` a * b <= &0 <=> &0 <= a * -- b `] THEN
\r
3530 SIMP_TAC[REAL_LE_MUL_EQ] THEN
\r
3531 ONCE_REWRITE_TAC[MESON[]`( a/\b ) /\ c <=> ( a /\ c ) /\ b `] THEN
\r
3532 NHANH (SPEC_ALL IMP_ETAY_POS) THEN
\r
3533 NHANH (REAL_ARITH ` &0 < eta_y a b c ==> ~(eta_y a b c = &0 ) `) THEN
\r
3534 REWRITE_TAC[GSYM REAL_POSSQ] THEN SIMP_TAC[REAL_FIELD ` &0 < a /\
\r
3535 &0 < b ==> -- (&1 / a - &1 / b) = (a - b) / ( a * b ) `] THEN
\r
3536 PHA THEN SIMP_TAC[REAL_LT_MUL; REAL_LE_RDIV_0] THEN
\r
3537 REWRITE_TAC[GSYM REAL_DIFFSQ] THEN
\r
3538 SIMP_TAC[REAL_LT_ADD; REAL_LE_MUL_EQ] THEN REAL_ARITH_TAC);;
\r
3558 let SQRT8_LE = MESON[ REAL_ARITH ` &0 <= &8`; SQRT_WORKS]` &0 <= sqrt (&8) `;;
\r
3560 let RELATE_POW2 = prove(` ( a = &0 <=> a pow 2 = &0 ) /\
\r
3561 ( &0 < a pow 2 <=> &0 < a \/ ~( &0 <= a )) `,
\r
3562 MP_TAC (REAL_FIELD ` a = &0 <=> a pow 2 = &0 `) THEN DISCH_TAC THEN
\r
3563 CONJ_TAC THENL [ASM_SIMP_TAC[]; MP_TAC REAL_LE_POW_2] THEN
\r
3564 MP_TAC (REAL_ARITH `( ! a. &0 < a \/ ~(&0 <= a) \/ a = &0 )`) THEN
\r
3565 MP_TAC (REAL_FIELD ` a = &0 <=> a pow 2 = &0 `) THEN
\r
3566 REWRITE_TAC[REAL_ARITH ` A <= b <=> A = b \/ A < b `] THEN
\r
3567 MESON_TAC[REAL_ARITH ` ~ ( a = &0 /\ ( &0 < a \/ ~( &0 <= a ) )) `]);;
\r
3569 let LT_POW2_COND = prove(`!a b. &0 <= a /\ &0 <= b ==> (a < b <=> a pow 2 < b pow 2)`,
\r
3570 REPEAT GEN_TAC THEN ASM_CASES_TAC ` a = &0 ` THENL
\r
3571 [ASM_SIMP_TAC[REAL_ARITH` &0 pow 2 = &0 `] THEN MESON_TAC[RELATE_POW2];
\r
3572 ASM_SIMP_TAC[REAL_LE_LT]] THEN STRIP_TAC THENL [ASM_MESON_TAC[LT_POW2_EQ_LT];
\r
3573 EXPAND_TAC "b"] THEN UNDISCH_TAC `&0 < a ` THEN REWRITE_TAC[REAL_ARITH `
\r
3574 &0 pow 2 = &0 /\ (a < &0 <=> ~(&0 <= a))`] THEN MP_TAC REAL_LE_POW_2 THEN
\r
3575 MESON_TAC[REAL_LT_IMP_LE]);;
\r
3578 let POS_IMP_POW2 = MESON[REAL_LE_TRANS; POW2_COND]` &0 <= a /\ a <= b ==> a pow 2
\r
3582 let SQRT8_LE_EQ_8_LESS_POW2 = prove(` sqrt (&8 ) <= a ==> &8 <= a pow 2 `,
\r
3583 MP_TAC SQRT8_LE THEN MESON_TAC[SQRT8_POW2; POS_IMP_POW2]);;
\r
3586 let MINIMAL_QUADRATIC_POLY = prove(`
\r
3587 ! b c (x:real). ( &4 * c - b pow 2 ) / &4 <= x pow 2 + b * x + c `,
\r
3588 ONCE_REWRITE_TAC[REAL_ARITH ` a <= b <=> &0 <= b - a `] THEN
\r
3589 REWRITE_TAC[REAL_ARITH ` (x pow 2 + b * x + c) - (&4 * c - b pow 2) / &4
\r
3590 = ( x + b / &2 ) pow 2 `; REAL_LE_POW_2]);;
\r
3592 let GREATER_THAN_MID_QUADRATIC_PO = prove(` ! b c x x0. -- b / &2 <= x0 /\ x0 <= x ==>
\r
3593 x0 pow 2 + b * x0 + c <= x pow 2 + b * x + c `,
\r
3594 REWRITE_TAC[REAL_ARITH ` x0 pow 2 + b * x0 + c <= x pow 2 + b * x + c
\r
3595 <=> &0 <= ( x - x0 ) * ( x + x0 + b ) `] THEN
\r
3596 MESON_TAC[REAL_ARITH ` --b / &2 <= x0 /\ x0 <= x ==>
\r
3597 &0 <= x - x0 /\ &0 <= x + x0 + b `; REAL_LE_MUL]);;
\r
3602 let SQRT8_TWO_TWO = prove(` sqrt (&8) <= &2 + &2 `,
\r
3603 MP_TAC SQRT8_LE THEN NHANH (MESON[REAL_ARITH ` &0 <= &2 + &2 `]
\r
3604 `&0 <= sqrt (&8) ==> &0 <= &2 + &2 `) THEN SIMP_TAC[POW2_COND] THEN
\r
3605 SIMP_TAC[REAL_ARITH ` &0 <= &8 `; SQRT_WORKS] THEN REAL_ARITH_TAC);;
\r
3608 let A_POS_DELTA = prove(` &0 < delta (#3.2 pow 2 ) (sqrt8 pow 2 ) (&2 pow 2) (sqrt8 pow 2)
\r
3609 (&2 pow 2) (&2 pow 2) `, REWRITE_TAC[delta; sqrt8; SQRT8_POW2] THEN REAL_ARITH_TAC);;
\r
3612 let THADGSB = new_axiom` !M13 m12 m14 M24 m34 m23 v1 v2 v3 v4.
\r
3613 (!x. x IN {M13, m12, m14, M24, m34, m23} ==> &0 <= x) /\
\r
3614 M13 < m12 + m23 /\
\r
3615 M13 < m14 + m34 /\
\r
3616 M24 < m12 + m14 /\
\r
3617 M24 < m23 + m34 /\
\r
3619 delta (M13 pow 2) (m12 pow 2) (m14 pow 2) (M24 pow 2) (m34 pow 2)
\r
3621 CARD {v1, v2, v3, v4} = 4 /\
\r
3622 m12 <= d3 v1 v2 /\
\r
3623 m23 <= d3 v2 v3 /\
\r
3624 m34 <= d3 v3 v4 /\
\r
3625 m14 <= d3 v1 v4 /\
\r
3626 d3 v1 v3 <= M13 /\
\r
3627 d3 v2 v4 <= M24 ==> conv {v1,v3} INTER conv {v2,v4} = {} `;;
\r
3629 let MET_LAM_ROI = prove(` #3.2 < sqrt8 + &2 /\ #3.2 < &2 + &2 /\ sqrt8 < sqrt8 + &2 /\
\r
3630 sqrt8 < &2 + &2 `,
\r
3631 REWRITE_TAC[sqrt8; REAL_ARITH ` a < sqrt (&8) + b <=> a - b < sqrt (&8) `] THEN
\r
3632 REWRITE_TAC[REAL_ARITH ` sqrt (&8) - &2 < sqrt (&8) `] THEN
\r
3633 CONV_TAC REAL_RAT_REDUCE_CONV THEN MP_TAC SQRT8_LE THEN
\r
3634 MP_TAC (REAL_ARITH` &0 <= &6 / &5 /\ &0 <= &4 `) THEN
\r
3635 SIMP_TAC[LT_POW2_COND ] THEN SIMP_TAC[LT_POW2_COND; SQRT8_POW2 ] THEN
\r
3639 let PROVE_POS_THINGS = prove(` ! x. x IN {#3.2 , sqrt8, &2 , sqrt8, &2, &2 } ==> &0 <= x `,
\r
3640 REWRITE_TAC[SET_RULE `( !x. x IN {a,b,c,d,s,e} ==> p x ) <=>
\r
3641 p a /\ p b /\ p c /\ p d /\ p s /\ p e `;sqrt8; SQRT8_LE] THEN REAL_ARITH_TAC);;
\r
3645 let IMP_GT_THAN_TWO = prove(` ! v1 v2 w1 (w2:real^3).
\r
3646 CARD {v1, w1,v2, w2} = 4 /\
\r
3647 packing {v1, w1,v2, w2}
\r
3648 ==> &2 <= d3 w1 v2 /\
\r
3651 REWRITE_TAC[CARD4; packing; GSYM d3; sqrt8] THEN SET_TAC[]);;
\r
3655 let JGYWWBX = prove(` ~ (?v1 v2 w1 (w2:real^3).
\r
3656 CARD {v1, v2, w1, w2} = 4 /\
\r
3657 packing {v1, v2, w1, w2} /\
\r
3658 dist (v1,w1) >= sqrt8 /\
\r
3659 dist (v1,v2) <= #3.2 /\
\r
3660 dist (w1,w2) <= sqrt8 /\
\r
3661 ~(conv {v1, v2} INTER conv {w1, w2} = {}))`,
\r
3662 MP_TAC (MESON[ REAL_ARITH ` &0 <= &8 /\ &0 <= &2 /\ &0 <= #3.2 `;
\r
3663 SQRT_WORKS]` &0 <= sqrt (&8) /\ &0 <= &2 /\ &0 <= #3.2`) THEN
\r
3664 MP_TAC MET_LAM_ROI THEN
\r
3665 REWRITE_TAC[MESON[]` CARD s = 4 /\ b /\ c <=> ( CARD s = 4 /\ b ) /\ c `] THEN
\r
3666 ONCE_REWRITE_TAC[SET_RULE ` {v1, v2, w1, w2} = {v1,w1,v2,w2} `] THEN
\r
3667 NHANH (SPEC_ALL IMP_GT_THAN_TWO ) THEN MP_TAC PROVE_POS_THINGS THEN
\r
3668 MP_TAC A_POS_DELTA THEN REWRITE_TAC[GSYM d3; REAL_ARITH ` a >= b <=> b <= a `]
\r
3669 THEN IMP_IMP_TAC THEN DISCH_TAC THEN NGOAC THEN
\r
3670 MATCH_MP_TAC (MESON[]` (! v1 v2 w1 w2. P v1 v2 w1 w2 ==> Q v1 v2 w1 w2)
\r
3671 ==> ~(? v1 v2 w1 w2. P v1 v2 w1 w2 /\ ~( Q v1 v2 w1 w2)) `) THEN
\r
3672 REPEAT GEN_TAC THEN FIRST_X_ASSUM MP_TAC THEN ABBREV_TAC `M13 = #3.2 ` THEN
\r
3673 PHA THEN REWRITE_TAC[sqrt8] THEN MP_TAC (SPECL [`M13:real`; `sqrt8`; `&2`;`sqrt8`
\r
3674 ;`&2 `; `&2`; `v1:real^3` ; `w1:real^3`; `v2:real^3`; `w2:real^3`] THADGSB) THEN
\r
3675 SIMP_TAC[D3_SYM; sqrt8]);;
\r
3677 let LEMMA37 = JGYWWBX;;
\r
3680 let LEMMA_FOR_PAHFWSI = prove(`! v1 v2 v3 v4. CARD {v1, v2, v3, v4} = 4 /\
\r
3681 packing {v1, v2, v3, v4} /\
\r
3682 dist (v1,v3) <= #3.2 /\
\r
3683 #2.51 <= dist (v1,v2) /\
\r
3684 dist (v2,v4) <= #2.51
\r
3685 ==> (!x. x IN {#3.2, #2.51, &2, #2.51, &2, &2} ==> &0 <= x) /\
\r
3686 #3.2 < #2.51 + &2 /\
\r
3688 #2.51 < #2.51 + &2 /\
\r
3689 #2.51 < &2 + &2 /\
\r
3691 delta (#3.2 pow 2) (#2.51 pow 2) (&2 pow 2) (#2.51 pow 2) (&2 pow 2)
\r
3693 CARD {v1, v2, v3, v4} = 4 /\
\r
3694 #2.51 <= d3 v1 v2 /\
\r
3698 d3 v1 v3 <= #3.2 /\
\r
3699 d3 v2 v4 <= #2.51 `,
\r
3700 REWRITE_TAC[SET_RULE ` (!x. x IN {a,b,c,d,e,f} ==> P x ) <=>
\r
3701 P a /\ P b /\ P c /\ P d /\ P e /\ P f `; REAL_ARITH `
\r
3707 &0 <= #2.51 /\ #2.51 < &2 + #2.51 /\
\r
3708 #2.51 < &2 + &2 /\
\r
3710 #3.2 < #2.51 + &2 /\ #3.2 < &2 + #2.51 /\
\r
3711 #2.51 < #2.51 + &2 `] THEN SIMP_TAC[GSYM d3] THEN
\r
3712 REWRITE_TAC[CARD4; packing; delta; d3] THEN CONV_TAC REAL_RAT_REDUCE_CONV
\r
3715 let PAHFWSI = prove(` !(v1:real^3) v2 v3 v4.
\r
3716 CARD {v1, v2, v3, v4} = 4 /\
\r
3717 packing {v1, v2, v3, v4} /\
\r
3718 dist (v1,v3) <= #3.2 /\
\r
3719 #2.51 <= dist (v1,v2) /\
\r
3720 dist (v2,v4) <= #2.51
\r
3721 ==> conv {v1, v3} INTER conv {v2, v4} = {} `, REPEAT GEN_TAC THEN
\r
3722 MP_TAC (SPECL [` #3.2 `; `#2.51`;` &2 `; ` #2.51 `;` &2 `; `&2`] THADGSB) THEN
\r
3723 NHANH (SPEC_ALL LEMMA_FOR_PAHFWSI ) THEN SIMP_TAC[]);;
\r
3724 let LEMMA38 = PAHFWSI;;
\r
3726 let LEMMA_OF_39 = prove(` ! (v1:real^3) v2 w1 w2.
\r
3727 CARD {v1, v2, w1, w2} = 4 /\
\r
3728 packing {v1, v2, w1, w2} /\
\r
3729 dist (w1,w2) <= #2.51 /\
\r
3730 dist (v1,v2) <= #3.07
\r
3731 ==> (!x. x IN {#2.51, &2, &2, #3.07, &2, &2} ==> &0 <= x) /\
\r
3732 #2.51 < &2 + &2 /\
\r
3733 #2.51 < &2 + &2 /\
\r
3734 #3.07 < &2 + &2 /\
\r
3735 #3.07 < &2 + &2 /\
\r
3737 delta (#2.51 pow 2) (&2 pow 2) (&2 pow 2) (#3.07 pow 2) (&2 pow 2)
\r
3739 CARD {w1, v1, w2, v2} = 4 /\
\r
3744 d3 w1 w2 <= #2.51 /\
\r
3745 d3 v1 v2 <= #3.07 `,
\r
3746 REWRITE_TAC[SET_RULE ` (!x. x IN {a,b,c,d,e,f} ==> P x ) <=>
\r
3747 P a /\ P b /\ P c /\ P d /\ P e /\ P f `; delta; GSYM d3] THEN CONV_TAC
\r
3748 REAL_RAT_REDUCE_CONV THEN REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL
\r
3749 [ASM_MESON_TAC[SET_RULE ` {v1, v2, w1, w2} = {w1, v1, w2, v2}`];DOWN_TAC]
\r
3750 THEN REWRITE_TAC[CARD4; packing; d3] THEN SET_TAC[]);;
\r
3753 let UVGVIXB = prove(` ! (v1:real^3) v2 w1 w2.
\r
3754 CARD {v1, v2, w1, w2} = 4 /\
\r
3755 packing {v1, v2, w1, w2} /\
\r
3756 dist (w1,w2) <= #2.51 /\
\r
3757 dist (v1,v2) <= #3.07
\r
3758 ==> conv {w1, w2} INTER conv {v1, v2} = {}`, NHANH (SPEC_ALL LEMMA_OF_39)
\r
3759 THEN SIMP_TAC[ SPECL [ ` #2.51 `; `&2 `; `&2 `; `#3.07 `; `&2 `; ` &2 `;
\r
3760 ` w1:real^3 `; ` v1:real^3`;` w2:real^3`; `v2:real^3 `] THADGSB ]);;
\r
3762 let LEMMA39 = UVGVIXB;;
\r
3764 let LEMMA_OF_LEMMA40 = prove(`! v1 v2 w1 (w2:real^3). CARD {v1, v2, w1, w2} = 4 /\
\r
3765 packing {v1, v2, w1, w2} /\
\r
3766 dist (v1,v2) <= #3.2 /\
\r
3767 dist (w1,w2) <= #2.51 /\
\r
3768 #2.2 <= dist (v1,w1)
\r
3769 ==> (!x. x IN {#3.2, #2.2, &2, #2.51, &2, &2} ==> &0 <= x) /\
\r
3770 #3.2 < #2.2 + &2 /\
\r
3772 #2.51 < #2.2 + &2 /\
\r
3773 #2.51 < &2 + &2 /\
\r
3775 delta (#3.2 pow 2) (#2.2 pow 2) (&2 pow 2) (#2.51 pow 2) (&2 pow 2)
\r
3777 CARD {v1, w1, v2, w2} = 4 /\
\r
3778 #2.2 <= d3 v1 w1 /\
\r
3782 d3 v1 v2 <= #3.2 /\
\r
3783 d3 w1 w2 <= #2.51 `,
\r
3784 REWRITE_TAC[SET_RULE ` (! x. x IN {a,b,c,d,e,f} ==> P x ) <=>
\r
3785 P a /\ P b /\ P c /\ P d /\ P e /\ P f `; delta] THEN
\r
3786 CONV_TAC REAL_RAT_REDUCE_CONV THEN SIMP_TAC[SET_RULE `
\r
3787 {v1, v2, w1, w2} = {v1, w1, v2, w2} `; packing] THEN
\r
3788 SIMP_TAC[CARD4; GSYM d3] THEN SET_TAC[]);;
\r
3790 let PJFAYXI = prove(`! (v1:real^3) v2 w1 w2.
\r
3791 CARD {v1, v2, w1, w2} = 4 /\ packing {v1, v2, w1, w2} /\
\r
3792 dist (v1,v2) <= #3.2 /\
\r
3793 dist (w1,w2) <= #2.51 /\
\r
3794 #2.2 <= dist (v1,w1)
\r
3795 ==> conv {v1, v2} INTER conv {w1, w2} = {}`,
\r
3796 NHANH (SPEC_ALL LEMMA_OF_LEMMA40) THEN SIMP_TAC[
\r
3797 SPECL [ ` #3.2 `; `#2.2 `; `&2 `; `#2.51 `; `&2 `; ` &2 `;
\r
3798 ` v1:real^3 `; ` w1:real^3`;` v2:real^3`; `w2:real^3 `] THADGSB ]);;
\r
3800 let LEMMA40 = PJFAYXI;;
\r
3804 let LEOF41 = prove(
\r
3805 `#3.114467 < x ==> delta (#2.51 pow 2) (&2 pow 2) (&2 pow 2) (&2 pow 2)
\r
3806 (&2 pow 2) (x pow 2) < &0`,
\r
3807 NHANH (MESON[REAL_ARITH ` #3.114467 < x ==> &0 < #3.114467 /\ &0 < x `;
\r
3808 LT_POW2_EQ_LT]` #3.114467 < x ==> ( #3.114467 ) pow 2 < x pow 2 `) THEN
\r
3809 REWRITE_TAC[delta] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3810 REWRITE_TAC[ REAL_POLY_CONV ` -- &126002 / &625 - &4 * &4 * x pow 2 - &4 * &4 * x pow 2 +
\r
3811 &63001 / &10000 * x pow 2 *
\r
3812 (-- &63001 / &10000 + &4 + &4 + &4 + &4 - x pow 2) +
\r
3813 &4 * &4 * (&23001 / &10000 + &4 + &0 + x pow 2) +
\r
3814 &4 * &4 * (&63001 / &10000 + -- &4 + &4 + x pow 2) `] THEN
\r
3815 REWRITE_TAC[REAL_ARITH ` a pow 4 = a pow 2 pow 2 `] THEN
\r
3816 REWRITE_TAC[REAL_ARITH ` a * x pow 2 + b * x = ( a * x + b ) * x `] THEN
\r
3817 NHANH (REAL_ARITH `&9699904694089 / &1000000000000 < x pow 2
\r
3818 ==> -- &63001 / &10000 * x pow 2 + &6111033999 / &100000000 < &0` ) THEN
\r
3819 NHANH (REAL_ARITH `&9699904694089 / &1000000000000 < x ==> &0 < x `) THEN
\r
3820 REWRITE_TAC[REAL_ARITH ` a < &0 <=> &0 < -- a `;
\r
3821 REAL_ARITH ` -- ( a * b ) = -- a * b `] THEN MESON_TAC[REAL_LT_MUL]);;
\r
3824 let LEMMA41 = prove(`! v1 v2 v3 (v4:real^3).
\r
3825 CARD {v1,v2,v3,v4} = 4 /\
\r
3826 d3 v1 v2 = #2.51 /\
\r
3831 ==> d3 v3 v4 <= #3.114467 `,
\r
3832 REPEAT GEN_TAC THEN MP_TAC LEMMA3 THEN LET_TR THEN
\r
3833 REWRITE_TAC[REAL_ARITH ` x <= #3.114467 <=> ~ (#3.114467 < x ) `] THEN
\r
3834 REWRITE_TAC[REAL_ARITH ` x <= #3.114467 <=> ~ (#3.114467 < x ) `;
\r
3835 MESON[]` a ==> ~ b <=> a /\ b ==> F `] THEN PHA THEN
\r
3836 NHANH (SPEC_ALL (prove(`! (v1:real^3) v2 v3 v4. d3 v1 v2 = #2.51 /\
\r
3837 d3 v1 v3 = &2 /\ d3 v1 v4 = &2 /\ d3 v2 v3 = &2 /\ d3 v2 v4 = &2 /\
\r
3838 #3.114467 < d3 v3 v4 ==> delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2)
\r
3839 (dist (v1,v4) pow 2) (dist (v2,v3) pow 2) (dist (v2,v4) pow 2)
\r
3840 (dist (v3,v4) pow 2) < &0 `, SIMP_TAC[d3] THEN MESON_TAC[LEOF41]))) THEN
\r
3841 REWRITE_TAC[REAL_ARITH ` a < &0 <=> ~( &0 <= a ) `; d3] THEN MESON_TAC[]);;
\r
3843 let YXWIPMH = LEMMA41;;
\r
3845 let LEMMA_OF_L42 = prove(`sqrt8 <= d3 v2 v4 /\ #3.488 <= x
\r
3846 ==> -- &1 * x pow 2 * d3 v2 v4 pow 2 +
\r
3848 &103001 / &5000 * x pow 2 +
\r
3849 -- &529046001 / &100000000 <
\r
3851 MP_TAC SQRT8_LE THEN
\r
3853 NHANH (MESON[REAL_ARITH ` &0 <= a /\ a <= b /\ #3.488 <= x ==> &0 <= b /\
\r
3854 &0 <= #3.488 /\ &0 <= x `; POW2_COND]`
\r
3855 &0 <= a /\ a <= b /\ #3.488 <= x ==> a pow 2 <= b pow 2 /\
\r
3856 #3.488 pow 2 <= x pow 2 `) THEN
\r
3857 REWRITE_TAC[SQRT8_POW2; sqrt8] THEN
\r
3858 NHANH (MESON[REAL_ARITH ` &0 <= a /\ a <= b /\ #3.488 <= x ==> &0 <= b /\
\r
3859 &0 <= #3.488 /\ &0 <= x `; POW2_COND]`
\r
3860 &0 <= a /\ a <= b /\ #3.488 <= x ==> a pow 2 <= b pow 2 /\
\r
3861 #3.488 pow 2 <= x pow 2 `) THEN
\r
3862 REWRITE_TAC[SQRT8_POW2] THEN
\r
3863 NHANH (MESON[REAL_ARITH ` &0 <= &8 /\ &0 <= #3.488 pow 2 `; REAL_LE_MUL2]` &8 <= a /\
\r
3864 #3.488 pow 2 <= b ==> &8 * #3.488 pow 2 <= a * b `) THEN
\r
3865 REWRITE_TAC[REAL_ARITH` a pow 4 = a pow 2 pow 2 `] THEN
\r
3866 NHANH (MESON[REAL_ARITH ` #3.488 pow 2 <= x ==> &0 <= #3.488 pow 2 /\
\r
3867 &0 <= x `; POW2_COND]` #3.488 pow 2 <= x ==> #3.488 pow 2 pow 2 <= x pow 2 `) THEN
\r
3868 REWRITE_TAC[REAL_ARITH ` a + -- &1 * x pow 2 + b * x + c =
\r
3869 a + -- &1 * ( x pow 2 + -- b * x + -- c ) `] THEN
\r
3870 NHANH (prove(` #3.488 pow 2 <= x pow 2 ==>
\r
3871 #3.488 pow 2 pow 2 +
\r
3872 --(&103001 / &5000) * #3.488 pow 2 +
\r
3873 --(-- &529046001 / &100000000) <= x pow 2 pow 2 +
\r
3874 --(&103001 / &5000) * x pow 2 +
\r
3875 --(-- &529046001 / &100000000) `,
\r
3876 MP_TAC (REAL_ARITH ` -- ( --(&103001 / &5000)) / &2 <= #3.488 pow 2 `) THEN
\r
3877 MESON_TAC[GREATER_THAN_MID_QUADRATIC_PO ])) THEN
\r
3882 let LEMMA_IN_LEMMA42_P25 = prove(` ! v1 v2 v3 v4 x.
\r
3883 d3 v1 v2 = #2.51 /\
\r
3884 d3 v1 v4 = #2.51 /\
\r
3887 sqrt8 <= d3 v2 v4 /\
\r
3889 ==> delta (d3 v1 v2 pow 2) ( x pow 2) (d3 v1 v4 pow 2)
\r
3892 (d3 v3 v4 pow 2) < &0 `,
\r
3894 NHANH (MESON[REAL_ARITH` #3.488 <= x ==> &0 <= #3.488 /\ &0 <= x `; POW2_COND]`
\r
3895 #3.488 <= x ==> (#3.488 pow 2 <= x pow 2 ) `) THEN
\r
3896 REWRITE_TAC[delta] THEN
\r
3897 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
3898 REWRITE_TAC[REAL_POLY_CONV `--(&63001 / &10000 * x pow 2 * &4) -
\r
3899 &63001 / &10000 * &63001 / &10000 * d3 v2 v4 pow 2 -
\r
3900 x pow 2 * &63001 / &2500 -
\r
3901 &4 * d3 v2 v4 pow 2 * &4 +
\r
3904 (-- &63001 / &10000 +
\r
3908 d3 v2 v4 pow 2 - &4) +
\r
3911 (&63001 / &10000 - x pow 2 +
\r
3913 &4 - d3 v2 v4 pow 2 +
\r
3917 (&63001 / &10000 +
\r
3918 x pow 2 - &63001 / &10000 - &4 +
\r
3921 REWRITE_TAC[REAL_IDEAL_CONV [` y pow 2 `] `-- &1 * x pow 4 * y pow 2 +
\r
3922 -- &1 * x pow 2 * y pow 4 +
\r
3923 &103001 / &5000 * x pow 2 * y pow 2 +
\r
3924 -- &529046001 / &100000000 * y pow 2 `] THEN
\r
3925 REWRITE_TAC[MESON[]` a/\ #3.488 <= x /\ c <=> (a/\ #3.488 <= x )/\ c`] THEN
\r
3926 NHANH (LEMMA_OF_L42) THEN
\r
3927 REWRITE_TAC[sqrt8] THEN
\r
3928 NHANH (SQRT8_LE_EQ_8_LESS_POW2) THEN
\r
3929 REPEAT GEN_TAC THEN
\r
3931 UNDISCH_TAC ` &8 <= d3 v2 v4 pow 2 ` THEN
\r
3932 UNDISCH_TAC ` -- &1 * x pow 2 * d3 v2 v4 pow 2 +
\r
3934 &103001 / &5000 * x pow 2 +
\r
3935 -- &529046001 / &100000000 <
\r
3937 ABBREV_TAC ` xx = (-- &1 * x pow 2 * d3 v2 v4 pow 2 +
\r
3939 &103001 / &5000 * x pow 2 +
\r
3940 -- &529046001 / &100000000)` THEN
\r
3941 NHANH (REAL_ARITH ` &8 <= a ==> &0 < a `) THEN
\r
3942 REWRITE_TAC[REAL_ARITH ` ( a * b < &0 <=> &0 < ( -- a ) * b )/\
\r
3943 ( a < &0 <=> &0 < -- a )`] THEN
\r
3944 SIMP_TAC[REAL_LT_MUL]);;
\r
3946 let PAATDXJ =prove(` ! v1 v2 v3 (v4:real^3).
\r
3947 CARD {v1,v2,v3,v4} = 4 /\
\r
3948 d3 v1 v2 = #2.51 /\
\r
3949 d3 v1 v4 = #2.51 /\
\r
3953 ==> d3 v1 v3 < #3.488 `,
\r
3954 MP_TAC LEMMA3 THEN LET_TR THEN REWRITE_TAC[REAL_ARITH ` a < b <=> ~ ( b <= a )`]
\r
3955 THEN REWRITE_TAC[MESON[]` a ==> ~ b <=> ~( a /\b)`] THEN
\r
3956 PHA THEN NHANH (SPEC_ALL LEMMA_IN_LEMMA42_P25) THEN
\r
3957 REWRITE_TAC[REAL_ARITH` a < b <=> ~(b <= a ) `] THEN SIMP_TAC[d3]);;
\r
3960 (* the following lemma are in Multivariate/convex.ml *)
\r
3963 let CONVEX_FINITE = new_axiom `!s:real^N->bool.
\r
3966 !u. (!x. x IN s ==> &0 <= u x) /\
\r
3968 ==> vsum s (\x. u(x) % x) IN s)`;;
\r
3970 let CONVEX_BALL = new_axiom `!x:real^N e. convex( normball x e) `;;
\r
3972 let CONVEX_HULL_FINITE = new_axiom `
\r
3974 ==> convex hull s =
\r
3975 {y:real^N | ?u. (!x. x IN s ==> &0 <= u x) /\
\r
3977 vsum s (\x. u(x) % x) = y} `;;
\r
3979 let CONVEX_HULL4 =
\r
3980 MATCH_MP CONVEX_HULL_FINITE (MESON[ FINITE_RULES]` FINITE {(v1:real^N),v2,v3,v4} `);;
\r
3984 let CONVEX_EXPLICIT = new_axiom `!s:real^N->bool.
\r
3986 !t u. FINITE t /\ t SUBSET s /\ (!x. x IN t ==> &0 <= u x) /\
\r
3988 ==> vsum t (\x. u(x) % x) IN s`;;
\r
3990 let CONVEX_HULL_FINITE_STEP = new_axiom
\r
3991 `((?u. (!x. x IN {} ==> &0 <= u x) /\
\r
3993 vsum {} (\x. u(x) % x) = y) <=> w = &0 /\ y = vec 0) /\
\r
3994 (FINITE(s:real^N->bool)
\r
3995 ==> ((?u. (!x. x IN (a INSERT s) ==> &0 <= u x) /\
\r
3996 sum (a INSERT s) u = w /\
\r
3997 vsum (a INSERT s) (\x. u(x) % x) = y) <=>
\r
3999 ?u. (!x. x IN s ==> &0 <= u x) /\
\r
4000 sum s u = w - v /\
\r
4001 vsum s (\x. u(x) % x) = y - v % a))`;;
\r
4003 let CONVEX_HULL_4_EQUIV = prove(` ! v1 v2 v3 (v4:real^N).
\r
4004 conv {v1,v2,v3,v4} = { x | ? a b c d.
\r
4009 a + b + c + d = &1 /\
\r
4010 a % v1 + b % v2 + c % v3 + d % v4 = x } `,
\r
4011 REWRITE_TAC[conv; FUN_EQ_THM; affsign; lin_combo; UNION_EMPTY;
\r
4012 IN_ELIM_THM; sgn_ge] THEN
\r
4013 REWRITE_TAC[MESON[]` x = vsum aa bb /\ a /\ b <=>
\r
4014 a /\ b /\ vsum aa bb = x `] THEN
\r
4015 ONCE_REWRITE_TAC[SET_RULE ` a s ==> b <=> s IN a ==> b `] THEN
\r
4016 SIMP_TAC[CONVEX_HULL_FINITE_STEP; FINITE_INSERT; FINITE_RULES] THEN
\r
4017 REWRITE_TAC[REAL_ARITH `x - y = z:real <=> x = y + z`;
\r
4018 VECTOR_ARITH `x - y = z:real^N <=> x = y + z`] THEN
\r
4019 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN MESON_TAC[IN]);;
\r
4022 let TXDIACY = prove(`! (a:real^3) b c d (v0: real^3) r.
\r
4023 {a, b, c, d} SUBSET normball v0 r
\r
4024 ==> convex hull {a, b, c, d} SUBSET normball v0 r `,
\r
4025 REPEAT GEN_TAC THEN MP_TAC (MESON[CONVEX_BALL]` convex (normball (v0:real^3) r)`) THEN
\r
4026 NHANH (MESON[FINITE6] ` {a, b, c, d} SUBSET s ==> FINITE {(a:real^3),b,c,d} `) THEN
\r
4027 REWRITE_TAC[CONVEX_HULL4; CONVEX_EXPLICIT] THEN
\r
4029 REWRITE_TAC[SET_RULE ` {a | P a } SUBSET b <=> (! a. P a ==> a IN b)`] THEN
\r
4030 REWRITE_TAC[MESON[]` (! y. ( ? u. P u y ) ==> Q y ) <=>
\r
4031 (! y u. P u y ==> Q y ) `] THEN
\r
4032 REWRITE_TAC[MESON[]`(!y u. P u /\ Q u /\ R u = y ==> Z y) <=>
\r
4033 (!u. P u /\ Q u ==> Z (R u)) `] THEN MESON_TAC[]);;
\r
4034 let LEMMA14 = TXDIACY;;
\r
4037 let ECSEVNC = prove(`?t1 t2 t3 t4.
\r
4038 !v1 v2 v3 v4 (v: real^3).
\r
4039 ~coplanar {v1, v2, v3, v4}
\r
4040 ==> t1 v1 v2 v3 v4 v +
\r
4041 t2 v1 v2 v3 v4 v +
\r
4042 t3 v1 v2 v3 v4 v +
\r
4043 t4 v1 v2 v3 v4 v =
\r
4046 t1 v1 v2 v3 v4 v % v1 +
\r
4047 t2 v1 v2 v3 v4 v % v2 +
\r
4048 t3 v1 v2 v3 v4 v % v3 +
\r
4049 t4 v1 v2 v3 v4 v % v4 /\
\r
4051 v = ta % v1 + tb % v2 + tc % v3 + td % v4 /\
\r
4052 ta + tb + tc + td = &1
\r
4053 ==> ta = t1 v1 v2 v3 v4 v /\
\r
4054 tb = t2 v1 v2 v3 v4 v /\
\r
4055 tc = t3 v1 v2 v3 v4 v /\
\r
4056 td = t4 v1 v2 v3 v4 v) `,
\r
4057 REWRITE_TAC[GSYM SKOLEM_THM; RIGHT_EXISTS_IMP_THM] THEN REPEAT
\r
4058 GEN_TAC THEN NHANH (SPEC_ALL (prove(`!v1 v2 v3 v0 v:real^3.
\r
4059 ~coplanar {v0, v1, v2, v3} ==> (?t1 t2 t3. v - v0 = t1 % (v1 - v0)
\r
4060 + t2 % (v2 - v0) + t3 % (v3 - v0) /\ (!ta tb tc. v - v0 = ta % (v1 - v0)
\r
4061 + tb % (v2 - v0) + tc % (v3 - v0) ==> ta = t1 /\
\r
4062 tb = t2 /\ tc = t3))`, SIMP_TAC[NONCOPLANAR_3_BASIS]))) THEN
\r
4063 STRIP_TAC THEN EXISTS_TAC ` &1 - t1 - t2 - t3 ` THEN
\r
4064 EXISTS_TAC ` t1:real ` THEN EXISTS_TAC ` t2:real ` THEN
\r
4065 EXISTS_TAC ` t3:real ` THEN CONJ_TAC THENL [REAL_ARITH_TAC;
\r
4066 CONJ_TAC] THENL [UNDISCH_TAC ` (v:real^3) - v1 = t1 % (v2 - v1) +
\r
4067 t2 % (v3 - v1) + t3 % (v4 - v1)` THEN
\r
4068 CONV_TAC VECTOR_ARITH; REPEAT GEN_TAC] THEN
\r
4069 REWRITE_TAC[MESON[]` a /\ b ==> c <=> b ==> a ==> c `;
\r
4070 REAL_ARITH ` ta + tb + tc + td = &1 <=> ta = &1 - tb - tc - td `] THEN
\r
4071 SIMP_TAC[] THEN REWRITE_TAC[VECTOR_ARITH ` v = (&1 - tb - tc - td) % v1
\r
4072 + tb % v2 + tc % v3 + td % v4 <=> v - v1 = tb % ( v2 - v1 ) +
\r
4073 tc % ( v3 - v1 ) + td % ( v4 - v1 ) `] THEN ASM_MESON_TAC[]);;
\r
4075 let LEMMA76 = ECSEVNC;;
\r
4077 let COEFS_4 = new_specification ["COEF4_1"; "COEF4_2"; "COEF4_3"; "COEF4_4"] ECSEVNC ;;
\r
4083 let COEF_1_EQ_ZERO = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4084 ~ coplanar {v1,v2,v3,v4} ==>
\r
4085 ( COEF4_1 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v3,v4} ) `,
\r
4086 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM] THEN
\r
4087 NHANH (SPEC_ALL COEFS_4) THEN
\r
4088 REPEAT GEN_TAC THEN STRIP_TAC THEN
\r
4089 ONCE_REWRITE_TAC[REAL_ARITH` u + v + w = &0 + u + v + w `] THEN
\r
4090 ONCE_REWRITE_TAC[VECTOR_ARITH` u + v + w = &0 % v1 + u + v + w `] THEN
\r
4091 ASM_MESON_TAC[]);;
\r
4094 let EQ_IMP_COPLANAR = prove(`! a b c (d:real^3). ( a = b \/ a = c \/ a = d )
\r
4095 ==> coplanar {a,b,c,d} `,
\r
4096 REPEAT STRIP_TAC THENL [
\r
4097 ASM_SIMP_TAC[SET_RULE ` a INSERT ( a INSERT s ) = a INSERT s `] THEN
\r
4098 MP_TAC (DIMINDEX_3) THEN MESON_TAC[COPLANAR_3; ARITH_RULE` a = 3 ==> 2 <= a `];
\r
4099 ONCE_REWRITE_TAC[SET_RULE` {a,b,v,c} = {a,v,b,c} `] THEN
\r
4100 ASM_SIMP_TAC[SET_RULE ` a INSERT ( a INSERT s ) = a INSERT s `] THEN
\r
4101 MP_TAC (DIMINDEX_3) THEN MESON_TAC[COPLANAR_3; ARITH_RULE` a = 3 ==> 2 <= a `];
\r
4102 ONCE_REWRITE_TAC[SET_RULE` {a,b,v,c} = {a,c,v,b} `] THEN
\r
4103 ASM_SIMP_TAC[SET_RULE ` a INSERT ( a INSERT s ) = a INSERT s `] THEN
\r
4104 MP_TAC (DIMINDEX_3) THEN MESON_TAC[COPLANAR_3; ARITH_RULE` a = 3 ==> 2 <= a `]]);;
\r
4110 let AFFINE_HULL_FINITE_STEP_GEN = prove
\r
4111 (`!P:real^N->real->bool.
\r
4112 ((?u. (!x. x IN {} ==> P x (u x)) /\
\r
4113 sum {} u = w /\ vsum {} (\x. u(x) % x) = y) <=>
\r
4114 w = &0 /\ y = vec 0) /\
\r
4115 (FINITE(s:real^N->bool) /\
\r
4116 (!y. a IN s /\ P a y ==> P a (y / &2)) /\
\r
4117 (!x y. a IN s /\ P a x /\ P a y ==> P a (x + y))
\r
4118 ==> ((?u. (!x. x IN (a INSERT s) ==> P x (u x)) /\
\r
4119 sum (a INSERT s) u = w /\
\r
4120 vsum (a INSERT s) (\x. u(x) % x) = y) <=>
\r
4121 ?v u. P a v /\ (!x. x IN s ==> P x (u x)) /\
\r
4122 sum s u = w - v /\
\r
4123 vsum s (\x. u(x) % x) = y - v % a))`,
\r
4124 GEN_TAC THEN SIMP_TAC[SUM_CLAUSES; VSUM_CLAUSES; NOT_IN_EMPTY] THEN
\r
4125 CONJ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN DISCH_TAC THEN
\r
4126 ASM_CASES_TAC `(a:real^N) IN s` THEN ASM_REWRITE_TAC[] THENL
\r
4127 [ASM_SIMP_TAC[SET_RULE `a IN s ==> a INSERT s = s`] THEN EQ_TAC THEN
\r
4128 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THENL
\r
4129 [X_GEN_TAC `u:real^N->real` THEN STRIP_TAC THEN
\r
4130 EXISTS_TAC `(u:real^N->real) a / &2` THEN
\r
4131 EXISTS_TAC `\x:real^N. if x = a then u x / &2 else u x`;
\r
4132 MAP_EVERY X_GEN_TAC [`v:real`; `u:real^N->real`] THEN
\r
4134 EXISTS_TAC `\x:real^N. if x = a then u x + v else u x`] THEN
\r
4135 ASM_SIMP_TAC[] THEN (CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC]) THEN
\r
4136 ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
\r
4137 ASM_SIMP_TAC[VSUM_CASES; SUM_CASES] THEN
\r
4138 ASM_SIMP_TAC[GSYM DELETE; SUM_DELETE; VSUM_DELETE] THEN
\r
4139 ASM_SIMP_TAC[SET_RULE `a IN s ==> {x | x IN s /\ x = a} = {a}`] THEN
\r
4140 REWRITE_TAC[SUM_SING; VSUM_SING] THEN
\r
4141 (CONJ_TAC THENL [REAL_ARITH_TAC; VECTOR_ARITH_TAC]);
\r
4142 EQ_TAC THEN REWRITE_TAC[LEFT_IMP_EXISTS_THM] THENL
\r
4143 [X_GEN_TAC `u:real^N->real` THEN STRIP_TAC THEN
\r
4144 EXISTS_TAC `(u:real^N->real) a` THEN
\r
4145 EXISTS_TAC `u:real^N->real` THEN ASM_SIMP_TAC[IN_INSERT] THEN
\r
4146 REPEAT(FIRST_X_ASSUM(SUBST1_TAC o SYM)) THEN
\r
4147 CONJ_TAC THENL [REAL_ARITH_TAC; VECTOR_ARITH_TAC];
\r
4148 MAP_EVERY X_GEN_TAC [`v:real`; `u:real^N->real`] THEN
\r
4150 EXISTS_TAC `\x:real^N. if x = a then v:real else u x` THEN
\r
4151 ASM_SIMP_TAC[IN_INSERT] THEN CONJ_TAC THENL
\r
4152 [ASM_MESON_TAC[]; ALL_TAC] THEN
\r
4153 ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
\r
4154 ASM_SIMP_TAC[VSUM_CASES; SUM_CASES] THEN
\r
4155 ASM_SIMP_TAC[GSYM DELETE; SUM_DELETE; VSUM_DELETE] THEN
\r
4156 ASM_SIMP_TAC[SET_RULE `~(a IN s) ==> {x | x IN s /\ x = a} = {}`] THEN
\r
4157 ASM_SIMP_TAC[SET_RULE `~(a IN s) ==> s DELETE a = s`] THEN
\r
4158 REWRITE_TAC[SUM_CLAUSES; VSUM_CLAUSES] THEN
\r
4159 CONJ_TAC THENL [REAL_ARITH_TAC; VECTOR_ARITH_TAC]]]);;
\r
4163 let THEOREM_RE_AFF_LT31 = prove
\r
4164 (`!v1 v2 v3 vv x:real^N.
\r
4165 ~(v1 = vv) /\ ~(v2 = vv) /\ ~(v3 = vv)
\r
4166 ==> ((?f. f vv < &0 /\
\r
4167 sum {v1, v2, v3, vv} f = &1 /\
\r
4168 x = vsum {v1, v2, v3, vv} (\v. f v % v)) <=>
\r
4170 a + b + c + t = &1 /\
\r
4171 x = a % v1 + b % v2 + c % v3 + t % vv /\
\r
4174 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
\r
4176 `?f. (!x:real^N. x IN {v1, v2, v3, vv} ==> vv = x ==> f x < &0) /\
\r
4177 sum {v1, v2, v3, vv} f = &1 /\
\r
4178 vsum {v1, v2, v3, vv} (\v. f v % v) = x` THEN
\r
4180 [ASM_REWRITE_TAC[FORALL_IN_INSERT; NOT_IN_EMPTY] THEN MESON_TAC[];
\r
4181 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
4182 REAL_ARITH `x < &0 /\ y < &0 ==> x + y < &0`;
\r
4183 REAL_ARITH `x < &0 ==> x / &2 < &0`;
\r
4184 FINITE_INSERT; CONJUNCT1 FINITE_RULES; RIGHT_EXISTS_AND_THM] THEN
\r
4185 ASM_REWRITE_TAC[IN_ELIM_THM;
\r
4186 REAL_ARITH `x - y:real = z <=> x = y + z`;
\r
4187 VECTOR_ARITH `x - y:real^N = z <=> x = y + z`] THEN
\r
4188 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN MESON_TAC[]]);;
\r
4190 let AFF_LT31 = prove(` ! v1 v2 v3 (vv: real^N). ~ (vv IN {v1,v2,v3} ) ==>
\r
4191 aff_lt {v1,v2,v3} {vv} =
\r
4192 { x| ? a b c t. t < &0 /\ a + b + c + t = &1 /\
\r
4193 x = a % v1 + b % v2 + c % v3 + t % vv } `,
\r
4194 REWRITE_TAC[IN_SET3; DE_MORGAN_THM; aff_lt_def;FUN_EQ_THM;
\r
4195 affsign; lin_combo; sgn_lt] THEN
\r
4196 REWRITE_TAC[SET_RULE` {v1, v2, v3} UNION {vv} = {v1, v2, v3, vv}`] THEN
\r
4197 REWRITE_TAC[SET_RULE` a /\ (!w. {vv} w ==> f w < &0) /\ b
\r
4198 <=> f vv < &0 /\ b /\ a `] THEN
\r
4199 SIMP_TAC[THEOREM_RE_AFF_LT31; IN_ELIM_THM] THEN SET_TAC[]);;
\r
4201 let AFF_LT21 = prove(`! a b (v0:real^N). ~ ( a = v0 ) /\ ~( b = v0 ) ==>
\r
4202 aff_lt {a,b} {v0} =
\r
4204 ta + tb + t = &1 /\
\r
4206 x = ta % a + tb % b + t % v0} `,
\r
4207 REWRITE_TAC[SET_RULE` ~(a = v0) /\ ~(b = v0) <=>
\r
4208 ~ ( v0 IN {a,b} ) `] THEN
\r
4209 ONCE_REWRITE_TAC[SET_RULE` {a,b} = {a,b,b} `] THEN SIMP_TAC[AFF_LT31] THEN
\r
4210 SIMP_TAC[AFF_LT31; FUN_EQ_THM; IN_ELIM_THM] THEN
\r
4211 REWRITE_TAC[VECTOR_ARITH` a % b + c % b + x = ( a + c ) % b + x `] THEN
\r
4212 MESON_TAC[REAL_ARITH` a + b + c = ( a + b ) + c `;
\r
4213 VECTOR_ARITH ` a % v = ( a + &0 ) % v `; REAL_ARITH `
\r
4214 a + b = a + &0 + b `]);;
\r
4217 let INSET3 = SET_RULE` a IN {a,b,c} /\ b IN {a,b,c} /\ c IN {a,b,c} `;;
\r
4224 let AFF_GT33 = prove(`! (v1:real^N) v2 v3 w1 w2 w3.
\r
4225 {v1, v2, v3} INTER {w1, w2, w3} = {}
\r
4226 ==> aff_gt {v1, v2, v3} {w1, w2, w3} =
\r
4227 {x | ?a1 a2 a3 b1 b2 b3.
\r
4231 a1 + a2 + a3 + b1 + b2 + b3 = &1 /\
\r
4233 a1 % v1 + a2 % v2 + a3 % v3 + b1 % w1 + b2 % w2 + b3 % w3}`,
\r
4234 REWRITE_TAC[aff_gt_def; FUN_EQ_THM; affsign; lin_combo; sgn_gt] THEN
\r
4235 REPEAT STRIP_TAC THEN
\r
4236 MATCH_MP_TAC EQ_TRANS THEN
\r
4237 REWRITE_TAC[SET_RULE ` ( a INSERT b ) UNION c =
\r
4238 b UNION ( a INSERT c ) /\ {} UNION b = b `] THEN
\r
4239 EXISTS_TAC ` (? f. x = vsum {v3, v2, v1, w1, w2, w3} (\v. f v % v) /\
\r
4240 (!(w:real^N). w IN {v3,v2,v1, w1, w2, w3} ==> w IN {w1,w2,w3} ==> &0 < f w) /\
\r
4241 sum {v3, v2, v1, w1, w2, w3} f = &1 ) ` THEN
\r
4242 REWRITE_TAC[SET_RULE` (!x. ({v1, v2, v3} INTER {w1, w2, w3}) x <=> {} x)
\r
4243 <=> {v1, v2, v3} INTER {w1, w2, w3} = {} `] THEN
\r
4245 FIRST_X_ASSUM MP_TAC THEN
\r
4246 REWRITE_TAC[SET_RULE` (!x. ({v1, v2, v3} INTER {w1, w2, w3}) x <=> {} x)
\r
4247 <=> {v1, v2, v3} INTER {w1, w2, w3} = {} `] THEN
\r
4248 MESON_TAC[SET_RULE` {v1, v2, v3} INTER {w1, w2, w3} = {} ==>
\r
4249 ( (!w. {w1, w2, w3} w ==> &0 < f w) <=>
\r
4250 (!w. w IN {v3, v2, v1, w1, w2, w3}
\r
4251 ==> w IN {w1, w2, w3}
\r
4252 ==> &0 < f w) ) `];
\r
4253 REWRITE_TAC[MESON[]` a /\ (!z. P z ) /\ aa = &1 <=>
\r
4254 (!z. P z ) /\ aa = &1 /\ a `]] THEN
\r
4255 ONCE_REWRITE_TAC[MESON[]` a = vsum b c <=> vsum b c = a `] THEN
\r
4256 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;FINITE_INSERT; CONJUNCT1 FINITE_RULES;
\r
4257 RIGHT_EXISTS_AND_THM;
\r
4258 REAL_ARITH `&0 < x /\ &0 < y ==> &0 < x + y`;
\r
4259 REAL_ARITH `&0 < x ==> &0 < x / &2 `] THEN
\r
4260 FIRST_X_ASSUM MP_TAC THEN
\r
4261 REWRITE_TAC[SET_RULE` (!x. ({v1, v2, v3} INTER {w1, w2, w3}) x <=> {} x)
\r
4262 <=> {v1, v2, v3} INTER {w1, w2, w3} = {} `; SET_RULE` ( a INSERT s ) INTER ss = {} <=>
\r
4263 ~ ( a IN ss ) /\ s INTER ss = {} `] THEN
\r
4264 SIMP_TAC[INSET3] THEN
\r
4265 SIMP_TAC[INSET3; REAL_ARITH` a - b = c <=> a = b + c `;
\r
4266 VECTOR_ARITH` a:real^N - b = c <=> a = b + c `] THEN
\r
4267 REWRITE_TAC[ GSYM RIGHT_EXISTS_AND_THM; ZERO_NEUTRAL;
\r
4268 IN_ELIM_THM; VECTOR_ARITH ` a + vec 0 = a `] THEN
\r
4270 MESON_TAC[REAL_ARITH` a + b + c + d = c + b + a + d `;
\r
4271 VECTOR_ARITH` ( a:real^N ) + b + c + d = c + b + a + d `]);;
\r
4274 g `! (v1:real^N) v2 v3 w1 w2 w3.
\r
4275 {v1, v2, v3} INTER {w1, w2, w3} = {}
\r
4276 ==> aff_ge {v1, v2, v3} {w1, w2, w3} =
\r
4277 {x | ?a1 a2 a3 b1 b2 b3.
\r
4281 a1 + a2 + a3 + b1 + b2 + b3 = &1 /\
\r
4283 a1 % v1 + a2 % v2 + a3 % v3 + b1 % w1 + b2 % w2 + b3 % w3}`;;
\r
4284 e (REWRITE_TAC[aff_gt_def; aff_ge_def; FUN_EQ_THM; affsign; lin_combo; sgn_gt; sgn_ge]);;
\r
4285 e (REPEAT STRIP_TAC);;
\r
4286 e (MATCH_MP_TAC EQ_TRANS );;
\r
4287 e (REWRITE_TAC[SET_RULE ` ( a INSERT b ) UNION c =
\r
4288 b UNION ( a INSERT c ) /\ {} UNION b = b `]);;
\r
4289 e (EXISTS_TAC ` (? f. x = vsum {v3, v2, v1, w1, w2, w3} (\v. f v % v) /\
\r
4290 (!(w:real^N). w IN {v3,v2,v1, w1, w2, w3} ==> w IN {w1,w2,w3} ==> &0 <= f w) /\
\r
4291 sum {v3, v2, v1, w1, w2, w3} f = &1 ) `);;
\r
4293 e (FIRST_X_ASSUM MP_TAC);;
\r
4294 e (REWRITE_TAC[SET_RULE` (!x. ({v1, v2, v3} INTER {w1, w2, w3}) x <=> {} x)
\r
4295 <=> {v1, v2, v3} INTER {w1, w2, w3} = {} `]);;
\r
4296 e (MESON_TAC[SET_RULE` {v1, v2, v3} INTER {w1, w2, w3} = {} ==>
\r
4297 ( (!w. {w1, w2, w3} w ==> &0 <= f w) <=>
\r
4298 (!w. w IN {v3, v2, v1, w1, w2, w3}
\r
4299 ==> w IN {w1, w2, w3}
\r
4300 ==> &0 <= f w) ) `]);;
\r
4301 e (REWRITE_TAC[MESON[]` a /\ (!z. P z ) /\ aa = &1 <=>
\r
4302 (!z. P z ) /\ aa = &1 /\ a `]);;
\r
4303 e (ONCE_REWRITE_TAC[MESON[]` a = vsum b c <=> vsum b c = a `]);;
\r
4304 e ( SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;FINITE_INSERT; CONJUNCT1 FINITE_RULES;
\r
4305 RIGHT_EXISTS_AND_THM;
\r
4306 REAL_ARITH `&0 <= x /\ &0 <= y ==> &0 <= x + y`;
\r
4307 REAL_ARITH `&0 <= x ==> &0 <= x / &2 `]);;
\r
4308 e (FIRST_X_ASSUM MP_TAC);;
\r
4309 e (REWRITE_TAC[SET_RULE` (!x. ({v1, v2, v3} INTER {w1, w2, w3}) x <=> {} x)
\r
4310 <=> {v1, v2, v3} INTER {w1, w2, w3} = {} `; SET_RULE` ( a INSERT s ) INTER ss = {} <=>
\r
4311 ~ ( a IN ss ) /\ s INTER ss = {} `]);;
\r
4312 e (SIMP_TAC[INSET3]);;
\r
4313 e (SIMP_TAC[INSET3; REAL_ARITH` a - b = c <=> a = b + c `;
\r
4314 VECTOR_ARITH` a:real^N - b = c <=> a = b + c `]);;
\r
4315 e (REWRITE_TAC[ GSYM RIGHT_EXISTS_AND_THM; ZERO_NEUTRAL;
\r
4316 IN_ELIM_THM; VECTOR_ARITH ` a + vec 0 = a `]);;
\r
4318 e (MESON_TAC[REAL_ARITH` a + b + c + d = c + b + a + d `;
\r
4319 VECTOR_ARITH` ( a:real^N ) + b + c + d = c + b + a + d `]);;
\r
4320 let AFF_GE33 = top_thm();;
\r
4323 let AFF_GE_12 = prove(`!v0 (a:real^N) b.
\r
4324 ~(v0 = a \/ v0 = b)
\r
4325 ==> aff_ge {v0} {a, b} =
\r
4329 tv + ta + tb = &1 /\
\r
4330 x = tv % v0 + ta % a + tb % b}`,
\r
4331 REWRITE_TAC[SET_RULE ` ~(v0 = a \/ v0 = b) <=> {v0} INTER {a,b} = {} `] THEN
\r
4332 ONCE_REWRITE_TAC[SET_RULE` {a} = {a,a} `] THEN
\r
4333 ONCE_REWRITE_TAC[SET_RULE` {a,a} = {a,a,a} `] THEN
\r
4334 ONCE_REWRITE_TAC[SET_RULE` {a,b,b,b} = {a,b,b} `] THEN
\r
4335 SIMP_TAC[AFF_GE33] THEN REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN
\r
4336 REPEAT STRIP_TAC THEN
\r
4337 REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; VECTOR_ARITH` a % v +
\r
4338 b % v + y = ( a + b ) % v + y `] THEN GONTONG THEN EQ_TAC THENL [
\r
4339 MESON_TAC[REAL_ARITH` a1 + a2 + a3 + b1 + b2 + b3 =
\r
4340 ( a1 + a2 + a3 ) + b1 + b2 + b3 `; REAL_ARITH ` &0 <= a
\r
4341 /\ &0 <= b ==> &0 <= a + b `];STRIP_TAC] THEN EXISTS_TAC` tv: real `
\r
4342 THEN EXISTS_TAC` &0 ` THEN EXISTS_TAC` &0` THEN EXISTS_TAC` ta :real `
\r
4343 THEN EXISTS_TAC` &0` THEN EXISTS_TAC` tb:real ` THEN
\r
4344 ASM_SIMP_TAC[REAL_ARITH ` a <= a `; ZERO_NEUTRAL]);;
\r
4347 let INSET3 = SET_RULE` a IN {a, b, c} /\ b IN {a, b, c} /\ c IN {a, b, c}
\r
4348 /\ {a, b, c} a /\ {a, b, c} b /\ {a, b, c} c `;;
\r
4352 let AFF_LE_LT33 = prove(`! (v1:real^N) v2 v3 w1 w2 w3.
\r
4353 {v1, v2, v3} INTER {w1, w2, w3} = {}
\r
4354 ==> aff_le {v1, v2, v3} {w1, w2, w3} =
\r
4355 {x | ?a1 a2 a3 b1 b2 b3.
\r
4359 a1 + a2 + a3 + b1 + b2 + b3 = &1 /\
\r
4361 a1 % v1 + a2 % v2 + a3 % v3 + b1 % w1 + b2 % w2 + b3 % w3} /\
\r
4362 aff_lt {v1, v2, v3} {w1, w2, w3} =
\r
4363 {x | ?a1 a2 a3 b1 b2 b3.
\r
4367 a1 + a2 + a3 + b1 + b2 + b3 = &1 /\
\r
4369 a1 % v1 + a2 % v2 + a3 % v3 + b1 % w1 + b2 % w2 + b3 % w3} `,
\r
4370 REWRITE_TAC[IN_ELIM_THM; aff_le_def; FUN_EQ_THM; aff_lt_def;
\r
4371 affsign; lin_combo; sgn_lt; sgn_le] THEN
\r
4372 REWRITE_TAC[SET_RULE` {v1, v2, v3} UNION {w1, w2, w3} =
\r
4373 {v1,v2,v3,w1,w2,w3} `] THEN
\r
4374 ONCE_REWRITE_TAC[SET_RULE` {w1, w2, w3} w ==> P w <=>
\r
4375 w IN {v1,v2,v3,w1,w2,w3} ==> {w1,w2,w3} w ==> P w `] THEN
\r
4376 REWRITE_TAC[MESON[]` a = vsum aa bb /\
\r
4377 (! w. P w ) /\ b <=> (! w. P w ) /\ b /\ vsum aa bb = a `] THEN
\r
4378 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
4379 REAL_ARITH `( x < &0 /\ y < &0 ==> x + y < &0) /\ ( x <= &0 /\ y <= &0 ==> x + y <= &0)`;
\r
4380 REAL_ARITH ` (x < &0 ==> x / &2 < &0 ) /\ (x <= &0 ==> x / &2 <= &0 )`;
\r
4381 FINITE_INSERT; CONJUNCT1 FINITE_RULES
\r
4382 ; RIGHT_EXISTS_AND_THM] THEN
\r
4383 SIMP_TAC[ GSYM RIGHT_EXISTS_AND_THM; SET_RULE `
\r
4384 (!x. ({v1, v2, v3} INTER s ) x <=> {} x) <=>
\r
4385 ~ ( s v1 ) /\ ~ ( s v2 ) /\ ~ ( s v3 ) `; INSET3] THEN
\r
4386 REWRITE_TAC[REAL_ARITH` a - b = c <=> a = b + c`; REAL_ARITH `
\r
4387 a + &0 = a `; VECTOR_ARITH` (a:real^N) - b = c <=> a = b + c`;
\r
4388 VECTOR_ARITH` a + vec 0 = a `] THEN
\r
4394 let AFF_GES_LTS = prove(` ! a b c (v0 :real^N).
\r
4395 ~ ( a = v0 ) /\ ~( b = v0 ) /\ ~( c = v0 ) ==>
\r
4396 aff_gt {a, b} {v0} =
\r
4398 ta + tb + t = &1 /\ &0 < t /\ x = ta % a + tb % b + t % v0} /\
\r
4399 aff_ge {a, b} {v0} =
\r
4401 ta + tb + t = &1 /\
\r
4403 x = ta % a + tb % b + t % v0} /\
\r
4404 aff_lt {a,b,c} {v0} =
\r
4405 { x| ? ta tb tc t. t < &0 /\ ta + tb + tc + t = &1 /\
\r
4406 x = ta % a + tb % b + tc % c + t % v0 } /\
\r
4407 aff_gt {a,b,c} {v0} =
\r
4408 { x| ? ta tb tc t. &0 < t /\ ta + tb + tc + t = &1 /\
\r
4409 x = ta % a + tb % b + tc % c + t % v0 } `,
\r
4410 ONCE_REWRITE_TAC[SET_RULE` {a} = {a,a,a} `] THEN
\r
4411 ONCE_REWRITE_TAC[SET_RULE` {a,b,b,b} = {a,b,b} `] THEN
\r
4412 ONCE_REWRITE_TAC[SET_RULE` {a,b,c,c} = {a,b,c} `] THEN
\r
4413 NHANH (SET_RULE` ~(a = v0) /\ ~(b = v0) /\ ~(c = v0) ==>
\r
4414 {a,b,b} INTER {v0,v0,v0} = {} /\ {a,b,c} INTER {v0,v0,v0} = {} `) THEN
\r
4415 SIMP_TAC[AFF_LE_LT33; AFF_GE33; AFF_GT33] THEN
\r
4416 REWRITE_TAC[GSYM VECTOR_ADD_RDISTRIB; VECTOR_ARITH` a % x + b % x + y
\r
4417 = ( a + b ) % x + y `] THEN
\r
4418 REWRITE_TAC[REAL_ARITH` (a + b ) + c = a + b + c `] THEN
\r
4419 REPEAT STRIP_TAC THENL [
\r
4420 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN GEN_TAC THEN
\r
4421 EQ_TAC THENL [MESON_TAC[REAL_ARITH ` &0 < a /\ &0 < b ==> &0 < a + b `;
\r
4422 REAL_ARITH ` a + b + c + d = a + ( b + c ) + d `];
\r
4423 MESON_TAC[REAL_ARITH ` a + b + c = a + b / &2 + b / &2 + c / &3 +
\r
4424 c / &3 + c / &3 `; REAL_ARITH` &0 < a <=> &0 < a / &3 `;
\r
4425 REAL_ARITH` a = a / &2 + a / &2 /\ b = b / &3 + b / &3 + b / &3 /\ b =
\r
4426 ( b / &3 + b / &3 ) + b / &3 `]];
\r
4427 REPEAT STRIP_TAC THEN
\r
4428 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN GEN_TAC THEN
\r
4430 MESON_TAC[REAL_ARITH ` ( &0 < a /\ &0 < b ==> &0 < a + b ) /\ ( &0 <= a /\ &0 <= b ==> &0 <= a + b ) `;
\r
4431 REAL_ARITH ` a + b + c + d = a + ( b + c ) + d `] ;
\r
4432 MESON_TAC[REAL_ARITH ` a + b + c = a + b / &2 + b / &2 + c / &3 +
\r
4433 c / &3 + c / &3 `; REAL_ARITH` ( &0 < a <=> &0 < a / &3) /\ ( &0 <= a <=> &0 <= a / &3) `;
\r
4434 REAL_ARITH` a = a / &2 + a / &2 /\ b = b / &3 + b / &3 + b / &3 /\ b = ( b / &3 + b / &3 ) + b / &3 `]];
\r
4435 REPEAT STRIP_TAC THEN
\r
4436 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN GEN_TAC THEN
\r
4437 EQ_TAC THENL [MESON_TAC[REAL_ARITH ` ( &0 < a /\ &0 < b ==> &0 < a + b )
\r
4438 /\ ( &0 <= a /\ &0 <= b ==> &0 <= a + b ) `; REAL_ARITH ` ( a < &0 /\ b < &0
\r
4439 ==> a + b < &0 )`; REAL_ARITH ` a + b + c + d = a + ( b + c ) + d `]; STRIP_TAC] THEN
\r
4440 EXISTS_TAC `ta :real` THEN
\r
4441 EXISTS_TAC `tb :real` THEN
\r
4442 EXISTS_TAC `tc :real` THEN
\r
4443 REPEAT (EXISTS_TAC ` t / &3 `) THEN
\r
4444 ASM_MESON_TAC[REAL_ARITH` a < &0 <=> a / &3 < &0 `;
\r
4445 REAL_ARITH ` a = a / &3 + a / &3 + a / &3 `];
\r
4446 REPEAT STRIP_TAC THEN
\r
4447 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN GEN_TAC THEN
\r
4448 EQ_TAC THENL [MESON_TAC[REAL_ARITH ` ( &0 < a /\ &0 < b ==> &0 < a + b ) /\ ( &0 <= a /\ &0 <= b
\r
4449 ==> &0 <= a + b ) `; REAL_ARITH ` ( a < &0 /\ b < &0 ==> a + b < &0 )`;
\r
4450 REAL_ARITH ` a + b + c + d = a + ( b + c ) + d `]; STRIP_TAC] THEN
\r
4451 EXISTS_TAC `ta :real` THEN
\r
4452 EXISTS_TAC `tb :real` THEN
\r
4453 EXISTS_TAC `tc :real` THEN
\r
4454 REPEAT (EXISTS_TAC ` t / &3 `) THEN
\r
4455 ASM_MESON_TAC[REAL_ARITH ` a = a / &3 + a / &3 + a / &3 `;
\r
4456 REAL_ARITH ` &0 < a <=> &0 < a / &3 `]]);;
\r
4459 let AFF_GES_GTS = prove(` ! a b c (v0:real^N).
\r
4460 ~(a = v0) /\ ~(b = v0) /\ ~(c = v0)
\r
4461 ==> aff_gt {a, b} {v0} =
\r
4463 ta + tb + t = &1 /\
\r
4465 x = ta % a + tb % b + t % v0} /\
\r
4466 aff_ge {a, b} {v0} =
\r
4468 ta + tb + t = &1 /\
\r
4470 x = ta % a + tb % b + t % v0} /\
\r
4471 aff_lt {a, b, c} {v0} =
\r
4474 ta + tb + tc + t = &1 /\
\r
4475 x = ta % a + tb % b + tc % c + t % v0} /\
\r
4476 aff_gt {a, b, c} {v0} =
\r
4479 ta + tb + tc + t = &1 /\
\r
4480 x = ta % a + tb % b + tc % c + t % v0} /\
\r
4481 aff_ge {a, b, c} {v0} =
\r
4484 ta + tb + tc + t = &1 /\
\r
4485 x = ta % a + tb % b + tc % c + t % v0} `,
\r
4486 REPEAT GEN_TAC THEN
\r
4487 REWRITE_TAC[MESON[]` (a ==> a1 /\ a2 /\ a3 /\ a4 /\ a5) <=>
\r
4488 ( a ==> a1 /\ a2 /\ a3 /\a4 ) /\ ( a ==> a5) `] THEN
\r
4489 REWRITE_TAC[AFF_GES_LTS] THEN
\r
4490 NHANH (SET_RULE` ~(a = v0) /\ ~(b = v0) /\ ~(c = v0)
\r
4491 ==> {a,b,c} INTER {v0,v0,v0} = {} `) THEN
\r
4492 ONCE_REWRITE_TAC[SET_RULE` {v} = {v,v,v} `] THEN
\r
4493 ONCE_REWRITE_TAC[SET_RULE` {a, b, c, c, c} = {a,b,c} `] THEN
\r
4494 SIMP_TAC[AFF_GE33] THEN
\r
4495 REPEAT STRIP_TAC THEN
\r
4496 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM; GSYM VECTOR_ADD_RDISTRIB] THEN
\r
4497 GEN_TAC THEN EQ_TAC THENL [
\r
4498 MESON_TAC[REAL_ARITH` &0 <= a /\ &0 <= b ==> &0 <= a + b `];
\r
4500 EXISTS_TAC ` ta :real` THEN
\r
4501 EXISTS_TAC ` tb :real` THEN
\r
4502 EXISTS_TAC ` tc :real` THEN
\r
4503 REPEAT ( EXISTS_TAC ` t / &3 `) THEN
\r
4504 ASM_MESON_TAC[REAL_ARITH` a = a / &3 + a / &3 + a / &3 `;
\r
4505 REAL_ARITH` &0 <= a <=> &0 <= a / &3 `]]);;
\r
4508 let COEF_1_POS_NEG = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4509 ~ coplanar {v1,v2,v3,v4} ==>
\r
4510 ( COEF4_1 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v3,v4} {v1} ) /\
\r
4511 ( COEF4_1 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v3, v4} {v1} ) `,
\r
4512 NHANH (MESON[EQ_IMP_COPLANAR]`~coplanar {v1, v2, v3, v4} ==>
\r
4513 ~ ( v2 = v1 ) /\ ~ ((v3:real^3) = v1 ) /\ ~ (v4 = v1 ) `) THEN
\r
4514 SIMP_TAC[AFF_GES_LTS] THEN NHANH (SPEC_ALL COEFS_4) THEN
\r
4515 REWRITE_TAC[IN_ELIM_THM; REAL_ARITH ` a > b <=> b < a `] THEN
\r
4516 REPEAT GEN_TAC THEN STRIP_TAC THEN
\r
4517 ONCE_REWRITE_TAC[REAL_ARITH ` a + b + c + t = t + a + b + c `] THEN
\r
4518 ONCE_REWRITE_TAC[VECTOR_ARITH ` (a:real^N) + b + c + t = t + a + b + c `] THEN
\r
4519 ASM_MESON_TAC[]);;
\r
4522 let ALL_ABOUT_COEF_1 = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4523 ~ coplanar {v1,v2,v3,v4} ==>
\r
4524 ( COEF4_1 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v3, v4} {v1} ) /\
\r
4525 ( COEF4_1 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v3,v4} ) /\
\r
4526 ( COEF4_1 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v3,v4} {v1} )`,
\r
4527 SIMP_TAC[COEF_1_EQ_ZERO ; COEF_1_POS_NEG ]);;
\r
4529 let PER_COEF1_WITH_COEF2 = prove(`! v1 v2 v3 v4 (v:real^3).
\r
4530 ~coplanar {v1, v2, v3, v4} ==>
\r
4531 COEF4_2 v1 v2 v3 v4 v = COEF4_1 v2 v3 v4 v1 v `,
\r
4532 NHANH (SPEC_ALL COEFS_4) THEN
\r
4533 REPEAT GEN_TAC THEN STRIP_TAC THEN
\r
4534 MP_TAC (SPECL [` v2:real^3 `; `v3:real^3`; `v4:real^3`; ` v1:real^3`;
\r
4535 `v:real^3 `] COEFS_4) THEN
\r
4536 UNDISCH_TAC ` ~coplanar {v1, v2, v3, (v4:real^3)}` THEN
\r
4538 REWRITE_TAC[MESON[SET_RULE` {v1, v2, v3, v4} = {v2, v3, v4, v1}`]`
\r
4539 ~coplanar {v1, v2, v3, v4} /\
\r
4540 (~coplanar {v2, v3, v4, v1} ==> l ) <=> ~coplanar {v1, v2, v3, v4}
\r
4542 ONCE_REWRITE_TAC[GSYM (REAL_ARITH` a + b + c + d = b + c + d + a `)] THEN
\r
4543 ONCE_REWRITE_TAC[GSYM (VECTOR_ARITH` (a:real^N) + b + c + d = b + c + d + a `)] THEN
\r
4544 ASM_MESON_TAC[]);;
\r
4546 let PER_COEF1_WITH_COEF3 = prove(`! v1 v2 v3 v4 (v:real^3).
\r
4547 ~coplanar {v1, v2, v3, v4} ==>
\r
4548 COEF4_3 v1 v2 v3 v4 v = COEF4_1 v3 v4 v1 v2 v `,
\r
4549 NHANH (SPEC_ALL COEFS_4) THEN
\r
4550 REPEAT GEN_TAC THEN STRIP_TAC THEN
\r
4551 MP_TAC (SPECL [`v3:real^3`; `v4:real^3`; ` v1:real^3`; ` v2:real^3`;
\r
4552 `v:real^3 `] COEFS_4) THEN
\r
4553 UNDISCH_TAC ` ~coplanar {v1, v2, v3, (v4:real^3)}` THEN
\r
4555 REWRITE_TAC[MESON[SET_RULE` {v1, v2, v3, v4} = {v3, v4, v1, v2}`]`
\r
4556 ~coplanar {v1, v2, v3, v4} /\
\r
4557 (~coplanar {v3, v4, v1, v2} ==> l ) <=> ~coplanar {v1, v2, v3, v4}
\r
4559 ONCE_REWRITE_TAC[GSYM (REAL_ARITH` a + b + c + d = c + d + a + b`)] THEN
\r
4560 ONCE_REWRITE_TAC[GSYM (VECTOR_ARITH` (a:real^N) + b + c + d = c + d + a + b`)]
\r
4561 THEN ASM_MESON_TAC[]);;
\r
4563 let PER_COEF1_WITH_COEF4 = prove(`! v1 v2 v3 v4 (v:real^3).
\r
4564 ~coplanar {v1, v2, v3, v4} ==>
\r
4565 COEF4_4 v1 v2 v3 v4 v = COEF4_1 v4 v1 v2 v3 v `,
\r
4566 NHANH (SPEC_ALL COEFS_4) THEN
\r
4567 REPEAT GEN_TAC THEN
\r
4568 ONCE_REWRITE_TAC[SET_RULE` {v1, v2, v3, v4} = {v4,v1, v2, v3}`] THEN
\r
4569 NHANH (SPEC_ALL COEFS_4) THEN
\r
4570 MESON_TAC[REAL_ARITH` ta + tb + tc + td = td + ta + tb + tc`;
\r
4571 VECTOR_ARITH` ta + tb + tc + td = td + ta + tb + (tc:real^N)`]);;
\r
4573 let ALL_ABOUT_COEF_2 = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4574 ~ coplanar {v1,v2,v3,v4} ==>
\r
4575 ( COEF4_2 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v1,v3, v4} {v2} ) /\
\r
4576 ( COEF4_2 v1 v2 v3 v4 v = &0 <=> v IN aff {v1,v3,v4} ) /\
\r
4577 ( COEF4_2 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v1,v3,v4} {v2} )`,
\r
4578 SIMP_TAC[PER_COEF1_WITH_COEF2] THEN MP_TAC ALL_ABOUT_COEF_1 THEN
\r
4579 MESON_TAC[SET_RULE` {v1, v2, v3, v4} = {v2, v3, v4, v1}`;
\r
4580 SET_RULE` {v1, v2, v3} = {v2, v3,v1}`]);;
\r
4585 let ALL_ABOUT_COEF_3 = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4586 ~ coplanar {v1,v2,v3,v4} ==>
\r
4587 ( COEF4_3 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v1, v4} {v3} ) /\
\r
4588 ( COEF4_3 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v1,v4} ) /\
\r
4589 ( COEF4_3 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v1,v4} {v3} ) `,
\r
4590 SIMP_TAC[PER_COEF1_WITH_COEF3] THEN
\r
4591 ONCE_REWRITE_TAC[SET_RULE` {v2, v1, v4} = {v4,v1,v2} `] THEN
\r
4592 ONCE_REWRITE_TAC[SET_RULE` {v1, v4, v3, v2} = {v3,v4,v1,v2} `] THEN
\r
4593 SIMP_TAC[ALL_ABOUT_COEF_1]);;
\r
4595 let SRGTIHY = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4596 ~ coplanar {v1,v2,v3,v4} ==>
\r
4597 ( COEF4_1 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v3, v4} {v1} ) /\
\r
4598 ( COEF4_1 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v3,v4} ) /\
\r
4599 ( COEF4_1 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v3,v4} {v1} ) /\
\r
4600 ( COEF4_2 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v1,v3, v4} {v2} ) /\
\r
4601 ( COEF4_2 v1 v2 v3 v4 v = &0 <=> v IN aff {v1,v3,v4} ) /\
\r
4602 ( COEF4_2 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v1,v3,v4} {v2} ) /\
\r
4603 ( COEF4_3 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v1, v4} {v3} ) /\
\r
4604 ( COEF4_3 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v1,v4} ) /\
\r
4605 ( COEF4_3 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v1,v4} {v3} )/\
\r
4606 ( COEF4_4 v1 v2 v3 v4 v < &0 <=> v IN aff_lt {v2,v1, v3} {v4} ) /\
\r
4607 ( COEF4_4 v1 v2 v3 v4 v = &0 <=> v IN aff {v2,v1,v3} ) /\
\r
4608 ( COEF4_4 v1 v2 v3 v4 v > &0 <=> v IN aff_gt {v2,v1,v3} {v4} )`,
\r
4609 SIMP_TAC[ALL_ABOUT_COEF_1; ALL_ABOUT_COEF_2; ALL_ABOUT_COEF_3;
\r
4610 PER_COEF1_WITH_COEF4] THEN
\r
4611 ONCE_REWRITE_TAC[SET_RULE` {v2, v1, v3} = {v1,v2,v3}`] THEN
\r
4612 ONCE_REWRITE_TAC[SET_RULE` {v1, v3, v2, v4} = {v4,v1,v2,v3}`] THEN
\r
4613 SIMP_TAC[ALL_ABOUT_COEF_1]);;
\r
4614 let LEMMA77 = SRGTIHY;;
\r
4617 let CONV0_4 = prove
\r
4618 (`conv0 {v1, v2, v3, v4} =
\r
4619 {x:real^N | ?a b c d.
\r
4624 a + b + c + d = &1 /\
\r
4625 a % v1 + b % v2 + c % v3 + d % v4 = x}`,
\r
4626 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN X_GEN_TAC `y:real^N` THEN
\r
4627 REWRITE_TAC[conv0; affsign; sgn_gt; lin_combo; UNION_EMPTY] THEN
\r
4628 MATCH_MP_TAC EQ_TRANS THEN
\r
4630 `?f. (!w:real^N. w IN {v1, v2, v3, v4} ==> &0 < f w) /\
\r
4631 sum {v1, v2, v3, v4} f = &1 /\
\r
4632 vsum {v1, v2, v3, v4} (\v. f v % v) = y` THEN
\r
4633 CONJ_TAC THENL [REWRITE_TAC[IN] THEN MESON_TAC[]; ALL_TAC] THEN
\r
4634 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
4635 REAL_ARITH `&0 < x /\ &0 < y ==> &0 < x + y`;
\r
4636 REAL_ARITH `&0 < x ==> &0 < x / &2`;
\r
4637 FINITE_INSERT; CONJUNCT1 FINITE_RULES; RIGHT_EXISTS_AND_THM] THEN
\r
4638 ASM_REWRITE_TAC[IN_ELIM_THM;
\r
4639 REAL_ARITH `x - y:real = z <=> x = y + z`;
\r
4640 VECTOR_ARITH `x - y:real^N = z <=> x = y + z`] THEN
\r
4641 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN MESON_TAC[]);;
\r
4643 (* ======================= *)
\r
4645 (* ======================= *)
\r
4647 let ARIKWRQ = prove(`! v1 v2 v3 (v4:real^3).
\r
4648 let s = {v1,v2,v3,v4} in
\r
4649 CARD s = 4 /\ ~ coplanar s ==>
\r
4650 conv s = aff_ge ( s DIFF {v1} ) {v1} INTER
\r
4651 aff_ge ( s DIFF {v2} ) {v2} INTER
\r
4652 aff_ge ( s DIFF {v3} ) {v3} INTER
\r
4653 aff_ge ( s DIFF {v4} ) {v4} `, LET_TR THEN
\r
4654 SIMP_TAC[CARD4; SET_RULE ` ~(v1 IN {v2, v3, v4}) /\ ~(v2 = v3 \/ v3 = v4 \/ v4 = v2)
\r
4655 ==> {v1, v2, v3, v4} DIFF {v1} = {v2,v3,v4} /\
\r
4656 {v1, v2, v3, v4} DIFF {v2} = {v3,v4,v1} /\
\r
4657 {v1, v2, v3, v4} DIFF {v3} = {v4,v1,v2} /\
\r
4658 {v1, v2, v3, v4} DIFF {v4} = {v1,v2,v3} `] THEN
\r
4659 REWRITE_TAC[CARD4; IN_SET3;DE_MORGAN_THM] THEN
\r
4660 SIMP_TAC[AFF_GES_GTS] THEN
\r
4661 REWRITE_TAC[CONVEX_HULL_4_EQUIV] THEN
\r
4662 REPEAT STRIP_TAC THEN
\r
4663 REWRITE_TAC[SET_RULE ` a = b <=> (! x. x IN a <=> x IN b ) `;
\r
4664 IN_INTER; IN_ELIM_THM] THEN
\r
4665 GEN_TAC THEN EQ_TAC THENL [
\r
4666 ASM_MESON_TAC[REAL_ARITH` a + b + c + d = d + a + b + c `;
\r
4667 VECTOR_ARITH` (a:real^N) + b + c + d = d + a + b + c `];
\r
4668 FIRST_X_ASSUM MP_TAC ] THEN
\r
4669 NHANH (SPEC ` x: real^3` (GEN ` v:real^3` (SPEC_ALL COEFS_4))) THEN
\r
4670 ABBREV_TAC ` aa = COEF4_1 v1 v2 v3 v4 x ` THEN
\r
4671 ABBREV_TAC ` bb = COEF4_2 v1 v2 v3 v4 x ` THEN
\r
4672 ABBREV_TAC ` cc = COEF4_3 v1 v2 v3 v4 x ` THEN
\r
4673 ABBREV_TAC ` dd = COEF4_4 v1 v2 v3 v4 x ` THEN
\r
4674 REWRITE_TAC[MESON[]` a ==> b ==> c <=> a /\ b ==> c `] THEN PHA THEN
\r
4675 NHANH (MESON[REAL_ARITH` a + b + c + d = d + a + b + c `;
\r
4676 VECTOR_ARITH` (a:real^N) + b + c + d = d + a + b + c `]`
\r
4677 aa + bb + cc + dd = &1 /\
\r
4678 x = aa % v1 + bb % v2 + cc % v3 + dd % v4 /\
\r
4680 x = ta % v1 + tb % v2 + tc % v3 + td % v4 /\ ta + tb + tc + td = &1
\r
4681 ==> ta = aa /\ tb = bb /\ tc = cc /\ td = dd) /\
\r
4684 ta + tb + tc + t = &1 /\
\r
4685 x = ta % v2 + tb % v3 + tc % v4 + t % v1) /\
\r
4688 ta + tb + tc + t = &1 /\
\r
4689 x = ta % v3 + tb % v4 + tc % v1 + t % v2) /\
\r
4692 ta + tb + tc + t = &1 /\
\r
4693 x = ta % v4 + tb % v1 + tc % v2 + t % v3) /\
\r
4696 ta + tb + tc + t = &1 /\
\r
4697 x = ta % v1 + tb % v2 + tc % v3 + t % v4)
\r
4698 ==> &0 <= aa /\ &0 <= bb /\ &0 <= cc /\ &0 <= dd`) THEN
\r
4699 MATCH_MP_TAC (MESON[]` ( a1 /\ a2 /\ a3 ==> l) ==>
\r
4700 aa /\ ( a1 /\ a2 /\ a4 ) /\ a3 ==> l `) THEN MESON_TAC[]);;
\r
4706 (* ================ *)
\r
4708 (* ================= *)
\r
4713 let MXHKOXR = prove(`! v1 v2 v3 (v4:real^3). let s = {v1,v2,v3,v4} in
\r
4714 CARD s = 4 /\ ~ coplanar s ==>
\r
4715 conv0 s = aff_gt ( s DIFF {v1} ) {v1} INTER
\r
4716 aff_gt ( s DIFF {v2} ) {v2} INTER
\r
4717 aff_gt ( s DIFF {v3} ) {v3} INTER
\r
4718 aff_gt ( s DIFF {v4} ) {v4} `, LET_TR THEN
\r
4719 SIMP_TAC[CARD4; SET_RULE ` ~(v1 IN {v2, v3, v4}) /\ ~(v2 = v3 \/ v3 = v4 \/ v4 = v2)
\r
4720 ==> {v1, v2, v3, v4} DIFF {v1} = {v2,v3,v4} /\
\r
4721 {v1, v2, v3, v4} DIFF {v2} = {v3,v4,v1} /\
\r
4722 {v1, v2, v3, v4} DIFF {v3} = {v4,v1,v2} /\
\r
4723 {v1, v2, v3, v4} DIFF {v4} = {v1,v2,v3} `] THEN
\r
4724 REWRITE_TAC[CARD4; IN_SET3;DE_MORGAN_THM] THEN
\r
4725 SIMP_TAC[AFF_GES_GTS; CONV0_4 ] THEN
\r
4726 REPEAT STRIP_TAC THEN
\r
4727 REWRITE_TAC[SET_RULE ` a = b <=> (! x. x IN a <=> x IN b ) `;
\r
4728 IN_INTER; IN_ELIM_THM] THEN
\r
4729 GEN_TAC THEN EQ_TAC THENL [
\r
4730 ASM_MESON_TAC[REAL_ARITH` a + b + c + d = d + a + b + c `;
\r
4731 VECTOR_ARITH` (a:real^N) + b + c + d = d + a + b + c `];
\r
4732 FIRST_X_ASSUM MP_TAC ] THEN
\r
4733 NHANH (SPEC ` x: real^3` (GEN ` v:real^3` (SPEC_ALL COEFS_4))) THEN
\r
4734 ABBREV_TAC ` aa = COEF4_1 v1 v2 v3 v4 x ` THEN
\r
4735 ABBREV_TAC ` bb = COEF4_2 v1 v2 v3 v4 x ` THEN
\r
4736 ABBREV_TAC ` cc = COEF4_3 v1 v2 v3 v4 x ` THEN
\r
4737 ABBREV_TAC ` dd = COEF4_4 v1 v2 v3 v4 x ` THEN
\r
4738 REWRITE_TAC[MESON[]` a ==> b ==> c <=> a /\ b ==> c `] THEN PHA THEN
\r
4739 NHANH (MESON[REAL_ARITH` a + b + c + d = d + a + b + c `;
\r
4740 VECTOR_ARITH` (a:real^N) + b + c + d = d + a + b + c `]`
\r
4741 aa + bb + cc + dd = &1 /\
\r
4742 x = aa % v1 + bb % v2 + cc % v3 + dd % v4 /\
\r
4744 x = ta % v1 + tb % v2 + tc % v3 + td % v4 /\ ta + tb + tc + td = &1
\r
4745 ==> ta = aa /\ tb = bb /\ tc = cc /\ td = dd) /\
\r
4748 ta + tb + tc + t = &1 /\
\r
4749 x = ta % v2 + tb % v3 + tc % v4 + t % v1) /\
\r
4752 ta + tb + tc + t = &1 /\
\r
4753 x = ta % v3 + tb % v4 + tc % v1 + t % v2) /\
\r
4756 ta + tb + tc + t = &1 /\
\r
4757 x = ta % v4 + tb % v1 + tc % v2 + t % v3) /\
\r
4760 ta + tb + tc + t = &1 /\
\r
4761 x = ta % v1 + tb % v2 + tc % v3 + t % v4)
\r
4762 ==> &0 < aa /\ &0 < bb /\ &0 < cc /\ &0 < dd `) THEN
\r
4763 MATCH_MP_TAC (MESON[]` ( a1 /\ a2 /\ a3 ==> l) ==>
\r
4764 aa /\ ( a1 /\ a2 /\ a4 ) /\ a3 ==> l `) THEN MESON_TAC[]);;
\r
4767 let CONV0_4 = prove
\r
4768 (`conv0 {v1, v2, v3, v4} =
\r
4769 {x:real^N | ?a b c d.
\r
4774 a + b + c + d = &1 /\
\r
4775 a % v1 + b % v2 + c % v3 + d % v4 = x}`,
\r
4776 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM] THEN X_GEN_TAC `y:real^N` THEN
\r
4777 REWRITE_TAC[conv0; affsign; sgn_gt; lin_combo; UNION_EMPTY] THEN
\r
4778 MATCH_MP_TAC EQ_TRANS THEN
\r
4780 `?f. (!w:real^N. w IN {v1, v2, v3, v4} ==> &0 < f w) /\
\r
4781 sum {v1, v2, v3, v4} f = &1 /\
\r
4782 vsum {v1, v2, v3, v4} (\v. f v % v) = y` THEN
\r
4783 CONJ_TAC THENL [REWRITE_TAC[IN] THEN MESON_TAC[]; ALL_TAC] THEN
\r
4784 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
4785 REAL_ARITH `&0 < x /\ &0 < y ==> &0 < x + y`;
\r
4786 REAL_ARITH `&0 < x ==> &0 < x / &2`;
\r
4787 FINITE_INSERT; CONJUNCT1 FINITE_RULES; RIGHT_EXISTS_AND_THM] THEN
\r
4788 ASM_REWRITE_TAC[IN_ELIM_THM;
\r
4789 REAL_ARITH `x - y:real = z <=> x = y + z`;
\r
4790 VECTOR_ARITH `x - y:real^N = z <=> x = y + z`] THEN
\r
4791 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN MESON_TAC[]);;
\r
4794 let CONV0_4POINTS = CONV0_4;;
\r
4798 (* ================== *)
\r
4801 (* ================== *)
\r
4804 let ZRFMKPY = prove(` ! v1 v2 v3 v4 (v:real^3).
\r
4805 ~coplanar {v1, v2, v3, v4}
\r
4806 ==> (v IN conv {v1, v2, v3, v4} <=>
\r
4807 &0 <= COEF4_1 v1 v2 v3 v4 v /\
\r
4808 &0 <= COEF4_2 v1 v2 v3 v4 v /\
\r
4809 &0 <= COEF4_3 v1 v2 v3 v4 v /\
\r
4810 &0 <= COEF4_4 v1 v2 v3 v4 v) /\
\r
4811 (v IN conv0 {v1, v2, v3, v4} <=>
\r
4812 &0 < COEF4_1 v1 v2 v3 v4 v /\
\r
4813 &0 < COEF4_2 v1 v2 v3 v4 v /\
\r
4814 &0 < COEF4_3 v1 v2 v3 v4 v /\
\r
4815 &0 < COEF4_4 v1 v2 v3 v4 v) `,
\r
4816 NHANH (SPEC_ALL COEFS_4) THEN REWRITE_TAC[CONVEX_HULL_4_EQUIV;
\r
4817 CONV0_4POINTS; IN_ELIM_THM] THEN MESON_TAC[]);;
\r
4819 let LEMMA78 = ZRFMKPY;;
\r
4825 (* NGUYEN QUANG TRUONG *)
\r
4826 let IMP_TAC = IMP_IMP_TAC;;
\r
4830 let QUAANG_TRUOONN = prove(` ! v0 v1 v2 v3 (v4:real^N).
\r
4831 CARD {v0, v1, v2, v3, v4} = 5 /\
\r
4832 (?x. ~(x = v0) /\ x IN cone v0 {v1, v3} INTER cone v0 {v2, v4})
\r
4833 ==> ~(conv {v1, v3} INTER cone v0 {v2, v4} = {})`,
\r
4834 REWRITE_TAC[CONV_SET2; cone; CARD5; SET_RULE ` a INTER b = {} <=>
\r
4835 ~ (? x. a x /\ b x ) `; GSYM aff_ge_def; IN; IN_INTER] THEN
\r
4836 NHANH (SET_RULE ` ~{v1, v2, v3, v4} v0 ==>
\r
4837 ~ ( v0 = v1 \/ v0 = v3 ) /\ ~ ( v0 = v2 \/ v0 = v4 ) `) THEN
\r
4838 ONCE_REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `] THEN
\r
4839 SIMP_TAC[AFF_GE_12] THEN REWRITE_TAC[DE_MORGAN_THM] THEN
\r
4840 REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
\r
4841 UNDISCH_TAC ` (x:real^N) = tv % v0 + ta % v1 + tb % v3` THEN
\r
4842 UNDISCH_TAC ` (x:real^N) = tv' % v0 + ta' % v2 + tb' % v4` THEN
\r
4843 REWRITE_TAC[MESON[]` x = a
\r
4844 ==> x = (b:real^N) ==> c <=> x = a /\ a = b ==> c `] THEN
\r
4845 REWRITE_TAC[VECTOR_ARITH` a % v + d = b % v + e <=>
\r
4846 ( a - b ) % v + d = e `] THEN
\r
4847 ASM_CASES_TAC ` &0 < ta + tb ` THENL [DOWN_TAC THEN
\r
4848 REWRITE_TAC[MESON[VECTOR_MUL_LCANCEL; REAL_FIELD ` &0 < a ==> ~ ( &1 / a = &0 )`]`
\r
4849 &0 < ta + tb /\ aaa /\
\r
4850 aa = ta % v1 + tb % v3 <=> &0 < ta + tb /\ aaa /\
\r
4851 &1 / ( ta + tb ) % aa = &1 / ( ta + tb ) % ( ta % v1 + tb % v3) `] THEN
\r
4852 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH `
\r
4853 &1 / a * b = b / a `] THEN STRIP_TAC THEN DOWN_TAC THEN
\r
4854 NHANH (MESON[REAL_LE_RDIV_0]`&0 <= ta /\ &0 <= tb /\ a1 /\ &0 <= ta' /\
\r
4855 &0 <= tb' /\ a2 /\
\r
4856 &0 < ta + tb /\ a3 ==> &0 <= ta / (ta + tb) /\ &0 <= tb / (ta + tb) /\
\r
4857 &0 <= ta' / (ta + tb) /\ &0 <= tb' / (ta + tb) `) THEN ASM_MESON_TAC[
\r
4858 REAL_FIELD` tv + ta + tb = &1 /\ tv' + ta' + tb' = &1 /\
\r
4859 &0 < ta + tb ==> (tv' - tv) / (ta + tb) + ta' / (ta + tb) +
\r
4860 tb' / (ta + tb) = &1 /\ ta / ( ta + tb ) + tb / ( ta + tb ) = &1`];
\r
4862 NHANH (MESON[REAL_ARITH` &0 <= a /\ &0 <= b /\ ~( &0 < a + b )
\r
4863 ==> a = &0 /\ b = &0 `]`&0 <= ta /\ &0 <= tb /\a1/\a2 /\a3/\a4 /\
\r
4864 ~(&0 < ta + tb) /\ a5 ==> ta = &0 /\ tb = &0`) THEN
\r
4865 PURE_ONCE_REWRITE_TAC[MESON[]` P ta tb /\ ta = &0 /\ tb = &0
\r
4866 <=> P ( &0 ) ( &0 ) /\ ta = &0 /\ tb = &0 `] THEN
\r
4867 REWRITE_TAC[ZERO_NEUTRAL; VECTOR_MUL_LZERO; VECTOR_ADD_LID] THEN
\r
4868 REWRITE_TAC[VECTOR_ARITH` (tv' - tv) % v + a = vec 0 <=> tv' % v + a
\r
4869 = tv % v `; MESON[]` a = b /\ b = c <=> a = c /\ b = c `] THEN
\r
4870 MESON_TAC[VECTOR_ARITH ` &1 % v = v `]]);;
\r
4873 (* ================ *)
\r
4875 let JVDAFRS = prove(` ! v0 v1 v2 v3 (v4:real^N).
\r
4876 CARD {v0, v1, v2, v3, v4} = 5 /\
\r
4877 (?x. ~(x = v0) /\ x IN cone v0 {v1, v3} INTER cone v0 {v2, v4})
\r
4878 ==> ~(conv {v1, v3} INTER cone v0 {v2, v4} = {} /\
\r
4879 conv {v2, v4} INTER cone v0 {v1, v3} = {})`, MESON_TAC[QUAANG_TRUOONN]);;
\r
4882 (* =========================== *)
\r
4884 let SQRT8_POS = MESON[REAL_ARITH ` &0 < &8 `; SQRT_POS_LT]` &0 < sqrt (&8) `;;
\r
4886 let SQRT8_LT_4_45 = prove(` sqrt8 < #4.45 `,
\r
4887 SIMP_TAC[sqrt8; REAL_ARITH ` &0 < #4.45 `; MESON[REAL_ARITH ` &0 < &8 `;
\r
4888 SQRT_POS_LT]` &0 < sqrt (&8) `; LT_POW2_EQ_LT; SQRT8_POW2] THEN REAL_ARITH_TAC);;
\r
4891 let PROVE_NOT_COLLINEAR = prove(` ! v0 v1 (v2:real^3).
\r
4893 d3 v0 v1 <= #2.51 /\
\r
4894 #2.45 <= d3 v1 v2 /\
\r
4895 d3 v1 v2 <= #2.51 /\
\r
4896 #2.77 <= d3 v0 v2 /\
\r
4898 ==> ~ collinear {v0, v1, v2}`,
\r
4899 REWRITE_TAC[COLLINEAR_AS_IN_CONV2; MID_COND; d3; LENGTH_EQ_EX; DE_MORGAN_THM] THEN
\r
4900 SIMP_TAC[DIST_SYM] THEN
\r
4901 REPEAT GEN_TAC THEN
\r
4902 ABBREV_TAC ` a = dist(v0,v1:real^3)` THEN
\r
4903 ABBREV_TAC ` b = dist(v0,v2:real^3)` THEN
\r
4904 ABBREV_TAC ` c = dist(v1,v2:real^3)` THEN
\r
4905 MP_TAC SQRT8_LT_4_45 THEN
\r
4910 let BPOW8APOW2CPOW2 = prove(`&2 <= a /\
\r
4916 ==> b pow 2 <= &8 /\ a pow 2 <= #2.51 pow 2 /\ c pow 2 <= #2.51 pow 2 `,
\r
4917 REWRITE_TAC[MESON[]` a1 /\ a2 /\a3 /\a4 /\a5 /\a6 ==> l <=>
\r
4918 a1 /\a3 /\a5 ==> a2 /\a4 /\a6 ==> l `] THEN
\r
4919 NHANH (REAL_ARITH`&2 <= a /\ #2.45 <= c /\ #2.77 <= b ==>
\r
4920 &0 < a /\ &0 < b /\ &0 < c /\ &0 < #2.51 `) THEN
\r
4921 SIMP_TAC[sqrt8; POW2_COND_LT; SQRT8_POS; SQRT8_POW2]);;
\r
4924 let IMP_PRE_LE_19 = prove(`&2 <= a /\
\r
4936 a pow 2 <= #2.77 pow 2 + #2.45 pow 2 /\
\r
4937 b pow 2 <= &2 pow 2 + #2.45 pow 2 /\
\r
4938 c pow 2 <= &2 pow 2 + #2.77 pow 2 `,
\r
4939 CONV_TAC REAL_RAT_REDUCE_CONV THEN NHANH (BPOW8APOW2CPOW2 ) THEN REAL_ARITH_TAC);;
\r
4943 let ZEDIDCF = prove(` ! v0 v1 (v2:real^3).
\r
4945 d3 v0 v1 <= #2.51 /\
\r
4946 #2.45 <= d3 v1 v2 /\
\r
4947 d3 v1 v2 <= #2.51 /\
\r
4948 #2.77 <= d3 v0 v2 /\
\r
4950 ==> sqrt2 < radV {v0, v1, v2}`,
\r
4951 NHANH (SPEC_ALL PROVE_NOT_COLLINEAR) THEN
\r
4952 SIMP_TAC[RADV_FORMULAR] THEN REPEAT GEN_TAC THEN
\r
4953 SIMP_TAC[d3; DIST_SYM] THEN
\r
4954 ABBREV_TAC ` a = dist(v0,v1:real^3)` THEN
\r
4955 ABBREV_TAC ` b = dist(v0,v2:real^3)` THEN
\r
4956 ABBREV_TAC ` c = dist(v1,v2:real^3)` THEN
\r
4957 NHANH (IMP_PRE_LE_19 ) THEN NHANH (SPEC_ALL BYOWBDF) THEN
\r
4958 SIMP_TAC[ETA_Y_SYYM] THEN STRIP_TAC THEN
\r
4959 UNDISCH_TAC ` eta_y #2.77 #2.45 (&2) <= eta_y a b c ` THEN
\r
4960 ABBREV_TAC ` l = eta_y a b c ` THEN
\r
4961 REWRITE_TAC[eta_y; eta_x; ups_x; sqrt2] THEN LET_TR THEN
\r
4962 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
4963 MP_TAC (prove(` sqrt (&2) < sqrt (&93993025 / &46231104) `,
\r
4964 SIMP_TAC[SQRT_WORKS; REAL_ARITH ` &0 <= &2 /\
\r
4965 &0 <= &93993025 / &46231104 `; LT_POW2_COND] THEN REAL_ARITH_TAC))
\r
4966 THEN REAL_ARITH_TAC);;
\r
4969 (* ==================== *)
\r
4971 let condC = new_definition ` condC M13 m12 m14 M24 m34 (m23:real) =
\r
4972 ((! x. x IN {M13, m12, m14, M24, m34, m23 } ==> &0 <= x ) /\
\r
4973 M13 <= m12 + m23 /\
\r
4974 M13 <= m14 + m34 /\
\r
4975 M24 < m12 + m14 /\
\r
4976 M24 < m23 + m34 /\
\r
4977 &0 <= delta (M13 pow 2) (m12 pow 2) (m14 pow 2) (M24 pow 2) (m34 pow 2 )
\r
4981 let CXWOCGN = new_axiom` !M13 m12 m14 M24 m34 m23 (v1:real^3) v2 v3 v4.
\r
4982 condC M13 m12 m14 M24 m34 m23 /\
\r
4983 CARD {v1,v2,v3,v4} = 4 /\
\r
4984 m12 <= d3 v1 v2 /\
\r
4985 m23 <= d3 v2 v3 /\
\r
4986 m34 <= d3 v3 v4 /\
\r
4987 m14 <= d3 v1 v4 /\
\r
4989 d3 v2 v4 <= M24 ==>
\r
4990 conv {v1,v3} INTER conv {v2,v4} = {} `;;
\r
4991 SPECL [` sqrt (&8 ) `; ` &2 `; ` &2 `; ` sqrt (&8) `; ` &2 `;
\r
4992 ` &2 `; ` u :real^3 `; ` w : real^3 `; ` v :real^3 `; ` u + v - ( w:real^3 )`] CXWOCGN;;
\r
4995 g ` a < sqrt (&8) ==> ~ ( &2 <= &1 / &2 * a ) `;;
\r
4996 e (ASM_CASES_TAC ` &0 <= a `);;
\r
4997 e (UNDISCH_TAC `&0 <= a `);;
\r
4998 e (SIMP_TAC[REAL_LT_IMP_LE; SQRT8_POS; LT_POW2_COND; REAL_ARITH `
\r
4999 &2 <= &1 / &2 * a <=> &4 <= a `; REAL_ARITH` &0 <= &4 `;
\r
5000 POW2_COND; SQRT8_POW2]);;
\r
5001 e (REAL_ARITH_TAC);;
\r
5002 e (FIRST_X_ASSUM MP_TAC);;
\r
5003 e (REAL_ARITH_TAC);;
\r
5004 let LT_SQ8_IMP_LT2 = top_thm();;
\r
5008 let LE_FOR_LEMMA36 = prove(`(CARD {u, v, w} = 3 /\ packing {u, v, w} /\ dist (u,v) < sqrt8) /\
\r
5009 ~(dist (u,v) / &2 < dist (w,&1 / &2 % (u + v))) ==>
\r
5010 condC (sqrt (&8)) (&2) (&2) (sqrt (&8)) (&2) (&2) /\
\r
5011 CARD {u, w, v, u + v - w} = 4 /\
\r
5014 &2 <= d3 v (u + v - w) /\
\r
5015 &2 <= d3 u (u + v - w) /\
\r
5016 d3 u v < sqrt (&8) /\
\r
5017 d3 w (u + v - w) <= sqrt (&8) `,
\r
5018 REWRITE_TAC[condC; delta; SQRT8_POW2] THEN
\r
5019 REWRITE_TAC[SET_RULE ` (! x. x IN ( a INSERT b ) ==> p x ) <=>
\r
5020 p a /\ (! x. x IN b ==> p x ) `; NOT_IN_EMPTY] THEN
\r
5021 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
5022 SIMP_TAC[SQRT8_POS; REAL_LT_IMP_LE; d3; sqrt8; packing] THEN
\r
5023 SIMP_TAC[REAL_LT_IMP_LE; SQRT8_POS; LT_POW2_COND;
\r
5024 REAL_ARITH ` &0 <= &4 `; POW2_COND; SQRT8_POW2] THEN
\r
5025 CONV_TAC REAL_RAT_REDUCE_CONV THEN
\r
5026 REWRITE_TAC[NORM_ARITH` dist (v,u + v - w) = dist (u,w) /\
\r
5027 dist (u,u + v - w) = dist (v,w) /\
\r
5028 dist (w,u + v - w) = &2 * dist (w,&1 / &2 % (u + v)) `] THEN
\r
5029 STRIP_TAC THEN CONJ_TAC THENL [
\r
5030 UNDISCH_TAC `CARD {(u:real^3), v, w} = 3` THEN
\r
5031 REWRITE_TAC[CARD3; CARD4; IN_SET3] THEN
\r
5032 REWRITE_TAC[DE_MORGAN_THM] THEN DAO THEN
\r
5033 STRIP_TAC THEN CONJ_TAC THENL [
\r
5034 NHANH (NORM_ARITH`u + v - w = w ==> dist (w,u) = &1 / &2 * dist (u,v) `) THEN
\r
5035 UNDISCH_TAC `dist ((u:real^3),v) < sqrt (&8)` THEN
\r
5036 NHANH (LT_SQ8_IMP_LT2 ) THEN DOWN_TAC THEN SET_TAC[];
\r
5037 REWRITE_TAC[VECTOR_ARITH ` ((v:real^N) = u + v - w <=> u = w )`;
\r
5038 VECTOR_ARITH ` ((u:real^N) = u + v - w <=> v = w ) `] THEN ASM_MESON_TAC[]];
\r
5039 DAO THEN CONJ_TAC THENL [REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN
\r
5040 REAL_ARITH_TAC;DOWN_TAC THEN REWRITE_TAC[CARD3] THEN SET_TAC[]]]);;
\r
5041 let MIDDLE_POINT_IN_CONV2 = prove(` &1 / &2 % ( u + v ) IN conv {u,v} `,
\r
5042 REWRITE_TAC[CONV_SET2; IN_ELIM_THM; VECTOR_ADD_LDISTRIB] THEN
\r
5043 MESON_TAC[REAL_ARITH ` &0 <= &1 / &2 `; REAL_ARITH` &1 / &2 + &1 / &2 = &1 `]);;
\r
5045 let INTER_DISJONT_EX =
\r
5046 SET_RULE ` ( a INTER b = {} ) <=> (! x. ~ (x IN a /\ x IN b )) `;;
\r
5051 (* ================== *)
\r
5052 let ZZSBSIO = prove(` ! (u:real^3) v w. CARD {u,v,w} = 3 /\ packing {u,v,w} /\
\r
5053 dist (u,v) < sqrt8 ==> dist (u,v) / &2 < dist (w, &1 / &2 % ( u + v )) `,
\r
5054 REWRITE_TAC[MESON[]` a ==> b <=> ~ ( a /\ ~ b ) `] THEN
\r
5055 NHANH (LE_FOR_LEMMA36) THEN
\r
5056 NHANH (SPEC_ALL CXWOCGN) THEN
\r
5057 REPEAT STRIP_TAC THEN
\r
5058 FIRST_X_ASSUM MP_TAC THEN
\r
5059 REWRITE_TAC[INTER_DISJONT_EX] THEN
\r
5060 MESON_TAC[MIDDLE_POINT_IN_CONV2 ; VECTOR_ARITH `
\r
5061 u + v = w + u + v - (w:real^N) `]);;
\r
5066 MATCH_MP (SPEC_ALL AFFINE_HULL_FINITE) (MESON[FINITE_RULES] ` FINITE {(a:real^N),b,c} `) ;;
\r
5070 let PLANE_IMP_AFFINE = prove(`plane (p:real^N -> bool ) ==> affine p `,
\r
5071 MESON_TAC[plane; AFFINE_AFFINE_HULL]);;
\r
5074 let AFFINE = new_axiom `!V:real^N->bool.
\r
5076 !(s:real^N->bool) (u:real^N->real).
\r
5077 FINITE s /\ ~(s = {}) /\ s SUBSET V /\ sum s u = &1
\r
5078 ==> vsum s (\x. u x % x) IN V`;;
\r
5081 let PLANE_IMP_AFFINE = prove(` plane (p:real^N -> bool ) ==> affine p `,
\r
5082 REWRITE_TAC[plane; AFFINE_HULL_3; affine; FUN_EQ_THM; IN_ELIM_THM] THEN
\r
5083 STRIP_TAC THEN ASM_SIMP_TAC[IN] THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[] THEN
\r
5084 SIMP_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC] THEN
\r
5085 REWRITE_TAC[VECTOR_ARITH` (( a:real^N) + b + c ) + a' + b' + c'
\r
5086 = ( a + a' ) + ( b + b') + c + c' `] THEN EXISTS_TAC ` u' * u'' + v' * u''' ` THEN
\r
5087 EXISTS_TAC ` (u' * v'' + v' * v''')` THEN EXISTS_TAC ` (u' * w' + v' * w'')` THEN
\r
5088 ASM_SIMP_TAC[prove(` u' + v' = &1 /\
\r
5089 u''' + v''' + w'' = &1 /\
\r
5090 u'' + v'' + w' = &1 ==>
\r
5091 (u' * u'' + v' * u''') + (u' * v'' + v' * v''') + u' * w' + v' * w'' = &1 `,
\r
5092 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `] THEN REAL_ARITH_TAC);
\r
5093 GSYM VECTOR_ADD_RDISTRIB]);;
\r
5098 let IMP_AFFINE_HULL_SUBSET = prove(` FINITE a /\ a SUBSET s /\
\r
5099 ~( a = {} )/\ affine s ==> ( affine hull a ) SUBSET s `,
\r
5100 SIMP_TAC[AFFINE_HULL_FINITE; SUBSET; IN_ELIM_THM] THEN
\r
5101 REWRITE_TAC[ GSYM SUBSET] THEN MESON_TAC[AFFINE]);;
\r
5105 let SET_EQ_EX = SET_RULE `a = b <=> (! x. x IN a <=> x IN b ) `;;
\r
5106 let SET_EQ_TO_SUBSET = SET_RULE ` a = b <=> a SUBSET b /\ b SUBSET a `;;
\r
5111 let OTHORGONAL_QUATER_FOR = prove(` delta x12 ( x12 + x23 ) ( x12 + x24 ) x23 x24 x34 =
\r
5112 x12 * ups_x x23 x24 x34 `, REWRITE_TAC[delta; ups_x] THEN REAL_ARITH_TAC);;
\r
5115 let ORTHOGONAL_CROSS_PRODUCT = prove(` u dot ( cross u v ) = &0 /\
\r
5116 v dot ( cross u v ) = &0 `,
\r
5117 REWRITE_TAC[cross; triple_of_real3; real3_of_triple; mk_vec3] THEN
\r
5118 LET_TR THEN REWRITE_TAC[DOT_3; VECTOR_3] THEN REAL_ARITH_TAC);;
\r
5122 let PITHAGOR_CROSS = prove(` dist (a + cross (b - a) (c - a),b) pow 2 =
\r
5123 dist (b,a) pow 2 + norm ( cross (b - a) (c - a) ) pow 2 `,
\r
5124 REWRITE_TAC[vector_norm; dist] THEN
\r
5125 SIMP_TAC[DOT_POS_LE; SQRT_WORKS] THEN
\r
5126 REWRITE_TAC[VECTOR_ARITH` ((a:real^N) + b) - c = b - (c - a ) `] THEN
\r
5127 ABBREV_TAC ` ab = ( b - (a:real^3)) ` THEN
\r
5128 ABBREV_TAC ` ac = ( c - (a:real^3)) ` THEN
\r
5129 REWRITE_TAC[DOT_LSUB; DOT_RSUB] THEN
\r
5130 SIMP_TAC[ORTHOGONAL_CROSS_PRODUCT; DOT_SYM] THEN
\r
5134 let PITHAGOR_NORM = prove(` a dot b = &0 ==> dist (a,b) pow 2 = norm a pow 2 +
\r
5136 SIMP_TAC[dist; vector_norm; DOT_POS_LE; SQRT_WORKS] THEN
\r
5137 SIMP_TAC[DOT_LSUB; DOT_RSUB; DOT_SYM] THEN REAL_ARITH_TAC);;
\r
5147 prove(` dist ( cross a b, a ) pow 2 = norm (cross a b) pow 2 +
\r
5148 norm a pow 2 /\dist ( cross a b, b ) pow 2 = norm (cross a b) pow 2 +
\r
5150 SIMP_TAC[DOT_SYM;ORTHOGONAL_CROSS_PRODUCT ; PITHAGOR_NORM; DIST_SYM]);;
\r
5159 let VEC3_EQ_EX= prove(`! a (b:real^3). a = b <=> a$1 = b$1 /\ a$2 = b$2 /\ a$3 = b$3 `,
\r
5160 SIMP_TAC[CART_EQ; DIMINDEX_3] THEN
\r
5161 REWRITE_TAC[ARITH_RULE`1 <= i /\ i <= 3 <=>
\r
5162 i = 1 \/ i = 2 \/ i = 3 `] THEN MESON_TAC[]);;
\r
5165 g ` cross (b - a) (c - d) = cross (a - b) (d - c )`;;
\r
5166 e (REWRITE_TAC[cross; triple_of_real3; real3_of_triple; mk_vec3]);;
\r
5168 e (REWRITE_TAC[lemma_cm3 ]);;
\r
5169 e (REWRITE_TAC[VEC3_EQ_EX]);;
\r
5170 e (REWRITE_TAC[VEC3_EQ_EX; VECTOR_3]);;
\r
5171 e (REAL_ARITH_TAC);;
\r
5172 let CROSS_CONVERT = top_thm();;
\r
5176 g ` &4 * norm (cross (b - a) (c - a)) pow 2 =
\r
5177 ups_x (dist (a,b) pow 2) (dist (a,c) pow 2) (dist (b,c) pow 2)`;;
\r
5178 e (REWRITE_TAC[MESON[
\r
5179 prove(` dist(b,c) pow 2 = (a - c - (a - b)) dot (a - c - (a - b)) `,
\r
5180 SIMP_TAC[dist; vector_norm; DOT_POS_LE; SQRT_WORKS] THEN
\r
5181 MESON_TAC[VECTOR_ARITH` b - (c:real^N) = (a - c) - ( a - b) `])]`
\r
5182 ups_x aa bb (dist (b,c) pow 2 ) =
\r
5183 ups_x aa bb (( a - c - (a - b)) dot (a - c - (a - b))) `]);;
\r
5184 e (ONCE_REWRITE_TAC[CROSS_CONVERT]);;
\r
5185 e (SIMP_TAC[ups_x;DIST_SYM; dist; vector_norm; DOT_POS_LE; SQRT_WORKS]);;
\r
5186 e (REWRITE_TAC[cross; triple_of_real3; real3_of_triple; mk_vec3]);;
\r
5188 e (REWRITE_TAC[DOT_3; VECTOR_3]);;
\r
5189 e (ABBREV_TAC ` ab = a - (b:real^3) `);;
\r
5190 e (ABBREV_TAC ` cc = a - (c:real^3) `);;
\r
5191 e (REWRITE_TAC[lemma_cm3 ] THEN REAL_ARITH_TAC);;
\r
5193 let NORM_CROSS_PRODUCT_UPS_X = top_thm();;
\r
5196 g ` ! u v (w:real^3). ~ collinear {a,b,c} ==> ~ coplanar {
\r
5197 a + cross (b - a ) ( c - a ),a,b,c} `;;
\r
5198 e (MP_TAC POLFLZY);;
\r
5202 e (REWRITE_TAC[NORM_ARITH` dist (a + b ,a) = norm (b ) `]);;
\r
5203 e (REWRITE_TAC[NORM_ARITH`dist (a + c,b) =
\r
5204 dist ( c, b - a ) `]);;
\r
5205 e (SIMP_TAC[prove(` dist ( cross a b, a ) pow 2 = norm (cross a b) pow 2 +
\r
5206 norm a pow 2 /\dist ( cross a b, b ) pow 2 = norm (cross a b) pow 2 +
\r
5208 SIMP_TAC[DOT_SYM;ORTHOGONAL_CROSS_PRODUCT ; PITHAGOR_NORM; DIST_SYM])]);;
\r
5209 e (REWRITE_TAC[GSYM dist]);;
\r
5210 e (SIMP_TAC[DIST_SYM; OTHORGONAL_QUATER_FOR]);;
\r
5211 e (ONCE_REWRITE_TAC[REAL_ARITH` a * b = &0 <=> ( &4 * a ) * b = &0 `]);;
\r
5212 e (SIMP_TAC[NORM_CROSS_PRODUCT_UPS_X]);;
\r
5213 e (REWRITE_TAC[REAL_ENTIRE]);;
\r
5214 e (MESON_TAC[FHFMKIY]);;
\r
5215 let NOT_COLLINEAR_IMP_CROSS_NOT_COPLANAR = top_thm();;
\r
5220 let ORTHOGONAL_IMP_PITHAGOR = prove(` (x:real^N) dot ((a:real^N) - b) = &0 ==>
\r
5221 dist (a + x,b) pow 2 = norm x pow 2 + dist (a,b) pow 2`,
\r
5222 SIMP_TAC[dist; vector_norm; DOT_POS_LE; SQRT_WORKS] THEN
\r
5223 REWRITE_TAC[VECTOR_ARITH` (a + c) - b = c + a - (b:real^N)`] THEN
\r
5224 ABBREV_TAC ` aa = ( a - (b:real^N)) ` THEN
\r
5225 SIMP_TAC[DOT_LADD; DOT_RADD; DOT_SYM; ZERO_NEUTRAL]);;
\r
5229 let NOT_COL_AND_ORTHO_IMP_NOT_COPL = prove(`! a b c (x:real^3).
\r
5230 ~collinear {a, b, c} /\ x dot (a - b) = &0 /\
\r
5231 x dot (a - c) = &0 /\ ~(x = vec 0)
\r
5232 ==> ~coplanar {a + x, a, b, c}`,
\r
5233 MP_TAC POLFLZY THEN LET_TR THEN SIMP_TAC[] THEN
\r
5234 SIMP_TAC[ORTHOGONAL_IMP_PITHAGOR ] THEN
\r
5235 SIMP_TAC[ORTHOGONAL_IMP_PITHAGOR; NORM_ARITH ` dist (a + x,a) = norm x `] THEN
\r
5236 SIMP_TAC[ORTHOGONAL_IMP_PITHAGOR; NORM_ARITH ` dist (a + x,a) = norm x `;
\r
5237 OTHORGONAL_QUATER_FOR] THEN SIMP_TAC[COL_EQ_UPS_0] THEN
\r
5238 SIMP_TAC[COL_EQ_UPS_0; GSYM NORM_POS_LT; REAL_ENTIRE; MESON[RELATE_POW2]`
\r
5239 a pow 2 = &0 <=> a = &0 `; REAL_ARITH ` &0 < a ==> ~( a = &0 ) `]);;
\r
5245 let PLANE_NORM_IMP_AFFINE = prove(`! p. plane_norm p ==> affine p `,
\r
5246 REWRITE_TAC[plane_norm; affine] THEN GEN_TAC THEN STRIP_TAC THEN
\r
5247 ASM_SIMP_TAC[IN_ELIM_THM; MESON[]` a = &1 <=> &1 = a `] THEN
\r
5248 ONCE_REWRITE_TAC[ VECTOR_ARITH ` ( a + b ) - c = ( a + b ) - &1 % c `] THEN
\r
5249 ASM_SIMP_TAC[ VECTOR_ARITH` (u % x + v % y) - (u + v) % v0 =
\r
5250 u % ( x - v0 ) + v % ( y - v0 ) `; DOT_RADD; DOT_RMUL; ZERO_NEUTRAL]);;
\r
5255 let IN_PLANE_IMP_OTHORGONAL = prove(`
\r
5256 n dot (x - v0) = &0 /\ n dot (y - v0) = &0 /\ n dot (z - v0) = &0 ==>
\r
5257 n dot ( x - y ) = &0 /\ n dot ( x - z ) = &0 `,
\r
5258 SIMP_TAC[DOT_RSUB] THEN REAL_ARITH_TAC);;
\r
5263 g `(n:real^N) dot (x - v0) = &0 /\
\r
5264 n dot (y - v0) = &0 /\
\r
5265 n dot (z - v0) = &0 /\
\r
5267 x' = a1 % (x + n) + a2 % x + a3 % y + a4 % z /\
\r
5268 a1 + a2 + a3 + a4 = &1 /\
\r
5269 n dot (x' - v0) = &0
\r
5272 e (UNDISCH_TAC ` (n:real^N) dot (x' - v0) = &0`);;
\r
5273 e (ASM_SIMP_TAC[VECTOR_ARITH`(a1 % x + y ) - v0 = a1 % ( x - v0 ) + y - v0 + a1 % v0 `]);;
\r
5274 e (ONCE_REWRITE_TAC[ VECTOR_ARITH` a % x - y =
\r
5275 a % ( x - y ) + a % y - y `]);;
\r
5276 e (ASM_SIMP_TAC[DOT_RADD; VECTOR_ARITH` ( a + b ) - (c:real^N)
\r
5277 = b + a - c `; DOT_RMUL; ZERO_NEUTRAL]);;
\r
5278 e (ASM_SIMP_TAC[DOT_RADD; VECTOR_ARITH` ( a + b ) - (c:real^N)
\r
5279 = b + a - c `; DOT_RMUL; ZERO_NEUTRAL; DOT_RSUB;
\r
5280 REAL_ARITH` ((a4 * (n dot v0) - n dot v0 + a3 * (n dot v0)) + a2 * (n dot v0)) +
\r
5281 a1 * (n dot v0) = ( a1 + a2 + a3 + a4 ) * ( n dot v0 ) - n dot v0 `;
\r
5282 REAL_ARITH ` &1 * a - a = &0 `]);;
\r
5283 e (ASM_MESON_TAC[REAL_ENTIRE; GSYM DOT_EQ_0]);;
\r
5284 let IMP_A1_EQ_0 = top_thm();;
\r
5290 let LEMMA7 = prove(` !x y z (p:real^3 -> bool).
\r
5291 plane_norm p /\ ~collinear {x, y, z} /\ {x, y, z} SUBSET p
\r
5292 ==> p = aff {x, y, z}`,
\r
5293 NHANH (PLANE_IMP_AFFINE) THEN
\r
5294 REPEAT STRIP_TAC THEN
\r
5295 REWRITE_TAC[aff; SET_EQ_TO_SUBSET] THEN CONJ_TAC THENL [
\r
5296 UNDISCH_TAC ` plane_norm (p:real^3 -> bool ) ` THEN
\r
5297 REWRITE_TAC[plane_norm] THEN
\r
5299 UNDISCH_TAC ` {(x:real^3), y, z} SUBSET p` THEN
\r
5300 ASM_SIMP_TAC[SET3_SUBSET; IN_ELIM_THM] THEN
\r
5301 NHANH (IN_PLANE_IMP_OTHORGONAL ) THEN
\r
5303 NHANH (MESON[NOT_COL_AND_ORTHO_IMP_NOT_COPL]`
\r
5304 ~collinear {(x:real^3), y, z} /\
\r
5305 ~(n = vec 0) /\a1 /\a2 /\a4 /\a3/\
\r
5306 n dot (x - y) = &0 /\
\r
5307 n dot (x - z) = &0 ==> ~coplanar { x + n ,x,y,z} `) THEN
\r
5308 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
\r
5309 REPEAT STRIP_TAC THEN
\r
5310 UNDISCH_TAC `~coplanar {x + n, x, y, (z:real^3)} ` THEN
\r
5311 NHANH (SPEC `x' :real^3` (GEN `v :real^3` ( SPEC_ALL COEFS_4 ))) THEN
\r
5312 ABBREV_TAC ` a1 = COEF4_1 (x + n) x y z x'` THEN
\r
5313 ABBREV_TAC ` a2 = COEF4_2 (x + n) x y z x'` THEN
\r
5314 ABBREV_TAC ` a3 = COEF4_3 (x + n) x y z x'` THEN
\r
5315 ABBREV_TAC ` a4 = COEF4_4 (x + n) x y z x'` THEN
\r
5318 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM] THEN
\r
5319 NHANH (MESON[IMP_A1_EQ_0]` ~(n = vec 0) /\
\r
5321 n dot (x - v0) = &0 /\
\r
5322 n dot (y - v0) = &0 /\
\r
5323 n dot (z - v0) = &0 /\
\r
5325 n dot (x' - v0) = &0 /\aa4/\aa5 /\aa6/\aa7/\
\r
5326 ~coplanar {x + n, x, y, z} /\
\r
5327 a1 + a2 + a3 + a4 = &1 /\
\r
5328 x' = a1 % (x + n) + a2 % x + a3 % y + a4 % z /\ l ==>
\r
5330 PURE_ONCE_REWRITE_TAC[MESON[]` P a1 /\ a1 = &0 <=> P (&0) /\
\r
5332 REWRITE_TAC[ZERO_NEUTRAL; VECTOR_ARITH` &0 % x + y = y `] THEN
\r
5334 ASM_MESON_TAC[PLANE_NORM_IMP_AFFINE ; FINITE_RULES;
\r
5335 SET_RULE` ~({(x:real^N), y, z} = {} )`; IMP_AFFINE_HULL_SUBSET]]);;
\r
5337 let SMWTDMU = LEMMA7;;
\r
5340 g ` det_vec3 v1 v2 v3 = ( cross v1 v2 ) dot v3 `;;
\r
5341 e (REWRITE_TAC[det_vec3; cross; triple_of_real3;
\r
5342 real3_of_triple; mk_vec3; DOT_3; VECTOR_3]);;
\r
5344 e (REWRITE_TAC[det_vec3; cross; triple_of_real3;
\r
5345 real3_of_triple; mk_vec3; DOT_3; VECTOR_3]);;
\r
5346 e (REAL_ARITH_TAC);;
\r
5347 let DET_VEC3_AS_CROSS_DOT = top_thm();;
\r
5351 g ` ! v1 v2 (v3:real^3). collinear {v1,v2,v3} <=>
\r
5352 norm (cross (v2 - v1) (v3 - v1)) pow 2 = &0 `;;
\r
5353 e (REWRITE_TAC[COL_EQ_UPS_0]);;
\r
5354 e (REWRITE_TAC[GSYM NORM_CROSS_PRODUCT_UPS_X]);;
\r
5355 e (REAL_ARITH_TAC);;
\r
5356 let COL_EQ_NORM_CROSS = top_thm();;
\r
5358 let COLLINEAR_IMP_COPLANAR = prove(` ! v1 v2 v3 v3 (v:real^3). collinear {v1,v2,v3} ==>
\r
5359 coplanar {v1,v2,v3,v} `,
\r
5360 REWRITE_TAC[COPLANAR_DET_VEC3_EQ_0; COL_EQ_NORM_CROSS; DET_VEC3_AS_CROSS_DOT ] THEN
\r
5361 REWRITE_TAC[GSYM RELATE_POW2; NORM_EQ_0] THEN REPEAT GEN_TAC THEN
\r
5362 SIMP_TAC[VECTOR_ARITH ` vec 0 dot x = &0 `]);;
\r
5364 (* MAY WORKS, LEMMA 85 ; VBVYGGT *)
\r
5369 let POS_EQ_NOT_COPLANANR = prove(` &0 < delta (dist ((x1:real^3),x2) pow 2) (dist (x1,x3) pow 2)
\r
5370 (dist (x1,x4) pow 2)
\r
5371 (dist (x2,x3) pow 2)
\r
5372 (dist (x2,x4) pow 2)
\r
5373 (dist (x3,x4) pow 2) <=> ~coplanar {x1, x2, x3, x4} `,
\r
5374 MP_TAC (DELTA_POS_4POINTS) THEN MP_TAC POLFLZY THEN LET_TR THEN
\r
5375 REWRITE_TAC[REAL_ARITH` a <= b <=> a = b \/ a < b `] THEN
\r
5376 MESON_TAC[REAL_ARITH` ~( a = b /\ a < b ) `]);;
\r
5378 let SUM_CHI_EQ_2DELTA = prove(` let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
5379 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
5380 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
5381 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
5382 &2 * delta x12 x13 x14 x23 x24 x34 = chi11 + chi22 + chi33 + chi44`, LET_TR THEN
\r
5383 REWRITE_TAC[chi; delta] THEN REAL_ARITH_TAC);;
\r
5385 let NOT_0_IMP_SUM_CHI_1 = prove(`~(delta x12 x13 x14 x23 x24 x34 = &0)
\r
5386 ==> chi x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) +
\r
5387 chi x12 x24 x23 x14 x13 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) +
\r
5388 chi x34 x13 x23 x14 x24 x12 / (&2 * delta x12 x13 x14 x23 x24 x34) +
\r
5389 chi x34 x24 x14 x23 x13 x12 / (&2 * delta x12 x13 x14 x23 x24 x34) =
\r
5390 &1`, MP_TAC SUM_CHI_EQ_2DELTA THEN
\r
5391 LET_TR THEN CONV_TAC REAL_FIELD);;
\r
5395 let PROVE_DIST_FROM_V1 = prove(` ~coplanar {v1, v2, v3, v4} ==>
\r
5396 let x12 = dist (v1,v2) pow 2 in
\r
5397 let x13 = dist (v1,v3) pow 2 in
\r
5398 let x14 = dist (v1,v4) pow 2 in
\r
5399 let x23 = dist (v2,v3) pow 2 in
\r
5400 let x24 = dist (v2,v4) pow 2 in
\r
5401 let x34 = dist (v3,v4) pow 2 in
\r
5402 let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
5403 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
5404 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
5405 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
5407 &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5408 (chi11 % v1 + chi22 % v2 + chi33 % v3 + chi44 % v4)
\r
5409 ==> d3 p v1 pow 2 =
\r
5410 ( &1 / &2 ) * rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) `,
\r
5411 REWRITE_TAC[ GSYM POS_EQ_NOT_COPLANANR] THEN
\r
5412 NHANH (REAL_ARITH` a < b ==> ~( b = a ) `) THEN
\r
5413 NHANH NOT_0_IMP_SUM_CHI_1 THEN
\r
5414 LET_TR THEN REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
5415 REAL_ARITH` ( &1 / a ) * b = b / a `] THEN
\r
5416 ABBREV_TAC ` a1 = chi (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5417 (dist (v2,v3) pow 2)
\r
5418 (dist (v2,v4) pow 2)
\r
5419 (dist (v3,v4) pow 2) /
\r
5421 delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5422 (dist (v2,v3) pow 2)
\r
5423 (dist (v2,v4) pow 2)
\r
5424 (dist (v3,(v4:real^3)) pow 2))` THEN
\r
5425 ABBREV_TAC ` a2 = chi (dist (v1,v2) pow 2) (dist (v2,v4) pow 2) (dist (v2,v3) pow 2)
\r
5426 (dist (v1,v4) pow 2)
\r
5427 (dist (v1,v3) pow 2)
\r
5428 (dist (v3,v4) pow 2) /
\r
5430 delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5431 (dist (v2,v3) pow 2)
\r
5432 (dist (v2,v4) pow 2)
\r
5433 (dist (v3,(v4:real^3)) pow 2)) ` THEN
\r
5434 REWRITE_TAC[ GSYM d3] THEN
\r
5435 ABBREV_TAC ` a3 = chi (d3 v3 v4 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) (d3 v1 v4 pow 2)
\r
5437 (d3 v1 v2 pow 2) /
\r
5439 delta (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v1 v4 pow 2)
\r
5442 (d3 v3 v4 pow 2)) ` THEN
\r
5443 ABBREV_TAC ` a4 = chi (d3 v3 v4 pow 2) (d3 v2 v4 pow 2) (d3 v1 v4 pow 2) (d3 v2 v3 pow 2)
\r
5445 (d3 v1 v2 pow 2) /
\r
5447 delta (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v1 v4 pow 2)
\r
5450 (d3 v3 v4 pow 2)) ` THEN
\r
5451 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `] THEN
\r
5452 REPEAT STRIP_TAC THEN
\r
5453 REWRITE_TAC[d3; dist; NORM_POW_2; VECTOR_ARITH`
\r
5454 (((&1 - (a2 + a3 + a4)) % v1 + a2 % v2 + a3 % v3 + a4 % v4) - v1) =
\r
5455 a2 % ( v2 - v1 ) + a3 % (v3 - v1 ) + a4 % ( v4 - v1 ) `;
\r
5456 VECTOR_ARITH` ( a + b ) dot ( a + b ) = a dot a + &2 * ( a dot b )
\r
5457 + b dot b `] THEN
\r
5458 REWRITE_TAC[DOT_RADD; DOT_LMUL; DOT_RMUL] THEN
\r
5459 REWRITE_TAC[X_DOT_X_EQ] THEN
\r
5460 REWRITE_TAC[DOT_NORM_NEG; VECTOR_ARITH` v2 - v1 - (v4 - v1)
\r
5461 = (v2:real^N) - v4 `] THEN
\r
5462 SIMP_TAC[GSYM dist; DIST_SYM; GSYM d3; D3_SYM] THEN
\r
5463 EXPAND_TAC "a2" THEN
\r
5464 EXPAND_TAC "a3" THEN
\r
5465 EXPAND_TAC "a4" THEN
\r
5466 REWRITE_TAC[GSYM d3 ] THEN
\r
5467 ABBREV_TAC ` x12 = d3 v1 v2 pow 2 ` THEN
\r
5468 ABBREV_TAC ` x13 = d3 v1 v3 pow 2 ` THEN
\r
5469 ABBREV_TAC ` x14 = d3 v1 v4 pow 2 ` THEN
\r
5470 ABBREV_TAC ` x23 = d3 v2 v3 pow 2 ` THEN
\r
5471 ABBREV_TAC ` x24 = d3 v2 v4 pow 2 ` THEN
\r
5472 ABBREV_TAC ` x34 = d3 v3 v4 pow 2 ` THEN
\r
5473 UNDISCH_TAC ` &0 < delta x12 x13 x14 x23 x24 x34 ` THEN
\r
5474 ONCE_REWRITE_TAC[REAL_FIELD` &0 < a ==> b = c <=> &0 < a
\r
5475 ==> b * ( &2 * a) pow 2 = c * ( &2 * a ) pow 2 `] THEN
\r
5476 ONCE_REWRITE_TAC[REAL_ARITH` &0 < a <=> &0 < &2 * a `] THEN
\r
5477 SIMP_TAC[REAL_FIELD` &0 < b ==> ( a / b ) * b pow 2 = a * b `;
\r
5478 REAL_RDISTRIB; REAL_FIELD` &0 < b ==> ( a / b ) * ( aa / b ) * c *
\r
5479 b pow 2 = a * aa * c `; REAL_ADD_LDISTRIB] THEN
\r
5480 SIMP_TAC[REAL_LDISTRIB; REAL_ARITH` (a*b)*c = a *b * c `;
\r
5481 REAL_FIELD` &0 < b ==> ( a / b ) * ( a / b ) * c * b pow 2 = a pow 2 * c `;
\r
5482 REAL_ARITH` &2 * a * b * c / &2 * d = a * b * d * c `] THEN
\r
5483 SIMP_TAC[REAL_FIELD` &0 < a ==> ( b / a ) * ( bb / a ) * a pow 2
\r
5484 * d = b * bb * d `] THEN
\r
5485 SIMP_TAC[REAL_FIELD` &0 < a ==> b / a / &2 * a pow 2 =
\r
5486 a * b / &2 `] THEN
\r
5487 REWRITE_TAC[chi; rho; delta] THEN
\r
5492 let PROVE_EQ_DIST_FROM4 = prove(` ~coplanar {v1, v2, v3, v4} ==>
\r
5493 let x12 = dist (v1,v2) pow 2 in
\r
5494 let x13 = dist (v1,v3) pow 2 in
\r
5495 let x14 = dist (v1,v4) pow 2 in
\r
5496 let x23 = dist (v2,v3) pow 2 in
\r
5497 let x24 = dist (v2,v4) pow 2 in
\r
5498 let x34 = dist (v3,v4) pow 2 in
\r
5499 let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
5500 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
5501 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
5502 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
5504 &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5505 (chi11 % v1 + chi22 % v2 + chi33 % v3 + chi44 % v4)
\r
5507 d3 p v2 pow 2 = ( &1 / &2 ) * rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) /\
\r
5508 d3 p v3 pow 2 = ( &1 / &2 ) * rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) /\
\r
5510 ( &1 / &2 ) * rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) `,
\r
5511 REWRITE_TAC[ GSYM POS_EQ_NOT_COPLANANR] THEN
\r
5512 NHANH (REAL_ARITH` a < b ==> ~( b = a ) `) THEN
\r
5513 NHANH NOT_0_IMP_SUM_CHI_1 THEN
\r
5514 LET_TR THEN REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
5515 REAL_ARITH` ( &1 / a ) * b = b / a `] THEN
\r
5516 ABBREV_TAC ` a1 = chi (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5517 (dist (v2,v3) pow 2)
\r
5518 (dist (v2,v4) pow 2)
\r
5519 (dist (v3,v4) pow 2) /
\r
5521 delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5522 (dist (v2,v3) pow 2)
\r
5523 (dist (v2,v4) pow 2)
\r
5524 (dist (v3,(v4:real^3)) pow 2))` THEN
\r
5525 ABBREV_TAC ` a2 = chi (dist (v1,v2) pow 2) (dist (v2,v4) pow 2) (dist (v2,v3) pow 2)
\r
5526 (dist (v1,v4) pow 2)
\r
5527 (dist (v1,v3) pow 2)
\r
5528 (dist (v3,v4) pow 2) /
\r
5530 delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
5531 (dist (v2,v3) pow 2)
\r
5532 (dist (v2,v4) pow 2)
\r
5533 (dist (v3,(v4:real^3)) pow 2)) ` THEN
\r
5534 REWRITE_TAC[ GSYM d3] THEN
\r
5535 ABBREV_TAC ` a3 = chi (d3 v3 v4 pow 2) (d3 v1 v3 pow 2) (d3 v2 v3 pow 2) (d3 v1 v4 pow 2)
\r
5537 (d3 v1 v2 pow 2) /
\r
5539 delta (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v1 v4 pow 2)
\r
5542 (d3 v3 v4 pow 2)) ` THEN
\r
5543 ABBREV_TAC ` a4 = chi (d3 v3 v4 pow 2) (d3 v2 v4 pow 2) (d3 v1 v4 pow 2) (d3 v2 v3 pow 2)
\r
5545 (d3 v1 v2 pow 2) /
\r
5547 delta (d3 v1 v2 pow 2) (d3 v1 v3 pow 2) (d3 v1 v4 pow 2)
\r
5550 (d3 v3 v4 pow 2)) ` THEN
\r
5551 ONCE_REWRITE_TAC[MESON[VECTOR_ARITH` &1 % x = x `]` d3 a b pow 2 =
\r
5552 aa <=> d3 a ( &1 % b ) pow 2 = aa `] THEN
\r
5553 ONCE_REWRITE_TAC[MESON[]` a = &1 <=> &1 = a `] THEN
\r
5555 STRIP_TAC THEN STRIP_TAC THEN
\r
5556 REWRITE_TAC[d3; dist] THEN
\r
5557 REWRITE_TAC[VECTOR_ARITH` (a1 % v1 + a2 % v2 + a3 % v3 + a4 % v4) - (a1 + a2 + a3 + a4) % v2
\r
5558 = a1 % ( v1 - v2 ) + a3 % ( v3 - v2 ) + a4 % (v4 - v2 ) `;
\r
5559 VECTOR_ARITH` (a1 % v1 + a2 % v2 + a3 % v3 + a4 % v4) - (a1 + a2 + a3 + a4) % v3
\r
5560 = a1 % ( v1 - v3 ) + a2 % ( v2 - v3 ) + a4 % (v4 - v3 )`;
\r
5561 VECTOR_ARITH` (a1 % v1 + a2 % v2 + a3 % v3 + a4 % v4) - (a1 + a2 + a3 + a4) % v4 =
\r
5562 a1 % ( v1 - v4 ) + a2 % ( v2 - v4 ) + a3 % (v3 - v4 )`] THEN
\r
5563 REWRITE_TAC[NORM_POW_2] THEN
\r
5564 REWRITE_TAC[DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL; GSYM NORM_POW_2] THEN
\r
5565 REWRITE_TAC[DOT_NORM_NEG; VECTOR_ARITH` v3 - v4 - (v2 - v4) =
\r
5566 (v3:real^N) - v2 `; GSYM dist; GSYM d3 ] THEN
\r
5567 EXPAND_TAC "a1" THEN
\r
5568 EXPAND_TAC "a2" THEN
\r
5569 EXPAND_TAC "a3" THEN
\r
5570 EXPAND_TAC "a4" THEN
\r
5571 REWRITE_TAC[GSYM d3 ] THEN
\r
5572 REWRITE_TAC[prove(` d3 (v4 - v3) (v1 - v3) = d3 v1 v4 `,
\r
5573 REWRITE_TAC[d3] THEN CONV_TAC NORM_ARITH)] THEN
\r
5574 SIMP_TAC[D3_SYM] THEN
\r
5575 ABBREV_TAC ` x12 = d3 v1 v2 pow 2 ` THEN
\r
5576 ABBREV_TAC ` x13 = d3 v1 v3 pow 2 ` THEN
\r
5577 ABBREV_TAC ` x14 = d3 v1 v4 pow 2 ` THEN
\r
5578 ABBREV_TAC ` x23 = d3 v2 v3 pow 2 ` THEN
\r
5579 ABBREV_TAC ` x24 = d3 v2 v4 pow 2 ` THEN
\r
5580 ABBREV_TAC ` x34 = d3 v3 v4 pow 2 ` THEN
\r
5581 UNDISCH_TAC ` &0 < delta x12 x13 x14 x23 x24 x34 ` THEN
\r
5582 ONCE_REWRITE_TAC[REAL_FIELD` &0 < a ==> ( b = c ) /\ ( bb = cc ) /\ ( bbb = ccc )
\r
5584 ==> ( b * ( &2 * a) pow 2 = c * ( &2 * a ) pow 2 ) /\
\r
5585 ( bb * ( &2 * a) pow 2 = cc * ( &2 * a ) pow 2 ) /\
\r
5586 ( bbb * ( &2 * a) pow 2 = ccc * ( &2 * a ) pow 2 ) `] THEN
\r
5587 ONCE_REWRITE_TAC[REAL_ARITH` &0 < a <=> &0 < &2 * a `] THEN
\r
5588 SIMP_TAC[REAL_FIELD` &0 < b ==> ( a / b ) * b pow 2 = a * b `;
\r
5589 REAL_RDISTRIB; REAL_FIELD` &0 < b ==> ( a / b ) * ( aa / b ) * c *
\r
5590 b pow 2 = a * aa * c `; REAL_ADD_LDISTRIB] THEN
\r
5591 SIMP_TAC[REAL_LDISTRIB; REAL_ARITH` (a*b)*c = a *b * c `;
\r
5592 REAL_FIELD` &0 < b ==> ( a / b ) * ( a / b ) * c * b pow 2 = a pow 2 * c `;
\r
5593 REAL_ARITH` &2 * a * b * c / &2 * d = a * b * d * c `] THEN
\r
5594 SIMP_TAC[REAL_FIELD` &0 < a ==> ( b / a ) * ( bb / a ) * a pow 2
\r
5595 * d = b * bb * d `] THEN
\r
5596 SIMP_TAC[REAL_FIELD` &0 < a ==> b / a / &2 * a pow 2 =
\r
5597 a * b / &2 `] THEN SIMP_TAC[REAL_FIELD` &0 < b ==> ( a / b ) * b pow 2 = a * b `;
\r
5598 REAL_RDISTRIB; REAL_FIELD` &0 < b ==> ( a / b ) * ( aa / b ) * c *
\r
5599 b pow 2 = a * aa * c `; REAL_ADD_LDISTRIB] THEN
\r
5600 SIMP_TAC[REAL_LDISTRIB; REAL_ARITH` (a*b)*c = a *b * c `;
\r
5601 REAL_FIELD` &0 < b ==> ( a / b ) * ( a / b ) * c * b pow 2 = a pow 2 * c `;
\r
5602 REAL_ARITH` &2 * a * b * c / &2 * d = a * b * d * c `] THEN
\r
5603 SIMP_TAC[REAL_FIELD` &0 < a ==> ( b / a ) * ( bb / a ) * a pow 2
\r
5604 * d = b * bb * d `] THEN
\r
5605 SIMP_TAC[REAL_FIELD` &0 < a ==> b / a / &2 * a pow 2 =
\r
5606 a * b / &2 `] THEN
\r
5607 DISCH_TAC THEN REWRITE_TAC[chi; rho; delta] THEN
\r
5612 (* the following lemma is in Multivariate/convex.ml *)
\r
5613 let AFFINE_HULL_FINITE_STEP = new_axiom
\r
5614 `((?u. sum {} u = w /\ vsum {} (\x. u(x) % x) = y) <=>
\r
5615 w = &0 /\ y = vec 0) /\
\r
5616 (FINITE(s:real^N->bool)
\r
5617 ==> ((?u. sum (a INSERT s) u = w /\
\r
5618 vsum (a INSERT s) (\x. u(x) % x) = y) <=>
\r
5619 ?v u. sum s u = w - v /\
\r
5620 vsum s (\x. u(x) % x) = y - v % a))`;;
\r
5622 let AFFINE_HULL_3 = prove
\r
5623 (`affine hull {a,b,c} =
\r
5624 { u % a + v % b + w % c | u + v + w = &1}`,
\r
5625 SIMP_TAC[AFFINE_HULL_FINITE; FINITE_INSERT; FINITE_RULES] THEN
\r
5626 SIMP_TAC[AFFINE_HULL_FINITE_STEP; FINITE_INSERT; FINITE_RULES] THEN
\r
5627 REWRITE_TAC[REAL_ARITH `x - y = z:real <=> x = y + z`;
\r
5628 VECTOR_ARITH `x - y = z:real^N <=> x = y + z`] THEN
\r
5629 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN SET_TAC[]);;
\r
5631 let AFFINE_HULL_4 = prove
\r
5632 (`affine hull {a,b,c,d} =
\r
5633 { u % a + v % b + w % c + z % d | u + v + w + z = &1}`,
\r
5634 SIMP_TAC[AFFINE_HULL_FINITE; FINITE_INSERT; FINITE_RULES] THEN
\r
5635 SIMP_TAC[AFFINE_HULL_FINITE_STEP; FINITE_INSERT; FINITE_RULES] THEN
\r
5636 REWRITE_TAC[REAL_ARITH `x - y = z:real <=> x = y + z`;
\r
5637 VECTOR_ARITH `x - y = z:real^N <=> x = y + z`] THEN
\r
5638 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN SET_TAC[]);;
\r
5641 let PROVE_EXISTS_CIR_OF_FOUR_POINTS = prove(`!(v1:real^3) v2 v3 v4.
\r
5642 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5643 ==> (? p. p IN affine hull {v1, v2, v3, v4} /\
\r
5644 (?r. !v. v IN {v1, v2, v3, v4}
\r
5645 ==> r = dist (p, v))) `,
\r
5646 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `p:real^3` PROVE_DIST_FROM_V1)) THEN
\r
5647 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `p:real^3` PROVE_EQ_DIST_FROM4 )) THEN
\r
5648 REPEAT GEN_TAC THEN REPEAT LET_TAC THEN ABBREV_TAC `rr = &1 / &2 *
\r
5649 rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
5650 REWRITE_TAC[GSYM POS_EQ_NOT_COPLANANR] THEN
\r
5651 NHANH (SPEC_ALL REAL_POS_NZ) THEN ASM_SIMP_TAC[] THEN
\r
5652 NHANH (NOT_0_IMP_SUM_CHI_1 ) THEN ASM_SIMP_TAC[] THEN
\r
5653 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
5654 REAL_ARITH ` &1 / a * b = b / a `] THEN
\r
5655 REWRITE_TAC[FORALL_IN_CLAUSES; MESON[]`(? r. (r:real) = a /\
\r
5656 r = b /\ r = c /\ r = d ) <=> a = b /\ a = c /\ a = d `] THEN
\r
5657 REWRITE_TAC[MESON[]` (! x. x = a ==> P a ) <=> P a `] THEN DISCH_TAC THEN
\r
5658 EXISTS_TAC ` chi11 / (&2 * delta x12 x13 x14 x23 x24 x34) % (v1:real^3) +
\r
5659 chi22 / (&2 * delta x12 x13 x14 x23 x24 x34) % v2 +
\r
5660 chi33 / (&2 * delta x12 x13 x14 x23 x24 x34) % v3 +
\r
5661 chi44 / (&2 * delta x12 x13 x14 x23 x24 x34) % v4 ` THEN
\r
5662 CONJ_TAC THENL [REWRITE_TAC[AFFINE_HULL_4; IN_ELIM_THM] THEN
\r
5663 FIRST_X_ASSUM MP_TAC THEN MESON_TAC[NOT_0_IMP_SUM_CHI_1 ];
\r
5664 FIRST_X_ASSUM MP_TAC THEN SIMP_TAC[d3; DIST_POS_LE; EQ_POW2_COND]]);;
\r
5677 let IMP_PROPERTIES_OF_CIR4 = prove(`!(v1:real^3) v2 v3 v4.
\r
5678 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5679 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
5680 (?r. !v. v IN {v1, v2, v3, v4}
\r
5681 ==> r = dist (circumcenter {v1, v2, v3, v4},v))`,
\r
5682 NHANH (SPEC_ALL PROVE_EXISTS_CIR_OF_FOUR_POINTS ) THEN REWRITE_TAC[circumcenter; IN]
\r
5683 THEN MESON_TAC[EXISTS_THM]);;
\r
5688 let DIST_EQ_IMP_ORTHOGONAL = prove(` dist (pp,v2) = dist (pp,v1) /\
\r
5689 dist (p,v2) = dist (p,v1) ==>
\r
5690 (pp - p ) dot (v2 - v1 ) = &0 `,
\r
5691 REWRITE_TAC[MONG7_ROI; DOT_LSUB] THEN REAL_ARITH_TAC);;
\r
5695 let IMP_OTHO4 = prove(` n dot (v2 - v1) = &0 /\
\r
5696 n dot (v3 - v1) = &0 /\
\r
5697 n dot (v4 - v1) = &0 /\
\r
5698 x IN affine hull {v1,v2,v3,v4} /\
\r
5699 y IN affine hull {v1,v2,v3,v4} ==>
\r
5700 n dot (x - y ) = &0 `,
\r
5701 REWRITE_TAC[AFFINE_HULL_4; IN_ELIM_THM] THEN STRIP_TAC THEN
\r
5702 DOWN_TAC THEN IMP_TAC THEN SIMP_TAC[REAL_ARITH`a + b = c <=> a = c - b `] THEN
\r
5703 PHA THEN REWRITE_TAC[VECTOR_ARITH` ((&1 - (v' + w' + z')) % v1 + v' % v2 +
\r
5704 w' % v3 + z' % v4) - ((&1 - (v + w + z)) % v1 + v % v2 + w % v3 + z % v4) =
\r
5705 ( v' - v ) % ( v2 - v1 ) + ( w' - w ) % ( v3 - v1 ) +
\r
5706 ( z' - z ) % ( v4 - v1 ) `] THEN
\r
5707 SIMP_TAC[DOT_RADD; DOT_RMUL; ZERO_NEUTRAL]);;
\r
5713 let UNIQUE_EXISISTING_PROPERTY_C4 = prove(`!(v1:real^3) v2 v3 v4.
\r
5714 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5715 ==> (!p. p IN affine hull {v1, v2, v3, v4} /\
\r
5716 (?r. !v. v IN {v1, v2, v3, v4} ==> r = dist (p,v))
\r
5717 ==> p = circumcenter {v1, v2, v3, v4}) `,
\r
5718 NHANH (SPEC_ALL IMP_PROPERTIES_OF_CIR4 ) THEN
\r
5719 REPEAT GEN_TAC THEN
\r
5720 ABBREV_TAC ` pp = circumcenter {(v1:real^3), v2, v3, v4}` THEN
\r
5721 REPEAT STRIP_TAC THEN
\r
5723 REWRITE_TAC[FORALL_IN_CLAUSES] THEN
\r
5724 REWRITE_TAC[MESON[]` r = a /\ r = b /\ r = c /\ r = d <=> r = a /\ b = a /\ c = a
\r
5727 NHANH (MESON[DIST_EQ_IMP_ORTHOGONAL ]`dist (pp,v2) = dist (pp,v1) /\
\r
5728 dist (pp,v3) = dist (pp,v1) /\
\r
5729 dist (pp,v4) = dist (pp,v1) /\a11/\a2/\
\r
5730 dist (p,v2) = dist (p,v1) /\
\r
5731 dist (p,v3) = dist (p,v1) /\
\r
5732 dist (p,v4) = dist (p,v1) ==>
\r
5733 ( p - pp) dot ( v2 - v1 ) = &0 /\
\r
5734 ( p - pp ) dot ( v3 - v1 ) = &0 /\
\r
5735 ( p - pp ) dot ( v4 - v1 ) = &0 `) THEN
\r
5736 ONCE_REWRITE_TAC[GSYM VECTOR_SUB_EQ] THEN
\r
5737 REWRITE_TAC[GSYM DOT_EQ_0] THEN MESON_TAC[IMP_OTHO4 ]);;
\r
5742 let PROVE_IN_AFFINE_HULL_4 = prove(
\r
5743 `~(delta x12 x13 x14 x23 x24 x34 = &0)
\r
5744 ==> &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5745 (chi x12 x13 x14 x23 x24 x34 % v1 +
\r
5746 chi x12 x24 x23 x14 x13 x34 % v2 +
\r
5747 chi x34 x13 x23 x14 x24 x12 % v3 +
\r
5748 chi x34 x24 x14 x23 x13 x12 % v4) IN
\r
5749 affine hull {(v1:real^3), v2, v3, v4}`,
\r
5750 REWRITE_TAC[AFFINE_HULL_4; IN_ELIM_THM; VECTOR_ADD_LDISTRIB;
\r
5751 VECTOR_MUL_ASSOC; REAL_ARITH ` ( &1 / a ) * b = b/a `]
\r
5752 THEN MESON_TAC[NOT_0_IMP_SUM_CHI_1]);;
\r
5756 (* VBVYGGT , le 85 *)
\r
5760 MESON[POW_2_SQRT; DIST_POS_LE]` dist (x,y) pow 2 = r ==> dist (x,y) = sqrt ( r ) `;;
\r
5763 let VBVYGGT = prove(`!(v1:real^3) v2 v3 v4.
\r
5764 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5765 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
5766 (?r. !v. v IN {v1, v2, v3, v4}
\r
5767 ==> r = dist (circumcenter {v1, v2, v3, v4},v)) /\
\r
5768 (!p. p IN affine hull {v1, v2, v3, v4} /\
\r
5769 (?r. !v. v IN {v1, v2, v3, v4} ==> r = dist (p,v))
\r
5770 ==> p = circumcenter {v1, v2, v3, v4}) /\
\r
5771 (let x12 = dist (v1,v2) pow 2 in
\r
5772 let x13 = dist (v1,v3) pow 2 in
\r
5773 let x14 = dist (v1,v4) pow 2 in
\r
5774 let x23 = dist (v2,v3) pow 2 in
\r
5775 let x24 = dist (v2,v4) pow 2 in
\r
5776 let x34 = dist (v3,v4) pow 2 in
\r
5777 let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
5778 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
5779 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
5780 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
5781 circumcenter {v1, v2, v3, v4} =
\r
5782 &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5783 (chi11 % v1 + chi22 % v2 + chi33 % v3 + chi44 % v4)) `,
\r
5784 NHANH (SPEC_ALL UNIQUE_EXISISTING_PROPERTY_C4 ) THEN
\r
5785 NHANH (SPEC_ALL IMP_PROPERTIES_OF_CIR4 ) THEN
\r
5786 REWRITE_TAC[MESON[]` (a /\ b1/\b2) /\ b ==> b1 /\b2/\ b/\ d <=> a /\ b1 /\b2/\b==>d `] THEN
\r
5787 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] ( GEN `p: real^3 `PROVE_DIST_FROM_V1)) THEN
\r
5788 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] ( GEN `p: real^3 ` PROVE_EQ_DIST_FROM4)) THEN
\r
5789 REPEAT GEN_TAC THEN REPEAT LET_TAC THEN ABBREV_TAC `rr = &1 / &2 *
\r
5790 rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
5791 REWRITE_TAC[MESON[]` (! x. x = a ==> P x ) <=> P a `] THEN
\r
5792 REWRITE_TAC[GSYM POS_EQ_NOT_COPLANANR] THEN
\r
5793 NHANH (REAL_ARITH` &0 < a ==> ~( a = &0 )`) THEN
\r
5794 NHANH (PROVE_IN_AFFINE_HULL_4 ) THEN
\r
5795 UNDISCH_TAC ` dist ((v1:real^3),v2) pow 2 = x12` THEN
\r
5796 UNDISCH_TAC ` dist ((v1:real^3),v3) pow 2 = x13` THEN
\r
5797 UNDISCH_TAC ` dist ((v1:real^3),v4) pow 2 = x14` THEN
\r
5798 UNDISCH_TAC ` dist ((v2:real^3),v3) pow 2 = x23` THEN
\r
5799 UNDISCH_TAC ` dist ((v2:real^3),v4) pow 2 = x24` THEN
\r
5800 UNDISCH_TAC ` dist ((v3:real^3),v4) pow 2 = x34` THEN
\r
5801 UNDISCH_TAC ` chi x12 x13 x14 x23 x24 x34 = chi11 ` THEN
\r
5802 UNDISCH_TAC ` chi x12 x24 x23 x14 x13 x34 = chi22 ` THEN
\r
5803 UNDISCH_TAC ` chi x34 x13 x23 x14 x24 x12 = chi33` THEN
\r
5804 UNDISCH_TAC ` chi x34 x24 x14 x23 x13 x12 = chi44` THEN
\r
5805 REWRITE_TAC[MESON[]` a = b ==> P a <=> a = b ==> P b `] THEN
\r
5806 ABBREV_TAC ` w = &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5807 (chi11 % (v1:real^3) + chi22 % v2 + chi33 % v3 + chi44 % v4)` THEN
\r
5808 REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `]
\r
5809 THEN REPLICATE_TAC 13 DISCH_TAC THEN
\r
5810 REWRITE_TAC[FORALL_IN_CLAUSES;d3] THEN PHA THEN
\r
5811 NHANH (MESON[POW_2_SQRT; DIST_POS_LE]` dist (x,y) pow 2 = r
\r
5812 ==> dist (x,y) = sqrt ( r ) `) THEN MESON_TAC[]);;
\r
5815 (* let VBVYGGT = new_axiom `!(v1:real^3) v2 v3 v4.
\r
5816 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5817 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
5818 (?r. !v. v IN {v1, v2, v3, v4}
\r
5819 ==> r = dist (circumcenter {v1, v2, v3, v4},v)) /\
\r
5820 (!p. p IN affine hull {v1, v2, v3, v4} /\
\r
5821 (?r. !v. v IN {v1, v2, v3, v4} ==> r = dist (p,v))
\r
5822 ==> p = circumcenter {v1, v2, v3, v4}) /\
\r
5823 (let x12 = dist (v1,v2) pow 2 in
\r
5824 let x13 = dist (v1,v3) pow 2 in
\r
5825 let x14 = dist (v1,v4) pow 2 in
\r
5826 let x23 = dist (v2,v3) pow 2 in
\r
5827 let x24 = dist (v2,v4) pow 2 in
\r
5828 let x34 = dist (v3,v4) pow 2 in
\r
5829 let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
5830 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
5831 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
5832 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
5833 circumcenter {v1, v2, v3, v4} =
\r
5834 &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
5835 (chi11 % v1 + chi22 % v2 + chi33 % v3 + chi44 % v4)) `;; *)
\r
5839 let NOT_COPLANAR_IMP_EXISTS_CIR = prove(`! (v1:real^3) v2 v3 v4.
\r
5840 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
5841 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
5842 (?r. !v. v IN {v1, v2, v3, v4}
\r
5843 ==> r = dist (circumcenter {v1, v2, v3, v4},v)) `,
\r
5844 MESON_TAC[VBVYGGT]);;
\r
5849 let THREE_POINTS_COP = prove(` ! v1 v2 (v3:real^3). coplanar {v1,v2,v3} `,
\r
5850 MESON_TAC[DIMINDEX_3; ARITH_RULE` 2 <= 3 `; COPLANAR_3]);;
\r
5855 let PER_SET4 = SET_RULE ` {a,b,c,d} = {b,a,c,d} /\
\r
5856 {a,b,c,d} = {c,b,a,d} /\
\r
5857 {a,b,c,d} = {d,b,c,a} `;;
\r
5860 let NOT_COPLANAR_IMP_CARD4 = prove(` ~ coplanar {(v1:real^3), v2, v3, v4}
\r
5861 ==> CARD {v1, v2, v3, v4} = 4 `, REWRITE_TAC[CARD4; IN_SET3] THEN
\r
5862 MP_TAC (GEN_ALL THREE_POINTS_COP ) THEN
\r
5863 MESON_TAC[PER_SET4; SET_RULE` {a,a,b,c} = {a,b,c} `]);;
\r
5866 let NOT_COPLANAR_IMP_EXISTS_CIR2 = MESON[NOT_COPLANAR_IMP_EXISTS_CIR ;
\r
5867 NOT_COPLANAR_IMP_CARD4 ]` ! (v1:real^3) v2 v3 v4. ~ coplanar {v1, v2, v3, v4}
\r
5868 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
5869 (?r. !v. v IN {v1, v2, v3, v4}
\r
5870 ==> r = dist (circumcenter {v1, v2, v3, v4},v)) `;;
\r
5874 let NOT_COPLANAR_IMP_RADV_PROPERTIES = prove(` ~coplanar {(v1:real^3), v2, v3, v4} ==>
\r
5875 (! w. {v1, v2, v3, v4} w ==> radV {v1, v2, v3, v4}
\r
5876 = dist (circumcenter {v1,v2,v3,v4} ,w) ) `,
\r
5877 NHANH (SPEC_ALL NOT_COPLANAR_IMP_EXISTS_CIR2) THEN
\r
5878 REWRITE_TAC[IN; radV] THEN MESON_TAC[EXISTS_THM]);;
\r
5882 let ZJEWPAP = ` ! v1 v2 v3 (v4:real^3).
\r
5883 let s = {v1, v2, v3, v4} in CARD s = 4 /\ ~ coplanar s
\r
5884 ==> radV {v1,v2,v3} <= radV s `;;
\r
5888 let PHA = REWRITE_TAC[MESON[]` ( a ==> b ==> c <=> a /\ b ==> c ) /\
\r
5889 ( (a /\ b ) /\ c <=> a /\ b /\ c ) `];;
\r
5892 let NOT_COL_EQ_UPS_X_POS = prove(`! v1 v2 v3. ~ collinear {(v1:real^3), v2, v3} <=>
\r
5893 &0 < ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2)
\r
5894 (dist (v2,v3) pow 2) `,
\r
5895 MP_TAC (GEN_ALL ZERO_LE_UPS_X) THEN REWRITE_TAC[UPS_X_EQ_ZERO_COND] THEN
\r
5896 REWRITE_TAC[UPS_X_EQ_ZERO_COND; REAL_ARITH` a <= b <=> a = b \/ a < b `] THEN
\r
5897 REWRITE_TAC[d3] THEN MESON_TAC[REAL_ARITH` ~( a = b /\ a < b ) `]);;
\r
5900 let ETA_Y_POW2_EQ = prove(`(dist (v1,v2) pow 2 * dist (v1,v3) pow 2 * dist (v2,v3) pow 2) /
\r
5901 ups_x (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2) =
\r
5902 ( eta_y (d3 v2 v3) (d3 v1 v3) (d3 v1 v2)) pow 2 `,
\r
5903 REWRITE_TAC[eta_y;d3; eta_x] THEN LET_TR THEN
\r
5904 REWRITE_TAC[GSYM REAL_POW_2; GSYM d3 ] THEN
\r
5905 SIMP_TAC[MESON[UPS_X_SYM]` ups_x a b c = ups_x c b a `;
\r
5906 REAL_ARITH ` a * b * c = c * b * a `] THEN
\r
5907 MESON_TAC[SQRT_WORKS; REAL_LE_SQUARE_POW; REAL_LE_MUL;
\r
5908 REAL_LE_DIV; d3 ; ZERO_LE_UPS_X; UPS_X_SYM]);;
\r
5911 let ETA_Y_POS_LE = prove(` &0 <= eta_y (d3 v1 v2) (d3 v1 v3) (d3 v2 v3) `,
\r
5912 REWRITE_TAC[eta_y; eta_x] THEN LET_TR THEN REWRITE_TAC[GSYM REAL_POW_2] THEN
\r
5913 MESON_TAC[REAL_LE_POW_2; REAL_LE_MUL; ZERO_LE_UPS_X; REAL_LE_DIV;
\r
5918 let ZJEWPAP = prove(` ! v1 v2 v3 (v4:real^3).
\r
5919 let s = {v1, v2, v3, v4} in CARD s = 4 /\ ~ coplanar s
\r
5920 ==> radV {v1,v2,v3} <= radV s `,
\r
5922 NHANH (MESON[COLLINEAR_IMP_COPLANAR ]`~coplanar {v1, v2, v3, v4}
\r
5923 ==> ~ collinear {(v1:real^3),v2,v3} `) THEN
\r
5924 SIMP_TAC[NOT_COLL_IMP_RADV_EQ_ETA_Y] THEN
\r
5925 REWRITE_TAC[MESON[]` a /\ b /\ c <=> (a/\b)/\c`] THEN
\r
5926 NHANH (SPEC_ALL VBVYGGT) THEN
\r
5927 REPEAT GEN_TAC THEN
\r
5928 NHANH (NOT_COPLANAR_IMP_RADV_PROPERTIES) THEN
\r
5929 ABBREV_TAC ` pp = circumcenter {(v1:real^3), v2, v3, v4}` THEN
\r
5930 MP_TAC (SPECL [`pp :real^3`; ` v1: real^3`; `v2:real^3`; ` v3:real^3`] DELTA_POS_4POINTS ) THEN
\r
5931 REWRITE_TAC[REWRITE_RULE[IN] FORALL_IN_CLAUSES;
\r
5932 FORALL_IN_CLAUSES ] THEN
\r
5933 REWRITE_TAC[MESON[]` ( a ==> b ==> c <=> a /\ b ==> c ) /\
\r
5934 ( (a /\ b ) /\ c <=> a /\ b /\ c ) `] THEN
\r
5935 REPEAT STRIP_TAC THEN
\r
5936 UNDISCH_TAC ` &0 <=
\r
5937 delta (dist ((pp:real^3),v1) pow 2) (dist (pp,v2) pow 2) (dist (pp,v3) pow 2)
\r
5938 (dist (v1,v2) pow 2)
\r
5939 (dist (v1,v3) pow 2)
\r
5940 (dist (v2,v3) pow 2)` THEN
\r
5941 ABBREV_TAC `p1 = dist ((pp:real^3),v1)` THEN
\r
5942 ABBREV_TAC `p2 = dist ((pp:real^3),v2)` THEN
\r
5943 ABBREV_TAC `p3 = dist ((pp:real^3),v3)` THEN
\r
5944 REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC THEN MATCH_MP_TAC
\r
5945 (MESON[]` a ==> b ==> a `)) THEN
\r
5946 EXPAND_TAC "p1" THEN
\r
5947 EXPAND_TAC "p2" THEN
\r
5948 EXPAND_TAC "p3" THEN
\r
5949 FIRST_X_ASSUM MP_TAC THEN
\r
5950 REWRITE_TAC[NOT_COL_EQ_UPS_X_POS ] THEN
\r
5951 REWRITE_TAC[NOT_COL_EQ_UPS_X_POS; DELTA_RRR_INTERPRETE] THEN
\r
5952 SIMP_TAC[REAL_FIELD` &0 < a ==> -- b * c + r * a = a * ( r - ( b * c ) / a ) `] THEN
\r
5953 SIMP_TAC[ETA_Y_POW2_EQ; REAL_LE_MUL_EQ] THEN
\r
5954 UNDISCH_TAC ` radV {(v1:real^3), v2, v3, v4} = p1 ` THEN
\r
5956 EXPAND_TAC "p1" THEN
\r
5957 UNDISCH_TAC `r = dist ((pp: real^3),v4)` THEN
\r
5959 REPLICATE_TAC 3 REMOVE_TAC THEN
\r
5960 SIMP_TAC[ETA_Y_SYYM; REAL_ARITH` &0 <= a - b <=> b <= a `] THEN
\r
5961 MESON_TAC[DIST_POS_LE; POW2_COND; ETA_Y_POS_LE ]);;
\r
5967 let NOT_EQ_BASIS_IMP_OTHORGANAL = MESON[DOT_BASIS_BASIS_UNEQUAL]
\r
5968 ` ! i j. ~( i = j ) ==> basis i dot basis j = &0 `;;
\r
5971 let BASIS_DIS_OTHORGONAL =
\r
5972 MESON[ARITH_RULE` ~( 1 = 2 \/ 1 = 3 \/ 2 = 3 ) `; NOT_EQ_BASIS_IMP_OTHORGANAL]
\r
5973 ` basis 1 dot basis 2 = &0 /\
\r
5974 basis 1 dot basis 3 = &0 /\
\r
5975 basis 2 dot basis 3 = &0 ` ;;
\r
5978 let NORM_BASIS_VEC3 = prove(` ! i. i = 1 \/ i = 2 \/ i = 3 ==>
\r
5979 norm (( basis i ):real^3 ) = &1 `,
\r
5980 MESON_TAC[DIMINDEX_3; ARITH_RULE` i = 1 \/ i = 2 \/ i = 3 <=>
\r
5981 1 <= i /\ i <= 3`; NORM_BASIS]);;
\r
5984 let AAA_LEMMA = prove(` &0 < a /\
\r
5986 b <= c /\ ll ==> &0 <= b pow 2 - a pow 2 /\ &0 <= c pow 2 - b pow 2 `,
\r
5987 REWRITE_TAC[REAL_ARITH` &0 <= a - b <=> b <= a `] THEN
\r
5988 MESON_TAC[REAL_LT_IMP_LE; POW2_COND; POS_IMP_POW2; REAL_LE_TRANS]);;
\r
5991 let LLEEMAA = prove(` &0 < a /\
\r
5999 c <= c' /\ l ==> &0 <= a' pow 2 - a pow 2 /\
\r
6000 &0 <= b' pow 2 - b pow 2 /\
\r
6001 &0 <= c' pow 2 - c pow 2 `,
\r
6002 REWRITE_TAC[REAL_ARITH` &0 <= a - b <=> b <= a `] THEN
\r
6003 MESON_TAC[POS_IMP_POW2; REAL_ARITH` a < b ==> a <= b `;
\r
6008 let TYUNJLA = prove(` !(e1:real^3) e2 e3 a b c a' b' c' t1 t2 t3.
\r
6021 (!x. x IN {t1, t2, t3} ==> &0 < x) /\
\r
6022 t1 + t2 + t3 < &1 /\
\r
6024 ((t1 + t2 + t3) * a) % e1 +
\r
6025 ((t2 + t3) * sqrt (b pow 2 - a pow 2)) % e2 +
\r
6026 (t3 * sqrt (c pow 2 - b pow 2)) % e3 /\
\r
6027 v' = ((t1 + t2 + t3) * a') % e1 +
\r
6028 ((t2 + t3) * sqrt (b' pow 2 - a' pow 2)) % e2 +
\r
6029 (t3 * sqrt (c' pow 2 - b' pow 2)) % e3 ==>
\r
6030 norm v <= norm v' `,
\r
6031 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MP_TAC THEN
\r
6032 FIRST_X_ASSUM MP_TAC THEN
\r
6033 SIMP_TAC[POW2_COND; NORM_POS_LE; NORM_POW_2; DOT_LADD; DOT_RADD;
\r
6034 DOT_LMUL; DOT_RMUL] THEN ASM_SIMP_TAC[] THEN
\r
6035 SIMP_TAC[GSYM NORM_POW_2; NORM_BASIS_VEC3 ] THEN
\r
6036 SIMP_TAC[BASIS_DIS_OTHORGONAL; MESON[DOT_SYM; BASIS_DIS_OTHORGONAL]
\r
6037 ` basis 2 dot basis 1 = &0 /\ basis 3 dot basis 1 = &0 /\
\r
6038 basis 3 dot basis 2 = &0 `; ZERO_NEUTRAL] THEN
\r
6039 REWRITE_TAC[REAL_ARITH` (a * x ) * ( b * x ) * c = a * b * c * x pow 2 `] THEN
\r
6040 REPEAT STRIP_TAC THEN DOWN_TAC THEN
\r
6041 NHANH (AAA_LEMMA) THEN PHA THEN
\r
6042 NHANH (MESON[AAA_LEMMA]` &0 < a /\ a <= b /\ b <= c /\ aa <= a /\ l ==>
\r
6043 &0 <= b pow 2 - a pow 2 /\ &0 <= c pow 2 - b pow 2 `) THEN
\r
6044 SIMP_TAC[SQRT_WORKS] THEN
\r
6045 ONCE_REWRITE_TAC[REAL_ARITH` a <= b <=> &0 <= b - a `] THEN
\r
6046 REWRITE_TAC[REAL_ARITH` ((t1 + t2 + t3) * (t1 + t2 + t3) * &1 pow 2 * a' pow 2 +
\r
6047 (t2 + t3) * (t2 + t3) * &1 pow 2 * (b' pow 2 - a' pow 2) +
\r
6048 t3 * t3 * &1 pow 2 * (c' pow 2 - b' pow 2)) -
\r
6049 ((t1 + t2 + t3) * (t1 + t2 + t3) * &1 pow 2 * a pow 2 +
\r
6050 (t2 + t3) * (t2 + t3) * &1 pow 2 * (b pow 2 - a pow 2) +
\r
6051 t3 * t3 * &1 pow 2 * (c pow 2 - b pow 2)) =
\r
6052 t1 * ( t1 + &2 * t2 + &2 * t3 ) * ( a' pow 2 - a pow 2 ) +
\r
6053 t2 * (t2 + &2 * t3 ) * ( b' pow 2 - b pow 2 ) +
\r
6054 t3 pow 2 * ( c' pow 2 - c pow 2 ) `] THEN
\r
6055 REWRITE_TAC[REAL_ARITH` &0 <= a - b <=> b <= a `] THEN
\r
6056 PHA THEN NHANH (LLEEMAA) THEN STRIP_TAC THEN
\r
6057 UNDISCH_TAC ` (!x. x IN {t1, t2, t3} ==> &0 < x)` THEN
\r
6058 REPLICATE_TAC 3 ( FIRST_X_ASSUM MP_TAC) THEN
\r
6059 REWRITE_TAC[FORALL_IN_CLAUSES] THEN PHA THEN
\r
6060 NHANH (REAL_ARITH` &0 < t1 /\ &0 < t2 /\ &0 < t3 ==>
\r
6061 &0 <= t1 /\ &0 <= t2 /\ &0 <= t1 + &2 * t2 + &2 * t3 /\
\r
6062 &0 <= t2 + &2 * t3 `) THEN
\r
6063 MESON_TAC[REAL_LE_ADD; REAL_LE_MUL; REAL_LE_POW_2]);;
\r
6065 let LEMMA83 = TYUNJLA ;;
\r
6069 (* This lemma will be proved by Harrison *)
\r
6070 let NORM_TOWARD_FORTH_POINT = new_axiom`!(v1:real^3) v2 v3 w.
\r
6071 ~coplanar {v1, v2, v3, w}
\r
6072 ==> (?nor. norm nor = &1 /\
\r
6073 (!x. x IN aff_ge {v1, v2, v3} {w} <=>
\r
6075 xx IN affine hull {v1, v2, v3} /\
\r
6077 x = xx + h % nor)) /\
\r
6079 {x, y} SUBSET affine hull {v1, v2, v3}
\r
6080 ==> nor dot (x - y) = &0))`;;
\r
6083 let DELTA_TRIPLE_SUB_H_EXPAND = prove(`
\r
6084 delta (a01 - h) (a02 - h) (a03 - h) x12 x13 x23 =
\r
6085 delta a01 a02 a03 x12 x13 x23 - h * ups_x x12 x13 x23 `,
\r
6086 REWRITE_TAC[delta;ups_x] THEN REAL_ARITH_TAC);;
\r
6088 let PROVE_EXISTS_H_DELTA_0 = prove(`&0 < ups_x x12 x13 x23 /\ &0 <= delta a01 a02 a03 x12 x13 x23
\r
6089 ==> (?h. &0 <= h /\ h = ( delta a01 a02 a03 x12 x13 x23 ) / ups_x x12 x13 x23 /\
\r
6090 delta (a01 - h) (a02 - h) (a03 - h) x12 x13 x23 = &0 )`,
\r
6091 REWRITE_TAC[DELTA_TRIPLE_SUB_H_EXPAND] THEN
\r
6093 EXISTS_TAC`( delta a01 a02 a03 x12 x13 x23 ) / ups_x x12 x13 x23` THEN
\r
6094 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_DIV] THEN
\r
6095 FIRST_X_ASSUM MP_TAC THEN CONV_TAC REAL_FIELD);;
\r
6099 let FIRST_POINT_IN_AFF3 = prove(` ! w v1 v2. w IN aff {w,v1,v2} `,
\r
6100 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM] THEN REPEAT GEN_TAC THEN
\r
6101 EXISTS_TAC ` &1 ` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0` THEN
\r
6102 REWRITE_TAC[ZERO_NEUTRAL] THEN CONV_TAC VECTOR_ARITH);;
\r
6104 let THREE_GEN_POINTS_IN_AFF3 = MESON[PER_SET3; FIRST_POINT_IN_AFF3 ]` a IN aff {a,b,c} /\
\r
6105 b IN aff {a,b,c} /\ c IN aff {a,b,c} `;;
\r
6109 let OFGJQUS = prove(` ! v1 v2 v3 (v4:real^3) a01 a02 a03 .
\r
6110 let x12 = d3 v1 v2 pow 2 in
\r
6111 let x13 = d3 v1 v3 pow 2 in
\r
6112 let x23 = d3 v2 v3 pow 2 in
\r
6113 CARD {v1, v2, v3, v4} = 4 /\
\r
6115 ~coplanar {v1, v2, v3, v4} /\
\r
6116 &0 <= a01 /\ &0 <= a02 /\ &0 <= a03 /\
\r
6117 delta a01 a02 a03 x12 x13 x23 >= &0
\r
6118 ==> (?v0. v0 IN aff_ge {v1, v2, v3} {v4} /\
\r
6119 d3 v0 v1 pow 2 = a01 /\
\r
6120 d3 v0 v2 pow 2 = a02 /\
\r
6121 d3 v0 v3 pow 2 = a03 /\
\r
6122 (!vv0. vv0 IN aff_ge {v1, v2, v3} {v4} /\
\r
6123 d3 vv0 v1 pow 2 = a01 /\
\r
6124 d3 vv0 v2 pow 2 = a02 /\
\r
6125 d3 vv0 v3 pow 2 = a03
\r
6127 ( v0 IN aff {v1,v2,v3} <=>
\r
6128 delta a01 a02 a03 x12 x13 x23 = &0 )) `,
\r
6129 REPEAT GEN_TAC THEN
\r
6130 REPEAT LET_TAC THEN
\r
6131 NHANH (MESON[COLLINEAR_IMP_COPLANAR ]`~coplanar {v1, v2, v3, v4}
\r
6132 ==> ~ collinear {(v1:real^3),v2,v3} `) THEN
\r
6133 REWRITE_TAC[NOT_COL_EQ_UPS_X_POS] THEN
\r
6134 PHA THEN REWRITE_TAC[MESON[]` ( &0 < a ) /\ l <=> l /\ &0 < a `] THEN
\r
6136 REWRITE_TAC[d3 ; REAL_ARITH` a >= b <=> b <= a `;
\r
6137 GSYM (MESON[]` ( &0 < a ) /\ l <=> l /\ &0 < a `)] THEN
\r
6138 EXPAND_TAC "x12" THEN
\r
6139 EXPAND_TAC "x13" THEN
\r
6140 EXPAND_TAC "x23" THEN
\r
6141 REWRITE_TAC[d3] THEN NHANH (PROVE_EXISTS_H_DELTA_0 ) THEN
\r
6142 NHANH (SPEC_ALL NORM_TOWARD_FORTH_POINT ) THEN
\r
6143 NHANH (MESON[COLLINEAR_IMP_COPLANAR]`~coplanar {v1, v2, v3, v4}
\r
6144 ==> ~ collinear {(v1:real^3),v2,v3} `) THEN
\r
6146 FIRST_X_ASSUM MP_TAC THEN
\r
6147 UNDISCH_TAC ` ~collinear {(v1:real^3), v2, v3}` THEN
\r
6149 REWRITE_TAC[GSYM d3] THEN
\r
6150 NHANH (SPEC_ALL SDIHJZK_INTERPRETE) THEN
\r
6152 EXISTS_TAC ` (v0:real^3) + sqrt (h) % nor ` THEN
\r
6154 ASM_MESON_TAC[SQRT_WORKS; d3; aff];
\r
6155 UNDISCH_TAC ` !x y. {x, y} SUBSET affine hull {v1, v2, v3}
\r
6156 ==> (nor:real^3) dot (x - y) = &0`] THEN
\r
6157 NHANH (MESON[]` (! x y. P x y ) ==> P v0 v1 /\ P v0 v2 /\ P v0 v3 `) THEN
\r
6158 SIMP_TAC[SET2_SU_EX; GSYM aff; THREE_GEN_POINTS_IN_AFF3 ] THEN
\r
6159 UNDISCH_TAC ` (v0:real^3) IN aff {v1, v2, v3}` THEN
\r
6161 NHANH (MESON[REAL_MUL_RZERO; DOT_LMUL]`nor dot v = &0 ==>
\r
6162 sqrt h % nor dot v = &0 `) THEN
\r
6163 SIMP_TAC[ORTHOGONAL_IMP_PITHAGOR; d3; NORM_MUL; REAL_ARITH ` (a * b ) pow 2 =
\r
6164 a pow 2 * b pow 2 `; REAL_POW2_ABS] THEN
\r
6167 UNDISCH_TAC ` &0 <= h ` THEN
\r
6168 UNDISCH_TAC` norm (nor:real^3) = &1` THEN
\r
6169 SIMP_TAC[SQRT_WORKS; REAL_ARITH` &1 pow 2 = &1`; REAL_MUL_RID] THEN
\r
6170 REPLICATE_TAC 2 DISCH_TAC THEN
\r
6171 UNDISCH_TAC `a01 - h = d3 v0 v1 pow 2` THEN
\r
6172 UNDISCH_TAC `a02 - h = d3 v0 v2 pow 2` THEN
\r
6173 UNDISCH_TAC `a03 - h = d3 v0 v3 pow 2` THEN
\r
6174 SIMP_TAC[REAL_ARITH` a - b = c <=> c = a - b `; d3 ;
\r
6175 REAL_ARITH` a + b - a = b `] THEN
\r
6176 REPEAT STRIP_TAC THENL [
\r
6177 UNDISCH_TAC` vv0 IN aff_ge {v1, v2, v3} {(v4:real^3)} ` THEN
\r
6178 UNDISCH_TAC ` !x. (x:real^3) IN aff_ge {v1, v2, v3} {v4} <=>
\r
6180 xx IN affine hull {v1, v2, v3} /\ &0 <= h /\ x = xx + h % nor) ` THEN
\r
6182 REPEAT STRIP_TAC THEN
\r
6183 REPLICATE_TAC 7 (FIRST_X_ASSUM MP_TAC) THEN PHA THEN DAO THEN
\r
6185 PURE_ONCE_REWRITE_TAC[MESON[]`a = b /\ P a <=> a = b /\ P b `] THEN
\r
6187 (x:real^3) IN aff {v1, v2, v3} /\ y IN aff {v1, v2, v3}
\r
6188 ==> nor dot (x - y) = &0 /\ sqrt h % nor dot (x - y) = &0` THEN
\r
6190 NHANH (MESON[THREE_GEN_POINTS_IN_AFF3; aff]`(!x y.
\r
6191 x IN aff {v1, v2, v3} /\ y IN aff {v1, v2, v3} ==> P x y ) /\
\r
6192 a1 /\ a2 /\ xx IN affine hull {v1, v2, v3} /\ l ==>
\r
6193 P xx v1 /\ P xx v2 /\ P xx v3 `) THEN
\r
6194 NHANH (MESON[DOT_LMUL; REAL_MUL_RZERO]` nor dot (xx - v1) = &0 /\ l ==>
\r
6195 ( h' % nor) dot ( xx - v1 ) = &0 `) THEN
\r
6197 ONCE_REWRITE_TAC[MESON[]` a1/\a2/\a3/\a4/\a5/\a6/\a7/\l ==> las
\r
6198 <=> a1/\a2/\a3/\a4/\a5/\a6/\a7 ==> l ==> las `] THEN
\r
6199 SIMP_TAC[ORTHOGONAL_IMP_PITHAGOR] THEN
\r
6200 REWRITE_TAC[MESON[]` a1 /\a2/\a3/\ (! x. P x ) /\ l <=> (a1 /\a2/\a3)
\r
6201 /\ (! x. P x ) /\ l`] THEN
\r
6202 REWRITE_TAC[REAL_ARITH` c + a = aa /\ c + b = bb /\ c + d = dd
\r
6203 <=> c + a = aa /\ a - b = aa - bb /\ d - b = dd - bb `] THEN
\r
6204 REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN
\r
6206 SIMP_TAC[MESON[]` a1/\a2/\a3/\a4 <=> (a1/\a2/\a3)/\a4 `] THEN
\r
6207 REWRITE_TAC[REAL_ARITH` a3 = aa3 - h /\ a2 = aa2 - h /\
\r
6208 a1 = aa1 - h <=> a2 - a1 = aa2 - aa1 /\ a3 - a1 = aa3 - aa1 /\
\r
6209 a3 = aa3 - h `] THEN
\r
6212 UNDISCH_TAC`dist ((v0:real^3),v2) pow 2 - dist (v0,v1) pow 2 = a02 - a01` THEN
\r
6213 UNDISCH_TAC`dist ((v0:real^3),v3) pow 2 - dist (v0,v1) pow 2 = a03 - a01` THEN
\r
6214 UNDISCH_TAC`dist ((xx:real^3),v2) pow 2 - dist (xx,v1) pow 2 = a02 - a01` THEN
\r
6215 UNDISCH_TAC`dist ((xx:real^3),v3) pow 2 - dist (xx,v1) pow 2 = a03 - a01` THEN
\r
6217 UNDISCH_TAC `(v0:real^3) IN aff {v1, v2, v3}` THEN
\r
6218 UNDISCH_TAC `(xx:real^3) IN affine hull {v1, v2, v3}` THEN
\r
6220 REWRITE_TAC[MESON[]` a1 = a /\ b1 = b /\ a2 = a /\ b2 = b <=>
\r
6221 a1 = a /\ b1 = b /\ b1 = b2 /\ a1 = a2 `] THEN
\r
6222 REWRITE_TAC[aff; MESON[SET2_SU_EX]` a IN s /\ b IN s /\ a1
\r
6223 /\a2 /\ l <=> a1/\a2/\ {a,b} SUBSET s /\ l `] THEN
\r
6224 NHANH (SPEC_ALL EQ_SUB_DIST_POW2_IMP_IDENTIFIED) THEN
\r
6225 UNDISCH_TAC ` dist ((v0:real^3),v3) pow 2 = a03 - h` THEN
\r
6226 UNDISCH_TAC` norm (h' % (nor:real^3)) pow 2 + dist ((xx:real^3),v2) pow 2 = a02` THEN
\r
6227 PHA THEN DAO THEN
\r
6228 REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `] THEN
\r
6229 SIMP_TAC[REAL_ARITH` a - b = c <=> a = b + c `] THEN
\r
6230 SIMP_TAC[REAL_ARITH` a + b + c = d <=> b = d - a - c `] THEN
\r
6231 REWRITE_TAC[REAL_ARITH` a02 - norm (h' % nor) pow 2 - (a02 - a01) + a03 - a01 = a03 - h
\r
6232 <=> norm (h' % nor) pow 2 = h `] THEN
\r
6233 REPLICATE_TAC 7 DISCH_TAC THEN
\r
6234 SIMP_TAC[NORM_MUL; REAL_ARITH` (a*b) pow 2 = a pow 2 * b pow 2 `;
\r
6235 REAL_POW2_ABS] THEN
\r
6236 UNDISCH_TAC` norm (nor:real^3) = &1 ` THEN
\r
6237 SIMP_TAC[REAL_ARITH` a * &1 pow 2 = a `] THEN
\r
6238 UNDISCH_TAC ` &0 <= h ` THEN
\r
6239 UNDISCH_TAC ` &0 <= h' ` THEN
\r
6240 MESON_TAC[SQRT_WORKS; EQ_POW2_COND];
\r
6246 UNDISCH_TAC `(v0:real^3) IN aff {v1, v2, v3}` THEN
\r
6247 UNDISCH_TAC` !(x:real^3) y.
\r
6248 x IN aff {v1, v2, v3} /\ y IN aff {v1, v2, v3}
\r
6249 ==> nor dot (x - y) = &0 /\ sqrt h % nor dot (x - y) = &0 ` THEN
\r
6251 NHANH (MESON[]` (! x y. x IN aff {v1, v2, v3} /\ y IN aff {v1, v2, v3} ==> l x y )
\r
6252 /\ a IN aff {v1, v2, v3} /\ b IN aff {v1, v2, v3} ==> l a b `) THEN
\r
6253 REWRITE_TAC[VECTOR_ARITH` a - ( a + s % x ) = ( -- s ) % x `;
\r
6254 DOT_RMUL; GSYM NORM_POW_2] THEN
\r
6255 UNDISCH_TAC ` norm (nor:real^3) = &1 ` THEN
\r
6256 SIMP_TAC[REAL_ARITH` a * &1 pow 2 = a `; DOT_LMUL; GSYM NORM_POW_2;
\r
6257 REAL_ARITH` ( -- a ) * a = &0 <=> a pow 2 = &0 `] THEN
\r
6258 UNDISCH_TAC` &0 <= h ` THEN
\r
6259 UNDISCH_TAC` delta (a01 - h) (a02 - h) (a03 - h) (d3 v1 v2 pow 2) (d3 v1 v3 pow 2)
\r
6260 (d3 v2 v3 pow 2) =
\r
6262 SIMP_TAC[SQRT_WORKS; d3] THEN
\r
6263 MESON_TAC[REAL_ARITH` a - &0 = a `];
\r
6264 ABBREV_TAC ` tu = delta a01 a02 a03 (dist ((v1:real^3),v2) pow 2) (dist (v1,v3) pow 2)
\r
6265 (dist (v2,v3) pow 2) ` THEN
\r
6268 ups_x (dist ((v1:real^3),v2) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2)` THEN
\r
6269 PHA THEN SIMP_TAC[REAL_ARITH` &0 / a = &0 `] THEN
\r
6271 SIMP_TAC[SQRT_0; VECTOR_MUL_LZERO; VECTOR_ADD_RID] THEN
\r
6272 UNDISCH_TAC` (v0:real^3) IN aff {v1, v2, v3}` THEN
\r
6288 let PROVE_THE_HYPOTHESI_FOR_74 = prove(` (let s = {v1, v2, v3, v4} in
\r
6292 eta_y (d3 v1 v2 ) (d3 v1 v3) (d3 v2 v3) <= r )
\r
6293 ==> ( let x12 = d3 v1 v2 pow 2 in
\r
6294 let x13 = d3 v1 v3 pow 2 in
\r
6295 let x23 = d3 v2 v3 pow 2 in
\r
6296 CARD {v1, v2, v3, v4} = 4 /\
\r
6298 ~coplanar {v1, v2, v3, v4} /\
\r
6302 delta (r pow 2) (r pow 2) (r pow 2) x12 x13 x23 >= &0 ) `,
\r
6303 REPEAT LET_TAC THEN
\r
6304 SIMP_TAC[REAL_LE_POW_2] THEN
\r
6305 REWRITE_TAC[DELTA_RRR_INTERPRETE] THEN
\r
6306 EXPAND_TAC "s" THEN
\r
6307 NHANH (MESON[COLLINEAR_IMP_COPLANAR]` ~ coplanar {v1, v2, v3, v} ==>
\r
6308 ~ collinear {v1, v2, (v3:real^3)} `) THEN
\r
6309 REWRITE_TAC[NOT_COL_EQ_UPS_X_POS] THEN
\r
6310 EXPAND_TAC "x12" THEN
\r
6311 EXPAND_TAC "x13" THEN
\r
6312 EXPAND_TAC "x23" THEN
\r
6313 REWRITE_TAC[d3] THEN
\r
6314 SIMP_TAC[REAL_FIELD` &0 < a ==> -- x * y + r * a = a * ( r - (x * y ) / a )`] THEN
\r
6315 SIMP_TAC[ETA_Y_POW2_EQ;d3; ETA_Y_SYYM] THEN
\r
6316 MP_TAC ETA_Y_POS_LE THEN
\r
6317 DAO THEN PHA THEN
\r
6318 REWRITE_TAC[d3] THEN DAO THEN
\r
6319 NHANH (MESON[POS_IMP_POW2]` a <= b /\ &0 <= a ==>
\r
6320 a pow 2 <= b pow 2 `) THEN
\r
6321 ONCE_REWRITE_TAC[REAL_ARITH` a <= b <=> &0 <= b - a `] THEN
\r
6322 REWRITE_TAC[REAL_ARITH` a >= &0 <=> &0 <= a `] THEN
\r
6323 SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_MUL]);;
\r
6330 let LFYTDXC = prove(` ? p. ! v1 v2 v3 (v4:real^3) r.
\r
6331 let s = {v1, v2, v3, v4} in
\r
6335 eta_y (d3 v1 v2 ) (d3 v1 v3 ) (d3 v2 v3 ) <= r
\r
6336 ==> p v1 v2 v3 v4 r IN aff_ge {v1, v2, v3} {v4} /\
\r
6337 r = d3 ( p v1 v2 v3 v4 r ) v1 /\
\r
6338 r = d3 ( p v1 v2 v3 v4 r ) v2 /\
\r
6339 r = d3 ( p v1 v2 v3 v4 r ) v3 /\
\r
6340 (!w. w IN aff_ge {v1, v2, v3} {v4} /\
\r
6344 ==> w = ( p v1 v2 v3 v4 r ) ) `,
\r
6345 REWRITE_TAC[GSYM SKOLEM_THM] THEN
\r
6346 REPEAT GEN_TAC THEN (MP_TAC PROVE_THE_HYPOTHESI_FOR_74 ) THEN LET_TAC THEN
\r
6347 REWRITE_TAC[RIGHT_EXISTS_IMP_THM] THEN
\r
6348 MP_TAC (SPECL [`v1:real^3`;`v2:real^3`;`v3:real^3`;` v4:real^3`;
\r
6349 ` r pow 2 `; ` r pow 2 `; ` r pow 2 `] OFGJQUS) THEN REPEAT LET_TAC THEN
\r
6350 REWRITE_TAC[MESON[]` ( a ==> b ) ==> a ==> c <=> a /\ b ==> c`]
\r
6351 THEN EXPAND_TAC "s" THEN REWRITE_TAC[MESON[]` ( a ==> b) ==> c /\ a ==> l <=>
\r
6352 a /\ b /\ c ==> l `] THEN MATCH_MP_TAC (MESON[]` (c /\ b ==> l ) ==>
\r
6353 a /\ b /\ c ==> l `) THEN NHANH (MESON[ETA_Y_POS_LE; REAL_LE_TRANS]
\r
6354 ` eta_y (d3 v1 v2) (d3 v1 v3) (d3 v2 v3) <= r ==> &0 <= r ` ) THEN
\r
6355 STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN ASM_MESON_TAC[D3_POS_LE;
\r
6356 GSYM EQ_POW2_COND]);;
\r
6360 let LEMMA74 = LFYTDXC;;
\r
6361 let point_eq = new_specification ["point_eq"] LFYTDXC;;
\r
6365 let INSERT_SUBSET = SET_RULE` {} SUBSET s /\
\r
6366 ( ( a INSERT s ) SUBSET ss <=> a IN ss /\ s SUBSET ss ) `;;
\r
6369 let IMP_TAC = REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `];;
\r
6371 let IMP_OTHORGONAL_AFF3 = prove(`!v1 v2 v3 u.
\r
6372 u dot (v1 - v2) = &0 /\ u dot (v1 - v3) = &0
\r
6373 ==> (!x y. {x, y} SUBSET aff {v1, v2, v3} ==> u dot (x - y) = &0)`,
\r
6374 REWRITE_TAC[aff; AFFINE_HULL_3; INSERT_SUBSET; IN_ELIM_THM] THEN
\r
6375 REPEAT STRIP_TAC THEN DOWN_TAC THEN
\r
6376 REWRITE_TAC[MESON[]` a /\ b ==> c <=> a ==> b ==> c `] THEN
\r
6377 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `] THEN
\r
6378 REWRITE_TAC[VECTOR_ARITH` ((&1 - (v + w)) % v1 + v % v2 + w % v3) -
\r
6379 ((&1 - (v' + w')) % v1 + v' % v2 + w' % v3) =
\r
6380 ( v' - v ) % ( v1 - v2 ) + ( w' - w ) % ( v1 - v3 ) `] THEN REPEAT STRIP_TAC
\r
6381 THEN ASM_SIMP_TAC[DOT_RADD; DOT_RMUL; ZERO_NEUTRAL]);;
\r
6386 let DIST_EQ_IMP_OTHORGONAL = prove(` ! a b p q. dist (p,a) = dist (p,b) /\ dist (q,a) = dist(q,b)
\r
6387 ==> ( p - q ) dot ( a - b ) = &0 `,
\r
6388 REWRITE_TAC[MONG7_ROI; DOT_LSUB] THEN REAL_ARITH_TAC);;
\r
6390 let NOT_COPLANAR_IMP_NOT_COLLINEAR =
\r
6391 MATCH_MP (MESON[]` (a ==> b) ==> ~ b ==> ~ a `) (SPEC_ALL COLLINEAR_IMP_COPLANAR);;
\r
6395 let TIEEBHT = prove(` !v1 v2 v3 (v4:real^3) r p p' u. let s = {v1,v2,v3,v4} in
\r
6396 let x12 = d3 v1 v2 in
\r
6397 let x13 = d3 v1 v3 in
\r
6398 let x23 = d3 v2 v3 in
\r
6401 eta_y x12 x13 x23 <= r /\
\r
6402 p' = point_eq v1 v2 v3 v4 r /\
\r
6403 p = circumcenter {v1,v2,v3} /\ u IN aff {v1,v2,v3} ==>
\r
6404 ( p' - p ) dot ( u - p ) = &0 `,
\r
6405 REPEAT STRIP_TAC THEN LET_TR THEN NHANH NOT_COPLANAR_IMP_NOT_COLLINEAR THEN
\r
6406 NHANH PRE_RADV_COND THEN MP_TAC ( SPEC_ALL point_eq) THEN LET_TR THEN
\r
6407 REWRITE_TAC[MESON[]` ( a /\ b /\ c ==> l ) ==>
\r
6408 ( b /\ bb ) /\ a /\ c /\ las ==> ll <=>
\r
6409 a /\ b /\ c /\ bb /\ las /\ l ==> ll `] THEN
\r
6410 NGOAC THEN REWRITE_TAC[MESON[]` a /\ p = circumcenter {v1, v2, v3}
\r
6411 <=> p = circumcenter {v1, v2, v3} /\ a `] THEN PHA THEN
\r
6412 NHANH (SPEC_ALL CIRCUMCENTER_PROPTIES) THEN
\r
6413 REWRITE_TAC[MESON[]` a = b /\ P b <=> a = b /\ P a `] THEN
\r
6414 REWRITE_TAC[REWRITE_RULE[IN] FORALL_IN_CLAUSES] THEN
\r
6415 REWRITE_TAC[MESON[]`(? c. c = a /\ c = b /\ c = d ) <=>
\r
6416 a = b /\ a = d `; MESON[]` r = a /\ r = b /\ r = c /\ l <=>
\r
6417 a = b /\ a = c /\ r = c /\ l `; d3] THEN
\r
6418 NHANH (MESON[DIST_EQ_IMP_OTHORGONAL]` (dist (p,v1) = dist (p,v2) /\
\r
6419 dist (p,v1) = dist (p,v3)) /\ a1 /\a2 /\a3/\ dist (p',v1) = dist (p',v2) /\
\r
6420 dist (p',v1) = dist (p',v3) /\ l ==> ( p' - p ) dot ( v1 - v2 ) = &0 /\
\r
6421 (p' - p ) dot ( v1 - v3 ) = &0 `) THEN
\r
6422 REWRITE_TAC[GSYM aff] THEN STRIP_TAC THEN
\r
6423 UNDISCH_TAC` (p:real^3) IN aff {v1, v2, v3}` THEN
\r
6424 UNDISCH_TAC` (u:real^3) IN aff {v1, v2, v3}` THEN
\r
6425 PHA THEN REWRITE_TAC[GSYM SET2_SU_EX] THEN
\r
6426 REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN PHA THEN
\r
6427 MESON_TAC[IMP_OTHORGONAL_AFF3 ]);;
\r
6431 let PVLJZLA = prove( `! (v1:real^3) v2 v3 v4.
\r
6432 let s = {v1, v2, v3, v4} in
\r
6434 ==> (circumcenter s IN conv0 s <=>
\r
6435 orientation s v1 (\x. &0 < x) /\
\r
6436 orientation s v2 (\x. &0 < x) /\
\r
6437 orientation s v3 (\x. &0 < x) /\
\r
6438 orientation s v4 (\x. &0 < x))`,
\r
6439 REWRITE_TAC[orientation; affsign] THEN
\r
6440 REPEAT GEN_TAC THEN
\r
6442 REWRITE_TAC[lin_combo] THEN
\r
6443 REWRITE_TAC[SET_RULE` s DIFF {a} UNION {a} = s UNION {a} `;
\r
6444 SET_RULE` {a,b,c,d} UNION {a} = {a,b,c,d} /\
\r
6445 {a,b,c,d} UNION {b} = {a,b,c,d} /\
\r
6446 {a,b,c,d} UNION {c} = {a,b,c,d} /\
\r
6447 {a,b,c,d} UNION {d} = {a,b,c,d}`] THEN
\r
6448 REWRITE_TAC[MESON[]`a = b /\ c /\ d <=> c /\ d /\ b = a `] THEN
\r
6449 REWRITE_TAC[SET_RULE` (!w. {v1} w ==> &0 < f w) /\
\r
6450 sum {v1, v2, v3, v4} f = &1 /\ l
\r
6451 <=> (!w. w IN {v1,v2,v3,v4} ==> {v1} w ==> &0 < f w) /\
\r
6452 sum {v1, v2, v3, v4} f = &1 /\ l `;
\r
6453 SET_RULE` (!w. {v2} w ==> &0 < f w) /\
\r
6454 sum {v1, v2, v3, v4} f = &1 /\ l
\r
6455 <=> (!w. w IN {v1,v2,v3,v4} ==> {v2} w ==> &0 < f w) /\
\r
6456 sum {v1, v2, v3, v4} f = &1 /\ l `;
\r
6457 SET_RULE` (!w. {v2} w ==> &0 < f w) /\
\r
6458 sum {v1, v2, v3, v4} f = &1 /\ l
\r
6459 <=> (!w. w IN {v1,v2,v3,v4} ==> {v2} w ==> &0 < f w) /\
\r
6460 sum {v1, v2, v3, v4} f = &1 /\ l `;
\r
6461 SET_RULE` (!w. {v3} w ==> &0 < f w) /\
\r
6462 sum {v1, v2, v3, v4} f = &1 /\ l
\r
6463 <=> (!w. w IN {v1,v2,v3,v4} ==> {v3} w ==> &0 < f w) /\
\r
6464 sum {v1, v2, v3, v4} f = &1 /\ l `;
\r
6465 SET_RULE` (!w. {v4} w ==> &0 < f w) /\
\r
6466 sum {v1, v2, v3, v4} f = &1 /\ l
\r
6467 <=> (!w. w IN {v1,v2,v3,v4} ==> {v4} w ==> &0 < f w) /\
\r
6468 sum {v1, v2, v3, v4} f = &1 /\ l `] THEN
\r
6469 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
6470 REAL_ARITH `&0 < x /\ &0 < y ==> &0 < x + y`;
\r
6471 REAL_ARITH ` &0 < x ==> &0 < x / &2`;
\r
6472 FINITE_INSERT; CONJUNCT1 FINITE_RULES
\r
6473 ; RIGHT_EXISTS_AND_THM] THEN
\r
6474 NHANH (NOT_COPLANAR_IMP_CARD4) THEN
\r
6475 SIMP_TAC[IN_ACT_SING; CARD4; IN_SET3; DE_MORGAN_THM] THEN
\r
6476 REWRITE_TAC[REAL_ARITH` a - b = c <=> a = b + c `; ZERO_NEUTRAL;
\r
6477 VECTOR_ARITH`(a:real^N) - b = c <=> a = b + c `; VECTOR_ARITH` x +
\r
6478 vec 0 = x `] THEN
\r
6479 REWRITE_TAC[CONV0_4; IN_ELIM_THM] THEN
\r
6480 NHANH (SPEC ` circumcenter {(v1:real^3), v2, v3, v4} ` ( GEN `v:real^3` (SPEC_ALL COEFS_4))) THEN
\r
6484 UNDISCH_TAC ` !ta tb tc td.
\r
6485 circumcenter {v1, v2, v3, v4} =
\r
6486 ta % v1 + tb % v2 + tc % v3 + td % v4 /\
\r
6487 ta + tb + tc + td = &1
\r
6488 ==> ta = COEF4_1 v1 v2 v3 v4 (circumcenter {v1, v2, v3, v4}) /\
\r
6489 tb = COEF4_2 v1 v2 v3 v4 (circumcenter {v1, v2, v3, v4}) /\
\r
6490 tc = COEF4_3 v1 v2 v3 v4 (circumcenter {v1, v2, v3, v4}) /\
\r
6491 td = COEF4_4 v1 v2 v3 v4 (circumcenter {v1, v2, v3, v4})` THEN
\r
6492 REWRITE_TAC[MESON[]`&0 < v /\ ( ? b . P v b ) <=>
\r
6493 (? b. &0 < v /\ P v b ) `] THEN
\r
6494 REWRITE_TAC[MESON[]` &1 = a /\ aa = b <=> a = &1 /\ b = aa `] THEN
\r
6495 ABBREV_TAC ` (vv:real^3) = circumcenter {v1, v2, v3, v4} ` THEN
\r
6496 ABBREV_TAC ` a1 = COEF4_1 v1 v2 v3 v4 vv ` THEN
\r
6497 ABBREV_TAC ` a2 = COEF4_2 v1 v2 v3 v4 vv ` THEN
\r
6498 ABBREV_TAC ` a3 = COEF4_3 v1 v2 v3 v4 vv ` THEN
\r
6499 ABBREV_TAC ` a4 = COEF4_4 v1 v2 v3 v4 vv ` THEN PHA THEN
\r
6500 IMP_TAC THEN STRIP_TAC THEN STRIP_TAC THEN
\r
6501 REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC) THEN PHA THEN
\r
6502 NHANH (MESON[]`(!ta tb tc td.
\r
6503 vv = ta % v1 + tb % v2 + tc % v3 + td % v4 /\ ta + tb + tc + td = &1
\r
6504 ==> ta = a1 /\ tb = a2 /\ tc = a3 /\ td = a4) /\
\r
6506 v + v' + v'' + v''' = &1 /\
\r
6507 v % v1 + v' % v2 + v'' % v3 + v''' % v4 = vv /\
\r
6510 v + v' + v'' + v''' = &1 /\
\r
6511 v % v1 + v' % v2 + v'' % v3 + v''' % v4 = vv) /\
\r
6514 v + v' + v'' + v''' = &1 /\
\r
6515 v % v1 + v' % v2 + v'' % v3 + v''' % v4 = vv) /\
\r
6518 v + v' + v'' + v''' = &1 /\
\r
6519 v % v1 + v' % v2 + v'' % v3 + v''' % v4 = vv) ==>
\r
6520 &0 < v' /\ &0 < v'' /\ &0 < v''' `) THEN MESON_TAC[]]);;
\r
6525 let IMP_IN_AFF_LT = prove(`CARD {v1, v2, v3, v4} = 4 ==> ( (?v v' v'' v'''.
\r
6527 &1 = v + v' + v'' + v''' /\ vv =
\r
6528 v % v1 + v' % v2 + v'' % v3 + v''' % v4) <=>
\r
6529 vv IN aff_lt {v2,v3,v4} {v1} ) `,
\r
6530 REWRITE_TAC[CARD4; IN_SET3; DE_MORGAN_THM] THEN SIMP_TAC[AFF_GES_GTS; IN_ELIM_THM]
\r
6531 THEN REMOVE_TAC THEN
\r
6532 MESON_TAC[REAL_ARITH` a + b + c + d = d + a + b + c `;
\r
6533 VECTOR_ARITH` a + b + c + d = d + a + b + (c:real^N)`]);;
\r
6539 let VBVYGGT = new_axiom `!(v1:real^3) v2 v3 v4.
\r
6540 CARD {v1, v2, v3, v4} = 4 /\ ~coplanar {v1, v2, v3, v4}
\r
6541 ==> circumcenter {v1, v2, v3, v4} IN affine hull {v1, v2, v3, v4} /\
\r
6542 (?r. !v. v IN {v1, v2, v3, v4}
\r
6543 ==> r = dist (circumcenter {v1, v2, v3, v4},v)) /\
\r
6544 (!p. p IN affine hull {v1, v2, v3, v4} /\
\r
6545 (?r. !v. v IN {v1, v2, v3, v4} ==> r = dist (p,v))
\r
6546 ==> p = circumcenter {v1, v2, v3, v4}) /\
\r
6547 (let x12 = dist (v1,v2) pow 2 in
\r
6548 let x13 = dist (v1,v3) pow 2 in
\r
6549 let x14 = dist (v1,v4) pow 2 in
\r
6550 let x23 = dist (v2,v3) pow 2 in
\r
6551 let x24 = dist (v2,v4) pow 2 in
\r
6552 let x34 = dist (v3,v4) pow 2 in
\r
6553 let chi11 = chi x12 x13 x14 x23 x24 x34 in
\r
6554 let chi22 = chi x12 x24 x23 x14 x13 x34 in
\r
6555 let chi33 = chi x34 x13 x23 x14 x24 x12 in
\r
6556 let chi44 = chi x34 x24 x14 x23 x13 x12 in
\r
6557 circumcenter {v1, v2, v3, v4} =
\r
6558 &1 / (&2 * delta x12 x13 x14 x23 x24 x34) %
\r
6559 (chi11 % v1 + chi22 % v2 + chi33 % v3 + chi44 % v4)) `;;
\r
6567 let VSMPQYO = prove(` ! v1 v2 v3 (v4:real^3).
\r
6568 CARD {v1, v2, v3, v4} = 4 /\ ~ coplanar {v1,v2,v3,v4}
\r
6569 ==> (let s = {v1, v2, v3, v4} in
\r
6570 let x12 = dist (v1,v2) pow 2 in
\r
6571 let x13 = dist (v1,v3) pow 2 in
\r
6572 let x14 = dist (v1,v4) pow 2 in
\r
6573 let x23 = dist (v2,v3) pow 2 in
\r
6574 let x24 = dist (v2,v4) pow 2 in
\r
6575 let x34 = dist (v3,v4) pow 2 in
\r
6576 orientation s v1 (\t. t < &0) <=>
\r
6577 chi x12 x13 x14 x23 x24 x34 < &0) `,
\r
6578 REWRITE_TAC[orientation; affsign; lin_combo] THEN REPEAT GEN_TAC THEN
\r
6579 LET_TAC THEN EXPAND_TAC "s" THEN
\r
6580 REWRITE_TAC[CARD4; SET_RULE` ( a INSERT s) DIFF {a} UNION {a} =
\r
6581 a INSERT s `] THEN
\r
6582 REWRITE_TAC[MESON[]` a = b /\ c /\ d <=> c /\ d /\ b = a `] THEN
\r
6583 ONCE_REWRITE_TAC[SET_RULE` {v1} w ==> P <=> w IN {v1,v2,v3,v4} ==>
\r
6584 {v1} w ==> P `] THEN SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
6585 REAL_ARITH `x < &0 /\ y < &0 ==> x + y < &0`;
\r
6586 REAL_ARITH `x < &0 ==> x / &2 < &0`;
\r
6587 FINITE_INSERT; CONJUNCT1 FINITE_RULES
\r
6588 ; RIGHT_EXISTS_AND_THM] THEN
\r
6589 SIMP_TAC[IN_ACT_SING; IN_SET3; DE_MORGAN_THM] THEN
\r
6590 SIMP_TAC[REAL_ARITH` a - b = c <=> a = b + c `; ZERO_NEUTRAL;
\r
6591 VECTOR_ARITH` a - b = c <=> a = b + (c:real^y)`; VECTOR_ADD_RID;
\r
6592 RIGHT_AND_EXISTS_THM] THEN
\r
6593 REWRITE_TAC[GSYM DE_MORGAN_THM; GSYM IN_SET3] THEN
\r
6594 REWRITE_TAC[DE_MORGAN_THM] THEN
\r
6595 REWRITE_TAC[MESON[]` a1 /\ ~ a /\ ~ b /\ ~ ( c = d ) <=> a1 /\ ~ ( a \/ b \/
\r
6596 c = d ) `; GSYM CARD4 ] THEN NHANH (SPEC_ALL VBVYGGT) THEN STRIP_TAC THEN
\r
6597 UNDISCH_TAC ` CARD {(v1:real^3), v2, v3, v4} = 4` THEN
\r
6598 SIMP_TAC[IMP_IN_AFF_LT ] THEN
\r
6599 UNDISCH_TAC `~coplanar {(v1:real^3), v2, v3, v4}` THEN
\r
6600 SIMP_TAC[ GSYM SRGTIHY] THEN
\r
6601 NHANH (SPECL [` v1:real^3`; `v2:real^3`;`v3:real^3`;`v4:real^3`;
\r
6602 ` circumcenter {(v1:real^3), v2, v3, v4} `] COEFS_4) THEN
\r
6603 MP_TAC (GEN_ALL SUM_CHI_EQ_2DELTA ) THEN
\r
6604 ABBREV_TAC ` p = circumcenter {(v1:real^3), v2, v3, v4}` THEN
\r
6605 ABBREV_TAC `c1 = COEF4_1 v1 v2 v3 v4 p` THEN
\r
6606 ABBREV_TAC `c2 = COEF4_2 v1 v2 v3 v4 p` THEN
\r
6607 ABBREV_TAC `c3 = COEF4_3 v1 v2 v3 v4 p` THEN
\r
6608 ABBREV_TAC `c4 = COEF4_4 v1 v2 v3 v4 p` THEN
\r
6609 PHA THEN STRIP_TAC THEN
\r
6610 REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN
\r
6611 REPEAT LET_TAC THEN EXPAND_TAC "chi11" THEN
\r
6612 EXPAND_TAC "chi22" THEN EXPAND_TAC "chi33" THEN
\r
6613 EXPAND_TAC "chi44" THEN
\r
6614 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
6615 REAL_ARITH` ( &1 / a ) * b = b / a `] THEN
\r
6616 REWRITE_TAC[GSYM POS_EQ_NOT_COPLANANR ] THEN
\r
6617 REPLICATE_TAC 7 STRIP_TAC THEN
\r
6618 UNDISCH_TAC ` dist ((v1:real^3),v2) pow 2 = x12 ` THEN
\r
6619 UNDISCH_TAC ` dist ((v1:real^3),v3) pow 2 = x13 ` THEN
\r
6620 UNDISCH_TAC ` dist ((v1:real^3),v4) pow 2 = x14 ` THEN
\r
6621 UNDISCH_TAC ` dist ((v2:real^3),v3) pow 2 = x23 ` THEN
\r
6622 UNDISCH_TAC ` dist ((v2:real^3),v4) pow 2 = x24 ` THEN
\r
6623 UNDISCH_TAC ` dist ((v3:real^3),v4) pow 2 = x34 ` THEN
\r
6624 REWRITE_TAC[MESON[]` a = b ==> P a <=> a = b ==> P b `] THEN
\r
6625 NHANH (REAL_ARITH` &0 < a ==> ~( a = &0 ) `) THEN
\r
6626 NHANH (NOT_0_IMP_SUM_CHI_1 ) THEN REPEAT STRIP_TAC THEN
\r
6627 UNDISCH_TAC ` &0 < delta x12 x13 x14 x23 x24 x34 ` THEN
\r
6629 prove(` &0 < p a ==> ( aa <=> q a < &0) <=> &0 < p a ==> ( aa <=> ( q a ) / ( &2 * p a ) < &0 ) `,
\r
6630 REWRITE_TAC[REAL_ARITH` a < &0 <=> &0 < -- a `;
\r
6631 REAL_ARITH ` -- ( a / b ) = ( -- a ) / b `] THEN
\r
6632 MESON_TAC[REAL_LT_RDIV_0; REAL_ARITH` &0 < a <=> &0 < &2 * a `])] THEN
\r
6633 ABBREV_TAC ` c11 = chi x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
6634 ABBREV_TAC ` c22 = chi x12 x24 x23 x14 x13 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
6635 ABBREV_TAC ` c33 = chi x34 x13 x23 x14 x24 x12 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
6636 ABBREV_TAC ` c44 = chi x34 x24 x14 x23 x13 x12 / (&2 * delta x12 x13 x14 x23 x24 x34) ` THEN
\r
6637 REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC THEN REMOVE_TAC) THEN
\r
6638 REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC) THEN UNDISCH_TAC
\r
6639 ` (p:real^3) = c11 % v1 + c22 % v2 + c33 % v3 + c44 % v4` THEN MESON_TAC[]);;
\r
6652 let SQRT4_EQ2 = prove(` sqrt ( &4 ) = &2 `,
\r
6653 REWRITE_TAC[REAL_ARITH` &4 = &2 pow 2 `] THEN
\r
6654 MESON_TAC[POW_2_SQRT; REAL_ARITH` &0 <= &2 `]);;
\r
6664 let RHUFIIB = prove( ` !x12 x13 x14 x23 x24 x34.
\r
6665 rho x12 x13 x14 x23 x24 x34 * ups_x x34 x24 x23 =
\r
6666 chi x12 x13 x14 x23 x24 x34 pow 2 +
\r
6667 &4 * delta x12 x13 x14 x23 x24 x34 * x34 * x24 * x23 `,
\r
6668 REWRITE_TAC[rho; chi; delta; ups_x] THEN REAL_ARITH_TAC);;
\r
6672 let SHOGYBS = prove(` ! x1 x2 x3 (x4:real^3).
\r
6673 ~coplanar {x1,x2,x3,x4} ==>
\r
6674 let x12 = dist (x1,x2) pow 2 in
\r
6675 let x13 = dist (x1,x3) pow 2 in
\r
6676 let x14 = dist (x1,x4) pow 2 in
\r
6677 let x23 = dist (x2,x3) pow 2 in
\r
6678 let x24 = dist (x2,x4) pow 2 in
\r
6679 let x34 = dist (x3,x4) pow 2 in
\r
6680 &0 <= rho x12 x13 x14 x23 x24 x34 `,
\r
6681 ONCE_REWRITE_TAC[SET_RULE` {v1,v2,v3,v4} = {v2,v3,v4,v1} `] THEN
\r
6682 NHANH (NOT_COPLANAR_IMP_NOT_COLLINEAR) THEN
\r
6683 ONCE_REWRITE_TAC[GSYM (SET_RULE` {v1,v2,v3,v4} = {v2,v3,v4,v1} `)] THEN
\r
6684 REWRITE_TAC[NOT_COL_EQ_UPS_X_POS] THEN REPEAT GEN_TAC THEN
\r
6685 MP_TAC (SPEC_ALL DELTA_POS_4POINTS) THEN
\r
6686 REPEAT LET_TAC THEN MP_TAC (SPEC_ALL RHUFIIB) THEN DOWN_TAC THEN
\r
6687 NHANH (MESON[REAL_LE_POW_2]` a pow 2 = b ==> &0 <= b `) THEN DAO THEN
\r
6688 SIMP_TAC[UPS_X_SYM] THEN
\r
6689 REWRITE_TAC[MESON[REAL_FIELD` &0 < a ==> (b * a = c <=> b = c / a )`]`
\r
6690 &0 < a /\a1 /\a2/\ b * a = c /\l <=> &0 < a /\a1 /\a2/\ b = c / a /\ l `] THEN
\r
6691 MP_TAC (REAL_ARITH` &0 <= &4 `) THEN PHA THEN
\r
6692 NHANH (MESON[REAL_LT_IMP_LE; REAL_LE_DIV;
\r
6693 REAL_LE_MUL; REAL_LE_ADD; REAL_LE_POW_2]` &0 <= &4 /\
\r
6694 &0 < ups_x x23 x24 x34 /\a1/\
\r
6695 &0 <= delta x12 x13 x14 x23 x24 x34 /\ a2 /\
\r
6696 &0 <= x34 /\a3 /\ &0 <= x24 /\a4 /\ &0 <= x23 /\a5/\
\r
6697 &0 <= x14 /\a6 /\ &0 <= x13 /\a7 /\a8 /\ &0 <= x12 ==>
\r
6698 &0 <= &4 * delta x12 x13 x14 x23 x24 x34 * x34 * x24 * x23 `) THEN
\r
6699 ABBREV_TAC ` aaa = &4 * delta x12 x13 x14 x23 x24 x34 * x34 * x24 * x23 ` THEN STRIP_TAC THEN
\r
6700 FIRST_X_ASSUM MP_TAC THEN UNDISCH_TAC ` rho x12 x13 x14 x23 x24 x34 =
\r
6701 (chi x12 x13 x14 x23 x24 x34 pow 2 + aaa) / ups_x x23 x24 x34 ` THEN
\r
6702 UNDISCH_TAC`&0 < ups_x x23 x24 x34` THEN MESON_TAC[REAL_LT_IMP_LE; REAL_LE_DIV;
\r
6703 REAL_LE_MUL; REAL_LE_ADD; REAL_LE_POW_2]);;
\r
6706 (* le 86 . GDRQXLG *)
\r
6709 let GDRQXLG = prove(` ! v1 v2 v3 (v4:real^3).
\r
6710 let s = {v1, v2, v3, v4} in
\r
6711 let x12 = dist (v1,v2) pow 2 in
\r
6712 let x13 = dist (v1,v3) pow 2 in
\r
6713 let x14 = dist (v1,v4) pow 2 in
\r
6714 let x23 = dist (v2,v3) pow 2 in
\r
6715 let x24 = dist (v2,v4) pow 2 in
\r
6716 let x34 = dist (v3,v4) pow 2 in
\r
6717 CARD s = 4 /\ ~coplanar s
\r
6719 sqrt ( rho x12 x13 x14 x23 x24 x34) /
\r
6720 (&2 * sqrt (delta x12 x13 x14 x23 x24 x34))`,
\r
6721 REPEAT GEN_TAC THEN REPEAT LET_TAC THEN EXPAND_TAC "s" THEN
\r
6722 NHANH (NOT_COPLANAR_IMP_RADV_PROPERTIES) THEN
\r
6723 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `p:real^3` PROVE_DIST_FROM_V1 )) THEN
\r
6724 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `p:real^3` PROVE_EQ_DIST_FROM4 ) ) THEN
\r
6725 REWRITE_TAC[GSYM POS_EQ_NOT_COPLANANR] THEN
\r
6726 NHANH (REAL_ARITH` &0 < a ==> ~( a = &0 )`) THEN
\r
6727 NHANH (PROVE_IN_AFFINE_HULL_4 ) THEN LET_TR THEN
\r
6728 REWRITE_TAC[MESON[]`(!x. x = a ==> p x) <=> p a `] THEN
\r
6729 ABBREV_TAC `taa = (&1 / (&2 *
\r
6730 delta (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
6731 (dist (v2,v3) pow 2)
\r
6732 (dist (v2,v4) pow 2)
\r
6733 (dist (v3,v4) pow 2)) %
\r
6734 (chi (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
6735 (dist (v2,v3) pow 2)
\r
6736 (dist (v2,v4) pow 2)
\r
6737 (dist (v3,v4) pow 2) %
\r
6739 chi (dist (v1,v2) pow 2) (dist (v2,v4) pow 2) (dist (v2,v3) pow 2)
\r
6740 (dist (v1,v4) pow 2)
\r
6741 (dist (v1,v3) pow 2)
\r
6742 (dist (v3,v4) pow 2) %
\r
6744 chi (dist (v3,v4) pow 2) (dist (v1,v3) pow 2) (dist (v2,v3) pow 2)
\r
6745 (dist (v1,v4) pow 2)
\r
6746 (dist (v2,v4) pow 2)
\r
6747 (dist (v1,v2) pow 2) %
\r
6749 chi (dist (v3,v4) pow 2) (dist (v2,v4) pow 2) (dist (v1,v4) pow 2)
\r
6750 (dist (v2,v3) pow 2)
\r
6751 (dist (v1,v3) pow 2)
\r
6752 (dist (v1,v2) pow 2) %
\r
6754 REWRITE_TAC[ POS_EQ_NOT_COPLANANR] THEN NGOAC THEN
\r
6755 NHANH (SPEC_ALL UNIQUE_EXISISTING_PROPERTY_C4 ) THEN
\r
6756 REWRITE_TAC[FORALL_IN_CLAUSES] THEN ABBREV_TAC ` abc = &1 / &2 *
\r
6757 rho (dist (v1,v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
6758 (dist (v2,v3) pow 2) (dist (v2,v4) pow 2) (dist (v3,v4) pow 2) /
\r
6760 delta (dist ((v1:real^3),v2) pow 2) (dist (v1,v3) pow 2) (dist (v1,v4) pow 2)
\r
6761 (dist (v2,v3) pow 2)
\r
6762 (dist (v2,v4) pow 2)
\r
6763 (dist (v3,v4) pow 2)) ` THEN REWRITE_TAC[d3] THEN
\r
6764 NHANH (MESON[POW_2_SQRT; DIST_POS_LE]` dist (taa,v2) pow 2 = a ==>
\r
6765 dist(taa,v2) = sqrt a `) THEN PHA THEN
\r
6766 NHANH (MESON[]`(!p. p IN affine hull {v1, v2, v3, v4} /\
\r
6767 (?r. r = dist (p,v1) /\
\r
6768 r = dist (p,v2) /\
\r
6769 r = dist (p,v3) /\
\r
6771 ==> p = circumcenter {v1, v2, v3, v4}) /\ a11 /\
\r
6772 taa IN affine hull {v1, v2, v3, v4} /\
\r
6773 dist (taa,v2) pow 2 = abc /\
\r
6774 dist (taa,v2) = sqrt abc /\
\r
6775 dist (taa,v3) pow 2 = abc /\
\r
6776 dist (taa,v3) = sqrt abc /\
\r
6777 dist (taa,v4) pow 2 = abc /\
\r
6778 dist (taa,v4) = sqrt abc /\
\r
6779 dist (taa,v1) pow 2 = abc /\
\r
6780 dist (taa,v1) = sqrt abc /\ lll ==> taa = circumcenter {v1, v2, v3, v4} `) THEN
\r
6781 NHANH (SET_RULE ` (!w. {v1, v2, v3, v4} w ==> P w ) ==> P v1 `) THEN PHA THEN
\r
6782 REWRITE_TAC[MESON[]` a = dist (aa,b) /\ ta = aa <=> ta = aa /\ a = dist (ta,b) `] THEN
\r
6783 NHANH (MESON[]` a = b /\ a1 /\ a2 /\ c = a ==> c = b `) THEN NHANH (SPEC_ALL SHOGYBS) THEN
\r
6784 MP_TAC (SPECL [`v1:real^3`;` v2:real^3`;`v3:real^3`;`v4:real^3`]
\r
6785 DELTA_POS_4POINTS) THEN REPEAT LET_TAC THEN IMP_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN
\r
6786 REWRITE_TAC[MESON[]` a = b ==> P a <=> a = b ==> P b `] THEN
\r
6787 REWRITE_TAC[MESON[]` a = b ==> a = c <=> a = b ==> c = b `] THEN REPEAT STRIP_TAC THEN
\r
6788 UNDISCH_TAC ` &1 / &2 * rho x12 x13 x14 x23 x24 x34 / (&2 * delta x12 x13 x14 x23 x24 x34) =
\r
6789 abc ` THEN UNDISCH_TAC ` &0 <= rho x12 x13 x14 x23 x24 x34 ` THEN
\r
6790 ABBREV_TAC ` edl = delta x12 x13 x14 x23 x24 x34 ` THEN UNDISCH_TAC` &0 <= edl ` THEN
\r
6791 SIMP_TAC[REAL_ARITH` &0 <= &4 `; GSYM SQRT_MUL; GSYM SQRT4_EQ2] THEN
\r
6792 SIMP_TAC[REAL_ARITH` &0 <= &4 `; REAL_LE_MUL; GSYM SQRT_DIV] THEN
\r
6793 REWRITE_TAC[SQRT4_EQ2] THEN MESON_TAC[REAL_FIELD` &1 / &2 * x34 / (&2 * edl) = x34 / (&4 * edl)`]);;
\r
6796 let BAJSVHC = ` ! v1 v2 v3 v4 (v5:real^3).
\r
6797 CARD {v1, v2, v3, v4, v5} = 5 /\
\r
6798 ~coplanar {v1, v2, v3, v4} /\
\r
6799 v5 IN aff_ge {v1, v3} {v2, v4} /\
\r
6800 ~(v5 IN aff {v1, v3})
\r
6801 ==> aff_ge {v1, v3} {v2, v4} =
\r
6802 aff_ge {v1, v3} {v2, v5} UNION aff_ge {v1, v3} {v4, v5} /\
\r
6803 aff_gt {v1, v3} {v2, v5} INTER aff_gt {v1, v3} {v4, v5} = {}`;;
\r
6804 let LEMMA104 = BAJSVHC;;
\r
6810 let AFF_GE22 = prove(`!v1 v2 w1 (w2:real^N).
\r
6811 {v1, v2} INTER {w1, w2} = {}
\r
6812 ==> aff_ge {v1, v2} {w1, w2} =
\r
6813 {x | ?a1 a2 b1 b2.
\r
6816 a1 + a2 + b1 + b2 = &1 /\
\r
6817 x = a1 % v1 + a2 % v2 + b1 % w1 + b2 % w2}`,
\r
6818 REWRITE_TAC[aff_ge_def; affsign; FUN_EQ_THM; lin_combo; sgn_ge] THEN
\r
6819 REWRITE_TAC[MESON[]` (a = aa )/\ (! w. P w ) /\ b <=>
\r
6820 (!w. P w ) /\ b /\ ( aa = a ) `] THEN
\r
6821 ONCE_REWRITE_TAC[SET_RULE` {w1, w2} w ==> P w <=> w IN ( v1 INSERT ( v2
\r
6822 INSERT {w1, w2} )) ==> {w1, w2} w ==> P w `;
\r
6823 SET_RULE` {a,b} UNION {c,d} = {a,b,c,d} `] THEN
\r
6824 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
6825 REAL_ARITH `&0 <= x /\ &0 <= y ==> &0 <= x + y`;
\r
6826 REAL_ARITH `&0 <= x ==> &0 <= x / &2`;
\r
6827 FINITE_INSERT; CONJUNCT1 FINITE_RULES
\r
6828 ; RIGHT_EXISTS_AND_THM] THEN
\r
6829 SIMP_TAC[SET_RULE`(!x. ({v1, v2} INTER {w1, w2}) x <=> {} x)
\r
6830 <=> ~ ({w1,w2} v1 ) /\ ~({w1,w2} v2 )`;
\r
6831 SET_RULE` {a,b} a /\ {a,b} b `] THEN
\r
6832 REPEAT STRIP_TAC THEN REWRITE_TAC[RIGHT_AND_EXISTS_THM; IN_ELIM_THM;
\r
6833 REAL_ARITH` a - b = c <=> a = b + c `; ZERO_NEUTRAL;
\r
6834 VECTOR_ARITH` a - b = c <=> a = b + (c:real^N)`; VECTOR_ADD_RID;
\r
6835 REAL_ARITH` &1 = a <=> a = &1 `]);;
\r
6841 let PROVE_UNION_AFF22_SUBSET = prove(` ! v1 v2 v3 v4 (v5:real^3).
\r
6842 CARD {v1, v2, v3, v4, v5} = 5 /\ ~coplanar {v1, v2, v3, v4} /\
\r
6843 v5 IN aff_ge {v1, v3} {v2, v4} /\
\r
6844 ~(v5 IN aff {v1, v3})
\r
6845 ==> aff_ge {v1, v3} {v2, v5} UNION aff_ge {v1, v3} {v4, v5}
\r
6846 SUBSET aff_ge {v1, v3} {v2, v4} `,
\r
6847 REWRITE_TAC[UNION_SUBSET] THEN
\r
6848 ONCE_REWRITE_TAC[MESON[INSERT_AC]` a /\ b SUBSET
\r
6849 s {v1,v2} <=> a /\ b SUBSET s {v2,v1} `] THEN
\r
6850 MATCH_MP_TAC (MESON[]` (! v1 v2 v3 v4 v5. P v1 v2 v3 v4 v5 <=>
\r
6851 P v1 v4 v3 v2 v5 ) /\ (! v1 v2 v3 v4 v5.
\r
6852 P v1 v2 v3 v4 v5 ==> Q v1 v2 v3 v4 v5 ) ==>
\r
6853 (! v1 v2 v3 v4 v5. P v1 v2 v3 v4 v5 ==>
\r
6854 Q v1 v2 v3 v4 v5 /\ Q v1 v4 v3 v2 v5 ) `) THEN
\r
6855 SIMP_TAC[INSERT_AC] THEN REPEAT GEN_TAC THEN
\r
6856 ONCE_REWRITE_TAC[SET_RULE ` {a,b,c,d,e} = {e,a,b,c,d}`] THEN
\r
6857 REWRITE_TAC[CARD5] THEN
\r
6858 NHANH (SET_RULE` ~(v1 IN {v2, v3, v4}) /\
\r
6859 ~(v2 = v3 \/ v3 = v4 \/ v4 = v2) ==>
\r
6860 {v1,v3} INTER {v2,v4} = {} `) THEN
\r
6861 NHANH (SPEC_ALL AFF_GE22) THEN PHA THEN
\r
6862 REWRITE_TAC[IN_ELIM_THM; MESON[]` a = b /\ a1 /\ v IN a /\l <=>
\r
6863 a = b /\ a1 /\ v IN b /\ l`] THEN
\r
6864 NHANH (SET_RULE` ~(v5 IN {v1, v2, v3, v4}) /\
\r
6865 ~(v1 IN {v2, v3, v4}) /\
\r
6866 ~(v2 = v3 \/ v3 = v4 \/ v4 = v2) /\ l ==>
\r
6867 {v1,v3} INTER {v2,v5} = {} /\
\r
6868 {v1,v3} INTER {v4,v5} = {} `) THEN
\r
6869 SIMP_TAC[AFF_GE22] THEN STRIP_TAC THEN
\r
6870 SIMP_TAC[UNION_SUBSET; SUBSET; IN_ELIM_THM] THEN
\r
6871 GEN_TAC THEN STRIP_TAC THEN
\r
6872 UNDISCH_TAC ` x = a1' % v1 + a2' % v3 + b1' % v2 + b2' % (v5:real^3)` THEN
\r
6873 UNDISCH_TAC ` v5 = a1 % v1 + a2 % v3 + b1 % v2 + b2 % (v4:real^3)` THEN
\r
6875 PURE_ONCE_REWRITE_TAC[MESON[]` a = b /\ P a <=> a = b /\ P (b:real^3) `] THEN
\r
6876 REWRITE_TAC[VECTOR_ARITH` a1' % v1 + a2' % v3 + b1' % v2 +
\r
6877 b2' % (a1 % v1 + a2 % v3 + b1 % v2 + b2 % v4) =
\r
6878 (a1' + b2' * a1 ) % v1 + (a2' + b2' * a2 ) % v3
\r
6879 + (b1' + b2' * b1 ) % v2 + (b2' * b2 ) % v4 `] THEN
\r
6880 STRIP_TAC THEN EXISTS_TAC `a1' + b2' * a1` THEN
\r
6881 EXISTS_TAC `a2' + b2' * a2` THEN
\r
6882 EXISTS_TAC `b1' + b2' * b1` THEN EXISTS_TAC `b2' * b2` THEN
\r
6883 ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_MUL;
\r
6884 prove(`a1 + a2 + b1 + b2 = &1 /\ a1' + a2' + b1' + b2' = &1
\r
6885 ==> (a1' + b2' * a1) + (a2' + b2' * a2) + (b1' + b2' * b1) + b2' * b2 = &1`,
\r
6886 SIMP_TAC[REAL_ARITH` a + b = c <=> a = c - b `] THEN REAL_ARITH_TAC)]);;
\r
6898 let AFF_GT21 = MESON[AFF_GES_GTS]`!a b v0.
\r
6899 ~(a = v0) /\ ~(b = v0)
\r
6900 ==> aff_gt {a, b} {v0} =
\r
6902 ta + tb + t = &1 /\
\r
6904 x = ta % a + tb % b + t % v0}`;;
\r
6905 let AFF_GE21 = MESON[AFF_GES_GTS]`!a b v0.
\r
6906 ~(a = v0) /\ ~(b = v0)
\r
6907 ==> aff_ge {a, b} {v0} =
\r
6909 ta + tb + t = &1 /\
\r
6911 x = ta % a + tb % b + t % v0}`;;
\r
6914 let AFF_GT31 = MESON[AFF_GES_GTS]`!a b c v0.
\r
6915 ~(a = v0) /\ ~(b = v0) /\ ~(c = v0 )
\r
6916 ==> aff_gt {a, b, c} {v0} =
\r
6919 ta + tb + tc + t = &1 /\
\r
6920 x = ta % a + tb % b + tc % c + t % v0}`;;
\r
6921 let AFF_GE31 = MESON[AFF_GES_GTS]`!a b c v0.
\r
6922 ~(a = v0) /\ ~(b = v0) /\ ~(c = v0 )
\r
6923 ==> aff_ge {a, b, c} {v0} =
\r
6926 ta + tb + tc + t = &1 /\
\r
6927 x = ta % a + tb % b + tc % c + t % v0}`;;
\r
6935 let AFF_GE21_SUBSET_AFF22 = prove(`{a,b} INTER {x,y} = {}
\r
6936 ==> aff_ge {a,b} {y} SUBSET aff_ge {a,b} {x,y} `,
\r
6937 NHANH (SET_RULE ` {a,b} INTER {x,y} = {} ==>
\r
6938 ~ ( a = y ) /\ ~ ( b = y ) `) THEN
\r
6939 SIMP_TAC[AFF_GE22; AFF_GE21; SUBSET; IN_ELIM_THM] THEN
\r
6940 REPEAT STRIP_TAC THEN
\r
6941 EXISTS_TAC`ta :real` THEN
\r
6942 EXISTS_TAC`tb :real` THEN
\r
6943 EXISTS_TAC`&0 ` THEN
\r
6944 EXISTS_TAC`t :real` THEN
\r
6945 ASM_SIMP_TAC[REAL_LE_REFL; ZERO_NEUTRAL;
\r
6946 VECTOR_MUL_LZERO; VECTOR_ADD_LID]);;
\r
6957 let V5_IN_AFF21_IMP_SET_EQ = prove(` (v5:real^3) IN aff_ge {v1, v3} {v4} /\
\r
6958 ~coplanar {v1, v2, v3, v4} /\
\r
6959 ~(v5 IN aff {v1, v3}) /\ CARD {v1, v2, v3, v4, v5} = 5
\r
6960 ==> aff_ge {v1, v3} {v2, v4} = aff_ge {v1, v3} {v2, v5}`,
\r
6961 REWRITE_TAC[CARD5] THEN NHANH (SET_RULE` ~(v1 IN {v2, v3, v4, v5}) /\
\r
6962 ~(v2 IN {v3, v4, v5}) /\ ~(v3 = v4 \/ v4 = v5 \/ v5 = v3) ==> {v1,v3} INTER {v2,v4} = {} `) THEN
\r
6963 NHANH (AFF_GE21_SUBSET_AFF22 ) THEN REWRITE_TAC[ GSYM CARD5] THEN
\r
6964 REWRITE_TAC[MESON[]` x IN s /\l <=> l /\ x IN s `] THEN PHA THEN
\r
6965 NHANH (SET_RULE ` a SUBSET b /\ x IN a ==> x IN b `) THEN ONCE_REWRITE_TAC[MESON[]` a1 /\ a2 /\ CARD s = 5
\r
6966 /\ a4 /\ a5 /\ a6 <=>a4 /\ a5 /\ CARD s = 5 /\ a1 /\a6 /\a2 `] THEN
\r
6967 NHANH (SPEC_ALL PROVE_UNION_AFF22_SUBSET ) THEN SIMP_TAC[UNION_SUBSET; SET_EQ_TO_SUBSET] THEN
\r
6968 SIMP_TAC[GSYM SET_EQ_TO_SUBSET; CARD5] THEN NHANH (SET_RULE` ~(v1 IN {v2, v3, v4, v5}) /\
\r
6969 ~(v2 IN {v3, v4, v5}) /\ ~(v3 = v4 \/ v4 = v5 \/ v5 = v3) ==>
\r
6970 {v1, v3} INTER {v2, v5} = {} `) THEN SIMP_TAC[AFF_GE22] THEN
\r
6971 REWRITE_TAC[GSYM SET_EQ_TO_SUBSET; SET_RULE ` {v1, v3} INTER {v2, v4} = {}
\r
6972 <=> ~(v1 = v4) /\ ~(v3 = v4) /\ ~(v1 = v2) /\ ~(v3 = v2)`] THEN
\r
6973 ONCE_REWRITE_TAC[MESON[]` a /\b ==> c <=> a ==> b ==> c `] THEN SIMP_TAC[AFF_GE21] THEN
\r
6974 REWRITE_TAC[IN_ELIM_THM; AFF_2POINTS_INTERPRET] THEN REPEAT STRIP_TAC THEN
\r
6975 ASM_CASES_TAC `t = &0 ` THENL [UNDISCH_TAC `ta + tb + t = &1` THEN
\r
6976 UNDISCH_TAC `(v5:real^3) = ta % v1 + tb % v3 + t % v4` THEN UNDISCH_TAC` t = &0 ` THEN
\r
6977 SIMP_TAC[ZERO_NEUTRAL; VECTOR_MUL_LZERO; VECTOR_ADD_RID] THEN PHA THEN ASM_MESON_TAC[];
\r
6978 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
\r
6979 UNDISCH_TAC `x = a1 % v1 + a2 % v3 + b1 % v2 + b2 % (v4:real^3)` THEN
\r
6980 ONCE_REWRITE_TAC[MESON[]` a ==> b <=> ~b ==> ~ a `] THEN DISCH_TAC THEN
\r
6981 ONCE_REWRITE_TAC[VECTOR_ARITH` x = a <=> x = a - (b2 /t) % (v5:real^3) + (b2 /t) % (v5:real^3)`] THEN
\r
6982 UNDISCH_TAC` (v5:real^3) = ta % v1 + tb % v3 + t % v4 ` THEN SIMP_TAC[] THEN
\r
6983 REWRITE_TAC[VECTOR_ARITH` (a1 % v1 + a2 % v3 + b1 % v2 + b2 % v4) -
\r
6984 tt % (ta % v1 + tb % v3 + t % v4) = ( a1 - tt * ta ) % v1 + ( a2 - tt * tb ) % v3 + b1 % v2 +
\r
6985 ( b2 - tt * t ) % v4 `] THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
6986 UNDISCH_TAC`~(t = &0 )` THEN SIMP_TAC[REAL_FIELD` ~( a = &0) ==> b / a * a = b `;
\r
6987 REAL_SUB_REFL; VECTOR_MUL_LZERO; VECTOR_ADD_RID] THEN UNDISCH_TAC`ta + tb + t = &1` THEN
\r
6988 UNDISCH_TAC ` a1 + a2 + b1 + b2 = &1 ` THEN PHA THEN DAO THEN NHANH (REAL_FIELD` ~(t = &0) /\
\r
6989 a1 + a2 + b1 + b2 = &1 /\ ta + tb + t = &1 ==> a1 - b2 / t * ta + a2 - b2 / t * tb + b1 + b2 / t = &1`) THEN
\r
6990 UNDISCH_TAC ` &0 <= b2 ` THEN UNDISCH_TAC ` &0 <= t ` THEN PHA THEN
\r
6991 NHANH (MESON[REAL_LE_DIV]` &0 <= t /\ &0 <= b /\ l ==> &0 <= b / t `) THEN
\r
6992 REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[VECTOR_ARITH` ((a:real^N) + b ) + c =
\r
6993 a + b + c `] THEN MESON_TAC[]]);;
\r
7008 let AFF_GT22 = prove( `{(a:real^N), b} INTER {x, y} = {}
\r
7009 ==> aff_gt {a, b} {x, y} =
\r
7010 {w | ?ta tb tx ty.
\r
7013 ta + tb + tx + ty = &1 /\
\r
7014 w = ta % a + tb % b + tx % x + ty % y}`,
\r
7015 REWRITE_TAC[aff_gt_def; FUN_EQ_THM; affsign; sgn_gt;
\r
7017 ONCE_REWRITE_TAC[SET_RULE` {x, y} w ==> P <=>
\r
7018 w IN ({a, b} UNION {x, y}) ==> {x, y} w ==> P`] THEN
\r
7019 REWRITE_TAC[MESON[]` a = b /\ cc /\ j <=> cc /\ j
\r
7021 REWRITE_TAC[SET_RULE` {a, b} UNION {x, y} =
\r
7023 SIMP_TAC[AFFINE_HULL_FINITE_STEP_GEN;
\r
7024 REAL_ARITH `&0 < x /\ &0 < y ==> &0 < x + y`;
\r
7025 REAL_ARITH `&0 < x ==> &0 < x / &2`;
\r
7026 FINITE_INSERT; CONJUNCT1 FINITE_RULES
\r
7027 ; RIGHT_EXISTS_AND_THM] THEN
\r
7028 NHANH (SET_RULE` (!x'. ({a, b} INTER {x, y}) x' <=> {} x')
\r
7029 ==> ~( {x,y} a ) /\ ~( {x,y} b ) /\ {x,y} x /\ {x,y} y `) THEN
\r
7030 SIMP_TAC[RIGHT_AND_EXISTS_THM; REAL_ARITH` a - b = c
\r
7031 <=> a = b + c `; ZERO_NEUTRAL; VECTOR_ARITH` (a:real^N) - b
\r
7032 = c <=> a = b + c `; VECTOR_ADD_RID; IN_ELIM_THM] THEN
\r
7033 SIMP_TAC[EQ_SYM_EQ]);;
\r
7038 let PROVE_B1B2_POS = prove(` ~((?ta tb t. ta + tb + t = &1 /\ &0 <= t /\ v5 = ta % v1 + tb % v3 + t % v2) \/
\r
7039 (?ta tb t. ta + tb + t = &1 /\ &0 <= t /\ v5 = ta % v1 + tb % v3 + t % v4)) /\
\r
7040 ~coplanar {v1, v2, v3, v4} /\
\r
7043 a1 + a2 + b1 + b2 = &1 /\
\r
7044 v5 = a1 % v1 + a2 % v3 + b1 % v2 + b2 % v4 /\ l
\r
7045 ==> &0 < b1 /\ &0 < b2 `,
\r
7046 ASM_CASES_TAC `b1 = &0 ` THENL [
\r
7047 ASM_SIMP_TAC[ZERO_NEUTRAL; VECTOR_MUL_LZERO; VECTOR_ADD_LID] THEN
\r
7048 MESON_TAC[]; ASM_CASES_TAC `b2 = &0 ` THENL [
\r
7049 ASM_SIMP_TAC[ZERO_NEUTRAL; VECTOR_MUL_LZERO; VECTOR_ADD_LID; VECTOR_ADD_RID]
\r
7050 THEN MESON_TAC[]; ASM_SIMP_TAC[REAL_ARITH` a <= b <=> b = a \/ a < b `]]]);;
\r
7054 let NOT_COPLANAR_AND_SUM_IMP_UNIQUE = prove(
\r
7055 ` ~coplanar {(v1:real^3), v2, v3, v4} ==>
\r
7056 (! x s1 s2 s3 s4 t1 t2 t3 t4.
\r
7057 t1 + t2 + t3 + t4 = &1 /\
\r
7058 x = t1 % v1 + t2 % v2 + t3 % v3 + t4 % v4 /\
\r
7059 s1 + s2 + s3 + s4 = &1 /\
\r
7060 x = s1 % v1 + s2 % v2 + s3 % v3 + s4 % v4 ==>
\r
7061 s1 = t1 /\ s2 = t2 /\ s3 = t3 /\ s4 = t4 ) `,
\r
7062 NHANH (SPEC_ALL (REWRITE_RULE[RIGHT_FORALL_IMP_THM] COEFS_4))
\r
7063 THEN MESON_TAC[]);;
\r
7067 g ` ! (v1:real^3) (v2:real^3) (v3:real^3) (v4:real^3) (v5:real^3).
\r
7068 CARD {v1, v2, v3, v4, v5} = 5 /\
\r
7069 ~coplanar {v1, v2, v3, v4} /\
\r
7070 v5 IN aff_ge {v1, v3} {v2, v4} /\
\r
7071 ~(v5 IN aff {v1, v3})
\r
7072 ==> aff_ge {v1, v3} {v2, v4} =
\r
7073 aff_ge {v1, v3} {v2, v5} UNION aff_ge {v1, v3} {v4, v5} /\
\r
7074 aff_gt {v1, v3} {v2, v5} INTER aff_gt {v1, v3} {v4, v5} = {}`;;
\r
7075 e (SIMP_TAC[GSYM SUBSET_ANTISYM_EQ; PROVE_UNION_AFF22_SUBSET;
\r
7077 e (REPEAT GEN_TAC);;
\r
7078 e (ASM_CASES_TAC ` (v5:real^3) IN aff_ge {v1,v3} {v2} \/
\r
7079 v5 IN aff_ge {v1,v3} {v4} `);;
\r
7081 e (SPEC_TAC (`v2:real^3`,`v2:real^3`));;
\r
7082 e (SPEC_TAC (`v4:real^3`,`v4:real^3`));;
\r
7083 e (ONCE_REWRITE_TAC[MESON[]` a /\ b ==> c <=>
\r
7084 a ==> b ==> c `]);;
\r
7085 e (MATCH_MP_TAC (MESON[]`(! a b. L a b <=> L b a ) /\ (! a b . P a ==> L a b ) ==> (! a b. P b \/ P a ==>
\r
7088 e (SIMP_TAC[UNION_COMM; INTER_COMM; INSERT_AC]);;
\r
7090 e (ONCE_REWRITE_TAC[MESON[]`a1 /\a2/\a3/\a4/\a5 <=>
\r
7091 a4 /\ a1 /\a3/\a5/\a2`]);;
\r
7092 e (NHANH (V5_IN_AFF21_IMP_SET_EQ));;
\r
7093 e (SIMP_TAC[SET_RULE` a = b ==> a SUBSET (b UNION cc )`]);;
\r
7094 e (ONCE_REWRITE_TAC[MESON[]`a IN s /\ b /\ ss = tt ==> l
\r
7095 <=> ss = tt ==> a IN s /\ b ==> l`]);;
\r
7096 e (ONCE_REWRITE_TAC[GSYM (MESON[]`a1 /\a2/\a3/\a4/\a5 <=>
\r
7097 a4 /\ a1 /\a3/\a5/\a2`)]);;
\r
7098 e (ONCE_REWRITE_TAC[SET_RULE ` {a,b,c,d,e} = {e,a,b,c,d}`]);;
\r
7099 e (REWRITE_TAC[CARD5]);;
\r
7100 e (NHANH (SET_RULE` ~(v1 IN {v2, v3, v4}) /\
\r
7101 ~(v2 = v3 \/ v3 = v4 \/ v4 = v2) ==>
\r
7102 {v1,v3} INTER {v2,v4} = {} `));;
\r
7103 e (NHANH (SPEC_ALL AFF_GE22));;
\r
7105 e (REWRITE_TAC[IN_ELIM_THM; MESON[]` a = b /\ a1 /\ v IN a /\l <=>
\r
7106 a = b /\ a1 /\ v IN b /\ l`]);;
\r
7107 e (REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM]);;
\r
7109 e (NHANH (MESON[AFF_GE21]` ~(v1 = v4) /\
\r
7111 ~(v3 = v4) /\ ll ==>
\r
7112 aff_ge {v1,v3} {v4} =
\r
7114 ta + tb + t = &1 /\
\r
7116 x = ta % v1 + tb % v3 + t % v4}`));;
\r
7117 e (REWRITE_TAC[MESON[]` a IN s /\ l <=> l /\ a IN s `]);;
\r
7118 e (REWRITE_TAC[MESON[]` a IN s /\ l <=> l /\ a IN s `;
\r
7119 MESON[]` a = b /\ x IN a <=> a = b /\ x IN b `; IN_ELIM_THM]);;
\r
7121 e (REWRITE_TAC[MESON[]` a = b /\ x IN a <=>
\r
7122 x IN b /\ a = b `; IN_ELIM_THM]);;
\r
7123 e (NHANH (SET_RULE` ~(v5 = v1) /\
\r
7132 ~(v4 = v2) /\ l ==> {v1, v3} INTER {v2, v5} = {} /\
\r
7133 {v1,v3} INTER {v4,v5} = {} `));;
\r
7134 e (SIMP_TAC[AFF_GT22]);;
\r
7135 e (REWRITE_TAC[SET_RULE` a INTER b SUBSET {} <=> (! x. ~( x IN a
\r
7137 e (REWRITE_TAC[SET_RULE` a INTER b SUBSET {} <=> (! x. ~( x IN a
\r
7138 /\ x IN b ))`; IN_ELIM_THM] THEN REPEAT STRIP_TAC);;
\r
7139 e (ASM_CASES_TAC ` t = &0 `);;
\r
7143 e (UNDISCH_TAC `v5 = ta % v1 + tb % v3 + t % (v4:real^3)`);;
\r
7144 e (UNDISCH_TAC `ta + tb + t = &1`);;
\r
7145 e (UNDISCH_TAC `t = &0`);;
\r
7146 e (UNDISCH_TAC `~(v5 IN aff {v1, (v3:real^3)})`);;
\r
7147 e (SIMP_TAC[ZERO_NEUTRAL; VECTOR_MUL_LZERO; VECTOR_ADD_RID;
\r
7148 AFF_2POINTS_INTERPRET; IN_ELIM_THM]);;
\r
7150 e (REPLICATE_TAC 13 (FIRST_X_ASSUM MP_TAC));;
\r
7151 e (PURE_ONCE_REWRITE_TAC[MESON[]` a = b ==> p a <=> a = b ==> p b `]);;
\r
7154 e (REWRITE_TAC[ VECTOR_ARITH` ta' % v1 + tb' % v3 + tx % v2 + ty % (ta % v1 + tb % v3 + t % v4) =
\r
7155 ( ta' + ty * ta ) % v1 + ( tb' + ty * tb ) % v3 + tx % v2 + ( ty * t ) % v4 `]);;
\r
7158 e (REWRITE_TAC[VECTOR_ARITH` (ta'' + ty' * ta) % v1 +
\r
7159 (tb'' + ty' * tb) % v3 +
\r
7162 (ta'' + ty' * ta ) % v1 + (tb'' + ty' * tb ) % v3 + &0 % v2 + (tx' + ty' * t ) % v4 `]);;
\r
7164 e (REPEAT STRIP_TAC);;
\r
7165 e (UNDISCH_TAC `ta + tb + t = &1`);;
\r
7166 e (UNDISCH_TAC `ta' + tb' + tx + ty = &1`);;
\r
7167 e (UNDISCH_TAC `ta'' + tb'' + tx' + ty' = &1`);;
\r
7169 e (NHANH (REAL_FIELD`ta'' + tb'' + tx' + ty' = &1 /\ ta' + tb' + tx + ty = &1 /\ ta + tb + t = &1 ==>
\r
7170 (ta' + ty * ta) + (tb' + ty * tb) + tx + (ty * t) = &1 /\
\r
7171 (ta'' + ty' * ta) + (tb'' + ty' * tb) + &0 + (tx' + ty' * t ) = &1 `));;
\r
7172 e (MATCH_MP_TAC (MESON[]` (b ==> c) ==> ( a /\ b ==> c)`));;
\r
7173 e (UNDISCH_TAC `x =
\r
7174 (ta' + ty * ta) % v1 + (tb' + ty * tb) % v3 + tx % v2 + (ty * t) % (v4:real^3)`);;
\r
7175 e (UNDISCH_TAC `x =
\r
7176 (ta'' + ty' * ta) % v1 +
\r
7177 (tb'' + ty' * tb) % v3 +
\r
7179 (tx' + ty' * t) % (v4:real^3)`);;
\r
7180 e (UNDISCH_TAC `~coplanar {v1, v2, v3, (v4:real^3)}`);;
\r
7181 e (ONCE_REWRITE_TAC[SET_RULE` {v1, v2, v3, v4} =
\r
7182 {v1,v3,v2,v4}`]);;
\r
7183 e (PHA THEN ONCE_REWRITE_TAC[MESON[]`a1/\a2/\a3/\a4/\a5 <=>
\r
7184 a1/\a5/\a2/\a4/\a3`]);;
\r
7185 e (ABBREV_TAC ` t11 = (ta'' + ty' * ta) `);;
\r
7186 e (ABBREV_TAC ` t33 = (tb'' + ty' * tb) `);;
\r
7187 e (ABBREV_TAC ` t44 = (tx' + ty' * t) `);;
\r
7188 e (ABBREV_TAC ` s11 = (ta' + ty * ta) `);;
\r
7189 e (ABBREV_TAC ` s33 = (tb' + ty * tb) `);;
\r
7190 e (ABBREV_TAC ` s44 = (ty * t) `);;
\r
7191 e (NHANH (SPEC_ALL (REWRITE_RULE[RIGHT_FORALL_IMP_THM] COEFS_4)));;
\r
7192 e (NHANH (MESON[]`(! x. p x ) ==> p (x:real^3)`));;
\r
7194 e (NHANH (MESON[]`(!ta tb tc td.
\r
7195 x = ta % v1 + tb % v3 + tc % v2 + td % v4 /\ ta + tb + tc + td = &1
\r
7196 ==> ta = COEF4_1 v1 v3 v2 v4 x /\
\r
7197 tb = COEF4_2 v1 v3 v2 v4 x /\
\r
7198 tc = COEF4_3 v1 v3 v2 v4 x /\
\r
7199 td = COEF4_4 v1 v3 v2 v4 x) /\
\r
7200 t11 + t33 + &0 + t44 = &1 /\
\r
7201 x = t11 % v1 + t33 % v3 + &0 % v2 + t44 % v4 /\
\r
7202 s11 + s33 + tx + s44 = &1 /\
\r
7203 x = s11 % v1 + s33 % v3 + tx % v2 + s44 % v4 ==>
\r
7206 e (UNDISCH_TAC `&0 < tx `);;
\r
7207 e (UNDISCH_TAC ` tx = &0 `);;
\r
7208 e (MESON_TAC[REAL_ARITH`~( a = &0 /\ &0 < a )`]);;
\r
7213 e (ONCE_REWRITE_TAC[MESON[]` a/\b/\c ==> l <=> b ==> a /\ c ==> l`]);;
\r
7214 e (REWRITE_TAC[CARD5]);;
\r
7215 e (NHANH (SET_RULE` ~(v1 IN {v2, v3, v4, v5}) /\
\r
7216 ~(v2 IN {v3, v4, v5}) /\
\r
7217 ~(v3 = v4 \/ v4 = v5 \/ v5 = v3) ==>
\r
7218 ~(v1 = v2 ) /\ ~(v3 = v2) /\ ~(v1 = v4) /\ ~ (v3 = v4) /\
\r
7219 {v1,v3} INTER {v2,v4} = {} /\
\r
7220 {v1, v3} INTER {v2, v5} = {} /\
\r
7221 {v1, v3} INTER {v4, v5} = {}`));;
\r
7222 e (SIMP_TAC[AFF_GE22; AFF_GT22; AFF_GE21]);;
\r
7223 e (REWRITE_TAC[IN_ELIM_THM]);;
\r
7224 e (STRIP_TAC THEN STRIP_TAC);;
\r
7228 e (NHANH (PROVE_B1B2_POS ));;
\r
7229 e (REPEAT STRIP_TAC);;
\r
7230 e (REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM; SUBSET; IN_UNION]);;
\r
7231 e (REPEAT STRIP_TAC);;
\r
7232 e (ABBREV_TAC ` r = b1 * b2' - b1' * b2`);;
\r
7233 e (ASM_CASES_TAC ` &0 <= r `);;
\r
7234 e (UNDISCH_TAC `x = a1' % v1 + a2' % v3 + b1' % v2 + b2' % (v4:real^3)`);;
\r
7235 e (ONCE_REWRITE_TAC[MESON[VECTOR_ARITH` a = a - b + (b:real^N)`]` x = a ==> l <=>
\r
7236 x = a - ( b1' / b1 ) % v5 + ( b1' / b1 ) % v5 ==> l `]);;
\r
7237 e (UNDISCH_TAC `v5 = a1 % v1 + a2 % v3 + b1 % v2 + b2 % (v4:real^3)`);;
\r
7238 e (PHA THEN PURE_ONCE_REWRITE_TAC[MESON[]`v = b /\ x = aa - t % v + t % v <=>
\r
7239 v = b /\ x = aa - t % b + t % v `]);;
\r
7240 e (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);;
\r
7243 e (UNDISCH_TAC` &0 < b1 `);;
\r
7244 e (SIMP_TAC[REAL_FIELD` &0 < b ==> a / b * b = a `]);;
\r
7245 e (REWRITE_TAC[VECTOR_ARITH` (a1' % v1 + a2' % v3 + b1' % v2 + b2' % v4) -
\r
7249 bb % v4) = (a1' - b1 ) % v1
\r
7250 + (a2' - b2 ) % v3 + ( b2' - bb ) % v4 `]);;
\r
7251 e (SIMP_TAC[REAL_FIELD`&0 < b ==> a - x / b * c = ( a * b - x * c ) / b `]);;
\r
7252 e (REPEAT STRIP_TAC THEN DISJ2_TAC);;
\r
7253 e (EXISTS_TAC`(a1' * b1 - b1' * a1) / b1 `);;
\r
7254 e (EXISTS_TAC`(a2' * b1 - b1' * a2) / b1`);;
\r
7255 e (EXISTS_TAC`(b2' * b1 - b1' * b2) / b1`);;
\r
7256 e (EXISTS_TAC`b1' / b1`);;
\r
7257 e (SIMP_TAC[VECTOR_ARITH` (a+b) + (c:real^N) = a + b + c `]);;
\r
7258 e (ASM_SIMP_TAC[REAL_LE_DIV; REAL_ARITH` b1 * b2' - b1' * b2
\r
7259 = b2' * b1 - b1' * b2 `]);;
\r
7260 e (ASM_MESON_TAC[REAL_FIELD` &0 < b1 /\ a1 + a2 + b1 + b2 = &1 /\
\r
7261 a1' + a2' + b1' + b2' = &1 /\ b1 * b2' - b1' * b2 = r ==>
\r
7262 (a1' * b1 - b1' * a1) / b1 + (a2' * b1 - b1' * a2) / b1 + r / b1 + b1' / b1 =
\r
7264 e (UNDISCH_TAC `x = a1' % v1 + a2' % v3 + b1' % v2 + b2' % (v4:real^3)`);;
\r
7265 e (ONCE_REWRITE_TAC[MESON[VECTOR_ARITH` a = a - b + (b:real^N)`]` x = a ==> l <=>
\r
7266 x = a - ( b2' / b2 ) % v5 + ( b2' / b2 ) % v5 ==> l `]);;
\r
7267 e (UNDISCH_TAC `v5 = a1 % v1 + a2 % v3 + b1 % v2 + b2 % (v4:real^3)`);;
\r
7268 e (PHA THEN PURE_ONCE_REWRITE_TAC[MESON[]`v = b /\ x = aa - t % v + t % v <=>
\r
7269 v = b /\ x = aa - t % b + t % v `]);;
\r
7270 e (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);;
\r
7271 e (UNDISCH_TAC` &0 < b2 `);;
\r
7272 e (ONCE_REWRITE_TAC[MESON[]` a ==> b /\ c ==> l <=>
\r
7273 b ==> a /\ c ==> l`]);;
\r
7275 e (IMP_TAC THEN SIMP_TAC[REAL_FIELD` &0 < b2 ==> b2' / b2 * b2 = b2'`]);;
\r
7276 e (REWRITE_TAC[VECTOR_ARITH`(a1' % v1 + a2' % v3 + b1' % v2 + a44 % v4) -
\r
7277 (a11 % v1 + a33 % v3 + a22 % v2 + a44 % v4) +
\r
7279 (a1' - a11) % v1 + (a2' - a33) % v3 + (b1' - a22) % v2 + a55 % v5`]);;
\r
7280 e (REPEAT STRIP_TAC THEN DISJ1_TAC);;
\r
7281 e (EXISTS_TAC` (a1' - b2' / b2 * a1) `);;
\r
7282 e (EXISTS_TAC` (a2' - b2' / b2 * a2) `);;
\r
7283 e (EXISTS_TAC` (b1' - b2' / b2 * b1) `);;
\r
7284 e (EXISTS_TAC` b2' / b2 `);;
\r
7285 e (UNDISCH_TAC ` ~( &0 <= r )`);;
\r
7286 e (ASM_SIMP_TAC[REAL_LE_DIV; REAL_FIELD` &0 < b2 ==>
\r
7287 b1' - b2' / b2 * b1 = ( -- ( b1 * b2' - b1' * b2 ))/ b2 `;
\r
7288 REAL_ARITH` ~( &0 <= a) <=> &0 <= -- a /\ ~( a = &0 ) `]);;
\r
7290 e (EXPAND_TAC "r");;
\r
7291 e (ASM_SIMP_TAC[REAL_FIELD` &0 < b2 /\ a1' + a2' + b1' + b2' = &1 /\ a1 + a2 + b1 + b2 = &1
\r
7292 ==> --(a1 * b2' - a1' * b2) / b2 +
\r
7293 --(a2 * b2' - a2' * b2) / b2 +
\r
7294 --(b1 * b2' - b1' * b2) / b2 +
\r
7297 e (REWRITE_TAC[SET_RULE`a INTER b SUBSET {} <=> (! x. ~( x IN a /\ x IN b ))`; IN_ELIM_THM]);;
\r
7299 e (ASM_SIMP_TAC[VECTOR_ARITH` ta % v1 +
\r
7302 ty % (a1 % v1 + a2 % v3 + b1 % v2 + b2 % v4)
\r
7303 = (ta + ty * a1 ) % v1 + ( tb + ty * a2 ) % v3 +
\r
7304 ( tx + ty * b1 ) % v2 + ( ty * b2 ) % v4 `;
\r
7305 VECTOR_ARITH` ta % v1 +
\r
7308 ty % (a1 % v1 + a2 % v3 + b1 % v2 + b2 % v4) =
\r
7309 ( ta + ty * a1 ) % v1 + ( tb + ty * a2 ) % v3 +
\r
7310 ( ty * b1 ) % v2 + ( tx + ty * b2 ) % v4 `]);;
\r
7311 e (ONCE_REWRITE_TAC[MESON[]` ~ a <=> a ==> F `] THEN STRIP_TAC);;
\r
7312 e (UNDISCH_TAC` ta + tb + tx + ty = &1 `);;
\r
7313 e (UNDISCH_TAC` a1 + a2 + b1 + b2 = &1 `);;
\r
7314 e (UNDISCH_TAC` ta' + tb' + tx' + ty' = &1 `);;
\r
7316 e (NHANH (REAL_FIELD`ta' + tb' + tx' + ty' = &1 /\
\r
7317 a1 + a2 + b1 + b2 = &1 /\
\r
7318 ta + tb + tx + ty = &1 ==>
\r
7319 (ta' + ty' * a1) + (tb' + ty' * a2) + (ty' * b1) +
\r
7320 (tx' + ty' * b2) = &1 /\
\r
7321 (ta + ty * a1) + (tb + ty * a2) + (tx + ty * b1) +
\r
7322 (ty * b2) = &1 `));;
\r
7324 e (UNDISCH_TAC `x =
\r
7325 (ta + ty * a1) % v1 +
\r
7326 (tb + ty * a2) % v3 +
\r
7327 (tx + ty * b1) % v2 +
\r
7328 (ty * b2) % (v4:real^3)`);;
\r
7329 e (UNDISCH_TAC `(ta + ty * a1) + (tb + ty * a2) + (tx + ty * b1) + ty * b2 = &1`);;
\r
7330 e (UNDISCH_TAC`x =
\r
7331 (ta' + ty' * a1) % v1 +
\r
7332 (tb' + ty' * a2) % v3 +
\r
7334 (tx' + ty' * b2) % (v4:real^3) `);;
\r
7335 e (UNDISCH_TAC`(ta' + ty' * a1) + (tb' + ty' * a2) + ty' * b1 + tx' + ty' * b2 = &1 `);;
\r
7336 e (UNDISCH_TAC `~coplanar {(v1:real^3), v2, v3, v4}`);;
\r
7338 e (ONCE_REWRITE_TAC[SET_RULE` {a,b,c,d} = {a,c,b,d}`]);;
\r
7339 e (NHANH (NOT_COPLANAR_AND_SUM_IMP_UNIQUE));;
\r
7341 e (NHANH (MESON[]`(!x s1 s2 s3 s4 t1 t2 t3 t4.
\r
7342 t1 + t2 + t3 + t4 = &1 /\
\r
7343 x = t1 % v1 + t2 % v3 + t3 % v2 + t4 % v4 /\
\r
7344 s1 + s2 + s3 + s4 = &1 /\
\r
7345 x = s1 % v1 + s2 % v3 + s3 % v2 + s4 % v4
\r
7346 ==> s1 = t1 /\ s2 = t2 /\ s3 = t3 /\ s4 = t4) /\
\r
7347 (ta' + ty' * a1) + (tb' + ty' * a2) + ty' * b1 + tx' + ty' * b2 = &1 /\
\r
7349 (ta' + ty' * a1) % v1 +
\r
7350 (tb' + ty' * a2) % v3 +
\r
7352 (tx' + ty' * b2) % v4 /\
\r
7353 (ta + ty * a1) + (tb + ty * a2) + (tx + ty * b1) + ty * b2 = &1 /\
\r
7355 (ta + ty * a1) % v1 +
\r
7356 (tb + ty * a2) % v3 +
\r
7357 (tx + ty * b1) % v2 +
\r
7358 (ty * b2) % v4 ==>
\r
7359 ty' * b1 = (tx + ty * b1) /\
\r
7360 (tx' + ty' * b2) = (ty * b2) `));;
\r
7361 e (NHANH (REAL_FIELD`a = b /\ aa = bb ==>
\r
7362 a * bb - b * aa = &0 `));;
\r
7365 e (FIRST_X_ASSUM MP_TAC);;
\r
7366 e (ONCE_REWRITE_TAC[REAL_ARITH` a = &0 <=> -- a = &0 `]);;
\r
7367 e (ONCE_REWRITE_TAC[REAL_ARITH` a = &0 <=> -- a = &0 `]);;
\r
7368 e (REWRITE_TAC[REAL_POLY_CONV` --((ty' * b1) * ty * b2 - (tx + ty * b1) * (tx' + ty' * b2)) `]);;
\r
7369 e (UNDISCH_TAC ` &0 < b1 `);;
\r
7370 e (UNDISCH_TAC ` &0 < b2 `);;
\r
7371 e (UNDISCH_TAC ` &0 < tx `);;
\r
7372 e (UNDISCH_TAC ` &0 < ty `);;
\r
7373 e (UNDISCH_TAC ` &0 < tx' `);;
\r
7374 e (UNDISCH_TAC ` &0 < ty' `);;
\r
7376 e (NHANH (MESON[REAL_LT_MUL]`
\r
7377 &0 < ty' /\ &0 < tx' /\ &0 < ty /\ &0 < tx /\ &0 < b2 /\ &0 < b1
\r
7378 ==> &0 < b1 * tx' * ty /\ &0 < b2 * tx * ty' /\ &0 < tx * tx' `));;
\r
7379 e (MESON_TAC[REAL_LT_IMP_NZ; REAL_LT_ADD]);;
\r
7380 let BAJSVHC = top_thm();;
\r