Update from HH
[Flyspeck/.git] / text_formalization / local / MTUWLUN.hl
1
2 (* ========================================================================== *)
3 (* FLYSPECK - BOOK FORMALIZATION                                              *)
4 (*                                                                            *)
5 (* Chapter: Local Fan                                              *)
6 (* Author: Hoang Le Truong                                        *)
7 (* Date: 2012-04-01                                                           *)
8 (* ========================================================================= *)
9
10
11
12
13 module   Mtuwlun = struct
14
15
16
17 open Polyhedron;;
18 open Sphere;;
19 open Fan_defs;;
20 open Hypermap;;
21 open Vol1;;
22 open Fan;;
23 open Topology;;         
24 open Fan_misc;;
25 open Planarity;; 
26 open Conforming;;
27 open Sphere;;
28 open Hypermap;;
29 open Fan;;
30 open Topology;;
31 open Prove_by_refinement;;
32 open Pack_defs;;
33 open Wrgcvdr_cizmrrh;;
34 open Local_lemmas;;
35 open Collect_geom;;
36 open Dih2k_hypermap;;
37 open Wjscpro;;
38 open Tecoxbm;;
39 open Hdplygy;;
40 open Nkezbfc_local;;
41 open Flyspeck_constants;;
42 open Gbycpxs;;
43
44
45 let IS_SY = new_definition`IS_SY (s:stable_sy) p q={x| ?n m. n<m /\ m< k_sy s /\ ((f_sy s) POWER n) x=q /\ ((f_sy s) POWER m) x=p }`;;
46
47 let kl_sy = new_definition`kl_sy (s:stable_sy) p q=CARD(IS_SY (s:stable_sy) p q)`;;
48
49 let fl_sy = new_definition`fl_sy (s:stable_sy) p q i= (if ~(i=q) then f_sy s i else p)`;;
50
51
52
53 let COVER1_SY=new_definition`COVER1_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=> I_SY s1= IS_SY s p q /\ I_SY s2= IS_SY s q p
54 /\ f_sy s1= fl_sy s p q /\ f_sy s2= fl_sy s q p`;;
55
56 let COVER2_SY=new_definition`COVER2_SY (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=> d_sy s <= d_sy s1 + d_sy s2 `;;
57
58
59 let COVER3_SY=new_definition`COVER3_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=> J_SY s1 SUBSET J_SY s UNION {{p,q}}/\ 
60 J_SY s2 SUBSET J_SY s UNION {{p,q}}`;;
61
62 let COVER4_SY=new_definition`COVER4_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=>
63 (!i j. ~({i,j }={p,q}) /\ i IN I_SY s1 /\ j IN I_SY s1
64 ==> a_sy s1 (i,j)=a_sy s (i,j)/\ b_sy s1 (i,j)=b_sy s (i,j))
65 /\ 
66 (!i j. ~({i,j }={p,q}) /\ i IN I_SY s2 /\ j IN I_SY s2
67 ==> a_sy s2 (i,j)=a_sy s (i,j)/\ b_sy s2 (i,j)=b_sy s (i,j))`;;
68
69
70 let COVER5_SY=new_definition`COVER5_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=>
71 a_sy s1 (p,q)<= a_sy s (p,q)/\ a_sy s2 (p,q)<= a_sy s (p,q)/\ a_sy s (p,q)<=b_sy s1 (p,q)
72 /\ a_sy s (p,q)<=b_sy s2 (p,q)`;;
73
74 let COVER6_SY=new_definition`COVER6_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=>
75 (({p,q} IN J_SY s1 <=> {p,q} IN J_SY s2 )
76 /\ ({p,q} IN J_SY s1 <=> ear_sy s1 \/ ear_sy s2))`;;
77
78 let COVER_SY=new_definition`COVER_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy) <=> COVER1_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy)
79 /\ COVER2_SY (s:stable_sy) (s1:stable_sy) (s2:stable_sy)
80 /\ COVER3_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy)
81 /\ COVER4_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy)
82 /\ COVER5_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy)
83 /\ COVER6_SY p q (s:stable_sy) (s1:stable_sy) (s2:stable_sy)`;;
84
85
86
87 let pmat1=new_definition`pmat1 (A:real^N^M)= (lambda i j. if i< dimindex(:P) then A$i$j else A$ dimindex(:M)$j):real^N^P`;;
88
89
90 let pmat2=new_definition`pmat2 (A:real^N^M)= (lambda i j.   A$(dimindex(:M)- dimindex(:P)+i)$j):real^N^P`;;
91
92
93 let DIA_SY=new_definition`DIA_SY p q (s:stable_sy) <=> ~(p=q) /\ p IN I_SY(s) /\ q IN I_SY s /\ ~(?i. i IN I_SY s /\ {p,q}= {i, f_sy s i})`;;
94
95
96
97
98
99
100 let CARD_I_SY_LT_3=prove(`
101 DIA_SY p q s
102 ==> 3< CARD (I_SY s)`,
103 MRESA1_TAC stable_sy_lemma`s:stable_sy`
104 THEN POP_ASSUM MP_TAC
105 THEN REWRITE_TAC[stable_system;constraint_system;torsor;
106 HAS_SIZE;]
107 THEN REWRITE_TAC[DIA_SY]
108 THEN REPEAT STRIP_TAC
109 THEN ASM_REWRITE_TAC[]
110 THEN MATCH_MP_TAC(ARITH_RULE`3<= A /\ ~(A=3) ==> 3< A`)
111 THEN ASM_REWRITE_TAC[]
112 THEN POP_ASSUM MP_TAC
113 THEN MATCH_MP_TAC MONO_NOT
114 THEN STRIP_TAC
115 THEN POP_ASSUM(fun th-> ASM_TAC THEN REWRITE_TAC[th;ARITH_RULE`~(3<3)`])
116 THEN STRIP_TAC
117 THEN STRIP_TAC
118 THEN DISCH_THEN(LABEL_TAC"THY1")
119 THEN DISCH_THEN(LABEL_TAC"THY2")
120 THEN DISCH_THEN(LABEL_TAC"THY3")
121 THEN DISCH_THEN(LABEL_TAC"THY4")
122 THEN REPEAT STRIP_TAC
123 THEN POP_ASSUM MP_TAC
124 THEN REMOVE_THEN"THY1" (fun th-> MRESA1_TAC th`p:num` THEN MRESA1_TAC th`f_sy (s:stable_sy) (p:num)`)
125 THEN REMOVE_THEN"THY3" (fun th-> MRESAL_TAC th[`SUC 0`;`p:num`][ARITH_RULE`0<SUC 0 /\ SUC 0<3`;POWER;o_DEF;I_DEF] THEN MRESAL_TAC th[`SUC (SUC 0)`;`p:num`][ARITH_RULE`0<SUC (SUC 0) /\ SUC (SUC 0)<3`;POWER;o_DEF;I_DEF]
126 THEN MRESAL_TAC th[`SUC 0`;`f_sy (s:stable_sy) (p:num):num`][ARITH_RULE`0<SUC 0 /\ SUC 0<3`;POWER;o_DEF;I_DEF])
127 THEN MRESA_TAC Geomdetail.CARD3[`p:num`;`f_sy (s:stable_sy) (p:num)`;`f_sy (s:stable_sy) (f_sy (s:stable_sy) (p:num))`]
128 THEN MP_TAC(SET_RULE`p IN I_SY s
129 /\ f_sy s p IN I_SY s
130 /\ f_sy s (f_sy s p) IN I_SY (s:stable_sy)
131 ==> {p, f_sy s p, f_sy s (f_sy s p)} SUBSET I_SY s `)
132 THEN RESA_TAC
133 THEN MRESA_TAC CARD_SUBSET_EQ[`{p, f_sy (s:stable_sy) p, f_sy s (f_sy s p)}`;`I_SY (s:stable_sy)`]
134 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
135 THEN ASM_REWRITE_TAC[SET_RULE`A IN{B,C,D}<=> A= B \/ A=C\/ A=D`]
136 THEN STRIP_TAC
137 THEN ASM_REWRITE_TAC[]
138 THENL[EXISTS_TAC`p:num`
139 THEN ASM_REWRITE_TAC[];
140 EXISTS_TAC`f_sy s (f_sy (s:stable_sy)p)`
141 THEN ASM_REWRITE_TAC[]
142 THEN REMOVE_THEN"THY4" (fun th-> MRESA1_TAC th`p:num`)
143 THEN POP_ASSUM MP_TAC
144 THEN REWRITE_TAC[ARITH_RULE`3=SUC(SUC(SUC 0))`;POWER;o_DEF;I_DEF]
145 THEN RESA_TAC
146 THEN SET_TAC[]]);;
147
148 let COVER_NOT_EAR_SY=prove(`!(s:stable_sy).
149 DIA_SY p q s
150 ==> ~(ear_sy s)`,
151 REWRITE_TAC[ear_sy;]
152 THEN GEN_TAC THEN STRIP_TAC
153 THEN MRESA_TAC (GEN_ALL CARD_I_SY_LT_3)[`p:num`;`q:num`;`s:stable_sy`]
154 THEN REWRITE_TAC[DE_MORGAN_THM]
155 THEN MP_TAC(ARITH_RULE`3 < CARD (I_SY s) ==> ~(CARD (I_SY (s:stable_sy))= 3)`)
156 THEN RESA_TAC);;
157
158 let DIAGONAL_SY=prove(`DIA_SY p q s
159 ==> ~({p,q} IN J_SY s) `,
160 MRESA1_TAC stable_sy_lemma`s:stable_sy`
161 THEN POP_ASSUM MP_TAC
162 THEN REWRITE_TAC[stable_system;constraint_system;DIA_SY]
163 THEN REPEAT STRIP_TAC
164 THEN MP_TAC(SET_RULE`J_SY s SUBSET {{i, f_sy s i} | i | i IN I_SY (s:stable_sy)}
165 /\ {p, q} IN J_SY s
166 ==> {p, q} IN {{i, f_sy s i} | i | i IN I_SY (s:stable_sy)}`)
167 THEN ASM_REWRITE_TAC[IN_ELIM_THM]
168 THEN STRIP_TAC);;
169
170 let SCHANGE= new_definition`SCHANGE (f:num->num) (s:stable_sy) (s1:stable_sy)<=>
171 k_sy s= k_sy s1
172 /\ d_sy s= d_sy s1
173 /\ (I_SY s)=IMAGE f (I_SY s1)
174 /\ (!p q. {f p, f q} IN J_SY s<=> {p,q} IN J_SY s1)
175 /\ (!p q. a_sy s (f p, f q)=a_sy s1 (p,q))
176 /\ (!p q. b_sy s (f p, f q)=b_sy s1 (p,q))
177 /\ f_sy s1 =(f_sy s) o f
178 `;;
179
180
181
182 let IK_SY=prove(`1<= p/\ I_SY s= 0..(p-1) ==> k_sy (s:stable_sy)= p`,
183 STRIP_TAC
184 THEN MP_TAC(ARITH_RULE`1<= p ==> (p - 1 + 1)-0 = p`)
185 THEN RESA_TAC
186 THEN MRESA1_TAC stable_sy_lemma`s:stable_sy`
187 THEN POP_ASSUM MP_TAC
188 THEN ASM_REWRITE_TAC[stable_system;constraint_system;torsor;HAS_SIZE;CARD_NUMSEG;]
189 THEN REPEAT STRIP_TAC
190 THEN ASM_REWRITE_TAC[]);;
191
192
193 let K_SY_LE2=prove(`2< k_sy (s:stable_sy)`,
194 MRESA1_TAC stable_sy_lemma`s:stable_sy`
195 THEN POP_ASSUM MP_TAC
196 THEN ASM_REWRITE_TAC[stable_system;constraint_system;torsor;HAS_SIZE;CARD_NUMSEG;]
197 THEN REPEAT STRIP_TAC
198 THEN ASM_REWRITE_TAC[]
199 THEN ASM_TAC
200 THEN STRIP_TAC
201 THEN REPEAT(STRIP_TAC THEN REMOVE_ASSUM_TAC)
202 THEN POP_ASSUM MP_TAC
203 THEN ARITH_TAC);;
204
205 let IN_J_IMP_IN_J1_SY=prove(` k_sy s1=p
206 /\ I_SY s1= 0..p-1
207 /\ f_sy s1=(\i. ((1+i):num MOD p))
208 /\ {0, p - 1} IN J_SY s1
209 ==> p-1,p IN J1_SY (s1:stable_sy)`,
210 REPEAT STRIP_TAC
211 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
212 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM]
213 THEN MP_TAC(ARITH_RULE`2<p ==> SUC(p-1)= p/\1<= p-1 /\ p-1<=p /\ p-1< p /\ ~(p=0) /\ 1+p-1=p`)
214 THEN RESA_TAC
215 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
216 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p`]
217 THEN EXISTS_TAC`p-1:num`
218 THEN ASM_REWRITE_TAC[IN_NUMSEG]
219 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B}={B,A}`]
220 THEN ASM_REWRITE_TAC[]);;
221
222
223
224 let D_FUN_COVER_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
225 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
226 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
227 /\ 1<= k-p
228 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
229 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
230 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
231 /\ (ear_sy s2 <=> ear_sy s3)
232 /\ DIA_SY 0 (p-1) s
233 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
234 /\ COVER_SY 0 (p-1) s s1 s2 
235 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
236 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
237 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
238 /\ matvec(pmat1(vecmats l))= l1
239 /\ matvec(pmat2(vecmats l))= l2
240 ==> d_fun(s,l) <= d_fun(s1,l1) + d_fun(s3,l2)`,
241 [REPEAT STRIP_TAC
242 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
243 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
244 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
245 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
246 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p `)
247 THEN RESA_TAC
248 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
249 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
250 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
251 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
252 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
253 THEN MRESA_TAC (GEN_ALL COVER_NOT_EAR_SY)[`0`;`p-1`;`s:stable_sy`] 
254 THEN MRESA1_TAC sigma_sy`s:stable_sy`
255 THEN MRESA_TAC (GEN_ALL DIAGONAL_SY)[`0:num`;`p-1`;`s:stable_sy`]
256 THEN DISJ_CASES_TAC(SET_RULE`{0,p-1} IN J_SY (s1:stable_sy)\/ ~({0,p-1} IN J_SY (s1:stable_sy))`);
257 FIND_ASSUM MP_TAC `COVER_SY 0 (p - 1) s s1 (s2:stable_sy)`
258 THEN REWRITE_TAC[COVER_SY;COVER3_SY;COVER6_SY]
259 THEN RESA_TAC;
260 ASM_REWRITE_TAC[d_fun]
261 THEN MRESA1_TAC sigma_sy`s1:stable_sy`
262 THEN FIND_ASSUM MP_TAC`SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 (s3:stable_sy)`
263 THEN REWRITE_TAC[SCHANGE]
264 THEN RESA_TAC
265 THEN SUBGOAL_THEN`{0,1} IN J_SY (s3:stable_sy)`ASSUME_TAC;
266 REMOVE_ASSUM_TAC
267 THEN REMOVE_ASSUM_TAC
268 THEN REMOVE_ASSUM_TAC
269 THEN POP_ASSUM(fun th-> MRESA_TAC th[`0`;`1`])
270 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th;ARITH_RULE`A+0=A/\ ~(1=0)`])
271 THEN MP_TAC(ARITH_RULE`2<p ==> p-2+1 =p-1`)
272 THEN RESA_TAC
273 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`];
274 MRESA_TAC (GEN_ALL IN_J_IMP_IN_J1_SY)[`p:num`;`s1:stable_sy`]
275 THEN SUBGOAL_THEN`(k-p+2,1) IN J1_SY (s3:stable_sy)`ASSUME_TAC;
276 REWRITE_TAC[J1_SY;IN_ELIM_THM]
277 THEN POP_ASSUM MP_TAC
278 THEN POP_ASSUM MP_TAC
279 THEN REMOVE_ASSUM_TAC
280 THEN ASM_REWRITE_TAC[IN_NUMSEG]
281 THEN STRIP_TAC
282 THEN STRIP_TAC
283 THEN EXISTS_TAC`k-p+2`
284 THEN ASM_REWRITE_TAC[]
285 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\1+0=1/\ SUC 0=1 /\ k - p + 2 <= k - p + 2`]
286 THEN MRESA_TAC MOD_LT[`1:num`;`k-p+2:num`];
287 MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats (l1:real^(P,3)finite_product))))`;`J1_SY (s1:stable_sy)`;`p-1,p`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
288 THEN MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats (l2:real^(N,3)finite_product))))`;`J1_SY (s3:stable_sy)`;`k-p+2,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
289 THEN SUBGOAL_THEN`J1_SY s1  DELETE (p-1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
290 ASM_REWRITE_TAC[SUBSET;J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
291 THEN REPEAT STRIP_TAC
292 THEN POP_ASSUM MP_TAC
293 THEN POP_ASSUM MP_TAC
294 THEN ASM_REWRITE_TAC[PAIR_EQ;]
295 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
296 THEN RESA_TAC;
297 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
298 MP_TAC(ARITH_RULE`i<p /\ 2<p ==> i=p-1 \/ i< p-1:num`)
299 THEN RESA_TAC;
300 MP_TAC(ARITH_RULE`2<p ==> SUC(p-1)=p /\ p-1<p`)
301 THEN RESA_TAC
302 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
303 STRIP_TAC
304 THEN STRIP_TAC
305 THEN EXISTS_TAC`i:num`
306 THEN ASM_REWRITE_TAC[]
307 THEN MP_TAC(ARITH_RULE`i<p-1 /\ p < k /\ 2<p ==> i< k /\ i<=k:num /\ 1+i<k/\ 1+i< p/\ ~(i=1+i)/\ ~(i=p-1)/\ ~(p=2)`)
308 THEN RESA_TAC
309 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
310 THEN POP_ASSUM(fun th-> ASM_TAC THEN REWRITE_TAC[th] THEN REPEAT STRIP_TAC)
311 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
312 THEN MRESA_TAC MOD_LT[`1+i:num`;`k:num`]
313 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
314 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[SYM th] )
315 THEN FIND_ASSUM MP_TAC`J_SY s1 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
316 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
317 THEN STRIP_TAC
318 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{i,(1+i) MOD p}`)
319 THEN POP_ASSUM MP_TAC
320 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
321 THEN STRIP_TAC
322 THEN MP_TAC(SET_RULE`{i, 1 + i} = {0, p - 1} /\ ~(i=1+i) /\ ~(i=p-1) ==> i=0 /\ 1+i= p-1`)
323 THEN RESA_TAC
324 THEN POP_ASSUM MP_TAC
325 THEN ASM_REWRITE_TAC[ARITH_RULE`1+0=p-1<=> p=2`];
326 SUBGOAL_THEN`IMAGE (\(x,y). (p - 2 + x), (p - 2 + y)) (J1_SY s3  DELETE (k-p+2,1)) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
327 ASM_REWRITE_TAC[J1_SY;IMAGE;DELETE;SUBSET;IN_ELIM_THM;IN_NUMSEG]
328 THEN REPEAT STRIP_TAC
329 THEN POP_ASSUM MP_TAC
330 THEN POP_ASSUM MP_TAC
331 THEN ASM_REWRITE_TAC[PAIR_EQ;]
332 THEN MP_TAC(ARITH_RULE`i<=k-p+2 ==> i=k-p+2 \/ i< k-p+2:num`)
333 THEN RESA_TAC;
334 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
335 MP_TAC(ARITH_RULE`i<k-p+2 /\ 2<k-p+2 ==> i=k-p+1 \/ i< k-p+1:num`)
336 THEN RESA_TAC;
337 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
338 THEN RESA_TAC
339 THEN RESA_TAC
340 THEN MP_TAC(ARITH_RULE`2<p /\ 2< k-p+2 /\ 2< k ==> p-2+k-p+1=k-1/\ SUC(k-p+1)=k-p+2 /\ k-p+1<k-p+2/\ p - 2 + k - p + 2=k/\ 1<=k-1 /\ k-1<=k/\ k-1<k/\ 1+k-1=k /\ SUC(k-1)=k/\ 1 + k - p + 1= k - p + 2 /\ ~(k-p+1=0)`)
341 THEN RESA_TAC
342 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`]
343 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
344 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
345 THEN EXISTS_TAC`k-1`
346 THEN ASM_REWRITE_TAC[]
347 THEN FIND_ASSUM MP_TAC`{(k - p + 1) MOD (k - p + 2), (f_sy s2 o
348                                      (\x. if x = 0
349                                           then 0
350                                           else (p - 2 + x) MOD k))
351                                     ((k - p + 1) MOD (k - p + 2))} IN
352       J_SY (s3:stable_sy)`
353 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
354       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
355 THEN ASM_REWRITE_TAC[]
356 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
357 THEN STRIP_TAC
358 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`k-p+1`;`0`]th))`!p' q.
359           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
360                                                         then 0
361                                                         else (p - 2 + q) MOD
362                                                              k)} IN
363           J_SY s2 <=>
364           {p', q} IN J_SY (s3:stable_sy)`
365 THEN POP_ASSUM (fun th-> REWRITE_TAC[th;ARITH_RULE`0=0`])
366 THEN ASM_REWRITE_TAC[]
367 THEN STRIP_TAC
368 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
369 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
370 THEN STRIP_TAC
371 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{k-1,0}`);
372 POP_ASSUM MP_TAC
373 THEN MP_TAC(ARITH_RULE`1<=k-p /\2<p==> ~(k-1=p-1) /\ ~(0= p-1)`)
374 THEN RESA_TAC
375 THEN MP_TAC(SET_RULE`~(k-1=p-1) /\ ~(0= p-1)==> ~(p-1 IN {k-1,0})`)
376 THEN ASM_REWRITE_TAC[]
377 THEN SET_TAC[];
378 STRIP_TAC
379 THEN STRIP_TAC
380 THEN EXISTS_TAC`p-2+i:num`
381 THEN ASM_REWRITE_TAC[]
382 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==> p-2+i< k/\ p-2+i<=k /\ 1<=p-2+i/\ 1+p-2+i<k /\ 1+i< k-p+2/\ p-2+1+i<k`)
383 THEN RESA_TAC
384 THEN MRESA_TAC MOD_LT[`p-2+1+i:num`;`k:num`]
385 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
386 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==>  ~(i=0)/\ ~(1+i=0)`)
387 THEN RESA_TAC
388 THEN MRESA_TAC MOD_LT[`1+i:num`;`k-p+2:num`]
389 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
390 THEN REWRITE_TAC[ARITH_RULE`SUC (p - 2 + i)= p - 2 + SUC i`]
391 THEN MRESA_TAC MOD_LT[`1+p-2+i:num`;`k:num`]
392 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`i MOD (k - p + 2)`;`(f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
393                           (i MOD (k - p + 2))`] th))`!p' q.
394           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
395                                                         then 0
396                                                         else (p - 2 + q) MOD
397                                                              k)} IN
398           J_SY s2 <=>
399           {p', q} IN J_SY  (s3:stable_sy)`
400 THEN FIND_ASSUM(fun th-> REWRITE_TAC[th])`{i MOD (k - p + 2), (f_sy s2 o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
401                           (i MOD (k - p + 2))} IN
402       J_SY (s3:stable_sy)` 
403 THEN REMOVE_ASSUM_TAC
404 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
405 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
406       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
407 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
408 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
409 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
410 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
411 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
412 THEN STRIP_TAC
413 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
414 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
415 THEN STRIP_TAC
416 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{p-2+i,p-2+1+i}`);
417 ASM_REWRITE_TAC[ARITH_RULE`1+p-2+i= p-2+1+i`];
418 MP_TAC(SET_RULE`{p - 2 + i, p - 2 + 1 + i} = {0, p - 1} ==> (p-2+i=0) \/ (p-2+1+i=0)`)
419 THEN RESA_TAC
420 THEN MP_TAC(ARITH_RULE`1<=i /\ 2< p==> ~(p-2+i=0) /\ ~(p-2+1+i=0)`)
421 THEN ASM_REWRITE_TAC[];
422 MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s1:stable_sy)`;`p-1,p`][FINITE_J1_SY]
423 THEN MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s3:stable_sy)`;`k-p+2,1`][FINITE_J1_SY]
424 THEN DISJ_CASES_TAC(SET_RULE`ear_sy s3 \/ ~(ear_sy (s3:stable_sy))`);
425 ASM_REWRITE_TAC[sigma_sy]
426 THEN MATCH_MP_TAC(REAL_ARITH`
427 d_sy s <=
428  d_sy s1 +
429    d_sy s3
430 /\ 
431 &0<= sum (J1_SY s)
432  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l)))
433 /\
434 &0<=  sum (J1_SY s1 DELETE (p - 1,p))
435    (\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats l1)))
436 /\ &0<=   cstab - norm (row (p - 1) (vecmats l1) - row p (vecmats l1))
437 /\
438 &0<=
439  sum (J1_SY s3 DELETE (k - p + 2,1))
440   (\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats l2))) 
441 /\ &0<=  cstab - norm (row (k - p + 2) (vecmats l2) - row 1 (vecmats l2))
442 ==>
443 d_sy s +
444  #0.1 *
445  -- &1 *
446  sum (J1_SY s)
447  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l))) <=
448  (d_sy s1 +
449   #0.1 *
450   &1 *
451   (sum (J1_SY s1 DELETE (p - 1,p))
452    (\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats l1))) +
453    cstab - norm (row (p - 1) (vecmats l1) - row p (vecmats l1)))) +
454  d_sy s3 +
455  #0.1 *
456  &1 *
457  (sum (J1_SY (s3:stable_sy) DELETE (k - p + 2,1))
458   (\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats l2))) +
459   cstab - norm (row (k - p + 2) (vecmats l2) - row 1 (vecmats l2)))`)
460 THEN RESA_TAC;
461 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
462 THEN REWRITE_TAC[COVER2_SY]
463 THEN RESA_TAC;
464 STRIP_TAC;
465 MATCH_MP_TAC SUM_POS_LE
466 THEN REWRITE_TAC[FINITE_J1_SY]
467 THEN REPEAT STRIP_TAC
468 THEN POP_ASSUM MP_TAC
469 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG]
470 THEN STRIP_TAC
471 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
472 THEN POP_ASSUM MP_TAC
473 THEN REAL_ARITH_TAC;
474 STRIP_TAC;
475 MATCH_MP_TAC SUM_POS_LE
476 THEN ASM_REWRITE_TAC[]
477 THEN REPEAT STRIP_TAC
478 THEN DISJ_CASES_TAC(SET_RULE`x=p:num,1 \/ ~(x=p:num,1 )`);
479 ASM_REWRITE_TAC[]
480 THEN EXPAND_TAC"l1"
481 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
482 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
483 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
484 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
485 POP_ASSUM MP_TAC
486 THEN ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
487 THEN RESA_TAC
488 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
489 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
490 THEN RESA_TAC
491 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
492 ASM_REWRITE_TAC[]
493 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p`]
494 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
495 THEN POP_ASSUM MP_TAC
496 THEN REAL_ARITH_TAC;
497 SUBGOAL_THEN`x IN J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1)` ASSUME_TAC;
498 POP_ASSUM MP_TAC
499 THEN POP_ASSUM MP_TAC
500 THEN REWRITE_TAC[IN_ELIM_THM;DELETE]
501 THEN SET_TAC[];
502 MP_TAC(SET_RULE`x IN J1_SY s1 DELETE (p - 1,p) DELETE (p,1)
503 /\ J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY s
504 ==> x IN J1_SY (s:stable_sy)`)
505 THEN RESA_TAC
506 THEN POP_ASSUM MP_TAC
507 THEN POP_ASSUM MP_TAC
508 THEN POP_ASSUM MP_TAC
509 THEN POP_ASSUM MP_TAC
510 THEN DISCH_THEN(LABEL_TAC"THY")
511 THEN DISCH_THEN(LABEL_TAC"THY1")
512 THEN REPEAT STRIP_TAC
513 THEN REMOVE_THEN"THY" MP_TAC
514 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
515 THEN RESA_TAC
516 THEN POP_ASSUM MP_TAC
517 THEN REMOVE_THEN"THY1" MP_TAC
518 THEN ASM_REWRITE_TAC[]
519 THEN MP_TAC(ARITH_RULE`i<=p==> i=p \/ i<p:num`)
520 THEN RESA_TAC;
521 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
522 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
523 THEN RESA_TAC;
524 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
525 THEN RESA_TAC
526 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
527 RESA_TAC
528 THEN RESA_TAC
529 THEN EXPAND_TAC"l1"
530 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
531 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
532 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
533 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
534 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
535 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
536 THEN RESA_TAC
537 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
538 ASM_REWRITE_TAC[]
539 THEN POP_ASSUM MP_TAC
540 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG]
541 THEN STRIP_TAC
542 THEN MP_TAC(ARITH_RULE`SUC i < p /\ 1<=k-p ==> i <= k/\ i<k`)
543 THEN RESA_TAC
544 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
545 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
546 THEN POP_ASSUM MP_TAC
547 THEN REAL_ARITH_TAC;
548 STRIP_TAC;
549 SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
550 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
551 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
552 POP_ASSUM MP_TAC
553 THEN ASM_REWRITE_TAC[ARITH_RULE`p <= p`]
554 THEN EXPAND_TAC"l1"
555 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
556 THEN RESA_TAC
557 THEN SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
558 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
559 THEN RESA_TAC
560 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
561 ASM_REWRITE_TAC[]
562 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`p-1`;`k:num`] th) )`!i j.
563           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
564           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
565 THEN REWRITE_TAC[IN_ELIM_THM;UNION;IN_SING]
566 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
567 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`;SET_RULE`{p-1,0}={0,p-1}`]
568 THEN REAL_ARITH_TAC;
569 STRIP_TAC;
570 MATCH_MP_TAC SUM_POS_LE
571 THEN ASM_REWRITE_TAC[]
572 THEN REPEAT STRIP_TAC
573 THEN DISJ_CASES_TAC(SET_RULE`x=k-p+1,k-p+2 \/ ~(x=k-p+1,k-p+2 )`);
574 ASM_REWRITE_TAC[]
575 THEN EXPAND_TAC"l2"
576 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
577 THEN SUBGOAL_THEN`row (k-p+1) ((pmat2 (vecmats l)):real^3^N) = row (k-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
578 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+1<=k-p+2 /\ 1<= k-p+1 /\ k - (k - p + 2) + k - p + 1= k-1`)
579 THEN RESA_TAC
580 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
581 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
582 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
583 THEN RESA_TAC
584 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
585 ASM_REWRITE_TAC[]
586 THEN MP_TAC(ARITH_RULE` 2<k ==> 1<=k-1 /\ k-1<= k /\ SUC (k - 1)= k /\ k-1<k`)
587 THEN RESA_TAC
588 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
589 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k-1:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
590 THEN POP_ASSUM MP_TAC
591 THEN REAL_ARITH_TAC;
592 POP_ASSUM MP_TAC
593 THEN POP_ASSUM MP_TAC
594 THEN DISCH_THEN(LABEL_TAC"THY")
595 THEN DISCH_THEN(LABEL_TAC"THY1")
596 THEN REMOVE_THEN"THY" MP_TAC
597 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
598 THEN RESA_TAC
599 THEN POP_ASSUM MP_TAC
600 THEN REMOVE_THEN"THY1" MP_TAC
601 THEN ASM_REWRITE_TAC[]
602 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
603 THEN RESA_TAC;
604 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
605 MP_TAC(ARITH_RULE`i< k-p+2 /\ 2<p ==> i=k-p +1 \/ i< k-p+1:num`)
606 THEN RESA_TAC;
607 MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> k-p+1< k-p+2 /\ SUC (k-p+1)=k-p+2`)
608 THEN RESA_TAC
609 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`];
610 RESA_TAC
611 THEN RESA_TAC
612 THEN EXPAND_TAC"l2"
613 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
614 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
615 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
616 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
617 THEN RESA_TAC
618 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
619 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
620 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+1 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
621 THEN RESA_TAC
622 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
623 ASM_REWRITE_TAC[]
624 THEN MP_TAC(ARITH_RULE` i< k-p+1 /\ 2< p /\ 1<= k-p ==> 1<=p-2+i /\ p-2+i <= k /\ SUC (p-2+i)= p-2+ SUC i /\ p-2+i<k`)
625 THEN RESA_TAC
626 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
627 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`p-2+i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
628 THEN POP_ASSUM MP_TAC
629 THEN REAL_ARITH_TAC;
630 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
631 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
632 THEN RESA_TAC
633 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
634 SUBGOAL_THEN`row 1 ((pmat2 (vecmats l)):real^3^N) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
635 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + 1= p-1/\ 1<=1 /\ 1<=k-p+2`)
636 THEN RESA_TAC
637 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
638 EXPAND_TAC"l2"
639 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
640 THEN ASM_REWRITE_TAC[]
641 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`k:num`;`p-1:num`] th) )`!i j.
642           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
643           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
644 THEN REWRITE_TAC[IN_ELIM_THM;UNION;IN_SING]
645 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
646 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`;SET_RULE`{p-1,0}={0,p-1}`]
647 THEN REAL_ARITH_TAC;
648 ASM_REWRITE_TAC[sigma_sy]
649 THEN SUBGOAL_THEN `cstab - norm (row (p - 1) (vecmats (l1:real^(P,3)finite_product)) - row p (vecmats l1)) =cstab - norm (row (k-p + 2) (vecmats (l2:real^(N,3)finite_product)) - row 1 (vecmats l2))` ASSUME_TAC;
650 REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
651 THEN EXPAND_TAC"l1"
652 THEN EXPAND_TAC"l2"
653 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
654 THEN SUBGOAL_THEN`row 1 ((pmat2 (vecmats l)):real^3^N) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
655 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + 1= p-1/\ 1<=1 /\ 1<=k-p+2`)
656 THEN RESA_TAC
657 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
658 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
659 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
660 THEN RESA_TAC
661 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
662 SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
663 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
664 THEN RESA_TAC
665 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
666 SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
667 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
668 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
669 POP_ASSUM MP_TAC
670 THEN ASM_REWRITE_TAC[ARITH_RULE`p <= p`]
671 THEN RESA_TAC
672 THEN SIMP_TAC[NORM_SUB];
673 ASM_REWRITE_TAC[]
674 THEN SUBGOAL_THEN`(!x y.
675            x IN J1_SY s3 DELETE (k - p + 2,1) /\
676            y IN J1_SY (s3:stable_sy) DELETE (k - p + 2,1) /\
677            (\(x,y). p - 2 + x,p - 2 + y) x = (\(x,y). p - 2 + x,p - 2 + y) y
678            ==> x = y)`ASSUME_TAC;
679 REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM]
680 THEN REPEAT STRIP_TAC
681 THEN POP_ASSUM MP_TAC
682 THEN ASM_REWRITE_TAC[PAIR_EQ;ARITH_RULE`p-2+B=p-2+C<=> B=C`];
683 SUBGOAL_THEN`!x. x IN (J1_SY (s3:stable_sy) DELETE (k - p + 2,1))
684 ==> 
685       ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
686        (\(x,y). p - 2 + x,p - 2 + y)) x
687 = (\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2))) x`
688 ASSUME_TAC;
689 ASM_REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;o_DEF;IN_NUMSEG]
690 THEN REPEAT STRIP_TAC
691 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
692 THEN EXPAND_TAC"l2"
693 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
694 THEN POP_ASSUM MP_TAC
695 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
696 THEN RESA_TAC;
697 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
698 MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
699 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
700 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
701 THEN RESA_TAC
702 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
703 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
704 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+2 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
705 THEN RESA_TAC
706 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
707 ASM_REWRITE_TAC[];
708 MRESA_TAC SUM_EQ[`      ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
709        (\(x,y). p - 2 + x,p - 2 + y))`;`(\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2)))`;`(J1_SY (s3:stable_sy) DELETE (k - p + 2,1))`]
710 THEN
711 MRESA_TAC SUM_IMAGE[`(\(x,y). p - 2 + x,p - 2 + y)`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s3:stable_sy) DELETE (k - p + 2,1)`]
712 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
713 THEN MRESAL_TAC SUM_DIFF[`(\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l)))`;`J1_SY(s:stable_sy)`;`(IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY (s3:stable_sy) DELETE (k - p + 2,1)))`][FINITE_J1_SY]
714 THEN MATCH_MP_TAC(REAL_ARITH`
715 d_sy s <= d_sy s1+  d_sy s3
716 /\ &0<= sum (J1_SY s1 DELETE (p - 1,p))
717    (\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats l1)))
718 /\ &0<=
719 sum (J1_SY s)
720  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l)))
721 - sum (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))
722   (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l)))
723 ==> 
724 d_sy s +
725  #0.1 *
726  -- &1 *
727  sum (J1_SY (s:stable_sy))
728  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l))) <=
729  (d_sy s1 +
730   #0.1 *
731   &1 *
732   (sum (J1_SY s1 DELETE (p - 1,p))
733    (\x. cstab - norm (row (FST x) (vecmats (l1:real^(P,3)finite_product)) - row (SND x) (vecmats l1))) +
734    cstab - norm (row (k - p + 2) (vecmats l2) - row 1 (vecmats l2)))) +
735  d_sy s3 +
736  #0.1 *
737  -- &1 *
738  (sum (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))
739   (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product)))) +
740   cstab - norm (row (k - p + 2) (vecmats (l2:real^(N,3)finite_product)) - row 1 (vecmats l2)))`)
741 THEN RESA_TAC;
742 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
743 THEN REWRITE_TAC[COVER2_SY]
744 THEN RESA_TAC;
745 STRIP_TAC;
746 MATCH_MP_TAC SUM_POS_LE
747 THEN ASM_REWRITE_TAC[]
748 THEN REPEAT STRIP_TAC
749 THEN DISJ_CASES_TAC(SET_RULE`x=p:num,1 \/ ~(x=p:num,1 )`);
750 ASM_REWRITE_TAC[]
751 THEN EXPAND_TAC"l1"
752 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
753 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
754 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
755 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
756 POP_ASSUM MP_TAC
757 THEN ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
758 THEN RESA_TAC
759 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
760 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
761 THEN RESA_TAC
762 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
763 ASM_REWRITE_TAC[]
764 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p`]
765 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
766 THEN POP_ASSUM MP_TAC
767 THEN REAL_ARITH_TAC;
768 SUBGOAL_THEN`x IN J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1)` ASSUME_TAC;
769 POP_ASSUM MP_TAC
770 THEN POP_ASSUM MP_TAC
771 THEN REWRITE_TAC[IN_ELIM_THM;DELETE]
772 THEN SET_TAC[];
773 MP_TAC(SET_RULE`x IN J1_SY s1 DELETE (p - 1,p) DELETE (p,1)
774 /\ J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY s
775 ==> x IN J1_SY (s:stable_sy)`)
776 THEN RESA_TAC
777 THEN POP_ASSUM MP_TAC
778 THEN POP_ASSUM MP_TAC
779 THEN POP_ASSUM MP_TAC
780 THEN POP_ASSUM MP_TAC
781 THEN DISCH_THEN(LABEL_TAC"THY")
782 THEN DISCH_THEN(LABEL_TAC"THY1")
783 THEN REPEAT STRIP_TAC
784 THEN REMOVE_THEN"THY" MP_TAC
785 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
786 THEN RESA_TAC
787 THEN POP_ASSUM MP_TAC
788 THEN REMOVE_THEN"THY1" MP_TAC
789 THEN ASM_REWRITE_TAC[]
790 THEN MP_TAC(ARITH_RULE`i<=p==> i=p \/ i<p:num`)
791 THEN RESA_TAC;
792 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
793 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
794 THEN RESA_TAC;
795 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
796 THEN RESA_TAC
797 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
798 RESA_TAC
799 THEN RESA_TAC
800 THEN EXPAND_TAC"l1"
801 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
802 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
803 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
804 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
805 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
806 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
807 THEN RESA_TAC
808 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
809 ASM_REWRITE_TAC[]
810 THEN POP_ASSUM MP_TAC
811 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG]
812 THEN STRIP_TAC
813 THEN MP_TAC(ARITH_RULE`SUC i < p /\ 1<=k-p ==> i <= k/\ i<k`)
814 THEN RESA_TAC
815 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
816 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
817 THEN POP_ASSUM MP_TAC
818 THEN REAL_ARITH_TAC;
819 POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
820 THEN MATCH_MP_TAC SUM_POS_LE
821 THEN STRIP_TAC;
822 MATCH_MP_TAC FINITE_DIFF
823 THEN REWRITE_TAC[FINITE_J1_SY];
824 REPEAT STRIP_TAC
825 THEN POP_ASSUM MP_TAC
826 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG;DIFF]
827 THEN STRIP_TAC
828 THEN REMOVE_ASSUM_TAC
829 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
830 THEN POP_ASSUM MP_TAC
831 THEN REAL_ARITH_TAC;
832 ASM_REWRITE_TAC[d_fun]
833 THEN MRESA1_TAC sigma_sy`s3:stable_sy`
834 THEN FIND_ASSUM MP_TAC`SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 (s3:stable_sy)`
835 THEN REWRITE_TAC[SCHANGE]
836 THEN RESA_TAC
837 THEN SUBGOAL_THEN`{0,1} IN J_SY (s3:stable_sy)`ASSUME_TAC;
838 REMOVE_ASSUM_TAC
839 THEN REMOVE_ASSUM_TAC
840 THEN REMOVE_ASSUM_TAC
841 THEN POP_ASSUM(fun th-> MRESA_TAC th[`0`;`1`])
842 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th;ARITH_RULE`A+0=A/\ ~(1=0)`])
843 THEN MP_TAC(ARITH_RULE`2<p ==> p-2+1 =p-1`)
844 THEN RESA_TAC
845 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`];
846 MRESA_TAC (GEN_ALL IN_J_IMP_IN_J1_SY)[`p:num`;`s1:stable_sy`]
847 THEN SUBGOAL_THEN`(k-p+2,1) IN J1_SY (s3:stable_sy)`ASSUME_TAC;
848 REWRITE_TAC[J1_SY;IN_ELIM_THM]
849 THEN POP_ASSUM MP_TAC
850 THEN POP_ASSUM MP_TAC
851 THEN REMOVE_ASSUM_TAC
852 THEN ASM_REWRITE_TAC[IN_NUMSEG]
853 THEN STRIP_TAC
854 THEN STRIP_TAC
855 THEN EXISTS_TAC`k-p+2`
856 THEN ASM_REWRITE_TAC[]
857 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\1+0=1/\ SUC 0=1 /\ k - p + 2 <= k - p + 2`]
858 THEN MRESA_TAC MOD_LT[`1:num`;`k-p+2:num`];
859 MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats (l1:real^(P,3)finite_product))))`;`J1_SY (s1:stable_sy)`;`p-1,p`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
860 THEN MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats (l2:real^(N,3)finite_product))))`;`J1_SY (s3:stable_sy)`;`k-p+2,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
861 THEN SUBGOAL_THEN`J1_SY s1  DELETE (p-1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
862 ASM_REWRITE_TAC[SUBSET;J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
863 THEN REPEAT STRIP_TAC
864 THEN POP_ASSUM MP_TAC
865 THEN POP_ASSUM MP_TAC
866 THEN ASM_REWRITE_TAC[PAIR_EQ;]
867 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
868 THEN RESA_TAC;
869 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
870 MP_TAC(ARITH_RULE`i<p /\ 2<p ==> i=p-1 \/ i< p-1:num`)
871 THEN RESA_TAC;
872 MP_TAC(ARITH_RULE`2<p ==> SUC(p-1)=p /\ p-1<p`)
873 THEN RESA_TAC
874 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
875 STRIP_TAC
876 THEN STRIP_TAC
877 THEN EXISTS_TAC`i:num`
878 THEN ASM_REWRITE_TAC[]
879 THEN MP_TAC(ARITH_RULE`i<p-1 /\ p < k /\ 2<p ==> i< k /\ i<=k:num /\ 1+i<k/\ 1+i< p/\ ~(i=1+i)/\ ~(i=p-1)/\ ~(p=2)`)
880 THEN RESA_TAC
881 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
882 THEN POP_ASSUM(fun th-> ASM_TAC THEN REWRITE_TAC[th] THEN REPEAT STRIP_TAC)
883 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
884 THEN MRESA_TAC MOD_LT[`1+i:num`;`k:num`]
885 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
886 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[SYM th] )
887 THEN FIND_ASSUM MP_TAC`J_SY s1 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
888 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
889 THEN STRIP_TAC
890 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{i,(1+i) MOD p}`)
891 THEN POP_ASSUM MP_TAC
892 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
893 THEN STRIP_TAC
894 THEN MP_TAC(SET_RULE`{i, 1 + i} = {0, p - 1} /\ ~(i=1+i) /\ ~(i=p-1) ==> i=0 /\ 1+i= p-1`)
895 THEN RESA_TAC
896 THEN POP_ASSUM MP_TAC
897 THEN ASM_REWRITE_TAC[ARITH_RULE`1+0=p-1<=> p=2`];
898 SUBGOAL_THEN`IMAGE (\(x,y). (p - 2 + x), (p - 2 + y)) (J1_SY s3  DELETE (k-p+2,1)) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
899 ASM_REWRITE_TAC[J1_SY;IMAGE;DELETE;SUBSET;IN_ELIM_THM;IN_NUMSEG]
900 THEN REPEAT STRIP_TAC
901 THEN POP_ASSUM MP_TAC
902 THEN POP_ASSUM MP_TAC
903 THEN ASM_REWRITE_TAC[PAIR_EQ;]
904 THEN MP_TAC(ARITH_RULE`i<=k-p+2 ==> i=k-p+2 \/ i< k-p+2:num`)
905 THEN RESA_TAC;
906 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
907 MP_TAC(ARITH_RULE`i<k-p+2 /\ 2<k-p+2 ==> i=k-p+1 \/ i< k-p+1:num`)
908 THEN RESA_TAC;
909 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
910 THEN RESA_TAC
911 THEN RESA_TAC
912 THEN MP_TAC(ARITH_RULE`2<p /\ 2< k-p+2 /\ 2< k ==> p-2+k-p+1=k-1/\ SUC(k-p+1)=k-p+2 /\ k-p+1<k-p+2/\ p - 2 + k - p + 2=k/\ 1<=k-1 /\ k-1<=k/\ k-1<k/\ 1+k-1=k /\ SUC(k-1)=k/\ 1 + k - p + 1= k - p + 2 /\ ~(k-p+1=0)`)
913 THEN RESA_TAC
914 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`]
915 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
916 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
917 THEN EXISTS_TAC`k-1`
918 THEN ASM_REWRITE_TAC[]
919 THEN FIND_ASSUM MP_TAC`{(k - p + 1) MOD (k - p + 2), (f_sy s2 o
920                                      (\x. if x = 0
921                                           then 0
922                                           else (p - 2 + x) MOD k))
923                                     ((k - p + 1) MOD (k - p + 2))} IN
924       J_SY (s3:stable_sy)`
925 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
926       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
927 THEN ASM_REWRITE_TAC[]
928 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
929 THEN STRIP_TAC
930 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`k-p+1`;`0`]th))`!p' q.
931           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
932                                                         then 0
933                                                         else (p - 2 + q) MOD
934                                                              k)} IN
935           J_SY s2 <=>
936           {p', q} IN J_SY (s3:stable_sy)`
937 THEN POP_ASSUM (fun th-> REWRITE_TAC[th;ARITH_RULE`0=0`])
938 THEN ASM_REWRITE_TAC[]
939 THEN STRIP_TAC
940 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
941 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
942 THEN STRIP_TAC
943 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{k-1,0}`);
944 POP_ASSUM MP_TAC
945 THEN MP_TAC(ARITH_RULE`1<=k-p /\2<p==> ~(k-1=p-1) /\ ~(0= p-1)`)
946 THEN RESA_TAC
947 THEN MP_TAC(SET_RULE`~(k-1=p-1) /\ ~(0= p-1)==> ~(p-1 IN {k-1,0})`)
948 THEN ASM_REWRITE_TAC[]
949 THEN SET_TAC[];
950 STRIP_TAC
951 THEN STRIP_TAC
952 THEN EXISTS_TAC`p-2+i:num`
953 THEN ASM_REWRITE_TAC[]
954 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==> p-2+i< k/\ p-2+i<=k /\ 1<=p-2+i/\ 1+p-2+i<k /\ 1+i< k-p+2/\ p-2+1+i<k`)
955 THEN RESA_TAC
956 THEN MRESA_TAC MOD_LT[`p-2+1+i:num`;`k:num`]
957 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
958 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==>  ~(i=0)/\ ~(1+i=0)`)
959 THEN RESA_TAC
960 THEN MRESA_TAC MOD_LT[`1+i:num`;`k-p+2:num`]
961 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
962 THEN REWRITE_TAC[ARITH_RULE`SUC (p - 2 + i)= p - 2 + SUC i`]
963 THEN MRESA_TAC MOD_LT[`1+p-2+i:num`;`k:num`]
964 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`i MOD (k - p + 2)`;`(f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
965                           (i MOD (k - p + 2))`] th))`!p' q.
966           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
967                                                         then 0
968                                                         else (p - 2 + q) MOD
969                                                              k)} IN
970           J_SY s2 <=>
971           {p', q} IN J_SY  (s3:stable_sy)`
972 THEN FIND_ASSUM(fun th-> REWRITE_TAC[th])`{i MOD (k - p + 2), (f_sy s2 o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
973                           (i MOD (k - p + 2))} IN
974       J_SY (s3:stable_sy)` 
975 THEN REMOVE_ASSUM_TAC
976 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
977 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
978       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
979 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
980 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
981 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
982 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
983 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
984 THEN STRIP_TAC
985 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
986 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
987 THEN STRIP_TAC
988 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{p-2+i,p-2+1+i}`);
989 ASM_REWRITE_TAC[ARITH_RULE`1+p-2+i= p-2+1+i`];
990 MP_TAC(SET_RULE`{p - 2 + i, p - 2 + 1 + i} = {0, p - 1} ==> (p-2+i=0) \/ (p-2+1+i=0)`)
991 THEN RESA_TAC
992 THEN MP_TAC(ARITH_RULE`1<=i /\ 2< p==> ~(p-2+i=0) /\ ~(p-2+1+i=0)`)
993 THEN ASM_REWRITE_TAC[];
994 MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s1:stable_sy)`;`p-1,p`][FINITE_J1_SY]
995 THEN MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s3:stable_sy)`;`k-p+2,1`][FINITE_J1_SY]
996 THEN DISJ_CASES_TAC(SET_RULE`ear_sy s1 \/ ~(ear_sy (s1:stable_sy))`);
997 ASM_REWRITE_TAC[sigma_sy]
998 THEN MATCH_MP_TAC(REAL_ARITH`
999 d_sy s <=
1000  d_sy s1 +
1001    d_sy s3
1002 /\ 
1003 &0<= sum (J1_SY s)
1004  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l)))
1005 /\
1006 &0<=  sum (J1_SY s1 DELETE (p - 1,p))
1007    (\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats l1)))
1008 /\ &0<=   cstab - norm (row (p - 1) (vecmats l1) - row p (vecmats l1))
1009 /\
1010 &0<=
1011  sum (J1_SY s3 DELETE (k - p + 2,1))
1012   (\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats l2))) 
1013 /\ &0<=  cstab - norm (row (k - p + 2) (vecmats l2) - row 1 (vecmats l2))
1014 ==>
1015 d_sy s +
1016  #0.1 *
1017  -- &1 *
1018  sum (J1_SY s)
1019  (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats l))) <=
1020  (d_sy s1 +
1021   #0.1 *
1022   &1 *
1023   (sum (J1_SY s1 DELETE (p - 1,p))
1024    (\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats l1))) +
1025    cstab - norm (row (p - 1) (vecmats l1) - row p (vecmats l1)))) +
1026  d_sy s3 +
1027  #0.1 *
1028  &1 *
1029  (sum (J1_SY (s3:stable_sy) DELETE (k - p + 2,1))
1030   (\x. cstab - norm (row (FST x) (vecmats l2) - row (SND x) (vecmats l2))) +
1031   cstab - norm (row (k - p + 2) (vecmats l2) - row 1 (vecmats l2)))`)
1032 THEN RESA_TAC;
1033 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
1034 THEN REWRITE_TAC[COVER2_SY]
1035 THEN RESA_TAC;
1036 STRIP_TAC;
1037 MATCH_MP_TAC SUM_POS_LE
1038 THEN REWRITE_TAC[FINITE_J1_SY]
1039 THEN REPEAT STRIP_TAC
1040 THEN POP_ASSUM MP_TAC
1041 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG]
1042 THEN STRIP_TAC
1043 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
1044 THEN POP_ASSUM MP_TAC
1045 THEN REAL_ARITH_TAC;
1046 STRIP_TAC;
1047 MATCH_MP_TAC SUM_POS_LE
1048 THEN ASM_REWRITE_TAC[]
1049 THEN REPEAT STRIP_TAC
1050 THEN DISJ_CASES_TAC(SET_RULE`x=p:num,1 \/ ~(x=p:num,1 )`);
1051 ASM_REWRITE_TAC[]
1052 THEN EXPAND_TAC"l1"
1053 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1054 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1055 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1056 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1057 POP_ASSUM MP_TAC
1058 THEN ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1059 THEN RESA_TAC
1060 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1061 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
1062 THEN RESA_TAC
1063 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1064 ASM_REWRITE_TAC[]
1065 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p`]
1066 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1067 THEN POP_ASSUM MP_TAC
1068 THEN REAL_ARITH_TAC;
1069 SUBGOAL_THEN`x IN J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1)` ASSUME_TAC;
1070 POP_ASSUM MP_TAC
1071 THEN POP_ASSUM MP_TAC
1072 THEN REWRITE_TAC[IN_ELIM_THM;DELETE]
1073 THEN SET_TAC[];
1074 MP_TAC(SET_RULE`x IN J1_SY s1 DELETE (p - 1,p) DELETE (p,1)
1075 /\ J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY s
1076 ==> x IN J1_SY (s:stable_sy)`)
1077 THEN RESA_TAC
1078 THEN POP_ASSUM MP_TAC
1079 THEN POP_ASSUM MP_TAC
1080 THEN POP_ASSUM MP_TAC
1081 THEN POP_ASSUM MP_TAC
1082 THEN DISCH_THEN(LABEL_TAC"THY")
1083 THEN DISCH_THEN(LABEL_TAC"THY1")
1084 THEN REPEAT STRIP_TAC
1085 THEN REMOVE_THEN"THY" MP_TAC
1086 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
1087 THEN RESA_TAC
1088 THEN POP_ASSUM MP_TAC
1089 THEN REMOVE_THEN"THY1" MP_TAC
1090 THEN ASM_REWRITE_TAC[]
1091 THEN MP_TAC(ARITH_RULE`i<=p==> i=p \/ i<p:num`)
1092 THEN RESA_TAC;
1093 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1094 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
1095 THEN RESA_TAC;
1096 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
1097 THEN RESA_TAC
1098 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1099 RESA_TAC
1100 THEN RESA_TAC
1101 THEN EXPAND_TAC"l1"
1102 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1103 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
1104 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1105 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1106 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1107 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
1108 THEN RESA_TAC
1109 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1110 ASM_REWRITE_TAC[]
1111 THEN POP_ASSUM MP_TAC
1112 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG]
1113 THEN STRIP_TAC
1114 THEN MP_TAC(ARITH_RULE`SUC i < p /\ 1<=k-p ==> i <= k/\ i<k`)
1115 THEN RESA_TAC
1116 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
1117 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
1118 THEN POP_ASSUM MP_TAC
1119 THEN REAL_ARITH_TAC;
1120 STRIP_TAC;
1121 SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1122 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1123 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1124 POP_ASSUM MP_TAC
1125 THEN ASM_REWRITE_TAC[ARITH_RULE`p <= p`]
1126 THEN EXPAND_TAC"l1"
1127 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1128 THEN RESA_TAC
1129 THEN SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1130 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
1131 THEN RESA_TAC
1132 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1133 ASM_REWRITE_TAC[]
1134 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`p-1`;`k:num`] th) )`!i j.
1135           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
1136           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
1137 THEN REWRITE_TAC[IN_ELIM_THM;UNION;IN_SING]
1138 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
1139 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`;SET_RULE`{p-1,0}={0,p-1}`]
1140 THEN REAL_ARITH_TAC;
1141 STRIP_TAC;
1142 MATCH_MP_TAC SUM_POS_LE
1143 THEN ASM_REWRITE_TAC[]
1144 THEN REPEAT STRIP_TAC
1145 THEN DISJ_CASES_TAC(SET_RULE`x=k-p+1,k-p+2 \/ ~(x=k-p+1,k-p+2 )`);
1146 ASM_REWRITE_TAC[]
1147 THEN EXPAND_TAC"l2"
1148 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1149 THEN SUBGOAL_THEN`row (k-p+1) ((pmat2 (vecmats l)):real^3^N) = row (k-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1150 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+1<=k-p+2 /\ 1<= k-p+1 /\ k - (k - p + 2) + k - p + 1= k-1`)
1151 THEN RESA_TAC
1152 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1153 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1154 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
1155 THEN RESA_TAC
1156 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1157 ASM_REWRITE_TAC[]
1158 THEN MP_TAC(ARITH_RULE` 2<k ==> 1<=k-1 /\ k-1<= k /\ SUC (k - 1)= k /\ k-1<k`)
1159 THEN RESA_TAC
1160 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
1161 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k-1:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1162 THEN POP_ASSUM MP_TAC
1163 THEN REAL_ARITH_TAC;
1164 POP_ASSUM MP_TAC
1165 THEN POP_ASSUM MP_TAC
1166 THEN DISCH_THEN(LABEL_TAC"THY")
1167 THEN DISCH_THEN(LABEL_TAC"THY1")
1168 THEN REMOVE_THEN"THY" MP_TAC
1169 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
1170 THEN RESA_TAC
1171 THEN POP_ASSUM MP_TAC
1172 THEN REMOVE_THEN"THY1" MP_TAC
1173 THEN ASM_REWRITE_TAC[]
1174 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
1175 THEN RESA_TAC;
1176 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1177 MP_TAC(ARITH_RULE`i< k-p+2 /\ 2<p ==> i=k-p +1 \/ i< k-p+1:num`)
1178 THEN RESA_TAC;
1179 MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> k-p+1< k-p+2 /\ SUC (k-p+1)=k-p+2`)
1180 THEN RESA_TAC
1181 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`];
1182 RESA_TAC
1183 THEN RESA_TAC
1184 THEN EXPAND_TAC"l2"
1185 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1186 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
1187 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1188 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
1189 THEN RESA_TAC
1190 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1191 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1192 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+1 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
1193 THEN RESA_TAC
1194 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1195 ASM_REWRITE_TAC[]
1196 THEN MP_TAC(ARITH_RULE` i< k-p+1 /\ 2< p /\ 1<= k-p ==> 1<=p-2+i /\ p-2+i <= k /\ SUC (p-2+i)= p-2+ SUC i /\ p-2+i<k`)
1197 THEN RESA_TAC
1198 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
1199 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`p-2+i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1200 THEN POP_ASSUM MP_TAC
1201 THEN REAL_ARITH_TAC;
1202 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1203 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
1204 THEN RESA_TAC
1205 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1206 SUBGOAL_THEN`row 1 ((pmat2 (vecmats l)):real^3^N) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1207 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + 1= p-1/\ 1<=1 /\ 1<=k-p+2`)
1208 THEN RESA_TAC
1209 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1210 EXPAND_TAC"l2"
1211 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1212 THEN ASM_REWRITE_TAC[]
1213 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`k:num`;`p-1:num`] th) )`!i j.
1214           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
1215           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
1216 THEN REWRITE_TAC[IN_ELIM_THM;UNION;IN_SING]
1217 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
1218 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`;SET_RULE`{p-1,0}={0,p-1}`]
1219 THEN REAL_ARITH_TAC;
1220 ASM_REWRITE_TAC[sigma_sy]
1221 THEN SUBGOAL_THEN `cstab - norm (row (p - 1) (vecmats (l1:real^(P,3)finite_product)) - row p (vecmats l1)) =cstab - norm (row (k-p + 2) (vecmats (l2:real^(N,3)finite_product)) - row 1 (vecmats l2))` ASSUME_TAC;
1222 REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1223 THEN EXPAND_TAC"l1"
1224 THEN EXPAND_TAC"l2"
1225 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1226 THEN SUBGOAL_THEN`row 1 ((pmat2 (vecmats l)):real^3^N) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1227 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + 1= p-1/\ 1<=1 /\ 1<=k-p+2`)
1228 THEN RESA_TAC
1229 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1230 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1231 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
1232 THEN RESA_TAC
1233 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1234 SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1235 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
1236 THEN RESA_TAC
1237 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1238 SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1239 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1240 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1241 POP_ASSUM MP_TAC
1242 THEN ASM_REWRITE_TAC[ARITH_RULE`p <= p`]
1243 THEN RESA_TAC
1244 THEN SIMP_TAC[NORM_SUB];
1245 DISJ_CASES_TAC(SET_RULE`(p,1) IN  J1_SY s1 DELETE (p - 1,p) \/ ~((p,1) IN  J1_SY (s1:stable_sy) DELETE (p - 1,p))`);
1246 SUBGOAL_THEN`k,1 IN J1_SY (s:stable_sy)`ASSUME_TAC;
1247 POP_ASSUM MP_TAC
1248 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;PAIR_EQ;IN_NUMSEG]
1249 THEN STRIP_TAC
1250 THEN REMOVE_ASSUM_TAC
1251 THEN REMOVE_ASSUM_TAC
1252 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1253 THEN REMOVE_ASSUM_TAC
1254 THEN REMOVE_ASSUM_TAC
1255 THEN POP_ASSUM MP_TAC
1256 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p /\ 1+0=1`]
1257 THEN MP_TAC(ARITH_RULE`2<p /\ 2< k==> 1<p /\ 1<k /\ k<=k`)
1258 THEN RESA_TAC
1259 THEN MRESA_TAC MOD_LT[`1:num`;`p:num`]
1260 THEN STRIP_TAC
1261 THEN EXISTS_TAC`k:num`
1262 THEN ASM_REWRITE_TAC[]
1263 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1/\ 1+0=1`]
1264 THEN MRESA_TAC MOD_LT[`1:num`;`k:num`]
1265 THEN FIND_ASSUM MP_TAC`J_SY s1 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
1266 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
1267 THEN STRIP_TAC
1268 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{0,1}`);
1269 MP_TAC(ARITH_RULE`2<p ==> ~(p-1=0) /\ ~(p-1=1)`)
1270 THEN RESA_TAC
1271 THEN MP_TAC(SET_RULE`~(p-1=0) /\ ~(p-1=1) ==> ~(p-1 IN {0,1})`)
1272 THEN ASM_REWRITE_TAC[]
1273 THEN REMOVE_ASSUM_TAC
1274 THEN REMOVE_ASSUM_TAC
1275 THEN POP_ASSUM MP_TAC
1276 THEN SET_TAC[];
1277 MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats (l1:real^(P,3)finite_product))))`;`J1_SY (s1:stable_sy) DELETE (p-1,p)`;`p:num,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
1278 THEN MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s:stable_sy)`;`k:num,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
1279 THEN EXPAND_TAC"l1"
1280 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1281 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1282 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1283 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1284 POP_ASSUM MP_TAC
1285 THEN ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1286 THEN RESA_TAC
1287 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1288 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
1289 THEN RESA_TAC
1290 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1291 SUBGOAL_THEN`J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy) DELETE (k,1)`ASSUME_TAC;
1292 MATCH_MP_TAC(SET_RULE`~(x IN A) /\ A SUBSET B==> A SUBSET B DELETE x`)
1293 THEN ASM_REWRITE_TAC[]
1294 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1295 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1296 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;PAIR_EQ;IN_NUMSEG]
1297 THEN STRIP_TAC
1298 THEN REMOVE_ASSUM_TAC
1299 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1300 THEN POP_ASSUM MP_TAC
1301 THEN MP_TAC(ARITH_RULE`1<= k-p ==> ~(k<=p)`)
1302 THEN RESA_TAC;
1303 ASM_REWRITE_TAC[REAL_ARITH`(A+ #0.1 * -- &1 *(C+B)) + D+ #0.1 * &1* (E+B)= (A+ #0.1 * -- &1 * C) + D+ #0.1 * &1 * E`]
1304 THEN MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s:stable_sy)`;`k:num,1`][FINITE_J1_SY]
1305 THEN MRESAL_TAC SUM_DIFF[`(\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l)))`;`J1_SY(s:stable_sy) DELETE (k,1)`;`J1_SY (s1:stable_sy) DELETE (p-1,p:num) DELETE (p:num,1)`][FINITE_J1_SY;]
1306 THEN MATCH_MP_TAC(REAL_ARITH`
1307 A1<= A+D /\ &0<= C1 -C /\ &0<= E
1308 ==> A1+ #0.1 * -- &1 * (C1+B) <=(A+ #0.1 * -- &1 *(C+B)) + D+ #0.1 * &1* E`)
1309 THEN STRIP_TAC;
1310 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
1311 THEN REWRITE_TAC[COVER2_SY]
1312 THEN RESA_TAC;
1313 STRIP_TAC;
1314 SUBGOAL_THEN`!x. x IN (J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))
1315 ==> (\x. cstab -
1316       norm
1317       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P))) x
1318 = (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product)))) x` ASSUME_TAC;
1319 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
1320 THEN REPEAT STRIP_TAC
1321 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1322 THEN POP_ASSUM MP_TAC
1323 THEN POP_ASSUM MP_TAC
1324 THEN ASM_REWRITE_TAC[]
1325 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1326 THEN RESA_TAC;
1327 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1328 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
1329 THEN RESA_TAC;
1330 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
1331 THEN RESA_TAC
1332 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1333 RESA_TAC
1334 THEN RESA_TAC
1335 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
1336 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1337 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1338 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1339 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
1340 THEN RESA_TAC
1341 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1342 ASM_REWRITE_TAC[];
1343 MRESA_TAC SUM_EQ[`(\x. cstab -
1344       norm
1345       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P)))`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`(J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))`]
1346 THEN REMOVE_ASSUM_TAC
1347 THEN REMOVE_ASSUM_TAC
1348 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
1349 THEN MATCH_MP_TAC SUM_POS_LE
1350 THEN STRIP_TAC;
1351 MATCH_MP_TAC FINITE_DIFF
1352 THEN REWRITE_TAC[FINITE_J1_SY; FINITE_DELETE];
1353 REPEAT STRIP_TAC
1354 THEN POP_ASSUM MP_TAC
1355 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG;DIFF;DELETE]
1356 THEN STRIP_TAC
1357 THEN REMOVE_ASSUM_TAC
1358 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
1359 THEN POP_ASSUM MP_TAC
1360 THEN REAL_ARITH_TAC;
1361 MATCH_MP_TAC SUM_POS_LE
1362 THEN ASM_REWRITE_TAC[]
1363 THEN REPEAT STRIP_TAC
1364 THEN DISJ_CASES_TAC(SET_RULE`x=k-p+1,k-p+2 \/ ~(x=k-p+1,k-p+2 )`);
1365 ASM_REWRITE_TAC[]
1366 THEN EXPAND_TAC"l2"
1367 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1368 THEN SUBGOAL_THEN`row (k-p+1) ((pmat2 (vecmats l)):real^3^N) = row (k-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1369 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+1<=k-p+2 /\ 1<= k-p+1 /\ k - (k - p + 2) + k - p + 1= k-1`)
1370 THEN RESA_TAC
1371 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1372 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1373 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
1374 THEN RESA_TAC
1375 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1376 ASM_REWRITE_TAC[]
1377 THEN MP_TAC(ARITH_RULE` 2<k ==> 1<=k-1 /\ k-1<= k /\ SUC (k - 1)= k /\ k-1<k`)
1378 THEN RESA_TAC
1379 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
1380 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k-1:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1381 THEN POP_ASSUM MP_TAC
1382 THEN REAL_ARITH_TAC;
1383 POP_ASSUM MP_TAC
1384 THEN POP_ASSUM MP_TAC
1385 THEN DISCH_THEN(LABEL_TAC"THY")
1386 THEN DISCH_THEN(LABEL_TAC"THY1")
1387 THEN REMOVE_THEN"THY" MP_TAC
1388 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
1389 THEN RESA_TAC
1390 THEN POP_ASSUM MP_TAC
1391 THEN REMOVE_THEN"THY1" MP_TAC
1392 THEN ASM_REWRITE_TAC[]
1393 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
1394 THEN RESA_TAC;
1395 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1396 MP_TAC(ARITH_RULE`i< k-p+2 /\ 2<p ==> i=k-p +1 \/ i< k-p+1:num`)
1397 THEN RESA_TAC;
1398 MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> k-p+1< k-p+2 /\ SUC (k-p+1)=k-p+2`)
1399 THEN RESA_TAC
1400 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`];
1401 RESA_TAC
1402 THEN RESA_TAC
1403 THEN EXPAND_TAC"l2"
1404 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1405 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
1406 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1407 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
1408 THEN RESA_TAC
1409 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1410 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1411 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+1 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
1412 THEN RESA_TAC
1413 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1414 ASM_REWRITE_TAC[]
1415 THEN MP_TAC(ARITH_RULE` i< k-p+1 /\ 2< p /\ 1<= k-p ==> 1<=p-2+i /\ p-2+i <= k /\ SUC (p-2+i)= p-2+ SUC i /\ p-2+i<k`)
1416 THEN RESA_TAC
1417 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
1418 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`p-2+i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1419 THEN POP_ASSUM MP_TAC
1420 THEN REAL_ARITH_TAC;
1421 MP_TAC(SET_RULE`~(p,1 IN J1_SY s1 DELETE (p - 1,p))
1422 ==> J1_SY (s1:stable_sy) DELETE (p - 1,p) = J1_SY s1 DELETE (p - 1,p) DELETE (p,1)`)
1423 THEN RESA_TAC
1424 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
1425 THEN MATCH_MP_TAC(REAL_ARITH`
1426 A1<= A+D /\ &0<= C1 -C /\ &0<= E
1427 ==> A1+ #0.1 * -- &1 * C1 <=(A+ #0.1 * -- &1 *(C+B)) + D+ #0.1 * &1* (E+B)`)
1428 THEN STRIP_TAC;
1429 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
1430 THEN REWRITE_TAC[COVER2_SY]
1431 THEN RESA_TAC;
1432 STRIP_TAC;
1433 SUBGOAL_THEN`!x. x IN (J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))
1434 ==> (\x. cstab -
1435       norm
1436       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P))) x
1437 = (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product)))) x` ASSUME_TAC;
1438 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
1439 THEN REPEAT STRIP_TAC
1440 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1441 THEN POP_ASSUM MP_TAC
1442 THEN POP_ASSUM MP_TAC
1443 THEN ASM_REWRITE_TAC[]
1444 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1445 THEN RESA_TAC;
1446 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1447 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
1448 THEN RESA_TAC;
1449 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
1450 THEN RESA_TAC
1451 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1452 RESA_TAC
1453 THEN RESA_TAC
1454 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
1455 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1456 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1457 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1458 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
1459 THEN RESA_TAC
1460 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1461 ASM_REWRITE_TAC[];
1462 MRESA_TAC SUM_EQ[`(\x. cstab -
1463       norm
1464       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P)))`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`(J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))`]
1465 THEN EXPAND_TAC"l1"
1466 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1467 THEN ASM_REWRITE_TAC[]
1468 THEN REMOVE_ASSUM_TAC
1469 THEN REMOVE_ASSUM_TAC
1470 THEN MRESAL_TAC SUM_DIFF[`(\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l)))`;`J1_SY(s:stable_sy) `;`J1_SY (s1:stable_sy) DELETE (p-1,p:num) DELETE (p:num,1)`][FINITE_J1_SY;]
1471 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
1472 THEN MATCH_MP_TAC SUM_POS_LE
1473 THEN STRIP_TAC;
1474 MATCH_MP_TAC FINITE_DIFF
1475 THEN REWRITE_TAC[FINITE_J1_SY; FINITE_DELETE];
1476 REPEAT STRIP_TAC
1477 THEN POP_ASSUM MP_TAC
1478 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG;DIFF;DELETE]
1479 THEN STRIP_TAC
1480 THEN REMOVE_ASSUM_TAC
1481 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
1482 THEN POP_ASSUM MP_TAC
1483 THEN REAL_ARITH_TAC;
1484 MATCH_MP_TAC SUM_POS_LE
1485 THEN ASM_REWRITE_TAC[]
1486 THEN REPEAT STRIP_TAC
1487 THEN DISJ_CASES_TAC(SET_RULE`x=k-p+1,k-p+2 \/ ~(x=k-p+1,k-p+2 )`);
1488 ASM_REWRITE_TAC[]
1489 THEN EXPAND_TAC"l2"
1490 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1491 THEN SUBGOAL_THEN`row (k-p+1) ((pmat2 (vecmats l)):real^3^N) = row (k-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1492 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+1<=k-p+2 /\ 1<= k-p+1 /\ k - (k - p + 2) + k - p + 1= k-1`)
1493 THEN RESA_TAC
1494 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1495 SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1496 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
1497 THEN RESA_TAC
1498 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1499 ASM_REWRITE_TAC[]
1500 THEN MP_TAC(ARITH_RULE` 2<k ==> 1<=k-1 /\ k-1<= k /\ SUC (k - 1)= k /\ k-1<k`)
1501 THEN RESA_TAC
1502 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
1503 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`k-1:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1504 THEN POP_ASSUM MP_TAC
1505 THEN REAL_ARITH_TAC;
1506 POP_ASSUM MP_TAC
1507 THEN POP_ASSUM MP_TAC
1508 THEN DISCH_THEN(LABEL_TAC"THY")
1509 THEN DISCH_THEN(LABEL_TAC"THY1")
1510 THEN REMOVE_THEN"THY" MP_TAC
1511 THEN REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;IN_NUMSEG]
1512 THEN RESA_TAC
1513 THEN POP_ASSUM MP_TAC
1514 THEN REMOVE_THEN"THY1" MP_TAC
1515 THEN ASM_REWRITE_TAC[]
1516 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
1517 THEN RESA_TAC;
1518 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1519 MP_TAC(ARITH_RULE`i< k-p+2 /\ 2<p ==> i=k-p +1 \/ i< k-p+1:num`)
1520 THEN RESA_TAC;
1521 MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> k-p+1< k-p+2 /\ SUC (k-p+1)=k-p+2`)
1522 THEN RESA_TAC
1523 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`];
1524 RESA_TAC
1525 THEN RESA_TAC
1526 THEN EXPAND_TAC"l2"
1527 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1528 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
1529 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1530 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
1531 THEN RESA_TAC
1532 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1533 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1534 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+1 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
1535 THEN RESA_TAC
1536 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1537 ASM_REWRITE_TAC[]
1538 THEN MP_TAC(ARITH_RULE` i< k-p+1 /\ 2< p /\ 1<= k-p ==> 1<=p-2+i /\ p-2+i <= k /\ SUC (p-2+i)= p-2+ SUC i /\ p-2+i<k`)
1539 THEN RESA_TAC
1540 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
1541 THEN MRESAL_TAC (GEN_ALL B_SY_LE_CSTAB)[`p-2+i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;][ARITH_RULE`SUC 0=1`]
1542 THEN POP_ASSUM MP_TAC
1543 THEN REAL_ARITH_TAC;
1544 FIND_ASSUM MP_TAC `COVER_SY 0 (p - 1) s s1 (s2:stable_sy)`
1545 THEN REWRITE_TAC[COVER_SY;COVER3_SY;COVER6_SY;]
1546 THEN ASM_REWRITE_TAC[DE_MORGAN_THM]
1547 THEN RESA_TAC
1548 THEN ASM_REWRITE_TAC[d_fun]
1549 THEN MRESA1_TAC sigma_sy`s1:stable_sy`
1550 THEN MRESA1_TAC sigma_sy`s3:stable_sy`
1551 THEN FIND_ASSUM MP_TAC`SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 (s3:stable_sy)`
1552 THEN REWRITE_TAC[SCHANGE]
1553 THEN RESA_TAC
1554 THEN SUBGOAL_THEN`~({0,1} IN J_SY (s3:stable_sy))`ASSUME_TAC;
1555 FIND_ASSUM MP_TAC`~({0, p - 1} IN J_SY (s2:stable_sy))`
1556 THEN MATCH_MP_TAC MONO_NOT
1557 THEN STRIP_TAC
1558 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`0`;`1`]th))`!p' q.
1559           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
1560                                                         then 0
1561                                                         else (p - 2 + q) MOD
1562                                                              k)} IN
1563           J_SY s2 <=>
1564           {p', q} IN J_SY (s3:stable_sy)`
1565 THEN POP_ASSUM(fun th-> REWRITE_TAC[th;ARITH_RULE`(0=0) /\ ~(1=0)`])
1566 THEN MP_TAC(ARITH_RULE`2<p/\ 1<= k-p ==> p-2+1=p-1 /\ p-1<k`)
1567 THEN RESA_TAC
1568 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`];
1569 SUBGOAL_THEN`~(p - 1,p IN J1_SY (s1:stable_sy))`ASSUME_TAC;
1570 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;PAIR_EQ;IN_NUMSEG]
1571 THEN STRIP_TAC
1572 THEN REMOVE_ASSUM_TAC
1573 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1574 THEN REMOVE_ASSUM_TAC
1575 THEN REMOVE_ASSUM_TAC
1576 THEN POP_ASSUM MP_TAC
1577 THEN MP_TAC(ARITH_RULE`2<p/\ 1<= k-p ==> p-2+1=p-1 /\ p-1<p/\ 1+p-1=p`)
1578 THEN RESA_TAC
1579 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
1580 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
1581 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B}={B,A}`]
1582 THEN RESA_TAC;
1583 SUBGOAL_THEN`~((k-p+2,1) IN J1_SY (s3:stable_sy))`ASSUME_TAC;
1584 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;PAIR_EQ;IN_NUMSEG]
1585 THEN STRIP_TAC
1586 THEN REMOVE_ASSUM_TAC
1587 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1588 THEN REMOVE_ASSUM_TAC
1589 THEN REMOVE_ASSUM_TAC
1590 THEN POP_ASSUM MP_TAC
1591 THEN POP_ASSUM MP_TAC
1592 THEN POP_ASSUM MP_TAC
1593 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1594 THEN STRIP_TAC
1595 THEN STRIP_TAC
1596 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ 1+0=1`]
1597 THEN MRESA_TAC MOD_LT[`1:num`;`k-p+2:num`];
1598 SUBGOAL_THEN`J1_SY s1  DELETE (p-1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
1599 ASM_REWRITE_TAC[SUBSET;J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
1600 THEN REPEAT STRIP_TAC
1601 THEN POP_ASSUM MP_TAC
1602 THEN POP_ASSUM MP_TAC
1603 THEN ASM_REWRITE_TAC[PAIR_EQ;]
1604 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1605 THEN RESA_TAC;
1606 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
1607 MP_TAC(ARITH_RULE`i<p /\ 2<p ==> i=p-1 \/ i< p-1:num`)
1608 THEN RESA_TAC;
1609 MP_TAC(ARITH_RULE`2<p ==> SUC(p-1)=p /\ p-1<p`)
1610 THEN RESA_TAC
1611 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1612 STRIP_TAC
1613 THEN STRIP_TAC
1614 THEN EXISTS_TAC`i:num`
1615 THEN ASM_REWRITE_TAC[]
1616 THEN MP_TAC(ARITH_RULE`i<p-1 /\ p < k /\ 2<p ==> i< k /\ i<=k:num /\ 1+i<k/\ 1+i< p/\ ~(i=1+i)/\ ~(i=p-1)/\ ~(p=2)`)
1617 THEN RESA_TAC
1618 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
1619 THEN POP_ASSUM(fun th-> ASM_TAC THEN REWRITE_TAC[th] THEN REPEAT STRIP_TAC)
1620 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
1621 THEN MRESA_TAC MOD_LT[`1+i:num`;`k:num`]
1622 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
1623 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[SYM th] )
1624 THEN FIND_ASSUM MP_TAC`J_SY s1 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
1625 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
1626 THEN STRIP_TAC
1627 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{i,(1+i) MOD p}`)
1628 THEN POP_ASSUM MP_TAC
1629 THEN MRESA_TAC MOD_LT[`1+i:num`;`p:num`]
1630 THEN STRIP_TAC
1631 THEN MP_TAC(SET_RULE`{i, 1 + i} = {0, p - 1} /\ ~(i=1+i) /\ ~(i=p-1) ==> i=0 /\ 1+i= p-1`)
1632 THEN RESA_TAC
1633 THEN POP_ASSUM MP_TAC
1634 THEN ASM_REWRITE_TAC[ARITH_RULE`1+0=p-1<=> p=2`];
1635 SUBGOAL_THEN`IMAGE (\(x,y). (p - 2 + x), (p - 2 + y)) (J1_SY s3  DELETE (k-p+2,1)) SUBSET J1_SY (s:stable_sy)` ASSUME_TAC;
1636 ASM_REWRITE_TAC[J1_SY;IMAGE;DELETE;SUBSET;IN_ELIM_THM;IN_NUMSEG]
1637 THEN REPEAT STRIP_TAC
1638 THEN POP_ASSUM MP_TAC
1639 THEN POP_ASSUM MP_TAC
1640 THEN ASM_REWRITE_TAC[PAIR_EQ;]
1641 THEN MP_TAC(ARITH_RULE`i<=k-p+2 ==> i=k-p+2 \/ i< k-p+2:num`)
1642 THEN RESA_TAC;
1643 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`];
1644 MP_TAC(ARITH_RULE`i<k-p+2 /\ 2<k-p+2 ==> i=k-p+1 \/ i< k-p+1:num`)
1645 THEN RESA_TAC;
1646 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
1647 THEN RESA_TAC
1648 THEN RESA_TAC
1649 THEN MP_TAC(ARITH_RULE`2<p /\ 2< k-p+2 /\ 2< k ==> p-2+k-p+1=k-1/\ SUC(k-p+1)=k-p+2 /\ k-p+1<k-p+2/\ p - 2 + k - p + 2=k/\ 1<=k-1 /\ k-1<=k/\ k-1<k/\ 1+k-1=k /\ SUC(k-1)=k/\ 1 + k - p + 1= k - p + 2 /\ ~(k-p+1=0)`)
1650 THEN RESA_TAC
1651 THEN MRESA_TAC MOD_LT[`k-p+1:num`;`k-p+2:num`]
1652 THEN MRESA_TAC MOD_LT[`k-1:num`;`k:num`]
1653 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
1654 THEN EXISTS_TAC`k-1`
1655 THEN ASM_REWRITE_TAC[]
1656 THEN FIND_ASSUM MP_TAC`{(k - p + 1) MOD (k - p + 2), (f_sy s2 o
1657                                      (\x. if x = 0
1658                                           then 0
1659                                           else (p - 2 + x) MOD k))
1660                                     ((k - p + 1) MOD (k - p + 2))} IN
1661       J_SY (s3:stable_sy)`
1662 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
1663       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
1664 THEN ASM_REWRITE_TAC[]
1665 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1`]
1666 THEN STRIP_TAC
1667 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`k-p+1`;`0`]th))`!p' q.
1668           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
1669                                                         then 0
1670                                                         else (p - 2 + q) MOD
1671                                                              k)} IN
1672           J_SY s2 <=>
1673           {p', q} IN J_SY (s3:stable_sy)`
1674 THEN POP_ASSUM (fun th-> REWRITE_TAC[th;ARITH_RULE`0=0`])
1675 THEN ASM_REWRITE_TAC[]
1676 THEN STRIP_TAC
1677 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
1678 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
1679 THEN STRIP_TAC
1680 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{k-1,0}`);
1681 POP_ASSUM MP_TAC
1682 THEN MP_TAC(ARITH_RULE`1<=k-p /\2<p==> ~(k-1=p-1) /\ ~(0= p-1)`)
1683 THEN RESA_TAC
1684 THEN MP_TAC(SET_RULE`~(k-1=p-1) /\ ~(0= p-1)==> ~(p-1 IN {k-1,0})`)
1685 THEN ASM_REWRITE_TAC[]
1686 THEN SET_TAC[];
1687 STRIP_TAC
1688 THEN STRIP_TAC
1689 THEN EXISTS_TAC`p-2+i:num`
1690 THEN ASM_REWRITE_TAC[]
1691 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==> p-2+i< k/\ p-2+i<=k /\ 1<=p-2+i/\ 1+p-2+i<k /\ 1+i< k-p+2/\ p-2+1+i<k`)
1692 THEN RESA_TAC
1693 THEN MRESA_TAC MOD_LT[`p-2+1+i:num`;`k:num`]
1694 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
1695 THEN MP_TAC(ARITH_RULE`i<k - p + 1 /\ 2<p /\ 1<=i==>  ~(i=0)/\ ~(1+i=0)`)
1696 THEN RESA_TAC
1697 THEN MRESA_TAC MOD_LT[`1+i:num`;`k-p+2:num`]
1698 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
1699 THEN REWRITE_TAC[ARITH_RULE`SUC (p - 2 + i)= p - 2 + SUC i`]
1700 THEN MRESA_TAC MOD_LT[`1+p-2+i:num`;`k:num`]
1701 THEN FIND_ASSUM (fun th-> MP_TAC( ISPECL [`i MOD (k - p + 2)`;`(f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
1702                           (i MOD (k - p + 2))`] th))`!p' q.
1703           {(if p' = 0 then 0 else (p - 2 + p') MOD k), (if q = 0
1704                                                         then 0
1705                                                         else (p - 2 + q) MOD
1706                                                              k)} IN
1707           J_SY s2 <=>
1708           {p', q} IN J_SY  (s3:stable_sy)`
1709 THEN FIND_ASSUM(fun th-> REWRITE_TAC[th])`{i MOD (k - p + 2), (f_sy s2 o (\x. if x = 0 then 0 else (p - 2 + x) MOD k))
1710                           (i MOD (k - p + 2))} IN
1711       J_SY (s3:stable_sy)` 
1712 THEN REMOVE_ASSUM_TAC
1713 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1714 THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM th])`(\i. (1 + i) MOD (k - p + 2)) =
1715       f_sy (s2:stable_sy) o (\x. if x = 0 then 0 else (p - 2 + x) MOD k)`
1716 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1717 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1718 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1719 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1720 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
1721 THEN STRIP_TAC
1722 THEN FIND_ASSUM MP_TAC`J_SY s2 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
1723 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
1724 THEN STRIP_TAC
1725 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{p-2+i,p-2+1+i}`);
1726 ASM_REWRITE_TAC[ARITH_RULE`1+p-2+i= p-2+1+i`];
1727 MP_TAC(SET_RULE`{p - 2 + i, p - 2 + 1 + i} = {0, p - 1} ==> (p-2+i=0) \/ (p-2+1+i=0)`)
1728 THEN RESA_TAC
1729 THEN MP_TAC(ARITH_RULE`1<=i /\ 2< p==> ~(p-2+i=0) /\ ~(p-2+1+i=0)`)
1730 THEN ASM_REWRITE_TAC[];
1731 MP_TAC(SET_RULE`~(k - p + 2,1 IN J1_SY s3) ==>  J1_SY (s3:stable_sy) =J1_SY s3 DELETE (k - p + 2,1)`)
1732 THEN RESA_TAC
1733 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
1734 THEN MP_TAC(SET_RULE`~(p -1,p IN J1_SY s1) ==>  J1_SY (s1:stable_sy) =J1_SY s1 DELETE (p -1,p)`)
1735 THEN RESA_TAC
1736 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th]);
1737 DISJ_CASES_TAC(SET_RULE`(p,1) IN  J1_SY s1 DELETE (p - 1,p) \/ ~((p,1) IN  J1_SY (s1:stable_sy) DELETE (p - 1,p))`);
1738 SUBGOAL_THEN`k,1 IN J1_SY (s:stable_sy)`ASSUME_TAC;
1739 POP_ASSUM MP_TAC
1740 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;PAIR_EQ;IN_NUMSEG]
1741 THEN STRIP_TAC
1742 THEN REMOVE_ASSUM_TAC
1743 THEN REMOVE_ASSUM_TAC
1744 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1745 THEN REMOVE_ASSUM_TAC
1746 THEN REMOVE_ASSUM_TAC
1747 THEN POP_ASSUM MP_TAC
1748 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p /\ 1+0=1`]
1749 THEN MP_TAC(ARITH_RULE`2<p /\ 2< k==> 1<p /\ 1<k /\ k<=k`)
1750 THEN RESA_TAC
1751 THEN MRESA_TAC MOD_LT[`1:num`;`p:num`]
1752 THEN STRIP_TAC
1753 THEN EXISTS_TAC`k:num`
1754 THEN ASM_REWRITE_TAC[]
1755 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p /\ SUC 0=1/\ 1+0=1`]
1756 THEN MRESA_TAC MOD_LT[`1:num`;`k:num`]
1757 THEN FIND_ASSUM MP_TAC`J_SY s1 SUBSET J_SY (s:stable_sy) UNION {{0, p - 1}}`
1758 THEN REWRITE_TAC[SUBSET;UNION;IN_ELIM_THM;IN_SING]
1759 THEN STRIP_TAC
1760 THEN POP_ASSUM(fun th-> MRESA1_TAC th`{0,1}`);
1761 MP_TAC(ARITH_RULE`2<p ==> ~(p-1=0) /\ ~(p-1=1)`)
1762 THEN RESA_TAC
1763 THEN MP_TAC(SET_RULE`~(p-1=0) /\ ~(p-1=1) ==> ~(p-1 IN {0,1})`)
1764 THEN ASM_REWRITE_TAC[]
1765 THEN REMOVE_ASSUM_TAC
1766 THEN REMOVE_ASSUM_TAC
1767 THEN POP_ASSUM MP_TAC
1768 THEN SET_TAC[];
1769 MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s1:stable_sy)`;`p-1,p`][FINITE_J1_SY]
1770 THEN MRESAL_TAC FINITE_DELETE_IMP[`J1_SY (s3:stable_sy)`;`k-p+2,1`][FINITE_J1_SY]
1771 THEN MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l1) - row (SND x) (vecmats (l1:real^(P,3)finite_product))))`;`J1_SY (s1:stable_sy) DELETE (p-1,p)`;`p:num,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
1772 THEN MRESAL_TAC SUM_DELETE[`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s:stable_sy)`;`k:num,1`][FINITE_J1_SY;REAL_ARITH`A=B-C<=> B=A+C`]
1773 THEN EXPAND_TAC"l1"
1774 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1775 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1776 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1777 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1778 POP_ASSUM MP_TAC
1779 THEN ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
1780 THEN RESA_TAC
1781 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1782 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
1783 THEN RESA_TAC
1784 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1785 SUBGOAL_THEN`J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy) DELETE (k,1)`ASSUME_TAC;
1786 MATCH_MP_TAC(SET_RULE`~(x IN A) /\ A SUBSET B==> A SUBSET B DELETE x`)
1787 THEN ASM_REWRITE_TAC[]
1788 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1789 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1790 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;PAIR_EQ;IN_NUMSEG]
1791 THEN STRIP_TAC
1792 THEN REMOVE_ASSUM_TAC
1793 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1794 THEN POP_ASSUM MP_TAC
1795 THEN MP_TAC(ARITH_RULE`1<= k-p ==> ~(k<=p)`)
1796 THEN RESA_TAC;
1797 ASM_REWRITE_TAC[REAL_ARITH`
1798 A1+ #0.1 * -- &1 * (C1+B) <=(A+ #0.1 * -- &1 *(C+B)) + D+ #0.1 * -- &1* E
1799 <=> A1+ #0.1 * -- &1 * (C1) <=(A+ #0.1 * -- &1 *(C)) + D+ #0.1 * -- &1* E
1800 `]
1801 THEN EXPAND_TAC"l1"
1802 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1803 THEN MATCH_MP_TAC(REAL_ARITH`
1804 A1<= A+D /\ &0<=C1-(C+E)
1805 ==>
1806 A1+ #0.1 * -- &1 * (C1) <=(A+ #0.1 * -- &1 *(C)) + D+ #0.1 * -- &1* E`)
1807 THEN STRIP_TAC;
1808 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
1809 THEN REWRITE_TAC[COVER2_SY]
1810 THEN RESA_TAC;
1811 SUBGOAL_THEN`!x. x IN (J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))
1812 ==> (\x. cstab -
1813       norm
1814       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P))) x
1815 = (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product)))) x` ASSUME_TAC;
1816 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
1817 THEN REPEAT STRIP_TAC
1818 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1819 THEN POP_ASSUM MP_TAC
1820 THEN POP_ASSUM MP_TAC
1821 THEN ASM_REWRITE_TAC[]
1822 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1823 THEN RESA_TAC;
1824 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1825 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
1826 THEN RESA_TAC;
1827 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
1828 THEN RESA_TAC
1829 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1830 RESA_TAC
1831 THEN RESA_TAC
1832 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
1833 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1834 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1835 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1836 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
1837 THEN RESA_TAC
1838 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
1839 ASM_REWRITE_TAC[];
1840 MRESA_TAC SUM_EQ[`(\x. cstab -
1841       norm
1842       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P)))`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`(J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))`]
1843 THEN REMOVE_ASSUM_TAC
1844 THEN REMOVE_ASSUM_TAC
1845 THEN SUBGOAL_THEN`!x. x IN (J1_SY (s3:stable_sy) DELETE (k - p + 2,1))
1846 ==> 
1847       ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
1848        (\(x,y). p - 2 + x,p - 2 + y)) x
1849 = (\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2))) x`
1850 ASSUME_TAC;
1851 ASM_REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;o_DEF;IN_NUMSEG]
1852 THEN REPEAT STRIP_TAC
1853 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1854 THEN EXPAND_TAC"l2"
1855 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
1856 THEN POP_ASSUM MP_TAC
1857 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
1858 THEN RESA_TAC;
1859 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1860 MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
1861 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1862 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
1863 THEN RESA_TAC
1864 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1865 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
1866 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+2 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
1867 THEN RESA_TAC
1868 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
1869 ASM_REWRITE_TAC[];
1870 MRESA_TAC SUM_EQ[`      ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
1871        (\(x,y). p - 2 + x,p - 2 + y))`;`(\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2)))`;`(J1_SY (s3:stable_sy) DELETE (k - p + 2,1))`]
1872 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
1873 THEN SUBGOAL_THEN`(!x y.
1874            x IN J1_SY s3 DELETE (k - p + 2,1) /\
1875            y IN J1_SY (s3:stable_sy) DELETE (k - p + 2,1) /\
1876            (\(x,y). p - 2 + x,p - 2 + y) x = (\(x,y). p - 2 + x,p - 2 + y) y
1877            ==> x = y)`ASSUME_TAC;
1878 REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM]
1879 THEN REPEAT STRIP_TAC
1880 THEN POP_ASSUM MP_TAC
1881 THEN ASM_REWRITE_TAC[PAIR_EQ;ARITH_RULE`p-2+B=p-2+C<=> B=C`];
1882 MRESA_TAC SUM_IMAGE[`(\(x,y). p - 2 + x,p - 2 + y)`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s3:stable_sy) DELETE (k - p + 2,1)`]
1883 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
1884 THEN SUBGOAL_THEN`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1) INTER (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))={}` ASSUME_TAC;
1885 ASM_REWRITE_TAC[SET_RULE`A ={} <=> ~(?a. a IN A)`; INTER;IN_ELIM_THM;J1_SY;DELETE;IMAGE;IN_NUMSEG]
1886 THEN STRIP_TAC
1887 THEN POP_ASSUM MP_TAC
1888 THEN ASM_REWRITE_TAC[PAIR_EQ]
1889 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1890 THEN RESA_TAC;
1891 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
1892 THEN REMOVE_ASSUM_TAC
1893 THEN REMOVE_ASSUM_TAC
1894 THEN REMOVE_ASSUM_TAC
1895 THEN REMOVE_ASSUM_TAC
1896 THEN REMOVE_ASSUM_TAC
1897 THEN POP_ASSUM MP_TAC
1898 THEN ASM_REWRITE_TAC[]
1899 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1900 MP_TAC(ARITH_RULE`i<p /\ 2< p ==> i=p-1 \/ i< p-1:num`)
1901 THEN RESA_TAC;
1902 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
1903 THEN REMOVE_ASSUM_TAC
1904 THEN REMOVE_ASSUM_TAC
1905 THEN REMOVE_ASSUM_TAC
1906 THEN REMOVE_ASSUM_TAC
1907 THEN REMOVE_ASSUM_TAC
1908 THEN REMOVE_ASSUM_TAC
1909 THEN REMOVE_ASSUM_TAC
1910 THEN POP_ASSUM MP_TAC
1911 THEN ASM_REWRITE_TAC[]
1912 THEN MP_TAC(ARITH_RULE` 2< p ==> p-1< p:num/\ SUC (p-1)=p`)
1913 THEN RESA_TAC
1914 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1915 MP_TAC(ARITH_RULE`1<= i /\ i< p-1 /\ 1<= i' ==> ~(i= p-2+i')`)
1916 THEN RESA_TAC;
1917 MRESA_TAC FINITE_IMAGE[`(\(x,y). p - 2 + x,p - 2 + y)`;`(J1_SY (s3:stable_sy) DELETE (k - p + 2,1))`]
1918 THEN MRESAL_TAC (GEN_ALL SUM_UNION_EQ)[`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1)`;`(IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY (s3:stable_sy) DELETE (k - p + 2,1)))`;`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY (s3:stable_sy) DELETE (k - p + 2,1)))`][FINITE_UNION;FINITE_DELETE]
1919 THEN SUBGOAL_THEN`IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)) SUBSET
1920       J1_SY s DELETE (k,1)` ASSUME_TAC;
1921 MATCH_MP_TAC(SET_RULE`~(x IN A) /\ A SUBSET B ==> A SUBSET B DELETE x`)
1922 THEN ASM_REWRITE_TAC[]
1923 THEN ASM_REWRITE_TAC[IMAGE;IN_ELIM_THM;DELETE;J1_SY;IN_NUMSEG]
1924 THEN STRIP_TAC
1925 THEN POP_ASSUM MP_TAC
1926 THEN POP_ASSUM MP_TAC
1927 THEN ASM_REWRITE_TAC[PAIR_EQ]
1928 THEN MP_TAC(ARITH_RULE`i<= k-p+2 ==> i=k-p+2 \/ i< k-p+2`)
1929 THEN RESA_TAC;
1930 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1931 MP_TAC(ARITH_RULE`i< k-p+2  /\ 1<= k-p /\ 2< p ==> ~(k=p-2 +i)`)
1932 THEN RESA_TAC;
1933 MP_TAC(SET_RULE`IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)) SUBSET
1934       J1_SY s DELETE (k,1)
1935 /\ J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY s DELETE (k,1)
1936 ==> J1_SY s1 DELETE (p - 1,p) DELETE (p,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1))) SUBSET J1_SY (s:stable_sy) DELETE (k,1)`)
1937 THEN RESA_TAC
1938 THEN MRESAL_TAC SUM_DIFF[`(\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l)))`;`J1_SY(s:stable_sy) DELETE (k,1)`;`J1_SY (s1:stable_sy) DELETE (p-1,p:num) DELETE (p:num,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))`][FINITE_J1_SY;FINITE_DELETE]
1939 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
1940 THEN MATCH_MP_TAC SUM_POS_LE
1941 THEN STRIP_TAC;
1942 MATCH_MP_TAC FINITE_DIFF
1943 THEN REWRITE_TAC[FINITE_J1_SY; FINITE_DELETE];
1944 REPEAT STRIP_TAC
1945 THEN POP_ASSUM MP_TAC
1946 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG;DIFF;DELETE]
1947 THEN STRIP_TAC
1948 THEN REMOVE_ASSUM_TAC
1949 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
1950 THEN POP_ASSUM MP_TAC
1951 THEN REAL_ARITH_TAC;
1952 MP_TAC(SET_RULE`~(p,1 IN J1_SY s1 DELETE (p - 1,p))
1953 ==> J1_SY (s1:stable_sy) DELETE (p - 1,p) = J1_SY s1 DELETE (p - 1,p) DELETE (p,1)`)
1954 THEN RESA_TAC
1955 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
1956 THEN SUBGOAL_THEN`J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY (s:stable_sy) DELETE (k,1)`ASSUME_TAC;
1957 MATCH_MP_TAC(SET_RULE`~(x IN A) /\ A SUBSET B==> A SUBSET B DELETE x`)
1958 THEN ASM_REWRITE_TAC[]
1959 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1960 THEN MATCH_MP_TAC(SET_RULE`~(x IN A) ==> ~(x IN A DELETE y)`)
1961 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;PAIR_EQ;IN_NUMSEG]
1962 THEN STRIP_TAC
1963 THEN REMOVE_ASSUM_TAC
1964 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
1965 THEN POP_ASSUM MP_TAC
1966 THEN MP_TAC(ARITH_RULE`1<= k-p ==> ~(k<=p)`)
1967 THEN RESA_TAC;
1968 ASM_REWRITE_TAC[REAL_ARITH`
1969 A1+ #0.1 * -- &1 * (C1+B) <=(A+ #0.1 * -- &1 *(C+B)) + D+ #0.1 * -- &1* E
1970 <=> A1+ #0.1 * -- &1 * (C1) <=(A+ #0.1 * -- &1 *(C)) + D+ #0.1 * -- &1* E
1971 `]
1972 THEN MATCH_MP_TAC(REAL_ARITH`
1973 A1<= A+D /\ &0<=C1-(C+E)
1974 ==>
1975 A1+ #0.1 * -- &1 * (C1) <=(A+ #0.1 * -- &1 *(C)) + D+ #0.1 * -- &1* E`)
1976 THEN STRIP_TAC;
1977 FIND_ASSUM MP_TAC `COVER2_SY s s1 (s2:stable_sy)`
1978 THEN REWRITE_TAC[COVER2_SY]
1979 THEN RESA_TAC;
1980 SUBGOAL_THEN`!x. x IN (J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))
1981 ==> (\x. cstab -
1982       norm
1983       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P))) x
1984 = (\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product)))) x` ASSUME_TAC;
1985 ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;DELETE;IN_NUMSEG]
1986 THEN REPEAT STRIP_TAC
1987 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
1988 THEN POP_ASSUM MP_TAC
1989 THEN POP_ASSUM MP_TAC
1990 THEN ASM_REWRITE_TAC[]
1991 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
1992 THEN RESA_TAC;
1993 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
1994 MP_TAC(ARITH_RULE`i< p /\ 2<p ==> i=p -1 \/ SUC i<p:num`)
1995 THEN RESA_TAC;
1996 MP_TAC(ARITH_RULE`2<p ==> p-1< p /\ SUC (p-1)=p`)
1997 THEN RESA_TAC
1998 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
1999 RESA_TAC
2000 THEN RESA_TAC
2001 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
2002 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2003 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2004 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2005 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
2006 THEN RESA_TAC
2007 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2008 ASM_REWRITE_TAC[];
2009 MRESA_TAC SUM_EQ[`(\x. cstab -
2010       norm
2011       (row (FST x) ((pmat1 (vecmats (l:real^(M,3)finite_product)):real^3^P)) - row (SND x) ((pmat1 (vecmats l)):real^3^P)))`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`(J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1))`]
2012 THEN EXPAND_TAC"l1"
2013 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
2014 THEN ASM_REWRITE_TAC[]
2015 THEN REMOVE_ASSUM_TAC
2016 THEN REMOVE_ASSUM_TAC
2017 THEN SUBGOAL_THEN`!x. x IN (J1_SY (s3:stable_sy) DELETE (k - p + 2,1))
2018 ==> 
2019       ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
2020        (\(x,y). p - 2 + x,p - 2 + y)) x
2021 = (\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2))) x`
2022 ASSUME_TAC;
2023 ASM_REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM;o_DEF;IN_NUMSEG]
2024 THEN REPEAT STRIP_TAC
2025 THEN ASM_REWRITE_TAC[REAL_ARITH`A-B=A-C<=> B=C`]
2026 THEN EXPAND_TAC"l2"
2027 THEN REWRITE_TAC[VECMATS_MATVEC_ID;]
2028 THEN POP_ASSUM MP_TAC
2029 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i=k-p+2 \/ i<k-p+2:num`)
2030 THEN RESA_TAC;
2031 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
2032 MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
2033 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2034 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
2035 THEN RESA_TAC
2036 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2037 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2038 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+2 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
2039 THEN RESA_TAC
2040 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2041 ASM_REWRITE_TAC[];
2042 MRESA_TAC SUM_EQ[`      ((\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l))) o
2043        (\(x,y). p - 2 + x,p - 2 + y))`;`(\x. cstab - norm (row (FST x) (vecmats (l2:real^(N,3)finite_product)) - row (SND x) (vecmats l2)))`;`(J1_SY (s3:stable_sy) DELETE (k - p + 2,1))`]
2044 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2045 THEN SUBGOAL_THEN`(!x y.
2046            x IN J1_SY s3 DELETE (k - p + 2,1) /\
2047            y IN J1_SY (s3:stable_sy) DELETE (k - p + 2,1) /\
2048            (\(x,y). p - 2 + x,p - 2 + y) x = (\(x,y). p - 2 + x,p - 2 + y) y
2049            ==> x = y)`ASSUME_TAC;
2050 REWRITE_TAC[J1_SY;DELETE;IN_ELIM_THM]
2051 THEN REPEAT STRIP_TAC
2052 THEN POP_ASSUM MP_TAC
2053 THEN ASM_REWRITE_TAC[PAIR_EQ;ARITH_RULE`p-2+B=p-2+C<=> B=C`];
2054 MRESA_TAC SUM_IMAGE[`(\(x,y). p - 2 + x,p - 2 + y)`;`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s3:stable_sy) DELETE (k - p + 2,1)`]
2055 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2056 THEN SUBGOAL_THEN`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1) INTER (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))={}` ASSUME_TAC;
2057 ASM_REWRITE_TAC[SET_RULE`A ={} <=> ~(?a. a IN A)`; INTER;IN_ELIM_THM;J1_SY;DELETE;IMAGE;IN_NUMSEG]
2058 THEN STRIP_TAC
2059 THEN POP_ASSUM MP_TAC
2060 THEN ASM_REWRITE_TAC[PAIR_EQ]
2061 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i< p:num`)
2062 THEN RESA_TAC;
2063 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2064 THEN REMOVE_ASSUM_TAC
2065 THEN REMOVE_ASSUM_TAC
2066 THEN REMOVE_ASSUM_TAC
2067 THEN REMOVE_ASSUM_TAC
2068 THEN REMOVE_ASSUM_TAC
2069 THEN POP_ASSUM MP_TAC
2070 THEN ASM_REWRITE_TAC[]
2071 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
2072 MP_TAC(ARITH_RULE`i<p /\ 2< p ==> i=p-1 \/ i< p-1:num`)
2073 THEN RESA_TAC;
2074 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2075 THEN REMOVE_ASSUM_TAC
2076 THEN REMOVE_ASSUM_TAC
2077 THEN REMOVE_ASSUM_TAC
2078 THEN REMOVE_ASSUM_TAC
2079 THEN REMOVE_ASSUM_TAC
2080 THEN REMOVE_ASSUM_TAC
2081 THEN REMOVE_ASSUM_TAC
2082 THEN POP_ASSUM MP_TAC
2083 THEN ASM_REWRITE_TAC[]
2084 THEN MP_TAC(ARITH_RULE` 2< p ==> p-1< p:num/\ SUC (p-1)=p`)
2085 THEN RESA_TAC
2086 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
2087 MP_TAC(ARITH_RULE`1<= i /\ i< p-1 /\ 1<= i' ==> ~(i= p-2+i')`)
2088 THEN RESA_TAC;
2089 MRESAL_TAC FINITE_IMAGE[`(\(x,y). p - 2 + x,p - 2 + y)`;`(J1_SY (s3:stable_sy) DELETE (k - p + 2,1))`][FINITE_J1_SY;FINITE_DELETE]
2090 THEN MRESAL_TAC (GEN_ALL SUM_UNION_EQ)[`(\x. cstab - norm (row (FST x) (vecmats l) - row (SND x) (vecmats (l:real^(M,3)finite_product))))`;`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1)`;`(IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY (s3:stable_sy) DELETE (k - p + 2,1)))`;`J1_SY (s1:stable_sy) DELETE (p - 1,p) DELETE (p,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY (s3:stable_sy) DELETE (k - p + 2,1)))`][FINITE_UNION;FINITE_DELETE;FINITE_J1_SY]
2091 THEN MP_TAC(SET_RULE`IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)) SUBSET
2092       J1_SY s 
2093 /\ J1_SY s1 DELETE (p - 1,p) DELETE (p,1) SUBSET J1_SY s 
2094 ==> J1_SY s1 DELETE (p - 1,p) DELETE (p,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1))) SUBSET J1_SY (s:stable_sy) `)
2095 THEN RESA_TAC
2096 THEN MRESAL_TAC SUM_DIFF[`(\x. cstab - norm (row (FST x) (vecmats (l:real^(M,3)finite_product)) - row (SND x) (vecmats l)))`;`J1_SY(s:stable_sy) `;`J1_SY (s1:stable_sy) DELETE (p-1,p:num) DELETE (p:num,1) UNION (IMAGE (\(x,y). p - 2 + x,p - 2 + y) (J1_SY s3 DELETE (k - p + 2,1)))`][FINITE_J1_SY;FINITE_DELETE]
2097 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2098 THEN MATCH_MP_TAC SUM_POS_LE
2099 THEN STRIP_TAC;
2100 MATCH_MP_TAC FINITE_DIFF
2101 THEN REWRITE_TAC[FINITE_J1_SY; FINITE_DELETE];
2102 REPEAT STRIP_TAC
2103 THEN POP_ASSUM MP_TAC
2104 THEN ASM_REWRITE_TAC[J1_SY;IN_ELIM_THM;IN_NUMSEG;DIFF;DELETE]
2105 THEN STRIP_TAC
2106 THEN REMOVE_ASSUM_TAC
2107 THEN MRESA_TAC (GEN_ALL B_SY_LE_CSTAB)[`i:num`;`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`;]
2108 THEN POP_ASSUM MP_TAC
2109 THEN REAL_ARITH_TAC]);;
2110
2111
2112
2113 let F_SY_COVER_EQ=prove_by_refinement(`!(l:real^(M,3)finite_product)
2114 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2115 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2116 /\ 1<= k-p
2117 /\ 2<p
2118 /\ matvec(pmat1(vecmats l))= l1
2119 /\ matvec(pmat2(vecmats l))= l2
2120 /\ (!i j. 1<= i /\ i<= dimindex (:M) /\ 1<= j /\ j<= dimindex (:M)
2121 /\ row i (vecmats l)= row j (vecmats l)
2122 ==> i=j)
2123 ==> (F_SY(vecmats l1) DELETE (row (p-1) (vecmats l1), row p (vecmats l1))) UNION (F_SY(vecmats l2) DELETE (row (k-p+2) (vecmats l2), row 1 (vecmats l2))) = F_SY(vecmats l)`,
2124 [REPEAT STRIP_TAC
2125 THEN POP_ASSUM MP_TAC
2126 THEN DISCH_THEN(LABEL_TAC"THY")
2127 THEN REWRITE_TAC[F_SY;UNION;EXTENSION;IN_ELIM_THM;DELETE]
2128 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2129 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2130 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2131 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2132 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p `)
2133 THEN RESA_TAC
2134 THEN GEN_TAC
2135 THEN EQ_TAC
2136 THEN RESA_TAC;
2137 EXPAND_TAC"l1"
2138 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2139 THEN POP_ASSUM MP_TAC
2140 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i<p:num`)
2141 THEN RESA_TAC;
2142 MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2143 THEN ASM_REWRITE_TAC[]
2144 THEN REMOVE_THEN "THY" MP_TAC
2145 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2146 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
2147 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2148 POP_ASSUM MP_TAC
2149 THEN RESA_TAC
2150 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2151 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
2152 THEN RESA_TAC
2153 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2154 DISCH_THEN(LABEL_TAC"THY")
2155 THEN STRIP_TAC
2156 THEN EXISTS_TAC`k:num`
2157 THEN ASM_REWRITE_TAC[ARITH_RULE`k<=k`]
2158 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2159 THEN ARITH_TAC;
2160 MP_TAC(ARITH_RULE` i< p/\ 2<p ==> i= p-1 \/ SUC i< p`)
2161 THEN RESA_TAC;
2162 MP_TAC(ARITH_RULE` 2< p ==> p-1< p:num /\ SUC(p-1)=p`)
2163 THEN RESA_TAC
2164 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
2165 MP_TAC(ARITH_RULE` i< p /\ 1<= k-p ==> i< k:num /\ i<=k`)
2166 THEN RESA_TAC
2167 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
2168 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
2169 THEN STRIP_TAC
2170 THEN EXISTS_TAC`i:num`
2171 THEN ASM_REWRITE_TAC[]
2172 THEN REMOVE_THEN "THY" MP_TAC
2173 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2174 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2175 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2176 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
2177 THEN RESA_TAC
2178 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2179 ASM_REWRITE_TAC[];
2180 POP_ASSUM MP_TAC
2181 THEN MP_TAC(ARITH_RULE`i <= k-p+2 ==> i=k-p+2 \/ i <k-p+2`)
2182 THEN RESA_TAC;
2183 MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
2184 EXPAND_TAC"l2"
2185 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2186 THEN REMOVE_THEN "THY" MP_TAC
2187 THEN SUBGOAL_THEN`row i ((pmat2 (vecmats l)):real^3^N) = row (p-2+i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2188 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
2189 THEN RESA_TAC
2190 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2191 SUBGOAL_THEN`row (SUC i) ((pmat2 (vecmats l)):real^3^N) = row (p-2+ SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2192 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k-p+2 ==> k - (k - p + 2) + SUC i= p-2+SUC i/\ 1<= SUC i /\ SUC i<= k-p+2`)
2193 THEN RESA_TAC
2194 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2195 MP_TAC(ARITH_RULE` i< k-p+2 /\ 1<= k-p /\ 2<p==> p-2+ i< k:num /\ p-2+i <=k/\ 1<= p-2+i/\ p-2+ SUC i= SUC(p-2+i)`)
2196 THEN RESA_TAC
2197 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
2198 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
2199 THEN DISCH_THEN(LABEL_TAC"THY")
2200 THEN STRIP_TAC
2201 THEN EXISTS_TAC`p-2+i`
2202 THEN ASM_REWRITE_TAC[];
2203 DISJ_CASES_TAC(ARITH_RULE`i< p-1\/ p-1<= i`);
2204 MATCH_MP_TAC(SET_RULE`A==> A\/B`)
2205 THEN ASM_REWRITE_TAC[]
2206 THEN MP_TAC(ARITH_RULE`i<p-1 /\ 1<= k-p ==> i< k /\ i<= p /\ i<p /\ SUC i< p`)
2207 THEN RESA_TAC
2208 THEN EXPAND_TAC"l1"
2209 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2210 THEN REMOVE_THEN "THY" MP_TAC
2211 THEN SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2212 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2213 SUBGOAL_THEN`row (SUC i) ((pmat1 (vecmats l)):real^3^P) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2214 MP_TAC(ARITH_RULE`SUC i < p==> 1<= SUC i /\ SUC i <= p`)
2215 THEN RESA_TAC
2216 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2217 ASM_REWRITE_TAC[]
2218 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
2219 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
2220 THEN DISCH_THEN(LABEL_TAC"THY")
2221 THEN STRIP_TAC;
2222 EXISTS_TAC`i:num`
2223 THEN ASM_REWRITE_TAC[];
2224 REMOVE_THEN "THY" MP_TAC
2225 THEN SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2226 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
2227 THEN RESA_TAC
2228 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2229 SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2230 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
2231 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2232 POP_ASSUM MP_TAC
2233 THEN RESA_TAC
2234 THEN DISCH_THEN(LABEL_TAC"THY")
2235 THEN ASM_REWRITE_TAC[PAIR_EQ]
2236 THEN STRIP_TAC
2237 THEN MP_TAC(ARITH_RULE`2<p /\ 1<= k-p /\ i< p-1==> 1<= p-1 /\ p-1<= k /\ ~(i=p-1)`)
2238 THEN RESA_TAC
2239 THEN REMOVE_THEN"THY"(fun th-> MRESA_TAC th[`i:num`;`p-1`]);
2240 MP_TAC(ARITH_RULE`i<= k ==> i=k \/ i< k:num`)
2241 THEN RESA_TAC;
2242 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2243 THEN MATCH_MP_TAC(SET_RULE`A==> A\/B`)
2244 THEN STRIP_TAC;
2245 EXISTS_TAC`p:num`
2246 THEN ASM_REWRITE_TAC[]
2247 THEN EXPAND_TAC"l1"
2248 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2249 THEN REMOVE_THEN "THY" MP_TAC
2250 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2251 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
2252 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2253 POP_ASSUM MP_TAC
2254 THEN RESA_TAC
2255 THEN SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2256 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
2257 THEN RESA_TAC
2258 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2259 MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2260 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`];
2261 REWRITE_TAC[PAIR_EQ]
2262 THEN REMOVE_THEN "THY" MP_TAC
2263 THEN SUBGOAL_THEN`row (p-1) ((pmat1 (vecmats l)):real^3^P) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2264 MP_TAC(ARITH_RULE`2< p ==> p-1 <= p /\ 1<= p-1/\ p-1<p`)
2265 THEN RESA_TAC
2266 THEN  ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2267 DISCH_THEN(LABEL_TAC"THY")
2268 THEN EXPAND_TAC"l1"
2269 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2270 THEN STRIP_TAC
2271 THEN REMOVE_THEN"THY"(fun th-> MRESA_TAC th[`k:num`;`p-1`])
2272 THEN POP_ASSUM MP_TAC
2273 THEN MP_TAC(ARITH_RULE`2< p /\ 1<= k-p ==> 1<= p-1 /\ ~(k=p-1)`)
2274 THEN RESA_TAC;
2275 MATCH_MP_TAC(SET_RULE`A==> B\/A`)
2276 THEN ASM_REWRITE_TAC[]
2277 THEN MP_TAC(ARITH_RULE`p-1<= i /\ 2< p/\ i< k /\ 1<= k-p ==> 1<= i- (p-2) /\ i-(p-2)<= k-p+2/\ k - (k - p + 2) = p-2 /\ i-(p-2)< k- p+2/\  SUC (i - (p - 2))= SUC i - (p - 2)/\ k<=k`)
2278 THEN RESA_TAC
2279 THEN EXPAND_TAC"l2"
2280 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2281 THEN REMOVE_THEN "THY" MP_TAC
2282 THEN SUBGOAL_THEN`row (i-(p-2)) ((pmat2 (vecmats l)):real^3^N) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2283 MP_TAC(ARITH_RULE` 2<p /\ p-1<= i ==> 
2284 p-2 + i-(p-2) =i`)
2285 THEN RESA_TAC
2286 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2287 SUBGOAL_THEN`row (SUC i -(p-2)) ((pmat2 (vecmats l)):real^3^N) = row (SUC i) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2288 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p/\ i< k /\ p-1<=i ==> p-2 + SUC i -(p-2)= SUC i/\ 1<= SUC i -(p-2) /\ SUC i - (p-2)<= k-p+2`)
2289 THEN RESA_TAC
2290 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2291 DISCH_THEN(LABEL_TAC"THY")
2292 THEN STRIP_TAC;
2293 EXISTS_TAC`i-(p-2)`
2294 THEN ASM_REWRITE_TAC[]
2295 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
2296 THEN MRESA_TAC MOD_LT[`i-(p-2):num`;`k-p+2:num`];
2297 POP_ASSUM MP_TAC
2298 THEN EXPAND_TAC"l2"
2299 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2300 THEN SUBGOAL_THEN`row (k-p+2) ((pmat2 (vecmats l)):real^3^N) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2301 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p ==> k-p+2<=k-p+2 /\ 1<= k-p+2 /\ k - (k - p + 2) + k - p + 2= k`)
2302 THEN RESA_TAC
2303 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2304 DISCH_THEN(LABEL_TAC"THY")
2305 THEN ASM_REWRITE_TAC[PAIR_EQ]
2306 THEN STRIP_TAC
2307 THEN REMOVE_THEN"THY"(fun th->MRESA_TAC th[`i:num`;`k:num`])
2308 THEN MP_TAC(ARITH_RULE`i<k==> ~(i=k:num)`)
2309 THEN RESA_TAC]);;
2310
2311
2312 let F_SY_COVER_INTER=prove_by_refinement(`!(l:real^(M,3)finite_product)
2313 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2314 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2315 /\ 1<= k-p
2316 /\ 2<p
2317 /\ matvec(pmat1(vecmats l))= l1
2318 /\ matvec(pmat2(vecmats l))= l2
2319 /\ (!i j. 1<= i /\ i<= dimindex (:M) /\ 1<= j /\ j<= dimindex (:M)
2320 /\ row i (vecmats l)= row j (vecmats l)
2321 ==> i=j)
2322 ==> (F_SY(vecmats l1) DELETE (row (p-1) (vecmats l1), row p (vecmats l1))) INTER (F_SY(vecmats l2) DELETE (row (k-p+2) (vecmats l2), row 1 (vecmats l2))) = {} `,
2323 [REPEAT STRIP_TAC
2324 THEN POP_ASSUM MP_TAC
2325 THEN DISCH_THEN(LABEL_TAC"THY")
2326 THEN REWRITE_TAC[F_SY;INTER;IN_ELIM_THM;DELETE;SET_RULE`A={}<=> ~(?a. a IN A)`]
2327 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2328 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2329 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2330 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2331 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p `)
2332 THEN RESA_TAC
2333 THEN STRIP_TAC
2334 THEN POP_ASSUM MP_TAC
2335 THEN POP_ASSUM MP_TAC
2336 THEN DISCH_THEN(LABEL_TAC"THY1")
2337 THEN STRIP_TAC
2338 THEN REMOVE_THEN "THY1"MP_TAC
2339 THEN ASM_REWRITE_TAC[PAIR_EQ]
2340 THEN EXPAND_TAC"l1"
2341 THEN EXPAND_TAC"l2"
2342 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2343 THEN REMOVE_THEN "THY" MP_TAC
2344 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2345 ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
2346 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2347 POP_ASSUM MP_TAC
2348 THEN RESA_TAC
2349 THEN SUBGOAL_THEN`row i' ((pmat2 (vecmats l)):real^3^N) = row (p-2+i') (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2350 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i'= p-2+i'`)
2351 THEN RESA_TAC
2352 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2353 ASM_REWRITE_TAC[]
2354 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i<p:num`)
2355 THEN RESA_TAC;
2356 DISCH_THEN(LABEL_TAC"THY")
2357 THEN STRIP_TAC
2358 THEN POP_ASSUM MP_TAC
2359 THEN DISCH_THEN(LABEL_TAC"THY1")
2360 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=i' /\ 1<= k-p /\ i'<= k-p+2 ==> k<=k /\ 1<= p-2+i' /\ p-2+i'<=k/\ ~(i'=0)`)
2361 THEN RESA_TAC
2362 THEN REMOVE_THEN "THY"(fun th-> MRESA_TAC th[`k:num`;`p-2+i'`] 
2363 THEN POP_ASSUM MP_TAC
2364 THEN MP_TAC th
2365 THEN DISCH_THEN(LABEL_TAC"THY"))
2366 THEN STRIP_TAC
2367 THEN MP_TAC(ARITH_RULE`k = p - 2 + i'/\ 2<p /\ 1<= k-p ==> i'= k-p+2`)
2368 THEN RESA_TAC
2369 THEN POP_ASSUM MP_TAC
2370 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2371 THEN STRIP_TAC
2372 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2373 THEN MRESAL_TAC MOD_MULT[`i':num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2374 THEN REMOVE_THEN"THY1"MP_TAC
2375 THEN ASM_REWRITE_TAC[ARITH_RULE`SUC 0=1`]
2376 THEN REMOVE_THEN"THY" MP_TAC
2377 THEN SUBGOAL_THEN`row 1 ((pmat2 (vecmats l)):real^3^N) = row (p-1) (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2378 MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + 1= p-1/\ 1<=1 /\ 1<=k-p+2`)
2379 THEN RESA_TAC
2380 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ];
2381 SUBGOAL_THEN`row 1 ((pmat1 (vecmats l)):real^3^P) = row 1 (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2382 MP_TAC(ARITH_RULE`2<p==> 1<=1 /\ 1<p `)
2383 THEN RESA_TAC
2384 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2385 ASM_REWRITE_TAC[]
2386 THEN DISCH_THEN(LABEL_TAC"THY")
2387 THEN STRIP_TAC
2388 THEN REMOVE_THEN "THY"(fun th-> MRESA_TAC th[`1:num`;`p-1`] )
2389 THEN POP_ASSUM MP_TAC
2390 THEN MP_TAC(ARITH_RULE`2< p /\ 1<= k-p ==> 1<=1 /\ 1<= p-1 /\ p-1<=k /\ ~(1=p-1)`)
2391 THEN RESA_TAC;
2392 SUBGOAL_THEN`row i ((pmat1 (vecmats l)):real^3^P) = row i (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC;
2393 ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2394 ASM_REWRITE_TAC[]
2395 THEN DISCH_THEN(LABEL_TAC"THY")
2396 THEN STRIP_TAC
2397 THEN POP_ASSUM MP_TAC
2398 THEN POP_ASSUM MP_TAC
2399 THEN POP_ASSUM MP_TAC
2400 THEN POP_ASSUM MP_TAC
2401 THEN POP_ASSUM MP_TAC
2402 THEN POP_ASSUM MP_TAC
2403 THEN POP_ASSUM MP_TAC
2404 THEN POP_ASSUM MP_TAC
2405 THEN POP_ASSUM MP_TAC
2406 THEN POP_ASSUM MP_TAC
2407 THEN POP_ASSUM MP_TAC
2408 THEN DISCH_THEN(LABEL_TAC"THY1")
2409 THEN REPEAT STRIP_TAC
2410 THEN POP_ASSUM MP_TAC
2411 THEN POP_ASSUM MP_TAC
2412 THEN POP_ASSUM MP_TAC
2413 THEN DISCH_THEN(LABEL_TAC"THY")
2414 THEN STRIP_TAC
2415 THEN STRIP_TAC
2416 THEN REMOVE_THEN "THY"(fun th-> MRESA_TAC th[`i:num`;`p-2+i'`] )
2417 THEN POP_ASSUM MP_TAC
2418 THEN MP_TAC(ARITH_RULE`i<p /\ 1<= k-p /\ 2< p /\ 1<=i'/\ i'<= k-p+2
2419 ==> i <= k /\ 1 <= p - 2 + i' /\ p - 2 + i' <= k /\ p-1<= p-2+i'`)
2420 THEN RESA_TAC
2421 THEN MP_TAC(ARITH_RULE`i<p /\ p-1<= p-2+i' /\ 2< p==> (i=p-1 /\ i'=1) \/ i< p-2+i'`)
2422 THEN RESA_TAC;
2423 REMOVE_THEN"THY1"MP_TAC
2424 THEN ASM_REWRITE_TAC[]
2425 THEN MP_TAC(ARITH_RULE`i<p /\ p-1<= p-2+i' /\ 2< p==> p-1<p /\ SUC (p-1)=p`)
2426 THEN RESA_TAC
2427 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`];
2428 POP_ASSUM MP_TAC
2429 THEN ARITH_TAC]);;
2430
2431
2432
2433 let ROW_IN_F_SY=prove(`! (l:real^(M,3)finite_product)
2434  (l1:real^(P,3)finite_product).
2435  dimindex(:P) =p 
2436 /\ 2<p
2437 /\ matvec(pmat1(vecmats l))= l1
2438 ==> (row (p - 1) (vecmats l1),row p (vecmats l1)) IN F_SY (vecmats l1)`,
2439 REPEAT STRIP_TAC
2440 THEN ASM_REWRITE_TAC[F_SY;IN_ELIM_THM]
2441 THEN EXISTS_TAC`p-1`
2442 THEN ASM_REWRITE_TAC[]
2443 THEN MP_TAC(ARITH_RULE`2<p==> p-1<p  /\ 1<= p-1 /\ p-1<=p/\ SUC(p-1)=p`)
2444 THEN RESA_TAC
2445 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]);;
2446
2447
2448 let PMAT2_EQ_SY=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2449 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2450 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2451 /\ 1<= k-p
2452 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2453 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2454 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2455 /\ (ear_sy s2 <=> ear_sy s3)
2456 /\ DIA_SY 0 (p-1) s
2457 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2458 /\ COVER_SY 0 (p-1) s s1 s2 
2459 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2460 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2461 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2462 /\ matvec(pmat1(vecmats l))= l1
2463 /\ matvec(pmat2(vecmats l))= l2
2464 /\ 1<= i /\ i<= k-p+2
2465 ==> row i (vecmats l2) = row (p-2+i ) (vecmats l)`,
2466 REPEAT STRIP_TAC
2467 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2468 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2469 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2470 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2471 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2472 THEN RESA_TAC
2473 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2474 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2475 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2476 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2477 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2478 THEN EXPAND_TAC"l2"
2479 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2480 THEN MP_TAC(ARITH_RULE`1<=k-p/\ 2<p  ==> k - (k - p + 2) + i= p-2+i`)
2481 THEN RESA_TAC
2482 THEN ASM_SIMP_TAC[row;pmat2;LAMBDA_BETA;CART_EQ]);;
2483
2484 let PMAT1_EQ_SY=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2485 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2486 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2487 /\ 1<= k-p
2488 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2489 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2490 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2491 /\ (ear_sy s2 <=> ear_sy s3)
2492 /\ DIA_SY 0 (p-1) s
2493 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2494 /\ COVER_SY 0 (p-1) s s1 s2 
2495 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2496 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2497 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2498 /\ matvec(pmat1(vecmats l))= l1
2499 /\ matvec(pmat2(vecmats l))= l2
2500 /\ 1<= i /\ i<= p-1
2501 ==> row i (vecmats l1) = row i (vecmats l)`,
2502 REPEAT STRIP_TAC
2503 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2504 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2505 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2506 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2507 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2508 THEN RESA_TAC
2509 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2510 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2511 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2512 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2513 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2514 THEN EXPAND_TAC"l1"
2515 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2516 THEN MP_TAC(ARITH_RULE`i<=p-1/\ 2<p  ==> i<= p /\ i< p`)
2517 THEN RESA_TAC
2518 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ]);;
2519
2520
2521 let PMAT1_EQ_SY_P=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2522 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2523 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2524 /\ 1<= k-p
2525 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2526 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2527 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2528 /\ (ear_sy s2 <=> ear_sy s3)
2529 /\ DIA_SY 0 (p-1) s
2530 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2531 /\ COVER_SY 0 (p-1) s s1 s2 
2532 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2533 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2534 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2535 /\ matvec(pmat1(vecmats l))= l1
2536 /\ matvec(pmat2(vecmats l))= l2
2537 ==> row p (vecmats l1) = row k (vecmats l)`,
2538 REPEAT STRIP_TAC
2539 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2540 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2541 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2542 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2543 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2544 THEN RESA_TAC
2545 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2546 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2547 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2548 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2549 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2550 THEN EXPAND_TAC"l1"
2551 THEN REWRITE_TAC[VECMATS_MATVEC_ID]
2552 THEN SUBGOAL_THEN`1<= p/\ p<= dimindex(:P)==> row p ((pmat1 (vecmats l)):real^3^P) = row k (vecmats (l:real^(M,3)finite_product))` ASSUME_TAC
2553 THENL[ASSUME_TAC(ARITH_RULE`p<=p /\ ~(p<p:num) `)
2554 THEN ASM_SIMP_TAC[row;pmat1;LAMBDA_BETA;CART_EQ];
2555 POP_ASSUM MATCH_MP_TAC 
2556 THEN ASM_REWRITE_TAC[]]);;
2557
2558
2559
2560
2561 let POWER_RHO_NODE_SY= prove_by_refinement(`!i u (l:real^(M,3)finite_product). local_fan (V_SY (vecmats (l:real^(M,3)finite_product)),E_SY (vecmats l),F_SY (vecmats l))
2562 /\ 1<= i /\ i<= dimindex (:M) 
2563 /\ row i (vecmats l)=u
2564 /\ row 1 (vecmats l)=v
2565 ==>  ITER (i-1) (rho_node1 (F_SY (vecmats l))) v=u`,
2566 [INDUCT_TAC;
2567 ARITH_TAC;
2568 POP_ASSUM MP_TAC
2569 THEN DISCH_THEN(LABEL_TAC"THY")
2570 THEN REPEAT GEN_TAC
2571 THEN DISJ_CASES_TAC(ARITH_RULE`i=0 \/ 1<=i`);
2572 ASM_REWRITE_TAC[ARITH_RULE`1-1=0/\ SUC 0=1`;ITER]
2573 THEN RESA_TAC
2574 THEN POP_ASSUM(fun th-> ASM_REWRITE_TAC[SYM th]);
2575 STRIP_TAC
2576 THEN MP_TAC(ARITH_RULE`1<=i /\ SUC i <= dimindex(:M) ==> SUC i- 1= SUC(i-1) /\ i<= dimindex(:M) /\ i< dimindex(:M)`)
2577 THEN RESA_TAC
2578 THEN REMOVE_THEN "THY"(fun th-> MRESA_TAC th[`row i (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`])
2579 THEN ASM_REWRITE_TAC[ITER]
2580 THEN MATCH_MP_TAC (GEN_ALL Local_lemmas.DETER_RHO_NODE)
2581 THEN EXISTS_TAC`V_SY (vecmats (l:real^(M,3)finite_product))`
2582 THEN EXISTS_TAC`E_SY (vecmats (l:real^(M,3)finite_product))`
2583 THEN ASM_REWRITE_TAC[]
2584 THEN MATCH_MP_TAC EDGE_IN_F_SY
2585 THEN ASM_REWRITE_TAC[]
2586 THEN MRESA_TAC MOD_LT[`i:num`;`dimindex(:M)`]]);;
2587
2588 let RHO_NODE_K_SY=prove(`!(l:real^(M,3)finite_product). local_fan (V_SY (vecmats (l:real^(M,3)finite_product)),E_SY (vecmats l),F_SY (vecmats l))
2589 /\ dimindex(:M)=k
2590 /\ row k (vecmats l)=u
2591 /\ row 1 (vecmats l)=v
2592 ==>   (rho_node1 (F_SY (vecmats l))) u=v`,
2593 REPEAT STRIP_TAC
2594 THEN MATCH_MP_TAC (GEN_ALL Local_lemmas.DETER_RHO_NODE)
2595 THEN EXISTS_TAC`V_SY (vecmats (l:real^(M,3)finite_product))`
2596 THEN EXISTS_TAC`E_SY (vecmats (l:real^(M,3)finite_product))`
2597 THEN ASM_REWRITE_TAC[]
2598 THEN MATCH_MP_TAC (GEN_ALL EDGE_IN_F_SY)
2599 THEN EXISTS_TAC`k:num`
2600 THEN ASM_REWRITE_TAC[]
2601 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2602 THEN MP_TAC(ARITH_RULE`1<=k==> k<=k /\ ~(k=0)/\ SUC 0=1`)
2603 THEN RESA_TAC
2604 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]);;
2605
2606
2607 let RHO_NODE_SY=prove(`!i (l:real^(M,3)finite_product). local_fan (V_SY (vecmats (l:real^(M,3)finite_product)),E_SY (vecmats l),F_SY (vecmats l))
2608 /\ 1<= i /\ i<= dimindex (:M) 
2609 ==>  (rho_node1 (F_SY (vecmats l))) (row i (vecmats l))=row (SUC (i MOD dimindex (:M))) (vecmats l)`,
2610 REPEAT STRIP_TAC
2611 THEN MATCH_MP_TAC (GEN_ALL Local_lemmas.DETER_RHO_NODE)
2612 THEN EXISTS_TAC`V_SY (vecmats (l:real^(M,3)finite_product))`
2613 THEN EXISTS_TAC`E_SY (vecmats (l:real^(M,3)finite_product))`
2614 THEN ASM_REWRITE_TAC[]
2615 THEN MATCH_MP_TAC (GEN_ALL EDGE_IN_F_SY)
2616 THEN EXISTS_TAC`i:num`
2617 THEN ASM_REWRITE_TAC[]
2618 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2619 THEN MP_TAC(ARITH_RULE`1<=k==> k<=k /\ ~(k=0)/\ SUC 0=1`)
2620 THEN RESA_TAC
2621 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]);;
2622
2623
2624 let ORDER_COVER1_SY=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2625 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2626 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2627 /\ 1<= k-p
2628 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2629 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2630 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2631 /\ (ear_sy s2 <=> ear_sy s3)
2632 /\ DIA_SY 0 (p-1) s
2633 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2634 /\ COVER_SY 0 (p-1) s s1 s2 
2635 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2636 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2637 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2638 /\ matvec(pmat1(vecmats l))= l1
2639 /\ matvec(pmat2(vecmats l))= l2
2640 /\ row k (vecmats l)= v
2641 /\ row (p-1) (vecmats l)= w
2642 ==> order (rho_node1 (F_SY (vecmats l))) v w = p-1`,
2643 REPEAT GEN_TAC THEN STRIP_TAC
2644 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2645 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2646 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2647 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2648 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2649 THEN RESA_TAC
2650 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2651 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2652 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2653 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2654 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2655 THEN MATCH_MP_TAC UNIQUE_ORDER
2656 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
2657 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
2658 THEN STRIP_TAC
2659 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
2660 THEN POP_ASSUM MP_TAC
2661 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2662 THEN STRIP_TAC
2663 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
2664 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p ==> 1<= p-1 /\ p-1<=k/\ p-1= SUC(p-1-1)`)
2665 THEN RESA_TAC
2666 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`p-1`;`w:real^3`;`l:real^(M,3)finite_product`]
2667 THEN STRIP_TAC
2668 THENL[
2669 POP_ASSUM MP_TAC
2670 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
2671 THEN POP_ASSUM MP_TAC
2672 THEN DISCH_THEN(LABEL_TAC"THY")
2673 THEN STRIP_TAC
2674 THEN REMOVE_THEN"THY"(fun th-> ONCE_REWRITE_TAC[th;])
2675 THEN REWRITE_TAC[POWER;o_DEF]
2676 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`];
2677 STRIP_TAC
2678 THENL[
2679 REPEAT STRIP_TAC
2680 THEN POP_ASSUM MP_TAC
2681 THEN MP_TAC(ARITH_RULE`0<i /\ i< p-1 /\ 1<= k-p ==> 1<=i /\ i<=k/\ i= SUC(i-1)`)
2682 THEN RESA_TAC
2683 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`i:num`;`row i (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2684 THEN POP_ASSUM MP_TAC
2685 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
2686 THEN POP_ASSUM MP_TAC
2687 THEN DISCH_THEN(LABEL_TAC"THY")
2688 THEN STRIP_TAC
2689 THEN REMOVE_THEN"THY"(fun th-> ONCE_REWRITE_TAC[th;])
2690 THEN REWRITE_TAC[POWER;o_DEF]
2691 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2692 THEN STRIP_TAC
2693 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
2694           (1 <= j /\ j <= k) /\
2695           row i (vecmats l) = row j (vecmats l) 
2696 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
2697           row i (vecmats l) = row j (vecmats l)`]
2698 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`p-1:num`])
2699 THEN MP_TAC(ARITH_RULE`i< p-1 ==> ~(i=p-1)`)
2700 THEN RESA_TAC;
2701 STRIP_TAC
2702 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
2703           (1 <= j /\ j <= k) /\
2704           row i (vecmats l) = row j (vecmats l) 
2705 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
2706           row i (vecmats l) = row j (vecmats l)`]
2707 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1:num`])
2708 THEN POP_ASSUM MP_TAC
2709 THEN MP_TAC(ARITH_RULE`1<= k-p ==> k<=k/\ ~(k=p-1)`)
2710 THEN RESA_TAC]]);;
2711
2712
2713 let SLICEV_EQ_V_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2714 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2715 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2716 /\ 1<= k-p
2717 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2718 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2719 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2720 /\ (ear_sy s2 <=> ear_sy s3)
2721 /\ DIA_SY 0 (p-1) s
2722 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2723 /\ COVER_SY 0 (p-1) s s1 s2 
2724 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2725 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2726 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2727 /\ matvec(pmat1(vecmats l))= l1
2728 /\ matvec(pmat2(vecmats l))= l2
2729 /\ row k (vecmats l)= v
2730 /\ row (p-1) (vecmats l)= w
2731 ==> slicev (E_SY (vecmats l)) (F_SY (vecmats l)) v w = V_SY(vecmats l1)`,
2732 [REPEAT GEN_TAC THEN STRIP_TAC
2733 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2734 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2735 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2736 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2737 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2738 THEN RESA_TAC
2739 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2740 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2741 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2742 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2743 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2744 THEN REWRITE_TAC[slicev;V_SY;rows;IN_ELIM_THM;EXTENSION]
2745 THEN MRESA_TAC (GEN_ALL ORDER_COVER1_SY)[`k:num`;`v:real^3`;`w:real^3`;`p:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2746 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2747 THEN GEN_TAC
2748 THEN EQ_TAC;
2749 REPEAT STRIP_TAC
2750 THEN ASM_REWRITE_TAC[]
2751 THEN DISJ_CASES_TAC(ARITH_RULE`n=0 \/ 0< n`);
2752 ASM_REWRITE_TAC[ITER]
2753 THEN EXISTS_TAC`p:num`
2754 THEN ASM_REWRITE_TAC[]
2755 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2756 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2757 FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
2758 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
2759 THEN STRIP_TAC
2760 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
2761 THEN POP_ASSUM MP_TAC
2762 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2763 THEN STRIP_TAC
2764 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
2765 THEN MP_TAC(ARITH_RULE`0<n /\ n<= p-1 /\ 1<= k-p ==> 1<=n /\ n<=k/\ n<=p/\ n= SUC(n-1)`)
2766 THEN RESA_TAC
2767 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`n:num`;`row n (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2768 THEN POP_ASSUM MP_TAC
2769 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
2770 THEN POP_ASSUM MP_TAC
2771 THEN DISCH_THEN(LABEL_TAC"THY")
2772 THEN STRIP_TAC
2773 THEN REMOVE_THEN"THY"(fun th-> ONCE_REWRITE_TAC[th;])
2774 THEN REWRITE_TAC[POWER;o_DEF]
2775 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2776 THEN EXISTS_TAC`n:num`
2777 THEN ASM_REWRITE_TAC[]
2778 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`n:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2779 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2780 REPEAT STRIP_TAC
2781 THEN ASM_REWRITE_TAC[]
2782 THEN MP_TAC(ARITH_RULE`i<= p ==> i=p \/ i< p:num`)
2783 THEN RESA_TAC;
2784 ASM_REWRITE_TAC[ITER]
2785 THEN EXISTS_TAC`0:num`
2786 THEN ASM_REWRITE_TAC[ITER;ARITH_RULE`0<=0`]
2787 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2788 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2789 THEN MP_TAC(ARITH_RULE`2<p==> 0<= p-1`)
2790 THEN RESA_TAC;
2791 FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
2792 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
2793 THEN STRIP_TAC
2794 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
2795 THEN POP_ASSUM MP_TAC
2796 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2797 THEN STRIP_TAC
2798 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
2799 THEN EXISTS_TAC`i:num`
2800 THEN ASM_REWRITE_TAC[]
2801 THEN MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> 0<=i/\ 1<=i /\ i<=p-1/\ i<=k/\ i= SUC(i-1)`)
2802 THEN RESA_TAC
2803 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`i:num`;`row i (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2804 THEN POP_ASSUM MP_TAC
2805 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
2806 THEN POP_ASSUM MP_TAC
2807 THEN DISCH_THEN(LABEL_TAC"THY")
2808 THEN STRIP_TAC
2809 THEN REMOVE_THEN"THY"(fun th-> ONCE_REWRITE_TAC[th;])
2810 THEN REWRITE_TAC[POWER;o_DEF]
2811 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2812 THEN MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> SUC(i-1)=i`)
2813 THEN RESA_TAC
2814 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2815 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]]);;
2816
2817
2818 let SLICEE_EQ_E_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2819 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2820 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2821 /\ 1<= k-p
2822 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2823 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2824 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2825 /\ (ear_sy s2 <=> ear_sy s3)
2826 /\ DIA_SY 0 (p-1) s
2827 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2828 /\ COVER_SY 0 (p-1) s s1 s2 
2829 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2830 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2831 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2832 /\ matvec(pmat1(vecmats l))= l1
2833 /\ matvec(pmat2(vecmats l))= l2
2834 /\ row k (vecmats l)= v
2835 /\ row (p-1) (vecmats l)= w
2836 ==> slicee (E_SY (vecmats l)) (F_SY (vecmats l)) v w = E_SY(vecmats l1)`,
2837 [REPEAT GEN_TAC THEN STRIP_TAC
2838 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2839 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
2840 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
2841 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
2842 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
2843 THEN RESA_TAC
2844 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
2845 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
2846 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
2847 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
2848 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
2849 THEN REWRITE_TAC[EXTENSION;]
2850 THEN REWRITE_TAC[slicee;rows;IN_ELIM_THM;UNION;IN_SING]
2851 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2852 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2853 THEN ASM_REWRITE_TAC[V_SY;rows;E_SY;IN_ELIM_THM;DELETE]
2854 THEN GEN_TAC
2855 THEN EQ_TAC;
2856 RESA_TAC;
2857 FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
2858 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
2859 THEN STRIP_TAC
2860 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
2861 THEN POP_ASSUM MP_TAC
2862 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2863 THEN STRIP_TAC
2864 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
2865 THEN MP_TAC(ARITH_RULE`2<p /\ i<=p /\ 1<= k-p ==> i<= k/\ 1<=1/\ 1<= p-1 `)
2866 THEN RESA_TAC
2867 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`i:num`;`l:real^(M,3)finite_product`]
2868 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i<p:num`)
2869 THEN RESA_TAC;
2870 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2871 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2872 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2873 THEN EXISTS_TAC`p:num`
2874 THEN ASM_REWRITE_TAC[]
2875 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2876 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2877 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2878 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2879 MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> 0<=i/\ 1<=i /\ i<=p-1/\ i<k/\ i<=k/\ i= SUC(i-1)/\ 1<= SUC i`)
2880 THEN RESA_TAC
2881 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2882 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2883 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
2884 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
2885 THEN EXISTS_TAC`i:num`
2886 THEN ASM_REWRITE_TAC[]
2887 THEN MP_TAC(ARITH_RULE`i<p ==> i= p-1 \/ SUC i<= p-1`)
2888 THEN RESA_TAC;
2889 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2890 THEN ASM_TAC
2891 THEN REPEAT RESA_TAC;
2892 MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`SUC(i):num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2893 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2894 EXISTS_TAC`p-1`
2895 THEN ASM_REWRITE_TAC[]
2896 THEN MP_TAC(ARITH_RULE`2<p  /\ 1<= k-p ==> p-1<= p/\ 1<=p-1/\ p-1<p /\SUC(p-1)=p /\ p-1<=p-1`)
2897 THEN RESA_TAC
2898 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
2899 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2900 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2901 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2902 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2903 REPEAT STRIP_TAC
2904 THEN ASM_REWRITE_TAC[]
2905 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
2906 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
2907 THEN STRIP_TAC
2908 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
2909 THEN POP_ASSUM MP_TAC
2910 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
2911 THEN STRIP_TAC
2912 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
2913 THEN MP_TAC(ARITH_RULE`2<p /\ i<=p /\ 1<= k-p ==> i<= k/\ 1<=1/\ 1<= p-1 `)
2914 THEN RESA_TAC
2915 THEN MP_TAC(ARITH_RULE`i<=p ==> i= p \/ i< p:num`)
2916 THEN RESA_TAC;
2917 MATCH_MP_TAC (SET_RULE`A==> A\/B`)
2918 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2919 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2920 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2921 THEN EXISTS_TAC`v:real^3`
2922 THEN ASM_REWRITE_TAC[]
2923 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
2924 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
2925 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2926 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2927 THEN STRIP_TAC;
2928 EXISTS_TAC`p:num`
2929 THEN ASM_REWRITE_TAC[];
2930 STRIP_TAC
2931 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
2932           (1 <= j /\ j <= k) /\
2933           row i (vecmats l) = row j (vecmats l) 
2934 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
2935           row i (vecmats l) = row j (vecmats l)`]
2936 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`k:num`])
2937 THEN POP_ASSUM MP_TAC
2938 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 2< p==> p-1<=k /\ k<=k /\ ~(p-1=k)`)
2939 THEN RESA_TAC;
2940 MP_TAC(ARITH_RULE`i<p ==> i= p-1 \/ SUC i<= p-1`)
2941 THEN RESA_TAC;
2942 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
2943 THEN MATCH_MP_TAC(SET_RULE`A==> B\/A`)
2944 THEN ASM_REWRITE_TAC[]
2945 THEN MP_TAC(ARITH_RULE`2<p  /\ 1<= k-p ==> p-1<= p/\ 1<=p-1/\ p-1<p /\SUC(p-1)=p /\ p-1<=p-1`)
2946 THEN RESA_TAC
2947 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
2948 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2949 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2950 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2951 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
2952 MATCH_MP_TAC(SET_RULE`A==> A\/B`)
2953 THEN MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> 0<=i/\ 1<=i /\ i<=p-1/\ i<k/\ i<=k/\ i= SUC(i-1)/\ 1<= SUC i`)
2954 THEN RESA_TAC
2955 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2956 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2957 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
2958 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
2959 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`SUC(i):num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
2960 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
2961 THEN EXISTS_TAC`row i (vecmats (l:real^(M,3)finite_product))`
2962 THEN ASM_REWRITE_TAC[]
2963 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`i:num`;`l:real^(M,3)finite_product`]
2964 THEN STRIP_TAC;
2965 EXISTS_TAC`i:num`
2966 THEN ASM_REWRITE_TAC[];
2967 STRIP_TAC
2968 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
2969           (1 <= j /\ j <= k) /\
2970           row i (vecmats l) = row j (vecmats l) 
2971 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
2972           row i (vecmats l) = row j (vecmats l)`]
2973 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`i:num`])
2974 THEN POP_ASSUM MP_TAC
2975 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 2< p /\ SUC i<= p-1 ==> p-1<=k  /\ ~(p-1=i)`)
2976 THEN RESA_TAC]);;
2977
2978 let SLICEF_EQ_F_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
2979 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
2980 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
2981 /\ 1<= k-p
2982 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
2983 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
2984 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
2985 /\ (ear_sy s2 <=> ear_sy s3)
2986 /\ DIA_SY 0 (p-1) s
2987 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
2988 /\ COVER_SY 0 (p-1) s s1 s2 
2989 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
2990 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
2991 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
2992 /\ matvec(pmat1(vecmats l))= l1
2993 /\ matvec(pmat2(vecmats l))= l2
2994 /\ row k (vecmats l)= v
2995 /\ row (p-1) (vecmats l)= w
2996 ==> slicef (E_SY (vecmats l)) (F_SY (vecmats l)) v w = F_SY(vecmats l1)`,
2997 [REPEAT GEN_TAC THEN STRIP_TAC
2998 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
2999 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3000 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3001 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3002 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3003 THEN RESA_TAC
3004 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3005 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3006 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3007 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3008 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3009 THEN REWRITE_TAC[EXTENSION;]
3010 THEN REWRITE_TAC[slicef;rows;IN_ELIM_THM;UNION;IN_SING]
3011 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3012 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3013 THEN ASM_REWRITE_TAC[V_SY;rows;E_SY;IN_ELIM_THM;DELETE]
3014 THEN GEN_TAC
3015 THEN EQ_TAC;
3016 STRIP_TAC;
3017 ONCE_REWRITE_TAC[F_SY;]
3018 THEN REWRITE_TAC[IN_ELIM_THM]
3019 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3020 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3021 THEN STRIP_TAC
3022 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3023 THEN POP_ASSUM MP_TAC
3024 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3025 THEN STRIP_TAC
3026 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3027 THEN MP_TAC(ARITH_RULE`2<p /\ i<=p /\ 1<= k-p ==> i<= k/\ 1<=1/\ 1<= p-1 `)
3028 THEN RESA_TAC
3029 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`i:num`;`l:real^(M,3)finite_product`]
3030 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i<p:num`)
3031 THEN RESA_TAC;
3032 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3033 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3034 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3035 THEN EXISTS_TAC`p:num`
3036 THEN ASM_REWRITE_TAC[]
3037 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3038 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
3039 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3040 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3041 MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> 0<=i/\ 1<=i /\ i<=p-1/\ i<k/\ i<=k/\ i= SUC(i-1)/\ 1<= SUC i`)
3042 THEN RESA_TAC
3043 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3044 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3045 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
3046 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
3047 THEN EXISTS_TAC`i:num`
3048 THEN ASM_REWRITE_TAC[]
3049 THEN MP_TAC(ARITH_RULE`i<p ==> i= p-1 \/ SUC i<= p-1`)
3050 THEN RESA_TAC;
3051 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3052 THEN ASM_TAC
3053 THEN REPEAT RESA_TAC;
3054 MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`SUC(i):num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3055 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3056 REWRITE_TAC[F_SY;IN_ELIM_THM]
3057 THEN ASM_REWRITE_TAC[]
3058 THEN EXISTS_TAC`p-1`
3059 THEN ASM_REWRITE_TAC[]
3060 THEN MP_TAC(ARITH_RULE`2<p  /\ 1<= k-p ==> p-1<= p/\ 1<=p-1/\ p-1<p /\SUC(p-1)=p /\ p-1<=p-1`)
3061 THEN RESA_TAC
3062 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
3063 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3064 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3065 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3066 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3067 GEN_REWRITE_TAC(LAND_CONV o DEPTH_CONV)[F_SY;IN_ELIM_THM]
3068 THEN ASM_REWRITE_TAC[]
3069 THEN STRIP_TAC
3070 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3071 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3072 THEN STRIP_TAC
3073 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3074 THEN POP_ASSUM MP_TAC
3075 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3076 THEN STRIP_TAC
3077 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3078 THEN MP_TAC(ARITH_RULE`2<p /\ i<=p /\ 1<= k-p ==> i<= k/\ 1<=1/\ 1<= p-1 `)
3079 THEN RESA_TAC
3080 THEN MP_TAC(ARITH_RULE`i<=p ==> i= p \/ i< p:num`)
3081 THEN RESA_TAC;
3082 MATCH_MP_TAC (SET_RULE`A==> A\/B`)
3083 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3084 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3085 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3086 THEN EXISTS_TAC`v:real^3`
3087 THEN ASM_REWRITE_TAC[]
3088 THEN MRESAL_TAC MOD_MULT[`p:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3089 THEN MRESA_TAC (GEN_ALL RHO_NODE_K_SY)[`k:num`;`v:real^3`;`row 1 (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
3090 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3091 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3092 THEN STRIP_TAC;
3093 EXISTS_TAC`p:num`
3094 THEN ASM_REWRITE_TAC[];
3095 STRIP_TAC
3096 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3097           (1 <= j /\ j <= k) /\
3098           row i (vecmats l) = row j (vecmats l) 
3099 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3100           row i (vecmats l) = row j (vecmats l)`]
3101 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`k:num`])
3102 THEN POP_ASSUM MP_TAC
3103 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 2< p==> p-1<=k /\ k<=k /\ ~(p-1=k)`)
3104 THEN RESA_TAC;
3105 MP_TAC(ARITH_RULE`i<p ==> i= p-1 \/ SUC i<= p-1`)
3106 THEN RESA_TAC;
3107 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3108 THEN MATCH_MP_TAC(SET_RULE`A==> B\/A`)
3109 THEN ASM_REWRITE_TAC[]
3110 THEN MP_TAC(ARITH_RULE`2<p  /\ 1<= k-p ==> p-1<= p/\ 1<=p-1/\ p-1<p /\SUC(p-1)=p /\ p-1<=p-1`)
3111 THEN RESA_TAC
3112 THEN MRESA_TAC MOD_LT[`p-1:num`;`p:num`]
3113 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3114 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3115 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3116 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3117 MATCH_MP_TAC(SET_RULE`A==> A\/B`)
3118 THEN MP_TAC(ARITH_RULE`1<=i /\ i< p /\ 1<= k-p ==> 0<=i/\ 1<=i /\ i<=p-1/\ i<k/\ i<=k/\ i= SUC(i-1)/\ 1<= SUC i`)
3119 THEN RESA_TAC
3120 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3121 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3122 THEN MRESA_TAC MOD_LT[`i:num`;`k:num`]
3123 THEN MRESA_TAC MOD_LT[`i:num`;`p:num`]
3124 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`SUC(i):num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3125 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3126 THEN EXISTS_TAC`row i (vecmats (l:real^(M,3)finite_product))`
3127 THEN ASM_REWRITE_TAC[]
3128 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`i:num`;`l:real^(M,3)finite_product`]
3129 THEN STRIP_TAC;
3130 EXISTS_TAC`i:num`
3131 THEN ASM_REWRITE_TAC[];
3132 STRIP_TAC
3133 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3134           (1 <= j /\ j <= k) /\
3135           row i (vecmats l) = row j (vecmats l) 
3136 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3137           row i (vecmats l) = row j (vecmats l)`]
3138 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`i:num`])
3139 THEN POP_ASSUM MP_TAC
3140 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 2< p /\ SUC i<= p-1 ==> p-1<=k  /\ ~(p-1=i)`)
3141 THEN RESA_TAC]);;
3142
3143 let ORDER_COVER2_SY=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3144 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3145 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3146 /\ 1<= k-p
3147 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3148 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3149 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3150 /\ (ear_sy s2 <=> ear_sy s3)
3151 /\ DIA_SY 0 (p-1) s
3152 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3153 /\ COVER_SY 0 (p-1) s s1 s2 
3154 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3155 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3156 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3157 /\ matvec(pmat1(vecmats l))= l1
3158 /\ matvec(pmat2(vecmats l))= l2
3159 /\ row k (vecmats l)= v
3160 /\ row (p-1) (vecmats l)= w
3161 ==> order (rho_node1 (F_SY (vecmats l))) w v = k-p+1`,
3162 REPEAT GEN_TAC THEN STRIP_TAC
3163 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3164 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3165 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3166 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3167 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3168 THEN RESA_TAC
3169 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3170 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3171 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3172 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3173 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3174 THEN MATCH_MP_TAC UNIQUE_ORDER
3175 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3176 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3177 THEN STRIP_TAC
3178 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3179 THEN POP_ASSUM MP_TAC
3180 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3181 THEN STRIP_TAC
3182 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3183 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p ==> 1<= p-1 /\ p-1<=k/\ p-1= SUC(p-1-1) /\ (k - p + 1) + p - 1 - 1 =k-1`)
3184 THEN RESA_TAC
3185 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`p-1`;`w:real^3`;`l:real^(M,3)finite_product`]
3186 THEN STRIP_TAC
3187 THENL[POP_ASSUM MP_TAC
3188 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
3189 THEN POP_ASSUM MP_TAC
3190 THEN DISCH_THEN(LABEL_TAC"THY")
3191 THEN STRIP_TAC
3192 THEN REWRITE_TAC[POWER;o_DEF]
3193 THEN POP_ASSUM(fun th-> ASM_REWRITE_TAC[SYM th;GSYM Hypermap.lemma_add_exponent_function])
3194 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`k:num`;`v:real^3`;`l:real^(M,3)finite_product`]
3195 THEN POP_ASSUM MP_TAC
3196 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
3197 THEN STRIP_TAC
3198 THEN POP_ASSUM MATCH_MP_TAC
3199 THEN ARITH_TAC;
3200 STRIP_TAC
3201 THENL[
3202 POP_ASSUM MP_TAC
3203 THEN DISCH_THEN(LABEL_TAC"THY")
3204 THEN REPEAT STRIP_TAC
3205 THEN POP_ASSUM MP_TAC
3206 THEN MP_TAC(ARITH_RULE`0<i /\ i< k-p+1 /\ 1<= k-p/\ 2<p ==> 1<=i+p-1 /\ i+p-1<=k/\ i= SUC(i-1)/\ (i + p - 1) - 1 =i + p - 1 - 1`)
3207 THEN RESA_TAC
3208 THEN REMOVE_THEN"THY"(fun th-> ASM_REWRITE_TAC[SYM th;GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER;GSYM Hypermap.lemma_add_exponent_function])
3209 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`i+p-1:num`;`row (i+p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
3210 THEN POP_ASSUM MP_TAC
3211 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
3212 THEN RESA_TAC
3213 THEN STRIP_TAC
3214 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3215           (1 <= j /\ j <= k) /\
3216           row i (vecmats l) = row j (vecmats l) 
3217 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3218           row i (vecmats l) = row j (vecmats l)`]
3219 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i+p-1:num`;`k:num`])
3220 THEN POP_ASSUM MP_TAC
3221 THEN MP_TAC(ARITH_RULE`i< k-p+1 /\2<p /\ 1<=k-p ==> ~(i+p-1=k) /\ k<=k`)
3222 THEN RESA_TAC;
3223 STRIP_TAC
3224 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3225           (1 <= j /\ j <= k) /\
3226           row i (vecmats l) = row j (vecmats l) 
3227 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3228           row i (vecmats l) = row j (vecmats l)`]
3229 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1:num`])
3230 THEN POP_ASSUM MP_TAC
3231 THEN MP_TAC(ARITH_RULE`1<= k-p ==> k<=k/\ ~(k=p-1)`)
3232 THEN RESA_TAC]]);;
3233
3234 let SLICEV_EQ_V2_SY=prove(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3235 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3236 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3237 /\ 1<= k-p
3238 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3239 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3240 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3241 /\ (ear_sy s2 <=> ear_sy s3)
3242 /\ DIA_SY 0 (p-1) s
3243 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3244 /\ COVER_SY 0 (p-1) s s1 s2 
3245 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3246 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3247 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3248 /\ matvec(pmat1(vecmats l))= l1
3249 /\ matvec(pmat2(vecmats l))= l2
3250 /\ row k (vecmats l)= v
3251 /\ row (p-1) (vecmats l)= w
3252 ==> slicev (E_SY (vecmats l)) (F_SY (vecmats l)) w v = V_SY(vecmats l2)`,
3253 REPEAT GEN_TAC THEN STRIP_TAC
3254 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3255 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3256 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3257 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3258 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3259 THEN RESA_TAC
3260 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3261 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3262 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3263 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3264 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3265 THEN REWRITE_TAC[slicev;V_SY;rows;IN_ELIM_THM;EXTENSION]
3266 THEN MRESA_TAC (GEN_ALL ORDER_COVER2_SY)[`w:real^3`;`v:real^3`;`k:num`;`p:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3267 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3268 THEN GEN_TAC
3269 THEN EQ_TAC
3270 THENL[
3271 RESA_TAC
3272 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3273 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3274 THEN STRIP_TAC
3275 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3276 THEN POP_ASSUM MP_TAC
3277 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3278 THEN STRIP_TAC
3279 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3280 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 0<=n /\ n<= k-p+1 ==> 1<= p-1 /\ p-1<=k/\ p-1= SUC(p-1-1) /\ (k - p + 1) + p - 1 - 1 =k-1/\ 1<= n+p-1 /\ n+p-1<=k
3281 /\ (n+p-1)-1=n+p-1-1 /\ 1<= n+1 /\ n+1<= k-p+2/\ p-2+n+1=n+p-1`)
3282 THEN RESA_TAC
3283 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`p-1`;`w:real^3`;`l:real^(M,3)finite_product`]
3284 THEN POP_ASSUM(fun th-> ASM_REWRITE_TAC[SYM th;GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER;GSYM Hypermap.lemma_add_exponent_function])
3285 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`n+p-1:num`;`row (n+p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
3286 THEN POP_ASSUM MP_TAC
3287 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
3288 THEN RESA_TAC
3289 THEN EXISTS_TAC`n+1`
3290 THEN ASM_REWRITE_TAC[]
3291 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`n+1`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3292 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3293 RESA_TAC
3294 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3295 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3296 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3297 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3298 THEN STRIP_TAC
3299 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3300 THEN POP_ASSUM MP_TAC
3301 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3302 THEN STRIP_TAC
3303 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3304 THEN EXISTS_TAC`i-1`
3305 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 1<=i /\ i<=k-p+2 ==> 0<= i-1 /\ i-1<=k-p+1/\ 1<= p-1 /\ p-1<=k/\ 1<=p-2+i /\ p-2+i<=k /\ (p - 2 + i) - 1=i - 1 + p - 1 - 1`)
3306 THEN RESA_TAC
3307 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`p-1`;`w:real^3`;`l:real^(M,3)finite_product`]
3308 THEN POP_ASSUM(fun th-> ASM_REWRITE_TAC[SYM th;GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER;GSYM Hypermap.lemma_add_exponent_function])
3309 THEN MRESA_TAC(GEN_ALL POWER_RHO_NODE_SY)[`row 1 (vecmats (l:real^(M,3)finite_product))`;`p-2+i:num`;`row (p-2+i) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`]
3310 THEN POP_ASSUM MP_TAC
3311 THEN REWRITE_TAC[GSYM Wrgcvdr_cizmrrh.POWER_TO_ITER]
3312 THEN RESA_TAC]);;
3313
3314
3315
3316 let SLICEE_EQ_E2_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3317 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3318 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3319 /\ 1<= k-p
3320 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3321 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3322 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3323 /\ (ear_sy s2 <=> ear_sy s3)
3324 /\ DIA_SY 0 (p-1) s
3325 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3326 /\ COVER_SY 0 (p-1) s s1 s2 
3327 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3328 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3329 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3330 /\ matvec(pmat1(vecmats l))= l1
3331 /\ matvec(pmat2(vecmats l))= l2
3332 /\ row k (vecmats l)= v
3333 /\ row (p-1) (vecmats l)= w
3334 ==> slicee (E_SY (vecmats l)) (F_SY (vecmats l)) w v = E_SY(vecmats l2)`,
3335 [REPEAT GEN_TAC THEN STRIP_TAC
3336 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3337 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3338 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3339 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3340 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3341 THEN RESA_TAC
3342 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3343 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3344 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3345 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3346 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3347 THEN REWRITE_TAC[EXTENSION;]
3348 THEN REWRITE_TAC[slicee;rows;IN_ELIM_THM;UNION;IN_SING]
3349 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3350 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3351 THEN ASM_REWRITE_TAC[V_SY;rows;E_SY;IN_ELIM_THM;DELETE]
3352 THEN GEN_TAC
3353 THEN EQ_TAC;
3354 STRIP_TAC;
3355 ASM_REWRITE_TAC[]
3356 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3357 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3358 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3359 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3360 THEN STRIP_TAC
3361 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3362 THEN POP_ASSUM MP_TAC
3363 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3364 THEN STRIP_TAC
3365 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3366 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 1<=i /\ i<=k-p+2 ==>  1<=p-2+i /\ p-2+i<=k  `)
3367 THEN RESA_TAC
3368 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`p-2+i:num`;`l:real^(M,3)finite_product`]
3369 THEN EXISTS_TAC`i:num`
3370 THEN ASM_REWRITE_TAC[]
3371 THEN MP_TAC(ARITH_RULE`i<= k-p+2==> i= k-p+2 \/ i< k-p+2`)
3372 THEN RESA_TAC;
3373 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3374 THEN REMOVE_ASSUM_TAC
3375 THEN REMOVE_ASSUM_TAC
3376 THEN REMOVE_ASSUM_TAC
3377 THEN REMOVE_ASSUM_TAC
3378 THEN REMOVE_ASSUM_TAC
3379 THEN REMOVE_ASSUM_TAC
3380 THEN REMOVE_ASSUM_TAC
3381 THEN POP_ASSUM MP_TAC
3382 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p  ==> p-2+k-p+2=k`)
3383 THEN RESA_TAC
3384 THEN STRIP_TAC
3385 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3386 THEN REMOVE_ASSUM_TAC
3387 THEN REMOVE_ASSUM_TAC
3388 THEN POP_ASSUM MP_TAC
3389 THEN RESA_TAC;
3390 MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ i<k-p+2 ==>  p-2+i<k  /\ 1<= SUC i /\ SUC i<= k-p+2 /\ SUC (p - 2 + i) =p-2+ SUC i`)
3391 THEN RESA_TAC
3392 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
3393 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
3394 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`SUC i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3395 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3396 ASM_REWRITE_TAC[]
3397 THEN EXISTS_TAC`k-p+2`
3398 THEN ASM_REWRITE_TAC[]
3399 THEN MP_TAC(ARITH_RULE`1<=k-p /\ 2<p==> p-2+k-p+2=k/\ k-p+2<=k-p+2/\ 1<=1/\ p-2+1=p-1`)
3400 THEN RESA_TAC
3401 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`k-p+2`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3402 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3403 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3404 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`1`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3405 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3406 RESA_TAC
3407 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3408 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3409 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i= k-p+2 \/ i< k-p+2`)
3410 THEN RESA_TAC;
3411 MATCH_MP_TAC(SET_RULE`A==> B\/A`)
3412 THEN MP_TAC(ARITH_RULE`1<=k-p /\ 2<p==> p-2+k-p+2=k/\ k-p+2<=k-p+2/\ 1<=1/\ p-2+1=p-1`)
3413 THEN RESA_TAC
3414 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3415 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`1`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3416 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3417 MATCH_MP_TAC(SET_RULE`A==> A\/B`)
3418 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ i<k-p+2 ==>  p-2+i<k  /\ 1<= SUC i /\ SUC i<= k-p+2 /\ SUC (p - 2 + i) =p-2+ SUC i`)
3419 THEN RESA_TAC
3420 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
3421 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
3422 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`SUC i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3423 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3424 THEN EXISTS_TAC`row i (vecmats (l2:real^(N,3)finite_product))`
3425 THEN ASM_REWRITE_TAC[]
3426 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3427 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3428 THEN STRIP_TAC
3429 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3430 THEN POP_ASSUM MP_TAC
3431 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3432 THEN STRIP_TAC
3433 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3434 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 1<=i /\ i<=k-p+2 ==>  1<=p-2+i /\ p-2+i<=k  `)
3435 THEN RESA_TAC
3436 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`p-2+i:num`;`l:real^(M,3)finite_product`]
3437 THEN STRIP_TAC;
3438 EXISTS_TAC`i:num`
3439 THEN ASM_REWRITE_TAC[];
3440 STRIP_TAC
3441 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3442           (1 <= j /\ j <= k) /\
3443           row i (vecmats l) = row j (vecmats l) 
3444 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3445           row i (vecmats l) = row j (vecmats l)`]
3446 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-2+i:num`])
3447 THEN POP_ASSUM MP_TAC
3448 THEN MP_TAC(ARITH_RULE`1<= k-p/\ i< k-p+2 /\ 2<p ==> k<=k/\ ~(k=p-2+i)`)
3449 THEN RESA_TAC]);;
3450
3451 let SLICEF_EQ_F2_SY=prove_by_refinement(`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3452 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3453 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3454 /\ 1<= k-p
3455 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3456 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3457 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3458 /\ (ear_sy s2 <=> ear_sy s3)
3459 /\ DIA_SY 0 (p-1) s
3460 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3461 /\ COVER_SY 0 (p-1) s s1 s2 
3462 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3463 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3464 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3465 /\ matvec(pmat1(vecmats l))= l1
3466 /\ matvec(pmat2(vecmats l))= l2
3467 /\ row k (vecmats l)= v
3468 /\ row (p-1) (vecmats l)= w
3469 ==> slicef (E_SY (vecmats l)) (F_SY (vecmats l)) w v = F_SY(vecmats l2)`,
3470 [REPEAT GEN_TAC THEN STRIP_TAC
3471 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3472 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3473 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3474 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3475 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3476 THEN RESA_TAC
3477 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3478 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3479 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3480 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3481 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3482 THEN REWRITE_TAC[EXTENSION;]
3483 THEN REWRITE_TAC[slicef;rows;IN_ELIM_THM;UNION;IN_SING]
3484 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3485 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3486 THEN ASM_REWRITE_TAC[V_SY;rows;IN_ELIM_THM;DELETE]
3487 THEN GEN_TAC
3488 THEN EQ_TAC;
3489 STRIP_TAC;
3490 REWRITE_TAC[F_SY;IN_ELIM_THM]
3491 THEN ASM_REWRITE_TAC[]
3492 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3493 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3494 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3495 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3496 THEN STRIP_TAC
3497 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3498 THEN POP_ASSUM MP_TAC
3499 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3500 THEN STRIP_TAC
3501 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3502 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 1<=i /\ i<=k-p+2 ==>  1<=p-2+i /\ p-2+i<=k  `)
3503 THEN RESA_TAC
3504 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`p-2+i:num`;`l:real^(M,3)finite_product`]
3505 THEN EXISTS_TAC`i:num`
3506 THEN ASM_REWRITE_TAC[]
3507 THEN MP_TAC(ARITH_RULE`i<= k-p+2==> i= k-p+2 \/ i< k-p+2`)
3508 THEN RESA_TAC;
3509 POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3510 THEN REMOVE_ASSUM_TAC
3511 THEN REMOVE_ASSUM_TAC
3512 THEN REMOVE_ASSUM_TAC
3513 THEN REMOVE_ASSUM_TAC
3514 THEN REMOVE_ASSUM_TAC
3515 THEN REMOVE_ASSUM_TAC
3516 THEN REMOVE_ASSUM_TAC
3517 THEN POP_ASSUM MP_TAC
3518 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p  ==> p-2+k-p+2=k`)
3519 THEN RESA_TAC
3520 THEN STRIP_TAC
3521 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(th))
3522 THEN REMOVE_ASSUM_TAC
3523 THEN REMOVE_ASSUM_TAC
3524 THEN POP_ASSUM MP_TAC
3525 THEN RESA_TAC;
3526 MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ i<k-p+2 ==>  p-2+i<k  /\ 1<= SUC i /\ SUC i<= k-p+2 /\ SUC (p - 2 + i) =p-2+ SUC i`)
3527 THEN RESA_TAC
3528 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
3529 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
3530 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`SUC i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3531 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3532 REWRITE_TAC[F_SY;IN_ELIM_THM]
3533 THEN ASM_REWRITE_TAC[]
3534 THEN EXISTS_TAC`k-p+2`
3535 THEN ASM_REWRITE_TAC[]
3536 THEN MP_TAC(ARITH_RULE`1<=k-p /\ 2<p==> p-2+k-p+2=k/\ k-p+2<=k-p+2/\ 1<=1/\ p-2+1=p-1`)
3537 THEN RESA_TAC
3538 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`k-p+2`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3539 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3540 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3541 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`1`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3542 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3543 GEN_REWRITE_TAC(LAND_CONV o DEPTH_CONV)[F_SY;IN_ELIM_THM]
3544 THEN RESA_TAC
3545 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3546 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3547 THEN MP_TAC(ARITH_RULE`i<=k-p+2==> i= k-p+2 \/ i< k-p+2`)
3548 THEN RESA_TAC;
3549 MATCH_MP_TAC(SET_RULE`A==> B\/A`)
3550 THEN MP_TAC(ARITH_RULE`1<=k-p /\ 2<p==> p-2+k-p+2=k/\ k-p+2<=k-p+2/\ 1<=1/\ p-2+1=p-1`)
3551 THEN RESA_TAC
3552 THEN MRESAL_TAC MOD_MULT[`k-p+2:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3553 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`1`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3554 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`];
3555 MATCH_MP_TAC(SET_RULE`A==> A\/B`)
3556 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ i<k-p+2 ==>  p-2+i<k  /\ 1<= SUC i /\ SUC i<= k-p+2 /\ SUC (p - 2 + i) =p-2+ SUC i`)
3557 THEN RESA_TAC
3558 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
3559 THEN MRESA_TAC MOD_LT[`i:num`;`k-p+2:num`]
3560 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`SUC i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3561 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3562 THEN EXISTS_TAC`row i (vecmats (l2:real^(N,3)finite_product))`
3563 THEN ASM_REWRITE_TAC[]
3564 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3565 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;]
3566 THEN STRIP_TAC
3567 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3568 THEN POP_ASSUM MP_TAC
3569 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3570 THEN STRIP_TAC
3571 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3572 THEN MP_TAC(ARITH_RULE`2<p /\ 1<=k-p /\ 1<=i /\ i<=k-p+2 ==>  1<=p-2+i /\ p-2+i<=k  `)
3573 THEN RESA_TAC
3574 THEN MRESA_TAC (GEN_ALL RHO_NODE_SY)[`p-2+i:num`;`l:real^(M,3)finite_product`]
3575 THEN STRIP_TAC;
3576 EXISTS_TAC`i:num`
3577 THEN ASM_REWRITE_TAC[];
3578 STRIP_TAC
3579 THEN MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3580           (1 <= j /\ j <= k) /\
3581           row i (vecmats l) = row j (vecmats l) 
3582 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3583           row i (vecmats l) = row j (vecmats l)`]
3584 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-2+i:num`])
3585 THEN POP_ASSUM MP_TAC
3586 THEN MP_TAC(ARITH_RULE`1<= k-p/\ i< k-p+2 /\ 2<p ==> k<=k/\ ~(k=p-2+i)`)
3587 THEN RESA_TAC]);;
3588
3589
3590
3591
3592 let TAU_STAR_COVER_concl=`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3593 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3594 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3595 /\ 1<= k-p
3596 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3597 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3598 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3599 /\ (ear_sy s2 <=> ear_sy s3)
3600 /\ DIA_SY 0 (p-1) s
3601 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3602 /\ COVER_SY 0 (p-1) s s1 s2 
3603 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3604 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3605 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3606 /\ matvec(pmat1(vecmats l))= l1
3607 /\ matvec(pmat2(vecmats l))= l2
3608 /\ row k (vecmats l)= v
3609 /\ row (p-1) (vecmats l)= w
3610 /\ (!u u1.
3611                u IN {v, w} /\ u1 IN V_SY(vecmats l) /\ ~(u = u1)
3612                ==> ~collinear {vec 0, u, u1})
3613 ==> tau_star s1 l1 + tau_star s3 l2 <= tau_star s l`
3614 ;;
3615
3616 let TAU_STAR_COVER_concl2 = mk_imp (EJRCFJD_concl, TAU_STAR_COVER_concl);;
3617
3618
3619
3620
3621
3622
3623
3624 let TAU_STAR_COVER=prove_by_refinement(TAU_STAR_COVER_concl2,
3625 [DISCH_THEN(LABEL_TAC"THY")
3626 THEN REPEAT STRIP_TAC
3627 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3628 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3629 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3630 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3631 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3632 THEN RESA_TAC
3633 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3634 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3635 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3636 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3637 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3638 THEN REWRITE_TAC[tau_star]
3639 THEN MRESA1_TAC stable_sy_lemma`s:stable_sy`
3640 THEN MP_TAC(ARITH_RULE` 2<p /\ 1<=k-p 
3641 ==> p - 2 + k - p + 2= k/\ p-2+1=p-1 /\ 1<=p-1 /\ p-1<=k /\ p-1<k /\ ~(k=p-1)/\ k<=k`)
3642 THEN RESA_TAC
3643 THEN SUBGOAL_THEN`{v, w} SUBSET V_SY (vecmats (l:real^(M,3)finite_product))`ASSUME_TAC;
3644 MATCH_MP_TAC(SET_RULE`A IN C /\ B IN C==> {A,B}SUBSET C`)
3645 THEN STRIP_TAC
3646 THEN ASM_REWRITE_TAC[IN_ELIM_THM;V_SY;rows];
3647 EXISTS_TAC`k:num`
3648 THEN ASM_REWRITE_TAC[]
3649 THEN ARITH_TAC;
3650 EXISTS_TAC`p-1`
3651 THEN ASM_REWRITE_TAC[];
3652 SUBGOAL_THEN`norm (v - w:real^3) <= cstab`ASSUME_TAC;
3653 MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3654 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
3655 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`k:num`;`p-1`]th))`!i j.
3656           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
3657           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
3658 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
3659 THEN POP_ASSUM(fun th-> REWRITE_TAC[th; SET_RULE`{0,p-1} IN J_SY s UNION {{0,p-1}}`])
3660 THEN ASM_REWRITE_TAC[];
3661 SUBGOAL_THEN`~({v, w} IN E_SY (vecmats (l:real^(M,3)finite_product)))`ASSUME_TAC;
3662 ASM_REWRITE_TAC[E_SY;IN_ELIM_THM]
3663 THEN STRIP_TAC
3664 THEN POP_ASSUM MP_TAC
3665 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3666 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;local_fan]
3667 THEN LET_TAC
3668 THEN STRIP_TAC
3669 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3670 THEN POP_ASSUM MP_TAC
3671 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3672 THEN STRIP_TAC
3673 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3674 THEN MRESA_TAC (GEN_ALL EDGE_IN_E_SY)[`i:num`;`row (i) (vecmats(l:real^(M,3)finite_product))`;`
3675       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`(l:real^(M,3)finite_product)`]
3676 THEN MRESA_TAC remark1_fan[`vec 0:real^3`;`V_SY (vecmats(l:real^(M,3)finite_product))`;`E_SY (vecmats (l:real^(M,3)finite_product))`;`
3677       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`row i (vecmats(l:real^(M,3)finite_product))`]
3678 THEN DISJ_CASES_TAC(SET_RULE`row k (vecmats l)= row (p - 1) (vecmats l)
3679 \/ ~(row k (vecmats l)= row (p - 1) (vecmats (l:real^(M,3)finite_product)))`);
3680 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3681           (1 <= j /\ j <= k) /\
3682           row i (vecmats l) = row j (vecmats l) 
3683 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3684           row i (vecmats l) = row j (vecmats l)`]
3685 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1`])
3686 THEN POP_ASSUM MP_TAC
3687 THEN POP_ASSUM MP_TAC
3688 THEN RESA_TAC;
3689 POP_ASSUM MP_TAC
3690 THEN RESA_TAC
3691 THEN STRIP_TAC
3692 THEN SUBGOAL_THEN`1 <= SUC (i' MOD dimindex (:M)) /\
3693       SUC (i' MOD dimindex (:M)) <= dimindex (:M)` ASSUME_TAC;
3694 ASM_REWRITE_TAC[ARITH_RULE`1<= SUC a`]
3695 THEN MRESAL_TAC DIVISION[`i':num`;`dimindex (:M):num`][DIMINDEX_NONZERO]
3696 THEN POP_ASSUM MP_TAC
3697 THEN ARITH_TAC;
3698 POP_ASSUM MP_TAC
3699 THEN RESA_TAC
3700 THEN MP_TAC(SET_RULE`{row k (vecmats l), row (p - 1) (vecmats l)} =
3701    {row i (vecmats l), row (SUC (i MOD k)) (vecmats l)}
3702 /\ ~(row k (vecmats l) = row (p - 1) (vecmats l))
3703 /\ ~(row i (vecmats l) = row (SUC (i MOD k)) (vecmats l))
3704 ==> (row i (vecmats l) = row (k) (vecmats l)
3705 /\ row (p-1) (vecmats l) = row (SUC (i MOD k)) (vecmats l))
3706 \/ (row i (vecmats l) = row (p-1) (vecmats l)
3707 /\ row (k) (vecmats l) = row (SUC (i MOD k)) (vecmats (l:real^(M,3)finite_product)))`)
3708 THEN RESA_TAC;
3709 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3710           (1 <= j /\ j <= k) /\
3711           row i (vecmats l) = row j (vecmats l) 
3712 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3713           row i (vecmats l) = row j (vecmats l)`]
3714 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`k:num`] THEN  MRESA_TAC th[`p-1:num`;`SUC(i MOD k):num`])
3715 THEN POP_ASSUM MP_TAC
3716 THEN POP_ASSUM MP_TAC
3717 THEN RESA_TAC
3718 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3719 THEN MP_TAC(ARITH_RULE`2<p==> ~(p-1=1)/\ 1<=1`)
3720 THEN RESA_TAC;
3721 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3722           (1 <= j /\ j <= k) /\
3723           row i (vecmats l) = row j (vecmats l) 
3724 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3725           row i (vecmats l) = row j (vecmats l)`]
3726 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`p-1:num`] THEN  MRESA_TAC th[`k:num`;`SUC(i MOD k):num`])
3727 THEN POP_ASSUM MP_TAC
3728 THEN POP_ASSUM MP_TAC
3729 THEN RESA_TAC
3730 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
3731 THEN MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> ~(k= SUC (p-1))/\ 1<= SUC(p-1)/\ SUC(p-1)<=k`)
3732 THEN RESA_TAC;
3733 MRESA_TAC (GEN_ALL PROPERTIES_OF_FAN_IN_B_SY)[`d_sy (s:stable_sy)`;`J_SY (s:stable_sy)`;`k_sy (s:stable_sy)`;`k:num`;`p-1:num`;`a_sy (s:stable_sy)`;`b_sy (s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`] 
3734 THEN MRESAL_TAC(GEN_ALL TECOXBM1)[`d_sy (s:stable_sy)`;`J_SY(s:stable_sy)`;`k:num`;`a_sy(s:stable_sy)`;`b_sy(s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`][SET_RULE`{A} UNION {B,C}={A,B,C}`]
3735 THEN MP_TAC(SET_RULE`{v, w} SUBSET V_SY (vecmats l)==> v IN V_SY (vecmats l)
3736 /\ w IN V_SY (vecmats (l:real^(M,3)finite_product))`)
3737 THEN RESA_TAC
3738 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3739 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;]
3740 THEN STRIP_TAC
3741 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3742 THEN POP_ASSUM MP_TAC
3743 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3744 THEN STRIP_TAC
3745 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3746 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3747 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3748 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3749 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3750 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3751 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3752 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3753 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3754 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3755 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3756 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3757 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3758 THEN REMOVE_THEN"THY"(fun th-> MRESA_TAC th[`V_SY(vecmats (l:real^(M,3)finite_product))`;`E_SY(vecmats (l:real^(M,3)finite_product))`;`F_SY(vecmats (l:real^(M,3)finite_product))`;
3759 `v:real^3`;`w:real^3`])
3760 THEN MRESA_TAC(GEN_ALL D_FUN_COVER_SY)[`k:num`;`p:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3761 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3762 THEN POP_ASSUM MP_TAC
3763 THEN REMOVE_ASSUM_TAC
3764 THEN REMOVE_ASSUM_TAC
3765 THEN REMOVE_ASSUM_TAC
3766 THEN REMOVE_ASSUM_TAC
3767 THEN POP_ASSUM MP_TAC
3768 THEN REAL_ARITH_TAC]);;
3769
3770
3771
3772 let IN_B_SY_COVER_concl=`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
3773 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
3774 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
3775 /\ 1<= k-p
3776 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
3777 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
3778 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
3779 /\ (ear_sy s2 <=> ear_sy s3)
3780 /\ DIA_SY 0 (p-1) s
3781 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
3782 /\ COVER_SY 0 (p-1) s s1 s2 
3783 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
3784 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
3785 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
3786 /\ matvec(pmat1(vecmats l))= l1
3787 /\ matvec(pmat2(vecmats l))= l2
3788 /\ row k (vecmats l)= v
3789 /\ row (p-1) (vecmats l)= w
3790 /\ (!u u1.
3791                u IN {v, w} /\ u1 IN V_SY(vecmats l) /\ ~(u = u1)
3792                ==> ~collinear {vec 0, u, u1})
3793 /\ norm(v-w)<= min (b_sy s1 (p-1,0)) (b_sy s2 (p-1,0))
3794 ==> l1 IN (B_SY1 (a_sy s1) (b_sy s1))`;;
3795
3796
3797 let IN_B_SY_COVER_concl2 = mk_imp (EJRCFJD_concl, IN_B_SY_COVER_concl);;
3798
3799
3800
3801
3802
3803 let IN_B_SY_COVER=prove_by_refinement(IN_B_SY_COVER_concl2,
3804 [DISCH_THEN(LABEL_TAC"THY")
3805 THEN REPEAT STRIP_TAC
3806 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
3807 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
3808 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
3809 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
3810 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
3811 THEN RESA_TAC
3812 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
3813 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
3814 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
3815 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
3816 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
3817 THEN REWRITE_TAC[tau_star]
3818 THEN MRESA1_TAC stable_sy_lemma`s:stable_sy`
3819 THEN MP_TAC(ARITH_RULE` 2<p /\ 1<=k-p 
3820 ==> p - 2 + k - p + 2= k/\ p-2+1=p-1 /\ 1<=p-1 /\ p-1<=k /\ p-1<k /\ ~(k=p-1)/\ k<=k`)
3821 THEN RESA_TAC
3822 THEN SUBGOAL_THEN`{v, w} SUBSET V_SY (vecmats (l:real^(M,3)finite_product))`ASSUME_TAC;
3823 MATCH_MP_TAC(SET_RULE`A IN C /\ B IN C==> {A,B}SUBSET C`)
3824 THEN STRIP_TAC
3825 THEN ASM_REWRITE_TAC[IN_ELIM_THM;V_SY;rows];
3826 EXISTS_TAC`k:num`
3827 THEN ASM_REWRITE_TAC[]
3828 THEN ARITH_TAC;
3829 EXISTS_TAC`p-1`
3830 THEN ASM_REWRITE_TAC[];
3831 SUBGOAL_THEN`norm (v - w:real^3) <= cstab`ASSUME_TAC;
3832 MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3833 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
3834 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`k:num`;`p-1`]th))`!i j.
3835           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
3836           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
3837 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
3838 THEN POP_ASSUM(fun th-> REWRITE_TAC[th; SET_RULE`{0,p-1} IN J_SY s UNION {{0,p-1}}`])
3839 THEN ASM_REWRITE_TAC[];
3840 SUBGOAL_THEN`~({v, w} IN E_SY (vecmats (l:real^(M,3)finite_product)))`ASSUME_TAC;
3841 ASM_REWRITE_TAC[E_SY;IN_ELIM_THM]
3842 THEN STRIP_TAC
3843 THEN POP_ASSUM MP_TAC
3844 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3845 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;local_fan]
3846 THEN LET_TAC
3847 THEN STRIP_TAC
3848 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3849 THEN POP_ASSUM MP_TAC
3850 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3851 THEN STRIP_TAC
3852 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3853 THEN MRESA_TAC (GEN_ALL EDGE_IN_E_SY)[`i:num`;`row (i) (vecmats(l:real^(M,3)finite_product))`;`
3854       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`(l:real^(M,3)finite_product)`]
3855 THEN MRESA_TAC remark1_fan[`vec 0:real^3`;`V_SY (vecmats(l:real^(M,3)finite_product))`;`E_SY (vecmats (l:real^(M,3)finite_product))`;`
3856       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`row i (vecmats(l:real^(M,3)finite_product))`]
3857 THEN DISJ_CASES_TAC(SET_RULE`row k (vecmats l)= row (p - 1) (vecmats l)
3858 \/ ~(row k (vecmats l)= row (p - 1) (vecmats (l:real^(M,3)finite_product)))`);
3859 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3860           (1 <= j /\ j <= k) /\
3861           row i (vecmats l) = row j (vecmats l) 
3862 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3863           row i (vecmats l) = row j (vecmats l)`]
3864 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1`])
3865 THEN POP_ASSUM MP_TAC
3866 THEN POP_ASSUM MP_TAC
3867 THEN RESA_TAC;
3868 POP_ASSUM MP_TAC
3869 THEN RESA_TAC
3870 THEN STRIP_TAC
3871 THEN SUBGOAL_THEN`1 <= SUC (i' MOD dimindex (:M)) /\
3872       SUC (i' MOD dimindex (:M)) <= dimindex (:M)` ASSUME_TAC;
3873 ASM_REWRITE_TAC[ARITH_RULE`1<= SUC a`]
3874 THEN MRESAL_TAC DIVISION[`i':num`;`dimindex (:M):num`][DIMINDEX_NONZERO]
3875 THEN POP_ASSUM MP_TAC
3876 THEN ARITH_TAC;
3877 POP_ASSUM MP_TAC
3878 THEN RESA_TAC
3879 THEN MP_TAC(SET_RULE`{row k (vecmats l), row (p - 1) (vecmats l)} =
3880    {row i (vecmats l), row (SUC (i MOD k)) (vecmats l)}
3881 /\ ~(row k (vecmats l) = row (p - 1) (vecmats l))
3882 /\ ~(row i (vecmats l) = row (SUC (i MOD k)) (vecmats l))
3883 ==> (row i (vecmats l) = row (k) (vecmats l)
3884 /\ row (p-1) (vecmats l) = row (SUC (i MOD k)) (vecmats l))
3885 \/ (row i (vecmats l) = row (p-1) (vecmats l)
3886 /\ row (k) (vecmats l) = row (SUC (i MOD k)) (vecmats (l:real^(M,3)finite_product)))`)
3887 THEN RESA_TAC;
3888 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3889           (1 <= j /\ j <= k) /\
3890           row i (vecmats l) = row j (vecmats l) 
3891 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3892           row i (vecmats l) = row j (vecmats l)`]
3893 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`k:num`] THEN  MRESA_TAC th[`p-1:num`;`SUC(i MOD k):num`])
3894 THEN POP_ASSUM MP_TAC
3895 THEN POP_ASSUM MP_TAC
3896 THEN RESA_TAC
3897 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
3898 THEN MP_TAC(ARITH_RULE`2<p==> ~(p-1=1)/\ 1<=1`)
3899 THEN RESA_TAC;
3900 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
3901           (1 <= j /\ j <= k) /\
3902           row i (vecmats l) = row j (vecmats l) 
3903 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
3904           row i (vecmats l) = row j (vecmats l)`]
3905 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`p-1:num`] THEN  MRESA_TAC th[`k:num`;`SUC(i MOD k):num`])
3906 THEN POP_ASSUM MP_TAC
3907 THEN POP_ASSUM MP_TAC
3908 THEN RESA_TAC
3909 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
3910 THEN MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> ~(k= SUC (p-1))/\ 1<= SUC(p-1)/\ SUC(p-1)<=k`)
3911 THEN RESA_TAC;
3912 MRESA_TAC (GEN_ALL PROPERTIES_OF_FAN_IN_B_SY)[`d_sy (s:stable_sy)`;`J_SY (s:stable_sy)`;`k_sy (s:stable_sy)`;`k:num`;`p-1:num`;`a_sy (s:stable_sy)`;`b_sy (s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`] 
3913 THEN MRESAL_TAC(GEN_ALL TECOXBM1)[`d_sy (s:stable_sy)`;`J_SY(s:stable_sy)`;`k:num`;`a_sy(s:stable_sy)`;`b_sy(s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`][SET_RULE`{A} UNION {B,C}={A,B,C}`]
3914 THEN MP_TAC(SET_RULE`{v, w} SUBSET V_SY (vecmats l)==> v IN V_SY (vecmats l)
3915 /\ w IN V_SY (vecmats (l:real^(M,3)finite_product))`)
3916 THEN RESA_TAC
3917 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3918 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3919 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3920 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3921 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3922 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3923 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3924 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3925 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3926 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3927 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3928 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3929 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
3930 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;]
3931 THEN STRIP_TAC
3932 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
3933 THEN POP_ASSUM MP_TAC
3934 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
3935 THEN STRIP_TAC
3936 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
3937 THEN REMOVE_THEN"THY"(fun th-> MRESA_TAC th[`V_SY(vecmats (l:real^(M,3)finite_product))`;`E_SY(vecmats (l:real^(M,3)finite_product))`;`F_SY(vecmats (l:real^(M,3)finite_product))`;
3938 `v:real^3`;`w:real^3`])
3939 THEN EXISTS_TAC`vecmats(l1:real^(P,3)finite_product)`
3940 THEN ASM_REWRITE_TAC[MATVEC_VECMATS_ID]
3941 THEN STRIP_TAC;
3942 REPEAT STRIP_TAC
3943 THEN MP_TAC(ARITH_RULE`i<=p ==> i=p \/ i<= p-1:num`)
3944 THEN RESA_TAC;
3945 MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3946 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3947 THEN REMOVE_ASSUM_TAC
3948 THEN REMOVE_ASSUM_TAC
3949 THEN REMOVE_ASSUM_TAC
3950 THEN REMOVE_ASSUM_TAC
3951 THEN REMOVE_ASSUM_TAC
3952 THEN REMOVE_ASSUM_TAC
3953 THEN REMOVE_ASSUM_TAC
3954 THEN REMOVE_ASSUM_TAC
3955 THEN REMOVE_ASSUM_TAC
3956 THEN REMOVE_ASSUM_TAC
3957 THEN REMOVE_ASSUM_TAC
3958 THEN REMOVE_ASSUM_TAC
3959 THEN REMOVE_ASSUM_TAC
3960 THEN POP_ASSUM (fun th-> MRESA1_TAC th`k:num`);
3961 MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
3962 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
3963 THEN REMOVE_ASSUM_TAC
3964 THEN REMOVE_ASSUM_TAC
3965 THEN POP_ASSUM MP_TAC
3966 THEN POP_ASSUM MP_TAC
3967 THEN REMOVE_ASSUM_TAC
3968 THEN REMOVE_ASSUM_TAC
3969 THEN REMOVE_ASSUM_TAC
3970 THEN REMOVE_ASSUM_TAC
3971 THEN REMOVE_ASSUM_TAC
3972 THEN REMOVE_ASSUM_TAC
3973 THEN REMOVE_ASSUM_TAC
3974 THEN REMOVE_ASSUM_TAC
3975 THEN REMOVE_ASSUM_TAC
3976 THEN POP_ASSUM (fun th-> MRESA1_TAC th`i:num`)
3977 THEN POP_ASSUM MP_TAC
3978 THEN DISCH_THEN(LABEL_TAC"MA")
3979 THEN STRIP_TAC
3980 THEN STRIP_TAC
3981 THEN REMOVE_THEN"MA" MATCH_MP_TAC
3982 THEN ASM_REWRITE_TAC[]
3983 THEN MP_TAC(ARITH_RULE`i<=p /\1<=k-p ==> i<=k`)
3984 THEN RESA_TAC;
3985 ASM_REWRITE_TAC[CONDITION1_SY]
3986 THEN FIND_ASSUM MP_TAC`COVER_SY 0 (p - 1) s s1 (s2:stable_sy)`
3987 THEN REWRITE_TAC[COVER_SY;COVER5_SY;COVER4_SY;]
3988 THEN RESA_TAC
3989 THEN REMOVE_ASSUM_TAC
3990 THEN POP_ASSUM MP_TAC
3991 THEN POP_ASSUM MP_TAC
3992 THEN POP_ASSUM MP_TAC
3993 THEN POP_ASSUM MP_TAC
3994 THEN POP_ASSUM MP_TAC
3995 THEN POP_ASSUM MP_TAC
3996 THEN DISCH_THEN(LABEL_TAC"THYGIANG")
3997 THEN DISCH_THEN(LABEL_TAC"THYGIANG1")
3998 THEN DISCH_THEN(LABEL_TAC"THYGIANG2")
3999 THEN DISCH_THEN(LABEL_TAC"THYGIANG3")
4000 THEN DISCH_THEN(LABEL_TAC"THYGIANG4")
4001 THEN DISCH_THEN(LABEL_TAC"THYGIANG5")
4002 THEN REPEAT GEN_TAC
4003 THEN STRIP_TAC;
4004 MP_TAC(ARITH_RULE`i<=p==> i=p \/ i<p :num`)
4005 THEN RESA_TAC;
4006 MP_TAC(ARITH_RULE`j<=p==> j=p \/ j<p :num`)
4007 THEN RESA_TAC;
4008 MP_TAC(ARITH_RULE`2<p/\ 2<k ==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1`)
4009 THEN RESA_TAC
4010 THEN MP_TAC(SET_RULE`~(0= p-1)==> ~({0,0}= {0,p-1})`)
4011 THEN RESA_TAC
4012 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`0:num`;`0:num`][IN_NUMSEG])
4013 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4014 THEN REMOVE_ASSUM_TAC
4015 THEN REMOVE_ASSUM_TAC
4016 THEN REMOVE_ASSUM_TAC
4017 THEN POP_ASSUM MP_TAC
4018 THEN REWRITE_TAC[constraint_system]
4019 THEN STRIP_TAC
4020 THEN REMOVE_ASSUM_TAC
4021 THEN REMOVE_ASSUM_TAC
4022 THEN POP_ASSUM (fun th-> MRESA_TAC th[`0:num`;`p:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4023 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`p:num`;`p:num`;`p:num`]
4024 THEN MRESAL_TAC MOD_MULT[`p:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4025 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4026 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4027 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4028 THEN REMOVE_ASSUM_TAC
4029 THEN POP_ASSUM(fun th-> MRESA1_TAC th`0`)
4030 THEN REWRITE_TAC[VECTOR_ARITH`A-A= vec 0`;NORM_0;REAL_ARITH`&0<= &0`]
4031 THEN REMOVE_ASSUM_TAC
4032 THEN POP_ASSUM MP_TAC
4033 THEN REMOVE_ASSUM_TAC
4034 THEN POP_ASSUM MP_TAC
4035 THEN REWRITE_TAC[constraint_system]
4036 THEN STRIP_TAC
4037 THEN REMOVE_ASSUM_TAC
4038 THEN REMOVE_ASSUM_TAC
4039 THEN REMOVE_ASSUM_TAC
4040 THEN POP_ASSUM(fun th-> MRESA_TAC th[`0`;`0`])
4041 THEN STRIP_TAC
4042 THEN POP_ASSUM(fun th-> POP_ASSUM MP_TAC THEN REWRITE_TAC[th]);
4043 MP_TAC(ARITH_RULE`j<p /\ 2<p ==> j=p-1 \/ j<p-1 :num`)
4044 THEN RESA_TAC;
4045 MP_TAC(ARITH_RULE`2<p/\ 2<k ==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1/\ p-1<=p-1/\ 1<k`)
4046 THEN RESA_TAC
4047 THEN MP_TAC(SET_RULE`~(0= p-1)==> ~({0,0}= {0,p-1})`)
4048 THEN RESA_TAC
4049 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4050 THEN REMOVE_ASSUM_TAC
4051 THEN REMOVE_ASSUM_TAC
4052 THEN REMOVE_ASSUM_TAC
4053 THEN POP_ASSUM MP_TAC
4054 THEN REWRITE_TAC[constraint_system]
4055 THEN STRIP_TAC
4056 THEN REMOVE_ASSUM_TAC
4057 THEN REMOVE_ASSUM_TAC
4058 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`p:num`] )
4059 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`p:num`;`p:num`;`p:num`]
4060 THEN MRESAL_TAC MOD_MULT[`p:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4061 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4062 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4063 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4064 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4065 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4066 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4067 THEN STRIP_TAC
4068 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4069 THEN POP_ASSUM MP_TAC
4070 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4071 THEN STRIP_TAC
4072 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4073 THEN REMOVE_ASSUM_TAC
4074 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1`])
4075 THEN POP_ASSUM MP_TAC
4076 THEN POP_ASSUM MP_TAC
4077 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4078 THEN REMOVE_ASSUM_TAC
4079 THEN REMOVE_ASSUM_TAC
4080 THEN REMOVE_ASSUM_TAC
4081 THEN POP_ASSUM MP_TAC
4082 THEN REWRITE_TAC[constraint_system]
4083 THEN STRIP_TAC
4084 THEN REMOVE_ASSUM_TAC
4085 THEN REMOVE_ASSUM_TAC
4086 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`k:num`] )
4087 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4088 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4089 THEN REMOVE_THEN"THYGIANG2"MP_TAC
4090 THEN ASM_REWRITE_TAC[]
4091 THEN REPEAT STRIP_TAC;
4092 REMOVE_ASSUM_TAC
4093 THEN POP_ASSUM MP_TAC
4094 THEN POP_ASSUM MP_TAC
4095 THEN REAL_ARITH_TAC;
4096 FIND_ASSUM MP_TAC`norm (v - w:real^3) <= min (b_sy s1 (p - 1,0)) (b_sy s2 (p - 1,0))`
4097 THEN REAL_ARITH_TAC;
4098 MP_TAC(ARITH_RULE`2<p/\ 2<k /\ j< p-1 /\ 1<= k-p==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1 /\ ~(j=p-1) /\ 0<=j /\ j<=p-1 /\ j<=k /\ 1<k`)
4099 THEN RESA_TAC
4100 THEN MP_TAC(SET_RULE`~(0= p-1)/\ ~(j=p-1)==> ~({0,j}= {0,p-1})`)
4101 THEN RESA_TAC
4102 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`0:num`;`j:num`][IN_NUMSEG])
4103 THEN POP_ASSUM MP_TAC
4104 THEN POP_ASSUM MP_TAC
4105 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4106 THEN REMOVE_ASSUM_TAC
4107 THEN REMOVE_ASSUM_TAC
4108 THEN REMOVE_ASSUM_TAC
4109 THEN POP_ASSUM MP_TAC
4110 THEN REWRITE_TAC[constraint_system]
4111 THEN STRIP_TAC
4112 THEN REMOVE_ASSUM_TAC
4113 THEN REMOVE_ASSUM_TAC
4114 THEN POP_ASSUM (fun th-> MRESA_TAC th[`j:num`;`p:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4115 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`p:num`;`p:num`;`p:num`]
4116 THEN MRESAL_TAC MOD_MULT[`p:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4117 THEN RESA_TAC
4118 THEN RESA_TAC
4119 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4120 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4121 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`j:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4122 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4123 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4124 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4125 THEN STRIP_TAC
4126 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4127 THEN POP_ASSUM MP_TAC
4128 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4129 THEN STRIP_TAC
4130 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4131 THEN REMOVE_ASSUM_TAC
4132 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`j:num`])
4133 THEN POP_ASSUM MP_TAC
4134 THEN POP_ASSUM MP_TAC
4135 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4136 THEN REMOVE_ASSUM_TAC
4137 THEN REMOVE_ASSUM_TAC
4138 THEN REMOVE_ASSUM_TAC
4139 THEN POP_ASSUM MP_TAC
4140 THEN REWRITE_TAC[constraint_system]
4141 THEN STRIP_TAC
4142 THEN REMOVE_ASSUM_TAC
4143 THEN REMOVE_ASSUM_TAC
4144 THEN POP_ASSUM (fun th-> MRESA_TAC th[`j:num`;`k:num`] )
4145 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4146 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4147 THEN RESA_TAC
4148 THEN RESA_TAC;
4149 MP_TAC(ARITH_RULE`i<p /\ 2<p ==> i=p-1 \/ i<p-1 :num`)
4150 THEN RESA_TAC;
4151 MP_TAC(ARITH_RULE`j<=p ==> j=p \/ j<p :num`)
4152 THEN RESA_TAC;
4153 MP_TAC(ARITH_RULE`2<p/\ 2<k ==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1/\ p-1<=p-1/\ 1<k`)
4154 THEN RESA_TAC
4155 THEN MP_TAC(SET_RULE`~(0= p-1)==> ~({0,0}= {0,p-1})`)
4156 THEN RESA_TAC
4157 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4158 THEN REMOVE_ASSUM_TAC
4159 THEN REMOVE_ASSUM_TAC
4160 THEN REMOVE_ASSUM_TAC
4161 THEN POP_ASSUM MP_TAC
4162 THEN REWRITE_TAC[constraint_system]
4163 THEN STRIP_TAC
4164 THEN REMOVE_ASSUM_TAC
4165 THEN REMOVE_ASSUM_TAC
4166 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`p:num`] )
4167 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`p:num`;`p:num`;`p:num`]
4168 THEN MRESAL_TAC MOD_MULT[`p:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4169 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4170 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4171 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4172 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4173 THEN ONCE_REWRITE_TAC[NORM_SUB]
4174 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4175 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4176 THEN STRIP_TAC
4177 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4178 THEN POP_ASSUM MP_TAC
4179 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4180 THEN STRIP_TAC
4181 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4182 THEN REMOVE_ASSUM_TAC
4183 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1`])
4184 THEN REMOVE_ASSUM_TAC
4185 THEN POP_ASSUM MP_TAC
4186 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4187 THEN REMOVE_ASSUM_TAC
4188 THEN REMOVE_ASSUM_TAC
4189 THEN REMOVE_ASSUM_TAC
4190 THEN POP_ASSUM MP_TAC
4191 THEN REWRITE_TAC[constraint_system]
4192 THEN STRIP_TAC
4193 THEN REMOVE_ASSUM_TAC
4194 THEN REMOVE_ASSUM_TAC
4195 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`k:num`] )
4196 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4197 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4198 THEN REMOVE_THEN"THYGIANG2"MP_TAC
4199 THEN ASM_REWRITE_TAC[]
4200 THEN FIND_ASSUM MP_TAC`norm (v - w:real^3) <= min (b_sy s1 (p - 1,0)) (b_sy s2 (p - 1,0))`
4201 THEN REAL_ARITH_TAC;
4202 MP_TAC(ARITH_RULE`j<p /\ 2< p ==> j=p-1 \/ j<p-1 :num`)
4203 THEN RESA_TAC;
4204 MP_TAC(ARITH_RULE` 2< p ==> p-1<=p-1 `)
4205 THEN RESA_TAC
4206 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4207 THEN REMOVE_ASSUM_TAC
4208 THEN POP_ASSUM(fun th-> MRESA1_TAC th`p-1` )
4209 THEN REWRITE_TAC[VECTOR_ARITH`A-A:real^3= vec 0`;NORM_0]
4210 THEN REMOVE_ASSUM_TAC
4211 THEN POP_ASSUM MP_TAC
4212 THEN REMOVE_ASSUM_TAC
4213 THEN POP_ASSUM MP_TAC
4214 THEN REWRITE_TAC[constraint_system]
4215 THEN STRIP_TAC
4216 THEN REMOVE_ASSUM_TAC
4217 THEN REMOVE_ASSUM_TAC
4218 THEN REMOVE_ASSUM_TAC
4219 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1`;`p-1`])
4220 THEN STRIP_TAC
4221 THEN POP_ASSUM(fun th-> POP_ASSUM MP_TAC THEN REWRITE_TAC[th])
4222 THEN REAL_ARITH_TAC;
4223 MP_TAC(ARITH_RULE`2<p/\ 2<k /\ 1<=j /\ j< p-1 /\ 1<= k-p==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1 /\ ~(j=0) /\ 0<=j /\ j<=p-1 /\ j<=k /\ 1<k/\ p-1<=p-1`)
4224 THEN RESA_TAC
4225 THEN MP_TAC(SET_RULE`~(0= p-1)/\ ~(j=0)==> ~({p-1,j}= {0,p-1})`)
4226 THEN RESA_TAC
4227 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`p-1:num`;`j:num`][IN_NUMSEG])
4228 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4229 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4230 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`j:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4231 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4232 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4233 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4234 THEN STRIP_TAC
4235 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4236 THEN POP_ASSUM MP_TAC
4237 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4238 THEN STRIP_TAC
4239 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4240 THEN REMOVE_ASSUM_TAC
4241 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`j:num`]);
4242 MP_TAC(ARITH_RULE`j<=p ==> j=p \/ j<p :num`)
4243 THEN RESA_TAC;
4244 MP_TAC(ARITH_RULE`2<p/\ 2<k /\ i< p-1 /\ 1<= k-p==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1 /\ ~(i=p-1) /\ 0<=i /\ i<=p-1 /\ i<=k /\ 1<k`)
4245 THEN RESA_TAC
4246 THEN MP_TAC(SET_RULE`~(0= p-1)/\ ~(i=p-1)==> ~({0,i}= {0,p-1})`)
4247 THEN RESA_TAC
4248 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`0:num`;`i:num`][IN_NUMSEG])
4249 THEN POP_ASSUM MP_TAC
4250 THEN POP_ASSUM MP_TAC
4251 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4252 THEN REMOVE_ASSUM_TAC
4253 THEN REMOVE_ASSUM_TAC
4254 THEN REMOVE_ASSUM_TAC
4255 THEN POP_ASSUM MP_TAC
4256 THEN REWRITE_TAC[constraint_system]
4257 THEN STRIP_TAC
4258 THEN REMOVE_ASSUM_TAC
4259 THEN REMOVE_ASSUM_TAC
4260 THEN POP_ASSUM (fun th-> MRESA_TAC th[`i:num`;`p:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4261 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`p:num`;`p:num`;`p:num`]
4262 THEN MRESAL_TAC MOD_MULT[`p:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4263 THEN RESA_TAC
4264 THEN RESA_TAC
4265 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY_P)[`p:num`;`k:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4266 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4267 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4268 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4269 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4270 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4271 THEN STRIP_TAC
4272 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4273 THEN POP_ASSUM MP_TAC
4274 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4275 THEN STRIP_TAC
4276 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4277 THEN REMOVE_ASSUM_TAC
4278 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`k:num`])
4279 THEN POP_ASSUM MP_TAC
4280 THEN POP_ASSUM MP_TAC
4281 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4282 THEN REMOVE_ASSUM_TAC
4283 THEN REMOVE_ASSUM_TAC
4284 THEN REMOVE_ASSUM_TAC
4285 THEN POP_ASSUM MP_TAC
4286 THEN REWRITE_TAC[constraint_system]
4287 THEN STRIP_TAC
4288 THEN REMOVE_ASSUM_TAC
4289 THEN REMOVE_ASSUM_TAC
4290 THEN POP_ASSUM (fun th-> MRESA_TAC th[`i:num`;`k:num`] )
4291 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4292 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4293 THEN RESA_TAC
4294 THEN RESA_TAC;
4295 MP_TAC(ARITH_RULE`j<p /\ 2< p ==> j=p-1 \/ j<p-1 :num`)
4296 THEN RESA_TAC;
4297 MP_TAC(ARITH_RULE`2<p/\ 2<k /\ 1<=i /\ i< p-1 /\ 1<= k-p==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1 /\ ~(i=0) /\ 0<=i /\ i<=p-1 /\ i<=k /\ 1<k/\ p-1<=p-1`)
4298 THEN RESA_TAC
4299 THEN MP_TAC(SET_RULE`~(0= p-1)/\ ~(i=0)==> ~({p-1,i}= {0,p-1})`)
4300 THEN RESA_TAC
4301 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`p-1:num`;`i:num`][IN_NUMSEG])
4302 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`p-1:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4303 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4304 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4305 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4306 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4307 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4308 THEN STRIP_TAC
4309 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4310 THEN POP_ASSUM MP_TAC
4311 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4312 THEN STRIP_TAC
4313 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4314 THEN REMOVE_ASSUM_TAC
4315 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`p-1:num`])
4316 THEN MRESAL1_TAC stable_sy_lemma`s1:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4317 THEN REMOVE_ASSUM_TAC
4318 THEN REMOVE_ASSUM_TAC
4319 THEN REMOVE_ASSUM_TAC
4320 THEN POP_ASSUM MP_TAC
4321 THEN REWRITE_TAC[constraint_system]
4322 THEN STRIP_TAC
4323 THEN REMOVE_ASSUM_TAC
4324 THEN REMOVE_ASSUM_TAC
4325 THEN REMOVE_ASSUM_TAC
4326 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
4327 THEN ASM_REWRITE_TAC[]
4328 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4329 THEN REMOVE_ASSUM_TAC
4330 THEN REMOVE_ASSUM_TAC
4331 THEN REMOVE_ASSUM_TAC
4332 THEN POP_ASSUM MP_TAC
4333 THEN REWRITE_TAC[constraint_system]
4334 THEN STRIP_TAC
4335 THEN REMOVE_ASSUM_TAC
4336 THEN REMOVE_ASSUM_TAC
4337 THEN REMOVE_ASSUM_TAC
4338 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
4339 THEN ASM_REWRITE_TAC[];
4340 MP_TAC(ARITH_RULE`2<p/\ 2<k /\ 1<=i /\ i< p-1 /\ 1<=j /\ j< p-1/\ 1<= k-p==> ~(0= p-1)/\ 0<=0 /\ 0<= p-1/\ 1<p /\ 0<=k-1 /\ ~(i=p-1)  /\ ~(j=p-1)/\ 0<=i /\ i<=p-1 /\ i<=k /\ 1<k/\ p-1<=p-1/\0<=j /\ j<=p-1 /\ j<=k`)
4341 THEN RESA_TAC
4342 THEN MP_TAC(SET_RULE`~(i= p-1)/\ ~(j=p-1)==> ~({i,j}= {0,p-1})`)
4343 THEN RESA_TAC
4344 THEN REMOVE_THEN"THYGIANG"(fun th-> MRESAL_TAC th[`i:num`;`j:num`][IN_NUMSEG])
4345 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4346 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4347 THEN MRESA_TAC (GEN_ALL PMAT1_EQ_SY)[`k:num`;`p:num`;`j:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4348 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4349 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4350 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4351 THEN STRIP_TAC
4352 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4353 THEN POP_ASSUM MP_TAC
4354 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4355 THEN STRIP_TAC
4356 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4357 THEN REMOVE_ASSUM_TAC
4358 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`j:num`])]);;
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378 let IN_B_SY2_COVER_concl=`!(s:stable_sy) (s1:stable_sy) (s2:stable_sy) (s3:stable_sy) (l:real^(M,3)finite_product)
4379 (l1:real^(P,3)finite_product) (l2:real^(N,3)finite_product).
4380 dimindex(:M) =k /\ dimindex(:N) =k-p+2 /\ dimindex(:P) =p 
4381 /\ 1<= k-p
4382 /\ I_SY s= 0..k-1 /\ f_sy s=(\i. ((1+i):num MOD k)) 
4383 /\ I_SY s1= 0..p-1 /\ f_sy s1=(\i. ((1+i):num MOD p))  
4384 /\ I_SY s3= 0..(k-p+1) /\ f_sy s3=(\i. ((1+i):num MOD (k-p+2))) 
4385 /\ (ear_sy s2 <=> ear_sy s3)
4386 /\ DIA_SY 0 (p-1) s
4387 /\ SCHANGE (\x. if x=0 then 0 else (p-2+x) MOD k) s2 s3
4388 /\ COVER_SY 0 (p-1) s s1 s2 
4389 /\ (l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))
4390 /\ (!i j. {i MOD k ,j MOD k} IN J_SY s UNION {{0,p-1}}
4391 ==> norm (row i (vecmats l) -row j (vecmats l))<= cstab)
4392 /\ matvec(pmat1(vecmats l))= l1
4393 /\ matvec(pmat2(vecmats l))= l2
4394 /\ row k (vecmats l)= v
4395 /\ row (p-1) (vecmats l)= w
4396 /\ (!u u1.
4397                u IN {v, w} /\ u1 IN V_SY(vecmats l) /\ ~(u = u1)
4398                ==> ~collinear {vec 0, u, u1})
4399 /\ norm(v-w)<= min (b_sy s1 (p-1,0)) (b_sy s2 (p-1,0))
4400 ==> l2 IN (B_SY1 (a_sy s3) (b_sy s3))`;;
4401
4402
4403 let IN_B_SY2_COVER_concl2 = mk_imp (EJRCFJD_concl, IN_B_SY2_COVER_concl);;
4404
4405
4406
4407
4408
4409
4410
4411 let IN_B_SY2_COVER=prove_by_refinement(IN_B_SY2_COVER_concl2,
4412 [DISCH_THEN(LABEL_TAC"THY")
4413 THEN REPEAT STRIP_TAC
4414 THEN MRESA1_TAC DIMINDEX_GE_1`(:M)`
4415 THEN MRESA1_TAC DIMINDEX_GE_1`(:P)`
4416 THEN MRESA1_TAC DIMINDEX_GE_1`(:N)`
4417 THEN MP_TAC(ARITH_RULE`1<= k-p /\ 1<=p /\ 1<=k ==> 2< k-p+2 /\ 1<= k-p+2 /\ (k - p + 2) - 1=k - p + 1 /\ ~(k=0)/\ p-1< k/\ p< k /\ ~(p=0)
4418 /\ ~(k-p+2=0)/\ 1< k-p+2/\ p<= k /\ p<=p /\ k-p+1<k-p+2/\ SUC(k-p+1)=k-p+2`)
4419 THEN RESA_TAC
4420 THEN MRESA_TAC (GEN_ALL IK_SY)[`s:stable_sy`;`k:num`]
4421 THEN MRESA_TAC (GEN_ALL IK_SY)[`s1:stable_sy`;`p:num`]
4422 THEN MRESA_TAC (GEN_ALL IK_SY)[`s3:stable_sy`;`k-p+2:num`]
4423 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s:stable_sy`
4424 THEN MRESA1_TAC (GEN_ALL K_SY_LE2)`s1:stable_sy`
4425 THEN REWRITE_TAC[tau_star]
4426 THEN MRESA1_TAC stable_sy_lemma`s:stable_sy`
4427 THEN MP_TAC(ARITH_RULE` 2<p /\ 1<=k-p 
4428 ==> p - 2 + k - p + 2= k/\ p-2+1=p-1 /\ 1<=p-1 /\ p-1<=k /\ p-1<k /\ ~(k=p-1)/\ k<=k`)
4429 THEN RESA_TAC
4430 THEN SUBGOAL_THEN`{v, w} SUBSET V_SY (vecmats (l:real^(M,3)finite_product))`ASSUME_TAC;
4431 MATCH_MP_TAC(SET_RULE`A IN C /\ B IN C==> {A,B}SUBSET C`)
4432 THEN STRIP_TAC
4433 THEN ASM_REWRITE_TAC[IN_ELIM_THM;V_SY;rows];
4434 EXISTS_TAC`k:num`
4435 THEN ASM_REWRITE_TAC[]
4436 THEN ARITH_TAC;
4437 EXISTS_TAC`p-1`
4438 THEN ASM_REWRITE_TAC[];
4439 SUBGOAL_THEN`norm (v - w:real^3) <= cstab`ASSUME_TAC;
4440 MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
4441 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4442 THEN FIND_ASSUM (fun th-> MP_TAC(ISPECL [`k:num`;`p-1`]th))`!i j.
4443           {i MOD k, j MOD k} IN J_SY s UNION {{0, p - 1}}
4444           ==> norm (row i (vecmats l) - row j (vecmats (l:real^(M,3)finite_product))) <= cstab`
4445 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
4446 THEN POP_ASSUM(fun th-> REWRITE_TAC[th; SET_RULE`{0,p-1} IN J_SY s UNION {{0,p-1}}`])
4447 THEN ASM_REWRITE_TAC[];
4448 SUBGOAL_THEN`~({v, w} IN E_SY (vecmats (l:real^(M,3)finite_product)))`ASSUME_TAC;
4449 ASM_REWRITE_TAC[E_SY;IN_ELIM_THM]
4450 THEN STRIP_TAC
4451 THEN POP_ASSUM MP_TAC
4452 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4453 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;convex_local_fan;local_fan]
4454 THEN LET_TAC
4455 THEN STRIP_TAC
4456 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
4457 THEN POP_ASSUM MP_TAC
4458 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4459 THEN STRIP_TAC
4460 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4461 THEN MRESA_TAC (GEN_ALL EDGE_IN_E_SY)[`i:num`;`row (i) (vecmats(l:real^(M,3)finite_product))`;`
4462       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`(l:real^(M,3)finite_product)`]
4463 THEN MRESA_TAC remark1_fan[`vec 0:real^3`;`V_SY (vecmats(l:real^(M,3)finite_product))`;`E_SY (vecmats (l:real^(M,3)finite_product))`;`
4464       (row (SUC (i MOD dimindex (:M))) (vecmats (l:real^(M,3)finite_product)))`;`row i (vecmats(l:real^(M,3)finite_product))`]
4465 THEN DISJ_CASES_TAC(SET_RULE`row k (vecmats l)= row (p - 1) (vecmats l)
4466 \/ ~(row k (vecmats l)= row (p - 1) (vecmats (l:real^(M,3)finite_product)))`);
4467 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
4468           (1 <= j /\ j <= k) /\
4469           row i (vecmats l) = row j (vecmats l) 
4470 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
4471           row i (vecmats l) = row j (vecmats l)`]
4472 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1`])
4473 THEN POP_ASSUM MP_TAC
4474 THEN POP_ASSUM MP_TAC
4475 THEN RESA_TAC;
4476 POP_ASSUM MP_TAC
4477 THEN RESA_TAC
4478 THEN STRIP_TAC
4479 THEN SUBGOAL_THEN`1 <= SUC (i' MOD dimindex (:M)) /\
4480       SUC (i' MOD dimindex (:M)) <= dimindex (:M)` ASSUME_TAC;
4481 ASM_REWRITE_TAC[ARITH_RULE`1<= SUC a`]
4482 THEN MRESAL_TAC DIVISION[`i':num`;`dimindex (:M):num`][DIMINDEX_NONZERO]
4483 THEN POP_ASSUM MP_TAC
4484 THEN ARITH_TAC;
4485 POP_ASSUM MP_TAC
4486 THEN RESA_TAC
4487 THEN MP_TAC(SET_RULE`{row k (vecmats l), row (p - 1) (vecmats l)} =
4488    {row i (vecmats l), row (SUC (i MOD k)) (vecmats l)}
4489 /\ ~(row k (vecmats l) = row (p - 1) (vecmats l))
4490 /\ ~(row i (vecmats l) = row (SUC (i MOD k)) (vecmats l))
4491 ==> (row i (vecmats l) = row (k) (vecmats l)
4492 /\ row (p-1) (vecmats l) = row (SUC (i MOD k)) (vecmats l))
4493 \/ (row i (vecmats l) = row (p-1) (vecmats l)
4494 /\ row (k) (vecmats l) = row (SUC (i MOD k)) (vecmats (l:real^(M,3)finite_product)))`)
4495 THEN RESA_TAC;
4496 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
4497           (1 <= j /\ j <= k) /\
4498           row i (vecmats l) = row j (vecmats l) 
4499 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
4500           row i (vecmats l) = row j (vecmats l)`]
4501 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`k:num`] THEN  MRESA_TAC th[`p-1:num`;`SUC(i MOD k):num`])
4502 THEN POP_ASSUM MP_TAC
4503 THEN POP_ASSUM MP_TAC
4504 THEN RESA_TAC
4505 THEN MRESAL_TAC MOD_MULT[`k:num`;`1:num`][ARITH_RULE`p*1=p/\ SUC 0=1`]
4506 THEN MP_TAC(ARITH_RULE`2<p==> ~(p-1=1)/\ 1<=1`)
4507 THEN RESA_TAC;
4508 MRESAL_TAC(GEN_ALL INJ_ROW_B_SY)[`k:num`;`s:stable_sy`;`l:real^(M,3)finite_product`][IN_NUMSEG;SET_RULE`(1 <= i /\ i <= k) /\
4509           (1 <= j /\ j <= k) /\
4510           row i (vecmats l) = row j (vecmats l) 
4511 <=> 1 <= i /\ i <= k /\ 1 <= j /\ j <= k /\
4512           row i (vecmats l) = row j (vecmats l)`]
4513 THEN POP_ASSUM(fun th-> MRESA_TAC th[`i:num`;`p-1:num`] THEN  MRESA_TAC th[`k:num`;`SUC(i MOD k):num`])
4514 THEN POP_ASSUM MP_TAC
4515 THEN POP_ASSUM MP_TAC
4516 THEN RESA_TAC
4517 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4518 THEN MP_TAC(ARITH_RULE`2<p /\ 1<= k-p ==> ~(k= SUC (p-1))/\ 1<= SUC(p-1)/\ SUC(p-1)<=k`)
4519 THEN RESA_TAC;
4520 MRESA_TAC (GEN_ALL PROPERTIES_OF_FAN_IN_B_SY)[`d_sy (s:stable_sy)`;`J_SY (s:stable_sy)`;`k_sy (s:stable_sy)`;`k:num`;`p-1:num`;`a_sy (s:stable_sy)`;`b_sy (s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`] 
4521 THEN MRESAL_TAC(GEN_ALL TECOXBM1)[`d_sy (s:stable_sy)`;`J_SY(s:stable_sy)`;`k:num`;`a_sy(s:stable_sy)`;`b_sy(s:stable_sy)`;`row k (vecmats (l:real^(M,3)finite_product))`;`row (p-1) (vecmats (l:real^(M,3)finite_product))`;`l:real^(M,3)finite_product`][SET_RULE`{A} UNION {B,C}={A,B,C}`]
4522 THEN MP_TAC(SET_RULE`{v, w} SUBSET V_SY (vecmats l)==> v IN V_SY (vecmats l)
4523 /\ w IN V_SY (vecmats (l:real^(M,3)finite_product))`)
4524 THEN RESA_TAC
4525 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4526 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4527 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4528 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4529 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F_SY)[`k:num`;`p:num`;`v:real^3`;`w:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4530 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4531 THEN MRESA_TAC (GEN_ALL SLICEF_EQ_F2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4532 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4533 THEN MRESA_TAC (GEN_ALL SLICEE_EQ_E2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4534 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4535 THEN MRESA_TAC (GEN_ALL SLICEV_EQ_V2_SY)[`k:num`;`p:num`;`w:real^3`;`v:real^3`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4536 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4537 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4538 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION2_SY;]
4539 THEN STRIP_TAC
4540 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v':real^3^M`
4541 THEN POP_ASSUM MP_TAC
4542 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4543 THEN STRIP_TAC
4544 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4545 THEN REMOVE_THEN"THY"(fun th-> MRESA_TAC th[`V_SY(vecmats (l:real^(M,3)finite_product))`;`E_SY(vecmats (l:real^(M,3)finite_product))`;`F_SY(vecmats (l:real^(M,3)finite_product))`;
4546 `v:real^3`;`w:real^3`])
4547 THEN EXISTS_TAC`vecmats(l2:real^(N,3)finite_product)`
4548 THEN ASM_REWRITE_TAC[MATVEC_VECMATS_ID]
4549 THEN STRIP_TAC;
4550 REPEAT STRIP_TAC
4551 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4552 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4553 THEN FIND_ASSUM (fun th-> MATCH_MP_TAC(ISPEC `p-2+i`th))`!i. 1 <= i /\ i <= dimindex (:M) ==> row i (vecmats (l:real^(M,3)finite_product)) IN ball_annulus`
4554 THEN ASM_REWRITE_TAC[]
4555 THEN MP_TAC(ARITH_RULE`1<=i /\ i<= k-p+2 /\ 2<p /\ 1<=k-p ==> 1<= p-2+i /\ p-2+i<=k`)
4556 THEN RESA_TAC;
4557 ASM_REWRITE_TAC[CONDITION1_SY]
4558 THEN FIND_ASSUM MP_TAC`COVER_SY 0 (p - 1) s s1 (s2:stable_sy)`
4559 THEN REWRITE_TAC[COVER_SY;COVER5_SY;COVER4_SY;]
4560 THEN RESA_TAC
4561 THEN REMOVE_ASSUM_TAC
4562 THEN POP_ASSUM MP_TAC
4563 THEN POP_ASSUM MP_TAC
4564 THEN POP_ASSUM MP_TAC
4565 THEN POP_ASSUM MP_TAC
4566 THEN POP_ASSUM MP_TAC
4567 THEN POP_ASSUM MP_TAC
4568 THEN DISCH_THEN(LABEL_TAC"THYGIANG")
4569 THEN DISCH_THEN(LABEL_TAC"THYGIANG1")
4570 THEN DISCH_THEN(LABEL_TAC"THYGIANG2")
4571 THEN DISCH_THEN(LABEL_TAC"THYGIANG3")
4572 THEN DISCH_THEN(LABEL_TAC"THYGIANG4")
4573 THEN DISCH_THEN(LABEL_TAC"THYGIANG5")
4574 THEN REPEAT GEN_TAC
4575 THEN STRIP_TAC;
4576 MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`i:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4577 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4578 THEN MRESA_TAC (GEN_ALL PMAT2_EQ_SY)[`k:num`;`p:num`;`j:num`;`(s:stable_sy)`;` (s1:stable_sy)`;` (s2:stable_sy)`;` (s3:stable_sy)`;` (l:real^(M,3)finite_product)`;`
4579 (l1:real^(P,3)finite_product) `;`(l2:real^(N,3)finite_product)`]
4580 THEN REMOVE_THEN "THYGIANG1"MP_TAC
4581 THEN REMOVE_THEN "THYGIANG3"MP_TAC
4582 THEN FIND_ASSUM MP_TAC`SCHANGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) s2 (s3:stable_sy)`
4583 THEN REWRITE_TAC[SCHANGE]
4584 THEN RESA_TAC
4585 THEN POP_ASSUM MP_TAC
4586 THEN POP_ASSUM MP_TAC
4587 THEN POP_ASSUM (fun th-> MRESA_TAC th[`i:num`;`j:num`])
4588 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4589 THEN STRIP_TAC
4590 THEN POP_ASSUM (fun th-> MRESA_TAC th[`i:num`;`j:num`])
4591 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4592 THEN STRIP_TAC
4593 THEN MP_TAC(ARITH_RULE`i<=k-p+2 ==> i=k-p+2 \/ i< k-p+2`)
4594 THEN RESA_TAC;
4595 MP_TAC(ARITH_RULE`j<=k-p+2 ==> j=k-p+2 \/ j< k-p+2`)
4596 THEN RESA_TAC;
4597 STRIP_TAC
4598 THEN STRIP_TAC
4599 THEN MRESAL_TAC MOD_MULT[`k:num`;`1`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4600 THEN SUBGOAL_THEN`0 IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4601 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4602 THEN EXISTS_TAC`0`
4603 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4604 MRESAL1_TAC stable_sy_lemma`s2:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4605 THEN REMOVE_ASSUM_TAC
4606 THEN POP_ASSUM(fun th-> MRESA1_TAC th`0`)
4607 THEN REMOVE_ASSUM_TAC
4608 THEN POP_ASSUM MP_TAC
4609 THEN REMOVE_ASSUM_TAC
4610 THEN POP_ASSUM MP_TAC
4611 THEN REWRITE_TAC[constraint_system]
4612 THEN STRIP_TAC
4613 THEN REMOVE_ASSUM_TAC
4614 THEN REMOVE_ASSUM_TAC
4615 THEN REMOVE_ASSUM_TAC
4616 THEN POP_ASSUM (fun th-> MRESA_TAC th[`0:num`;`0:num`] )
4617 THEN STRIP_TAC
4618 THEN POP_ASSUM(fun th-> POP_ASSUM MP_TAC THEN REWRITE_TAC[th;VECTOR_ARITH`A-A= vec 0 `;NORM_0;])
4619 THEN REAL_ARITH_TAC;
4620 MRESAL_TAC MOD_MULT[`k:num`;`1`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4621 THEN MP_TAC(ARITH_RULE`1<=j==> j=1 \/ 1<j`)
4622 THEN RESA_TAC;
4623 REWRITE_TAC[ARITH_RULE`~(1=0)`]
4624 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4625 THEN MP_TAC(ARITH_RULE`2<k==> 1<k`)
4626 THEN RESA_TAC
4627 THEN STRIP_TAC
4628 THEN STRIP_TAC
4629 THEN REMOVE_ASSUM_TAC
4630 THEN POP_ASSUM MP_TAC
4631 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4632 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4633 THEN STRIP_TAC
4634 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4635 THEN POP_ASSUM MP_TAC
4636 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4637 THEN STRIP_TAC
4638 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4639 THEN REMOVE_ASSUM_TAC
4640 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-1:num`])
4641 THEN REMOVE_ASSUM_TAC
4642 THEN POP_ASSUM MP_TAC
4643 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4644 THEN REMOVE_ASSUM_TAC
4645 THEN REMOVE_ASSUM_TAC
4646 THEN REMOVE_ASSUM_TAC
4647 THEN POP_ASSUM MP_TAC
4648 THEN REWRITE_TAC[constraint_system]
4649 THEN STRIP_TAC
4650 THEN REMOVE_ASSUM_TAC
4651 THEN REMOVE_ASSUM_TAC
4652 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`k:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4653 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4654 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4655 THEN MRESAL1_TAC stable_sy_lemma`s2:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4656 THEN REMOVE_ASSUM_TAC
4657 THEN REMOVE_ASSUM_TAC
4658 THEN REMOVE_ASSUM_TAC
4659 THEN POP_ASSUM MP_TAC
4660 THEN REWRITE_TAC[constraint_system]
4661 THEN STRIP_TAC
4662 THEN REMOVE_ASSUM_TAC
4663 THEN REMOVE_ASSUM_TAC
4664 THEN REMOVE_ASSUM_TAC
4665 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
4666 THEN FIND_ASSUM MP_TAC`norm (v - w:real^3) <= min (b_sy s1 (p - 1,0)) (b_sy (s2:stable_sy) (p - 1,0))`
4667 THEN REAL_ARITH_TAC;
4668 MP_TAC(ARITH_RULE`1<j /\ j<k-p+2 /\ 2<p /\ 1<=k-p ==> ~(j=0) /\ p-2+j<k /\ ~(p-2+j=p-1) /\ ~(0=p-1)/\ 0<=j /\ j<= k-p+1/\ 1<=p-2+j/\ p-2+j<=k /\1<k`)
4669 THEN RESA_TAC
4670 THEN MRESA_TAC MOD_LT[`p-2+j:num`;`k:num`]
4671 THEN MP_TAC(SET_RULE`~(p-2+j=p-1) /\ ~(0=p-1)==> ~({0,p-2+j}={0,p-1})`)
4672 THEN RESA_TAC
4673 THEN SUBGOAL_THEN`0 IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4674 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4675 THEN EXISTS_TAC`0`
4676 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4677 SUBGOAL_THEN`p-2+j IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4678 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4679 THEN EXISTS_TAC`j:num`
4680 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4681 STRIP_TAC
4682 THEN STRIP_TAC
4683 THEN POP_ASSUM(fun th-> MRESA_TAC th[`0`;`p-2+j`])
4684 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4685 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4686 THEN STRIP_TAC
4687 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4688 THEN POP_ASSUM MP_TAC
4689 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4690 THEN STRIP_TAC
4691 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4692 THEN REMOVE_ASSUM_TAC
4693 THEN POP_ASSUM(fun th-> MRESA_TAC th[`k:num`;`p-2+j:num`])
4694 THEN POP_ASSUM MP_TAC
4695 THEN POP_ASSUM MP_TAC
4696 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4697 THEN REMOVE_ASSUM_TAC
4698 THEN REMOVE_ASSUM_TAC
4699 THEN REMOVE_ASSUM_TAC
4700 THEN POP_ASSUM MP_TAC
4701 THEN REWRITE_TAC[constraint_system]
4702 THEN STRIP_TAC
4703 THEN REMOVE_ASSUM_TAC
4704 THEN REMOVE_ASSUM_TAC
4705 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-2+j:num`;`k:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4706 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4707 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4708 THEN RESA_TAC
4709 THEN RESA_TAC;
4710 MRESAL_TAC MOD_MULT[`k:num`;`1`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4711 THEN MP_TAC(ARITH_RULE`1<=i==> i=1 \/ 1<i`)
4712 THEN RESA_TAC;
4713 MP_TAC(ARITH_RULE`1<=j==> j=1 \/ 1<j`)
4714 THEN RESA_TAC;
4715 STRIP_TAC
4716 THEN STRIP_TAC
4717 THEN REWRITE_TAC[ARITH_RULE`~(1=0)`]
4718 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4719 THEN SUBGOAL_THEN`p-1 IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4720 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4721 THEN EXISTS_TAC`1:num`
4722 THEN ASM_REWRITE_TAC[ARITH_RULE`~(1=0) /\ 0<= 1/\ 1<= k-p+1`];
4723 MRESAL1_TAC stable_sy_lemma`s2:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4724 THEN REMOVE_ASSUM_TAC
4725 THEN POP_ASSUM(fun th-> MRESA1_TAC th`p-1`)
4726 THEN REMOVE_ASSUM_TAC
4727 THEN POP_ASSUM MP_TAC
4728 THEN REMOVE_ASSUM_TAC
4729 THEN POP_ASSUM MP_TAC
4730 THEN REWRITE_TAC[constraint_system]
4731 THEN STRIP_TAC
4732 THEN REMOVE_ASSUM_TAC
4733 THEN REMOVE_ASSUM_TAC
4734 THEN REMOVE_ASSUM_TAC
4735 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`p-1:num`] )
4736 THEN STRIP_TAC
4737 THEN POP_ASSUM(fun th-> POP_ASSUM MP_TAC THEN REWRITE_TAC[th;VECTOR_ARITH`A-A= vec 0 `;NORM_0;])
4738 THEN REAL_ARITH_TAC;
4739 MP_TAC(ARITH_RULE`j<=k-p+2 ==> j=k-p+2 \/ j< k-p+2`)
4740 THEN RESA_TAC;
4741 REWRITE_TAC[ARITH_RULE`~(1=0)`]
4742 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4743 THEN MP_TAC(ARITH_RULE`2<k==> 1<k`)
4744 THEN RESA_TAC
4745 THEN STRIP_TAC
4746 THEN STRIP_TAC
4747 THEN REMOVE_ASSUM_TAC
4748 THEN POP_ASSUM MP_TAC
4749 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4750 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4751 THEN STRIP_TAC
4752 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4753 THEN POP_ASSUM MP_TAC
4754 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4755 THEN STRIP_TAC
4756 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4757 THEN REMOVE_ASSUM_TAC
4758 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`k:num`])
4759 THEN REMOVE_ASSUM_TAC
4760 THEN POP_ASSUM MP_TAC
4761 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4762 THEN REMOVE_ASSUM_TAC
4763 THEN REMOVE_ASSUM_TAC
4764 THEN REMOVE_ASSUM_TAC
4765 THEN POP_ASSUM MP_TAC
4766 THEN REWRITE_TAC[constraint_system]
4767 THEN STRIP_TAC
4768 THEN REMOVE_ASSUM_TAC
4769 THEN REMOVE_ASSUM_TAC
4770 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-1:num`;`k:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4771 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4772 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4773 THEN REWRITE_TAC[NORM_SUB]
4774 THEN DISCH_THEN(LABEL_TAC"THY21")
4775 THEN DISCH_THEN(LABEL_TAC"THY22")
4776 THEN MRESAL1_TAC stable_sy_lemma`s2:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4777 THEN REMOVE_ASSUM_TAC
4778 THEN REMOVE_ASSUM_TAC
4779 THEN REMOVE_ASSUM_TAC
4780 THEN POP_ASSUM MP_TAC
4781 THEN REWRITE_TAC[constraint_system]
4782 THEN STRIP_TAC
4783 THEN REMOVE_ASSUM_TAC
4784 THEN REMOVE_ASSUM_TAC
4785 THEN REMOVE_ASSUM_TAC
4786 THEN FIND_ASSUM MP_TAC`norm (v - w:real^3) <= min (b_sy s1 (p - 1,0)) (b_sy (s2:stable_sy) (p - 1,0))`
4787 THEN POP_ASSUM(fun th-> ONCE_REWRITE_TAC[th])
4788 THEN REMOVE_THEN"THY21"MP_TAC
4789 THEN REMOVE_THEN"THY22"MP_TAC
4790 THEN REAL_ARITH_TAC;
4791 MP_TAC(ARITH_RULE`1<j /\ j<k-p+2 /\ 2<p /\ 1<=k-p ==> ~(j=0) /\ p-2+j<k /\ ~(p-2+j=0) /\ ~(0=p-1)/\ 0<=j /\ j<= k-p+1/\ 1<=p-2+j/\ p-2+j<=k /\1<k/\ ~(1=0)`)
4792 THEN RESA_TAC
4793 THEN MRESA_TAC MOD_LT[`p-2+j:num`;`k:num`]
4794 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4795 THEN MP_TAC(SET_RULE`~(p-2+j=0) /\ ~(0=p-1)==> ~({p-1,p-2+j}={0,p-1})`)
4796 THEN RESA_TAC
4797 THEN SUBGOAL_THEN`p-1 IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4798 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4799 THEN EXISTS_TAC`1`
4800 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 1/\ 1<= k-p+1`];
4801 SUBGOAL_THEN`p-2+j IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4802 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4803 THEN EXISTS_TAC`j:num`
4804 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4805 STRIP_TAC
4806 THEN STRIP_TAC
4807 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1`;`p-2+j`])
4808 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4809 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4810 THEN STRIP_TAC
4811 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4812 THEN POP_ASSUM MP_TAC
4813 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4814 THEN STRIP_TAC
4815 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4816 THEN REMOVE_ASSUM_TAC
4817 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-1:num`;`p-2+j:num`]);
4818 MP_TAC(ARITH_RULE`1<i /\ i<k-p+2 /\ 2<p /\ 1<=k-p/\ 1<=j ==> ~(i=0) /\ p-2+i<k /\ ~(p-2+i=0) /\ ~(0=p-1)/\ 0<=i /\ i<= k-p+1/\ 1<=p-2+i/\ p-2+i<=k /\1<k/\ ~(p-2+i=p-1)/\ ~(j=0)`)
4819 THEN RESA_TAC
4820 THEN MRESA_TAC MOD_LT[`p-2+i:num`;`k:num`]
4821 THEN MRESA_TAC MOD_LT[`p-1:num`;`k:num`]
4822 THEN MP_TAC(ARITH_RULE`j<=k-p+2 ==> j=k-p+2 \/ j< k-p+2`)
4823 THEN RESA_TAC;
4824 MP_TAC(SET_RULE`~(p-2+i=p-1) /\ ~(0=p-1)==> ~({p-2+i,0}={0,p-1})`)
4825 THEN RESA_TAC
4826 THEN SUBGOAL_THEN`0 IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4827 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4828 THEN EXISTS_TAC`0`
4829 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4830 SUBGOAL_THEN`p-2+i IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4831 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4832 THEN EXISTS_TAC`i:num`
4833 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4834 STRIP_TAC
4835 THEN STRIP_TAC
4836 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-2+i`;`0`])
4837 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4838 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4839 THEN STRIP_TAC
4840 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4841 THEN POP_ASSUM MP_TAC
4842 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4843 THEN STRIP_TAC
4844 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4845 THEN REMOVE_ASSUM_TAC
4846 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-2+i:num`;`k:num`;])
4847 THEN POP_ASSUM MP_TAC
4848 THEN POP_ASSUM MP_TAC
4849 THEN MRESAL1_TAC stable_sy_lemma`s:stable_sy`[stable_system;IN_NUMSEG;ARITH_RULE`0<= i:num`;]
4850 THEN REMOVE_ASSUM_TAC
4851 THEN REMOVE_ASSUM_TAC
4852 THEN REMOVE_ASSUM_TAC
4853 THEN POP_ASSUM MP_TAC
4854 THEN REWRITE_TAC[constraint_system]
4855 THEN STRIP_TAC
4856 THEN REMOVE_ASSUM_TAC
4857 THEN REMOVE_ASSUM_TAC
4858 THEN POP_ASSUM (fun th-> MRESA_TAC th[`p-2+i:num`;`k:num`] THEN MRESA_TAC th[`p:num`;`p:num`])
4859 THEN MRESA_TAC (GEN_ALL POWER_MOD_FUN)[`k:num`;`k:num`;`k:num`]
4860 THEN MRESAL_TAC MOD_MULT[`k:num`;`2`][DIMINDEX_NONZERO;ARITH_RULE`A*1=A/\ p+p= p* 2`]
4861 THEN RESA_TAC
4862 THEN RESA_TAC;
4863 MP_TAC(ARITH_RULE`j<k-p+2 /\ 2<p /\ 1<=k-p/\ 1<=j ==> ~(j=0) /\ p-2+j<k/\ 0<=j /\ j<=k-p+1/\ 1<= p-2+j /\ p-2+j<=k `)
4864 THEN RESA_TAC
4865 THEN MRESA_TAC MOD_LT[`p-2+j:num`;`k:num`]
4866 THEN MP_TAC(SET_RULE`~(p-2+i=p-1) /\ ~(p-2+i=0)==> ~({p-2+i,p-2+j}={0,p-1})`)
4867 THEN RESA_TAC
4868 THEN SUBGOAL_THEN`p-2+j IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4869 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4870 THEN EXISTS_TAC`j:num`
4871 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4872 SUBGOAL_THEN`p-2+i IN IMAGE (\x. if x = 0 then 0 else (p - 2 + x) MOD k) (0..k - p + 1)` ASSUME_TAC;
4873 REWRITE_TAC[IMAGE;IN_ELIM_THM;IN_NUMSEG]
4874 THEN EXISTS_TAC`i:num`
4875 THEN ASM_REWRITE_TAC[ARITH_RULE`0=0 /\ 0<= 0/\ 0<= k-p+1`];
4876 STRIP_TAC
4877 THEN STRIP_TAC
4878 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-2+i`;`p-2+j`])
4879 THEN FIND_ASSUM MP_TAC`(l:real^(M,3)finite_product) IN (B_SY1 (a_sy s) (b_sy s))`
4880 THEN REWRITE_TAC[B_SY1;IN_ELIM_THM;CONDITION1_SY]
4881 THEN STRIP_TAC
4882 THEN MRESA1_TAC (GEN_ALL VECMATS_MATVEC_ID)`v'':real^3^M`
4883 THEN POP_ASSUM MP_TAC
4884 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM th])
4885 THEN STRIP_TAC
4886 THEN POP_ASSUM (fun th-> SUBST_ALL_TAC(SYM th))
4887 THEN REMOVE_ASSUM_TAC
4888 THEN POP_ASSUM(fun th-> MRESA_TAC th[`p-2+i:num`;`p-2+j:num`;])]);;
4889
4890
4891
4892
4893 let MTUWLUN1 = D_FUN_COVER_SY;;
4894
4895 let MTUWLUN2 = TAU_STAR_COVER;;
4896
4897 let MTUWLUN3 = IN_B_SY_COVER;;
4898
4899 let MTUWLUN4 = IN_B_SY2_COVER;;
4900
4901
4902
4903
4904
4905
4906
4907 end;;
4908
4909