556
|
1 |
theory HarderProps imports BasicIdentities
|
|
2 |
begin
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
lemma spawn_simp_rsimpalts:
|
|
8 |
shows "rsimp (rsimp_ALTs rs) = rsimp (rsimp_ALTs (map rsimp rs))"
|
|
9 |
apply(cases rs)
|
|
10 |
apply simp
|
|
11 |
apply(case_tac list)
|
|
12 |
apply simp
|
|
13 |
apply(subst rsimp_idem[symmetric])
|
|
14 |
apply simp
|
|
15 |
apply(subgoal_tac "rsimp_ALTs rs = RALTS rs")
|
|
16 |
apply(simp only:)
|
|
17 |
apply(subgoal_tac "rsimp_ALTs (map rsimp rs) = RALTS (map rsimp rs)")
|
|
18 |
apply(simp only:)
|
|
19 |
prefer 2
|
|
20 |
apply simp
|
|
21 |
prefer 2
|
|
22 |
using rsimp_ALTs.simps(3) apply presburger
|
|
23 |
apply auto
|
|
24 |
apply(subst rsimp_idem)+
|
|
25 |
by (metis comp_apply rsimp_idem)
|
|
26 |
|
|
27 |
|
|
28 |
|
|
29 |
|
|
30 |
lemma good1_rsimpalts:
|
|
31 |
shows "rsimp r = RALTS rs \<Longrightarrow> rsimp_ALTs rs = RALTS rs"
|
|
32 |
by (metis no_alt_short_list_after_simp)
|
|
33 |
|
|
34 |
|
|
35 |
|
|
36 |
|
|
37 |
lemma good1_flatten:
|
|
38 |
shows "\<lbrakk> rsimp r = (RALTS rs1)\<rbrakk>
|
|
39 |
\<Longrightarrow> rflts (rsimp_ALTs rs1 # map rsimp rsb) = rflts (rs1 @ map rsimp rsb)"
|
|
40 |
apply(subst good1_rsimpalts)
|
|
41 |
apply simp+
|
|
42 |
apply(subgoal_tac "rflts (rs1 @ map rsimp rsb) = rs1 @ rflts (map rsimp rsb)")
|
|
43 |
apply simp
|
|
44 |
using flts_append rsimp_inner_idem4 by presburger
|
|
45 |
|
|
46 |
|
|
47 |
lemma flatten_rsimpalts:
|
|
48 |
shows "rflts (rsimp_ALTs (rdistinct (rflts (map rsimp rsa)) {}) # map rsimp rsb) =
|
|
49 |
rflts ( (rdistinct (rflts (map rsimp rsa)) {}) @ map rsimp rsb)"
|
|
50 |
apply(case_tac "map rsimp rsa")
|
|
51 |
apply simp
|
|
52 |
apply(case_tac "list")
|
|
53 |
apply simp
|
|
54 |
apply(case_tac a)
|
|
55 |
apply simp+
|
|
56 |
apply(rename_tac rs1)
|
|
57 |
apply (metis good1_flatten map_eq_Cons_D no_further_dB_after_simp)
|
|
58 |
|
|
59 |
apply simp
|
|
60 |
|
|
61 |
apply(subgoal_tac "\<forall>r \<in> set( rflts (map rsimp rsa)). good r")
|
|
62 |
apply(case_tac "rdistinct (rflts (map rsimp rsa)) {}")
|
|
63 |
apply simp
|
|
64 |
apply(case_tac "listb")
|
|
65 |
apply simp+
|
|
66 |
apply (metis Cons_eq_appendI good1_flatten rflts.simps(3) rsimp.simps(2) rsimp_ALTs.simps(3))
|
|
67 |
by (metis (mono_tags, lifting) flts3 good1 image_iff list.set_map)
|
|
68 |
|
|
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
|
73 |
|
|
74 |
lemma simp_flatten:
|
|
75 |
shows "rsimp (RALTS ((RALTS rsa) # rsb)) = rsimp (RALTS (rsa @ rsb))"
|
|
76 |
apply simp
|
|
77 |
apply(subst flatten_rsimpalts)
|
|
78 |
apply(simp add: flts_append)
|
|
79 |
by (metis Diff_empty distinct_once_enough flts_append nonalt0_fltseq nonalt_flts_rd qqq1 rdistinct_set_equality1)
|
|
80 |
|
|
81 |
|
|
82 |
|
|
83 |
|
|
84 |
|
|
85 |
lemma simp_flatten_aux0:
|
|
86 |
shows "rsimp (RALTS rs) = rsimp (RALTS (map rsimp rs))"
|
|
87 |
apply(induct rs)
|
|
88 |
apply simp+
|
|
89 |
by (metis (mono_tags, opaque_lifting) comp_eq_dest_lhs map_eq_conv rsimp_idem)
|
|
90 |
|
|
91 |
|
|
92 |
|
|
93 |
|
|
94 |
|
|
95 |
|
|
96 |
lemma good_singleton:
|
|
97 |
shows "good a \<and> nonalt a \<Longrightarrow> rflts [a] = [a]"
|
|
98 |
using good.simps(1) k0b by blast
|
|
99 |
|
|
100 |
|
|
101 |
|
|
102 |
|
|
103 |
|
|
104 |
lemma good_flatten_aux_aux1:
|
|
105 |
shows "\<lbrakk> size rs \<ge>2;
|
|
106 |
\<forall>r \<in> set rs. good r \<and> r \<noteq> RZERO \<and> nonalt r; \<forall>r \<in> set rsb. good r \<and> r \<noteq> RZERO \<and> nonalt r \<rbrakk>
|
|
107 |
\<Longrightarrow> rdistinct (rs @ rsb) rset =
|
|
108 |
rdistinct (rflts [rsimp_ALTs (rdistinct rs {})] @ rsb) rset"
|
|
109 |
apply(induct rs arbitrary: rset)
|
|
110 |
apply simp
|
|
111 |
apply(case_tac "a \<in> rset")
|
|
112 |
apply simp
|
|
113 |
apply(case_tac "rdistinct rs {a}")
|
|
114 |
apply simp
|
|
115 |
apply(subst good_singleton)
|
|
116 |
apply force
|
|
117 |
apply simp
|
|
118 |
apply (meson all_that_same_elem)
|
|
119 |
apply(subgoal_tac "rflts [rsimp_ALTs (a # rdistinct rs {a})] = a # rdistinct rs {a} ")
|
|
120 |
prefer 2
|
|
121 |
using k0a rsimp_ALTs.simps(3) apply presburger
|
|
122 |
apply(simp only:)
|
|
123 |
apply(subgoal_tac "rdistinct (rs @ rsb) rset = rdistinct ((rdistinct (a # rs) {}) @ rsb) rset ")
|
|
124 |
apply (metis insert_absorb insert_is_Un insert_not_empty rdistinct.simps(2))
|
|
125 |
apply (meson distinct_eq_interesting1)
|
|
126 |
apply simp
|
|
127 |
apply(case_tac "rdistinct rs {a}")
|
|
128 |
prefer 2
|
|
129 |
apply(subgoal_tac "rsimp_ALTs (a # rdistinct rs {a}) = RALTS (a # rdistinct rs {a})")
|
|
130 |
apply(simp only:)
|
|
131 |
apply(subgoal_tac "a # rdistinct (rs @ rsb) (insert a rset) =
|
|
132 |
rdistinct (rflts [RALTS (a # rdistinct rs {a})] @ rsb) rset")
|
|
133 |
apply simp
|
|
134 |
apply (metis append_Cons distinct_early_app empty_iff insert_is_Un k0a rdistinct.simps(2))
|
|
135 |
using rsimp_ALTs.simps(3) apply presburger
|
|
136 |
by (metis Un_insert_left append_Cons distinct_early_app empty_iff good_singleton rdistinct.simps(2) rsimp_ALTs.simps(2) sup_bot_left)
|
|
137 |
|
|
138 |
|
|
139 |
|
|
140 |
|
|
141 |
|
|
142 |
lemma good_flatten_aux_aux:
|
|
143 |
shows "\<lbrakk>\<exists>a aa lista list. rs = a # list \<and> list = aa # lista;
|
|
144 |
\<forall>r \<in> set rs. good r \<and> r \<noteq> RZERO \<and> nonalt r; \<forall>r \<in> set rsb. good r \<and> r \<noteq> RZERO \<and> nonalt r \<rbrakk>
|
|
145 |
\<Longrightarrow> rdistinct (rs @ rsb) rset =
|
|
146 |
rdistinct (rflts [rsimp_ALTs (rdistinct rs {})] @ rsb) rset"
|
|
147 |
apply(erule exE)+
|
|
148 |
apply(subgoal_tac "size rs \<ge> 2")
|
|
149 |
apply (metis good_flatten_aux_aux1)
|
|
150 |
by (simp add: Suc_leI length_Cons less_add_Suc1)
|
|
151 |
|
|
152 |
|
|
153 |
|
|
154 |
lemma good_flatten_aux:
|
|
155 |
shows " \<lbrakk>\<forall>r\<in>set rs. good r \<or> r = RZERO; \<forall>r\<in>set rsa . good r \<or> r = RZERO;
|
|
156 |
\<forall>r\<in>set rsb. good r \<or> r = RZERO;
|
|
157 |
rsimp (RALTS (rsa @ rs @ rsb)) = rsimp_ALTs (rdistinct (rflts (rsa @ rs @ rsb)) {});
|
|
158 |
rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) =
|
|
159 |
rsimp_ALTs (rdistinct (rflts (rsa @ [rsimp (RALTS rs)] @ rsb)) {});
|
|
160 |
map rsimp rsa = rsa;
|
|
161 |
map rsimp rsb = rsb;
|
|
162 |
map rsimp rs = rs;
|
|
163 |
rdistinct (rflts rsa @ rflts rs @ rflts rsb) {} =
|
|
164 |
rdistinct (rflts rsa) {} @ rdistinct (rflts rs @ rflts rsb) (set (rflts rsa));
|
|
165 |
rdistinct (rflts rsa @ rflts [rsimp (RALTS rs)] @ rflts rsb) {} =
|
|
166 |
rdistinct (rflts rsa) {} @ rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))\<rbrakk>
|
|
167 |
\<Longrightarrow> rdistinct (rflts rs @ rflts rsb) rset =
|
|
168 |
rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) rset"
|
|
169 |
apply simp
|
|
170 |
apply(case_tac "rflts rs ")
|
|
171 |
apply simp
|
|
172 |
apply(case_tac "list")
|
|
173 |
apply simp
|
|
174 |
apply(case_tac "a \<in> rset")
|
|
175 |
apply simp
|
|
176 |
apply (metis append.left_neutral append_Cons equals0D k0b list.set_intros(1) nonalt_flts_rd qqq1 rdistinct.simps(2))
|
|
177 |
apply simp
|
|
178 |
apply (metis Un_insert_left append_Cons append_Nil ex_in_conv flts_single1 insertI1 list.simps(15) nonalt_flts_rd nonazero.elims(3) qqq1 rdistinct.simps(2) sup_bot_left)
|
|
179 |
apply(subgoal_tac "\<forall>r \<in> set (rflts rs). good r \<and> r \<noteq> RZERO \<and> nonalt r")
|
|
180 |
prefer 2
|
|
181 |
apply (metis Diff_empty flts3 nonalt_flts_rd qqq1 rdistinct_set_equality1)
|
|
182 |
apply(subgoal_tac "\<forall>r \<in> set (rflts rsb). good r \<and> r \<noteq> RZERO \<and> nonalt r")
|
|
183 |
prefer 2
|
|
184 |
apply (metis Diff_empty flts3 good.simps(1) nonalt_flts_rd rdistinct_set_equality1)
|
|
185 |
by (smt (verit, ccfv_threshold) good_flatten_aux_aux)
|
|
186 |
|
|
187 |
|
|
188 |
|
|
189 |
|
|
190 |
lemma good_flatten_middle:
|
|
191 |
shows "\<lbrakk>\<forall>r \<in> set rs. good r \<or> r = RZERO;
|
|
192 |
\<forall>r \<in> set rsa. good r \<or> r = RZERO;
|
|
193 |
\<forall>r \<in> set rsb. good r \<or> r = RZERO\<rbrakk> \<Longrightarrow>
|
|
194 |
rsimp (RALTS (rsa @ rs @ rsb)) =
|
|
195 |
rsimp (RALTS (rsa @ [RALTS rs] @ rsb))"
|
|
196 |
apply(subgoal_tac "rsimp (RALTS (rsa @ rs @ rsb)) = rsimp_ALTs (rdistinct (rflts (map rsimp rsa @
|
|
197 |
map rsimp rs @ map rsimp rsb)) {})")
|
|
198 |
prefer 2
|
|
199 |
apply simp
|
|
200 |
apply(simp only:)
|
|
201 |
apply(subgoal_tac "rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) = rsimp_ALTs (rdistinct (rflts (map rsimp rsa @
|
|
202 |
[rsimp (RALTS rs)] @ map rsimp rsb)) {})")
|
|
203 |
prefer 2
|
|
204 |
apply simp
|
|
205 |
apply(simp only:)
|
|
206 |
apply(subgoal_tac "map rsimp rsa = rsa")
|
|
207 |
prefer 2
|
|
208 |
apply (metis map_idI rsimp.simps(3) test)
|
|
209 |
apply(simp only:)
|
|
210 |
apply(subgoal_tac "map rsimp rsb = rsb")
|
|
211 |
prefer 2
|
|
212 |
apply (metis map_idI rsimp.simps(3) test)
|
|
213 |
apply(simp only:)
|
|
214 |
apply(subst flts_append)+
|
|
215 |
apply(subgoal_tac "map rsimp rs = rs")
|
|
216 |
apply(simp only:)
|
|
217 |
prefer 2
|
|
218 |
apply (metis map_idI rsimp.simps(3) test)
|
|
219 |
apply(subgoal_tac "rdistinct (rflts rsa @ rflts rs @ rflts rsb) {} =
|
|
220 |
rdistinct (rflts rsa) {} @ rdistinct (rflts rs @ rflts rsb) (set (rflts rsa))")
|
|
221 |
apply(simp only:)
|
|
222 |
prefer 2
|
|
223 |
using rdistinct_concat_general apply blast
|
|
224 |
apply(subgoal_tac "rdistinct (rflts rsa @ rflts [rsimp (RALTS rs)] @ rflts rsb) {} =
|
|
225 |
rdistinct (rflts rsa) {} @ rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))")
|
|
226 |
apply(simp only:)
|
|
227 |
prefer 2
|
|
228 |
using rdistinct_concat_general apply blast
|
|
229 |
apply(subgoal_tac "rdistinct (rflts rs @ rflts rsb) (set (rflts rsa)) =
|
|
230 |
rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))")
|
|
231 |
apply presburger
|
|
232 |
using good_flatten_aux by blast
|
|
233 |
|
|
234 |
|
|
235 |
|
|
236 |
lemma simp_flatten3:
|
|
237 |
shows "rsimp (RALTS (rsa @ [RALTS rs ] @ rsb)) = rsimp (RALTS (rsa @ rs @ rsb))"
|
|
238 |
apply(subgoal_tac "rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) =
|
|
239 |
rsimp (RALTS (map rsimp rsa @ [rsimp (RALTS rs)] @ map rsimp rsb)) ")
|
|
240 |
prefer 2
|
|
241 |
apply (metis append.left_neutral append_Cons list.simps(9) map_append simp_flatten_aux0)
|
|
242 |
apply (simp only:)
|
|
243 |
apply(subgoal_tac "rsimp (RALTS (rsa @ rs @ rsb)) =
|
|
244 |
rsimp (RALTS (map rsimp rsa @ map rsimp rs @ map rsimp rsb))")
|
|
245 |
prefer 2
|
|
246 |
apply (metis map_append simp_flatten_aux0)
|
|
247 |
apply(simp only:)
|
|
248 |
apply(subgoal_tac "rsimp (RALTS (map rsimp rsa @ map rsimp rs @ map rsimp rsb)) =
|
|
249 |
rsimp (RALTS (map rsimp rsa @ [RALTS (map rsimp rs)] @ map rsimp rsb))")
|
|
250 |
|
|
251 |
apply (metis (no_types, lifting) head_one_more_simp map_append simp_flatten_aux0)
|
|
252 |
apply(subgoal_tac "\<forall>r \<in> set (map rsimp rsa). good r \<or> r = RZERO")
|
|
253 |
apply(subgoal_tac "\<forall>r \<in> set (map rsimp rs). good r \<or> r = RZERO")
|
|
254 |
apply(subgoal_tac "\<forall>r \<in> set (map rsimp rsb). good r \<or> r = RZERO")
|
|
255 |
|
|
256 |
using good_flatten_middle apply presburger
|
|
257 |
apply (simp add: good1)
|
|
258 |
apply (simp add: good1)
|
|
259 |
apply (simp add: good1)
|
|
260 |
done
|
|
261 |
|
|
262 |
|
|
263 |
lemma simp_removes_duplicate1:
|
|
264 |
shows " a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ [a])) = rsimp (RALTS (rsa))"
|
|
265 |
and " rsimp (RALTS (a1 # rsa @ [a1])) = rsimp (RALTS (a1 # rsa))"
|
|
266 |
apply(induct rsa arbitrary: a1)
|
|
267 |
apply simp
|
|
268 |
apply simp
|
|
269 |
prefer 2
|
|
270 |
apply(case_tac "a = aa")
|
|
271 |
apply simp
|
|
272 |
apply simp
|
|
273 |
apply (metis Cons_eq_appendI Cons_eq_map_conv distinct_removes_duplicate_flts list.set_intros(2))
|
|
274 |
apply (metis append_Cons append_Nil distinct_removes_duplicate_flts list.set_intros(1) list.simps(8) list.simps(9))
|
|
275 |
by (metis (mono_tags, lifting) append_Cons distinct_removes_duplicate_flts list.set_intros(1) list.simps(8) list.simps(9) map_append rsimp.simps(2))
|
|
276 |
|
|
277 |
lemma simp_removes_duplicate2:
|
|
278 |
shows "a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ [a] @ rsb)) = rsimp (RALTS (rsa @ rsb))"
|
|
279 |
apply(induct rsb arbitrary: rsa)
|
|
280 |
apply simp
|
|
281 |
using distinct_removes_duplicate_flts apply auto[1]
|
|
282 |
by (metis append.assoc head_one_more_simp rsimp.simps(2) simp_flatten simp_removes_duplicate1(1))
|
|
283 |
|
|
284 |
lemma simp_removes_duplicate3:
|
|
285 |
shows "a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ a # rsb)) = rsimp (RALTS (rsa @ rsb))"
|
|
286 |
using simp_removes_duplicate2 by auto
|
|
287 |
|
|
288 |
|
|
289 |
end |