878 | "AALTs bs [] \<leadsto> AZERO" |
888 | "AALTs bs [] \<leadsto> AZERO" |
879 | "AALTs bs [r] \<leadsto> fuse bs r" |
889 | "AALTs bs [r] \<leadsto> fuse bs r" |
880 | "erase a1 = erase a2 \<Longrightarrow> AALTs bs (rsa@[a1]@rsb@[a2]@rsc) \<leadsto> AALTs bs (rsa@[a1]@rsb@rsc)" |
890 | "erase a1 = erase a2 \<Longrightarrow> AALTs bs (rsa@[a1]@rsb@[a2]@rsc) \<leadsto> AALTs bs (rsa@[a1]@rsb@rsc)" |
881 |
891 |
882 |
892 |
883 inductive rrewrites:: "arexp \<Rightarrow> arexp \<Rightarrow> bool" ("_ \<leadsto>* _" [100, 100] 100) |
893 inductive |
884 where |
894 rrewrites:: "arexp \<Rightarrow> arexp \<Rightarrow> bool" ("_ \<leadsto>* _" [100, 100] 100) |
885 rs1[intro, simp]:"r \<leadsto>* r" |
895 where |
|
896 rs1[intro, simp]:"r \<leadsto>* r" |
886 | rs2[intro]: "\<lbrakk>r1 \<leadsto>* r2; r2 \<leadsto> r3\<rbrakk> \<Longrightarrow> r1 \<leadsto>* r3" |
897 | rs2[intro]: "\<lbrakk>r1 \<leadsto>* r2; r2 \<leadsto> r3\<rbrakk> \<Longrightarrow> r1 \<leadsto>* r3" |
887 |
898 |
888 inductive srewrites:: "arexp list \<Rightarrow> arexp list \<Rightarrow> bool" (" _ s\<leadsto>* _" [100, 100] 100) |
899 inductive |
889 where |
900 srewrites:: "arexp list \<Rightarrow> arexp list \<Rightarrow> bool" (" _ s\<leadsto>* _" [100, 100] 100) |
890 ss1: "[] s\<leadsto>* []" |
901 where |
891 |ss2: "\<lbrakk>r \<leadsto>* r'; rs s\<leadsto>* rs'\<rbrakk> \<Longrightarrow> (r#rs) s\<leadsto>* (r'#rs')" |
902 ss1: "[] s\<leadsto>* []" |
892 (*rs1 = [r1, r2, ..., rn] rs2 = [r1', r2', ..., rn'] |
903 | ss2: "\<lbrakk>r \<leadsto>* r'; rs s\<leadsto>* rs'\<rbrakk> \<Longrightarrow> (r#rs) s\<leadsto>* (r'#rs')" |
893 [r1, r2, ..., rn] \<leadsto>* [r1', r2, ..., rn] \<leadsto>* [...r2',...] \<leadsto>* [r1', r2',... rn'] |
904 |
|
905 (* |
|
906 rs1 = [r1, r2, ..., rn] rs2 = [r1', r2', ..., rn'] |
|
907 [r1, r2, ..., rn] \<leadsto>* [r1', r2, ..., rn] \<leadsto>* [...r2',...] \<leadsto>* [r1', r2',... rn'] |
894 *) |
908 *) |
895 |
909 |
896 |
910 |
897 |
911 |
898 lemma r_in_rstar : "r1 \<leadsto> r2 \<Longrightarrow> r1 \<leadsto>* r2" |
912 lemma r_in_rstar : "r1 \<leadsto> r2 \<Longrightarrow> r1 \<leadsto>* r2" |
899 using rrewrites.intros(1) rrewrites.intros(2) by blast |
913 using rrewrites.intros(1) rrewrites.intros(2) by blast |
900 |
914 |
901 lemma real_trans [trans]: |
915 lemma real_trans[trans]: |
902 assumes a1: "r1 \<leadsto>* r2" and a2: "r2 \<leadsto>* r3" |
916 assumes a1: "r1 \<leadsto>* r2" and a2: "r2 \<leadsto>* r3" |
903 shows "r1 \<leadsto>* r3" |
917 shows "r1 \<leadsto>* r3" |
904 using a2 a1 |
918 using a2 a1 |
905 apply(induct r2 r3 arbitrary: r1 rule: rrewrites.induct) |
919 apply(induct r2 r3 arbitrary: r1 rule: rrewrites.induct) |
906 apply(auto) |
920 apply(auto) |
907 done |
921 done |
908 |
922 |
909 |
923 |
910 lemma many_steps_later: "\<lbrakk>r1 \<leadsto> r2; r2 \<leadsto>* r3 \<rbrakk> \<Longrightarrow> r1 \<leadsto>* r3" |
924 lemma many_steps_later: "\<lbrakk>r1 \<leadsto> r2; r2 \<leadsto>* r3 \<rbrakk> \<Longrightarrow> r1 \<leadsto>* r3" |
911 by (meson r_in_rstar real_trans) |
925 by (meson r_in_rstar real_trans) |
1152 apply simp |
1171 apply simp |
1153 apply simp |
1172 apply simp |
1154 using alts_dBrewrites_withFront |
1173 using alts_dBrewrites_withFront |
1155 by (metis append_Nil dB_single_step empty_set image_empty) |
1174 by (metis append_Nil dB_single_step empty_set image_empty) |
1156 |
1175 |
1157 |
|
1158 |
|
1159 |
|
1160 |
|
1161 |
|
1162 lemma bsimp_rewrite: |
1176 lemma bsimp_rewrite: |
1163 shows "r \<leadsto>* bsimp r" |
1177 shows "r \<leadsto>* bsimp r" |
1164 apply(induction r rule: bsimp.induct) |
1178 proof (induction r rule: bsimp.induct) |
1165 apply simp |
1179 case (1 bs1 r1 r2) |
1166 apply(case_tac "bsimp r1 = AZERO") |
1180 then show "ASEQ bs1 r1 r2 \<leadsto>* bsimp (ASEQ bs1 r1 r2)" |
|
1181 apply(simp) |
|
1182 apply(case_tac "bsimp r1 = AZERO") |
1167 apply simp |
1183 apply simp |
1168 using continuous_rewrite apply blast |
1184 using continuous_rewrite apply blast |
1169 apply(case_tac "\<exists>bs. bsimp r1 = AONE bs") |
1185 apply(case_tac "\<exists>bs. bsimp r1 = AONE bs") |
1170 apply(erule exE) |
1186 apply(erule exE) |
1171 apply simp |
1187 apply simp |
1172 apply(subst bsimp_ASEQ2) |
1188 apply(subst bsimp_ASEQ2) |
1173 apply (meson real_trans rrewrite.intros(3) rrewrites.intros(2) star_seq star_seq2) |
1189 apply (meson real_trans rrewrite.intros(3) rrewrites.intros(2) star_seq star_seq2) |
1174 apply (smt (verit, best) bsimp_ASEQ0 bsimp_ASEQ1 real_trans rrewrite.intros(2) rs2 star_seq star_seq2) |
1190 apply (smt (verit, best) bsimp_ASEQ0 bsimp_ASEQ1 real_trans rrewrite.intros(2) rs2 star_seq star_seq2) |
1175 defer |
1191 done |
1176 using bsimp_aalts_simpcases(2) apply blast |
1192 next |
1177 apply simp |
1193 case (2 bs1 rs) |
1178 apply simp |
1194 then show "AALTs bs1 rs \<leadsto>* bsimp (AALTs bs1 rs)" |
1179 apply simp |
1195 by (metis alts_dBrewrites alts_simpalts bsimp.simps(2) bsimp_AALTsrewrites fltsrewrites real_trans) |
1180 |
1196 next |
1181 apply auto |
1197 case "3_1" |
1182 |
1198 then show "AZERO \<leadsto>* bsimp AZERO" |
1183 |
1199 by simp |
1184 apply(subgoal_tac "AALTs bs1 rs \<leadsto>* AALTs bs1 (map bsimp rs)") |
1200 next |
1185 apply(subgoal_tac "AALTs bs1 (map bsimp rs) \<leadsto>* AALTs bs1 (flts (map bsimp rs))") |
1201 case ("3_2" v) |
1186 apply(subgoal_tac "AALTs bs1 (flts (map bsimp rs)) \<leadsto>* AALTs bs1 (distinctBy (flts (map bsimp rs)) erase {})") |
1202 then show "AONE v \<leadsto>* bsimp (AONE v)" |
1187 apply(subgoal_tac "AALTs bs1 (distinctBy (flts (map bsimp rs)) erase {}) \<leadsto>* bsimp_AALTs bs1 (distinctBy (flts (map bsimp rs)) erase {} )") |
1203 by simp |
1188 |
1204 next |
1189 |
1205 case ("3_3" v va) |
1190 apply (meson real_trans) |
1206 then show "ACHAR v va \<leadsto>* bsimp (ACHAR v va)" |
1191 |
1207 by simp |
1192 apply (meson bsimp_AALTsrewrites) |
1208 next |
1193 |
1209 case ("3_4" v va) |
1194 apply (meson alts_dBrewrites) |
1210 then show "ASTAR v va \<leadsto>* bsimp (ASTAR v va)" |
1195 |
1211 by simp |
1196 using fltsrewrites apply auto[1] |
1212 qed |
1197 |
|
1198 using alts_simpalts by force |
|
1199 |
|
1200 |
|
1201 lemma rewrite_non_nullable: "\<lbrakk>r1 \<leadsto> r2; \<not>bnullable r1 \<rbrakk> \<Longrightarrow> \<not>bnullable r2" |
|
1202 apply(induction r1 r2 rule: rrewrite.induct) |
|
1203 apply auto |
|
1204 apply (metis bnullable_correctness erase_fuse)+ |
|
1205 done |
|
1206 |
1213 |
1207 lemma rewrite_non_nullable_strong: |
1214 lemma rewrite_non_nullable_strong: |
1208 assumes "r1 \<leadsto> r2" |
1215 assumes "r1 \<leadsto> r2" |
1209 shows "bnullable r1 = bnullable r2" |
1216 shows "bnullable r1 = bnullable r2" |
1210 using assms |
1217 using assms |
1227 using assms |
1234 using assms |
1228 apply(induction r1 r2 rule: rrewrites.induct) |
1235 apply(induction r1 r2 rule: rrewrites.induct) |
1229 apply simp |
1236 apply simp |
1230 using rewrite_non_nullable_strong by blast |
1237 using rewrite_non_nullable_strong by blast |
1231 |
1238 |
1232 lemma nonbnullable_lists_concat: " \<lbrakk> \<not> (\<exists>r0\<in>set rs1. bnullable r0); \<not> bnullable r; \<not> (\<exists>r0\<in>set rs2. bnullable r0)\<rbrakk> \<Longrightarrow> |
1239 |
1233 \<not>(\<exists>r0 \<in> (set (rs1@[r]@rs2)). bnullable r0 ) " |
1240 lemma bnullable_segment: |
1234 apply simp |
1241 "bnullable (AALTs bs (rs1@[r]@rs2)) \<Longrightarrow> bnullable (AALTs bs rs1) \<or> bnullable (AALTs bs rs2) \<or> bnullable r" |
1235 apply blast |
1242 by auto |
1236 done |
|
1237 |
|
1238 |
|
1239 |
|
1240 lemma nomember_bnullable: "\<lbrakk> \<not> (\<exists>r0\<in>set rs1. bnullable r0); \<not> bnullable r; \<not> (\<exists>r0\<in>set rs2. bnullable r0)\<rbrakk> |
|
1241 \<Longrightarrow> \<not>bnullable (AALTs bs (rs1 @ [r] @ rs2))" |
|
1242 using bnullable.simps(4) nonbnullable_lists_concat by presburger |
|
1243 |
|
1244 lemma bnullable_segment: " bnullable (AALTs bs (rs1@[r]@rs2)) \<Longrightarrow> bnullable (AALTs bs rs1) \<or> bnullable (AALTs bs rs2) \<or> bnullable r" |
|
1245 apply(case_tac "\<exists>r0\<in>set rs1. bnullable r0") |
|
1246 using r2 apply blast |
|
1247 apply(case_tac "bnullable r") |
|
1248 |
|
1249 apply blast |
|
1250 apply(case_tac "\<exists>r0\<in>set rs2. bnullable r0") |
|
1251 |
|
1252 using bnullable.simps(4) apply presburger |
|
1253 apply(subgoal_tac "False") |
|
1254 |
|
1255 apply blast |
|
1256 |
|
1257 using nomember_bnullable by blast |
|
1258 |
|
1259 |
|
1260 |
1243 |
1261 lemma bnullablewhichbmkeps: "\<lbrakk>bnullable (AALTs bs (rs1@[r]@rs2)); \<not> bnullable (AALTs bs rs1); bnullable r \<rbrakk> |
1244 lemma bnullablewhichbmkeps: "\<lbrakk>bnullable (AALTs bs (rs1@[r]@rs2)); \<not> bnullable (AALTs bs rs1); bnullable r \<rbrakk> |
1262 \<Longrightarrow> bmkeps (AALTs bs (rs1@[r]@rs2)) = bs @ (bmkeps r)" |
1245 \<Longrightarrow> bmkeps (AALTs bs (rs1@[r]@rs2)) = bs @ (bmkeps r)" |
|
1246 |
1263 using qq2 bnullable_Hdbmkeps_Hd by force |
1247 using qq2 bnullable_Hdbmkeps_Hd by force |
1264 |
|
1265 |
|
1266 |
1248 |
1267 lemma spillbmkepslistr: "bnullable (AALTs bs1 rs1) |
1249 lemma spillbmkepslistr: "bnullable (AALTs bs1 rs1) |
1268 \<Longrightarrow> bmkeps (AALTs bs (AALTs bs1 rs1 # rsb)) = bmkeps (AALTs bs ( map (fuse bs1) rs1 @ rsb))" |
1250 \<Longrightarrow> bmkeps (AALTs bs (AALTs bs1 rs1 # rsb)) = bmkeps (AALTs bs ( map (fuse bs1) rs1 @ rsb))" |
1269 apply(subst bnullable_Hdbmkeps_Hd) |
1251 apply(subst bnullable_Hdbmkeps_Hd) |
1270 |
1252 |
1271 apply simp |
1253 apply simp |
1272 by (metis bmkeps.simps(3) k0a list.set_intros(1) qq1 qq4 qs3) |
1254 by (metis bmkeps.simps(3) k0a list.set_intros(1) qq1 qq4 qs3) |
1273 |
1255 |
1274 lemma third_segment_bnullable: "\<lbrakk>bnullable (AALTs bs (rs1@rs2@rs3)); \<not>bnullable (AALTs bs rs1); \<not>bnullable (AALTs bs rs2)\<rbrakk> \<Longrightarrow> |
1256 lemma third_segment_bnullable: |
1275 bnullable (AALTs bs rs3)" |
1257 "\<lbrakk>bnullable (AALTs bs (rs1@rs2@rs3)); \<not>bnullable (AALTs bs rs1); \<not>bnullable (AALTs bs rs2)\<rbrakk> \<Longrightarrow> |
|
1258 bnullable (AALTs bs rs3)" |
|
1259 apply(auto) |
|
1260 done |
|
1261 |
|
1262 lemma third_segment_bmkeps: |
|
1263 "\<lbrakk>bnullable (AALTs bs (rs1@rs2@rs3)); \<not>bnullable (AALTs bs rs1); \<not>bnullable (AALTs bs rs2)\<rbrakk> \<Longrightarrow> |
|
1264 bmkeps (AALTs bs (rs1@rs2@rs3) ) = bmkeps (AALTs bs rs3)" |
|
1265 by (metis bnullable.simps(1) bnullable.simps(4) bsimp_AALTs.simps(1) bsimp_AALTsrewrites qq2 rewritesnullable self_append_conv third_segment_bnullable) |
|
1266 |
|
1267 lemma rewrite_bmkepsalt: |
|
1268 "\<lbrakk>bnullable (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)); bnullable (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))\<rbrakk> |
|
1269 \<Longrightarrow> bmkeps (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)) = bmkeps (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))" |
|
1270 apply(rule qq3) |
|
1271 apply(simp) |
|
1272 apply(simp) |
|
1273 apply(case_tac "bnullable (AALTs bs1 rs1)") |
|
1274 using spillbmkepslistr apply blast |
|
1275 apply(subst qq2) |
|
1276 apply(auto simp add: bnullable_fuse r1) |
|
1277 done |
|
1278 |
|
1279 lemma rewrite_bmkeps_aux: |
|
1280 assumes "r1 \<leadsto> r2" "bnullable r1" "bnullable r2" |
|
1281 shows "bmkeps r1 = bmkeps r2" |
|
1282 using assms |
|
1283 proof (induction r1 r2 rule: rrewrite.induct) |
|
1284 case (1 bs r2) |
|
1285 then show ?case by simp |
|
1286 next |
|
1287 case (2 bs r1) |
|
1288 then show ?case by simp |
|
1289 next |
|
1290 case (3 bs bs1 r) |
|
1291 then show ?case by (simp add: b2) |
|
1292 next |
|
1293 case (4 r1 r2 bs r3) |
|
1294 then show ?case by simp |
|
1295 next |
|
1296 case (5 r3 r4 bs r1) |
|
1297 then show ?case by simp |
|
1298 next |
|
1299 case (6 r r' bs rs1 rs2) |
|
1300 then show ?case |
|
1301 by (metis append_Cons append_Nil bnullable.simps(4) bnullable_segment bnullablewhichbmkeps qq3 r1 rewrite_non_nullable_strong) |
|
1302 next |
|
1303 case (7 bs rsa rsb) |
|
1304 then show ?case |
|
1305 by (metis bnullable.simps(1) bnullable.simps(4) bnullable_segment qq1 qq2 rewrite_nullable rrewrite.intros(10) rrewrite0away third_segment_bmkeps) |
|
1306 next |
|
1307 case (8 bs rsa bs1 rs1 rsb) |
|
1308 then show ?case |
|
1309 by (simp add: rewrite_bmkepsalt) |
|
1310 next |
|
1311 case (9 bs bs1 rs) |
|
1312 then show ?case |
|
1313 by (simp add: q3a) |
|
1314 next |
|
1315 case (10 bs) |
|
1316 then show ?case |
|
1317 by fastforce |
|
1318 next |
|
1319 case (11 bs r) |
|
1320 then show ?case |
|
1321 by (simp add: b2) |
|
1322 next |
|
1323 case (12 a1 a2 bs rsa rsb rsc) |
|
1324 then show ?case |
|
1325 by (smt (verit, ccfv_threshold) append_Cons append_eq_appendI append_self_conv2 bnullable_correctness list.set_intros(1) qq3 r1) |
|
1326 qed |
|
1327 |
|
1328 |
|
1329 lemma rewrite_bmkeps: |
|
1330 assumes "r1 \<leadsto> r2" "bnullable r1" |
|
1331 shows "bmkeps r1 = bmkeps r2" |
|
1332 using assms(1) assms(2) rewrite_bmkeps_aux rewrite_nullable by blast |
1276 |
1333 |
1277 by (metis append.left_neutral append_Cons bnullable.simps(1) bnullable_segment rrewrite.intros(7) rewrite_non_nullable) |
|
1278 |
|
1279 |
|
1280 lemma third_segment_bmkeps: "\<lbrakk>bnullable (AALTs bs (rs1@rs2@rs3)); \<not>bnullable (AALTs bs rs1); \<not>bnullable (AALTs bs rs2)\<rbrakk> \<Longrightarrow> |
|
1281 bmkeps (AALTs bs (rs1@rs2@rs3) ) = bmkeps (AALTs bs rs3)" |
|
1282 apply(subgoal_tac "bnullable (AALTs bs rs3)") |
|
1283 apply(subgoal_tac "\<forall>r \<in> set (rs1@rs2). \<not>bnullable r") |
|
1284 apply(subgoal_tac "bmkeps (AALTs bs (rs1@rs2@rs3)) = bmkeps (AALTs bs ((rs1@rs2)@rs3) )") |
|
1285 apply (metis bnullable.simps(4) qq2) |
|
1286 |
|
1287 apply (metis append.assoc) |
|
1288 |
|
1289 apply (metis append.assoc in_set_conv_decomp r2 third_segment_bnullable) |
|
1290 |
|
1291 using third_segment_bnullable by blast |
|
1292 |
|
1293 |
|
1294 lemma rewrite_bmkepsalt: " \<lbrakk>bnullable (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)); bnullable (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))\<rbrakk> |
|
1295 \<Longrightarrow> bmkeps (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)) = bmkeps (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))" |
|
1296 apply(case_tac "bnullable (AALTs bs rsa)") |
|
1297 |
|
1298 using qq1 apply force |
|
1299 apply(case_tac "bnullable (AALTs bs1 rs1)") |
|
1300 apply(subst qq2) |
|
1301 |
|
1302 |
|
1303 using r2 apply blast |
|
1304 |
|
1305 apply (metis list.set_intros(1)) |
|
1306 apply (metis append_Nil bnullable.simps(1) rewrite_non_nullable_strong rrewrite.intros(10) spillbmkepslistr third_segment_bmkeps) |
|
1307 apply(subgoal_tac "bmkeps (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)) = bmkeps (AALTs bs rsb) ") |
|
1308 prefer 2 |
|
1309 |
|
1310 apply (metis append_Cons append_Nil bnullable.simps(1) bnullable_segment rewrite_nullable rrewrite.intros(10) third_segment_bmkeps) |
|
1311 by (metis bnullable.simps(4) rewrite_non_nullable_strong rrewrite.intros(9) third_segment_bmkeps) |
|
1312 |
|
1313 |
|
1314 |
|
1315 lemma rewrite_bmkeps: "\<lbrakk> r1 \<leadsto> r2; bnullable r1\<rbrakk> \<Longrightarrow> bmkeps r1 = bmkeps r2" |
|
1316 |
|
1317 apply(frule rewrite_nullable) |
|
1318 apply simp |
|
1319 apply(induction r1 r2 rule: rrewrite.induct) |
|
1320 apply simp |
|
1321 using bnullable.simps(1) bnullable.simps(5) apply blast |
|
1322 apply (simp add: b2) |
|
1323 apply simp |
|
1324 apply simp |
|
1325 apply(frule bnullable_segment) |
|
1326 apply(case_tac "bnullable (AALTs bs rs1)") |
|
1327 using qq1 apply force |
|
1328 apply(case_tac "bnullable r") |
|
1329 using bnullablewhichbmkeps rewrite_nullable apply presburger |
|
1330 apply(subgoal_tac "bnullable (AALTs bs rs2)") |
|
1331 apply(subgoal_tac "\<not> bnullable r'") |
|
1332 apply (simp add: qq2 r1) |
|
1333 |
|
1334 using rewrite_non_nullable apply blast |
|
1335 |
|
1336 apply blast |
|
1337 apply (simp add: flts_append qs3) |
|
1338 apply (simp add: rewrite_bmkepsalt) |
|
1339 using q3a apply force |
|
1340 |
|
1341 apply (simp add: q3a) |
|
1342 apply (simp add: b2) |
|
1343 apply(simp del: append.simps) |
|
1344 apply(case_tac "bnullable a1") |
|
1345 apply (metis append.assoc in_set_conv_decomp qq1) |
|
1346 apply(case_tac "\<exists>r \<in> set rsa. bnullable r") |
|
1347 using qq1 apply presburger |
|
1348 apply(case_tac "\<exists>r \<in> set rsb. bnullable r") |
|
1349 apply (metis UnCI append.assoc qq1 set_append) |
|
1350 apply(case_tac "bnullable a2") |
|
1351 apply (metis bnullable_correctness) |
|
1352 apply(subst qq2) |
|
1353 apply blast |
|
1354 apply(auto)[1] |
|
1355 apply(subst qq2) |
|
1356 apply (metis empty_iff list.set(1) set_ConsD) |
|
1357 apply(auto)[1] |
|
1358 apply(subst qq2) |
|
1359 apply(auto)[2] |
|
1360 apply(subst qq2) |
|
1361 apply(auto)[2] |
|
1362 apply(subst qq2) |
|
1363 apply(auto)[2] |
|
1364 apply(subst qq2) |
|
1365 apply(auto)[2] |
|
1366 apply(subst qq2) |
|
1367 apply(auto)[2] |
|
1368 apply(simp) |
|
1369 done |
|
1370 |
1334 |
1371 lemma rewrites_bmkeps: |
1335 lemma rewrites_bmkeps: |
1372 assumes "r1 \<leadsto>* r2" "bnullable r1" |
1336 assumes "r1 \<leadsto>* r2" "bnullable r1" |
1373 shows "bmkeps r1 = bmkeps r2" |
1337 shows "bmkeps r1 = bmkeps r2" |
1374 using assms |
1338 using assms |
1387 qed |
1351 qed |
1388 |
1352 |
1389 lemma alts_rewrite_front: "r \<leadsto> r' \<Longrightarrow> AALTs bs (r # rs) \<leadsto> AALTs bs (r' # rs)" |
1353 lemma alts_rewrite_front: "r \<leadsto> r' \<Longrightarrow> AALTs bs (r # rs) \<leadsto> AALTs bs (r' # rs)" |
1390 by (metis append_Cons append_Nil rrewrite.intros(6)) |
1354 by (metis append_Cons append_Nil rrewrite.intros(6)) |
1391 |
1355 |
1392 lemma alt_rewrite_front: "r \<leadsto> r' \<Longrightarrow> AALT bs r r2 \<leadsto> AALT bs r' r2" |
|
1393 using alts_rewrite_front by blast |
|
1394 |
|
1395 lemma to_zero_in_alt: " AALT bs (ASEQ [] AZERO r) r2 \<leadsto> AALT bs AZERO r2" |
1356 lemma to_zero_in_alt: " AALT bs (ASEQ [] AZERO r) r2 \<leadsto> AALT bs AZERO r2" |
1396 by (simp add: alts_rewrite_front rrewrite.intros(1)) |
1357 by (simp add: alts_rewrite_front rrewrite.intros(1)) |
1397 |
1358 |
1398 lemma alt_remove0_front: " AALT bs AZERO r \<leadsto> AALTs bs [r]" |
1359 lemma rewrite_fuse: |
1399 by (simp add: rrewrite0away) |
1360 assumes "r2 \<leadsto> r3" |
1400 |
1361 shows "fuse bs r2 \<leadsto>* fuse bs r3" |
1401 lemma alt_rewrites_back: "r2 \<leadsto>* r2' \<Longrightarrow>AALT bs r1 r2 \<leadsto>* AALT bs r1 r2'" |
1362 using assms |
1402 apply(induction r2 r2' arbitrary: bs rule: rrewrites.induct) |
1363 proof(induction r2 r3 arbitrary: bs rule: rrewrite.induct) |
1403 apply simp |
1364 case (1 bs r2) |
1404 by (meson rs1 rs2 srewrites_alt1 ss1 ss2) |
1365 then show ?case |
1405 |
1366 by (simp add: continuous_rewrite) |
1406 lemma rewrite_fuse: " r2 \<leadsto> r3 \<Longrightarrow> fuse bs r2 \<leadsto>* fuse bs r3" |
1367 next |
1407 apply(induction r2 r3 arbitrary: bs rule: rrewrite.induct) |
1368 case (2 bs r1) |
1408 apply auto |
1369 then show ?case |
1409 |
1370 using rrewrite.intros(2) by force |
1410 apply (simp add: continuous_rewrite) |
1371 next |
1411 |
1372 case (3 bs bs1 r) |
1412 apply (simp add: r_in_rstar rrewrite.intros(2)) |
1373 then show ?case |
1413 |
1374 by (metis fuse.simps(5) fuse_append r_in_rstar rrewrite.intros(3)) |
1414 apply (metis fuse_append r_in_rstar rrewrite.intros(3)) |
1375 next |
1415 |
1376 case (4 r1 r2 bs r3) |
1416 using r_in_rstar star_seq apply blast |
1377 then show ?case |
1417 |
1378 by (simp add: r_in_rstar star_seq) |
1418 using r_in_rstar star_seq2 apply blast |
1379 next |
1419 |
1380 case (5 r3 r4 bs r1) |
1420 using contextrewrites2 r_in_rstar apply auto[1] |
1381 then show ?case |
1421 |
1382 using fuse.simps(5) r_in_rstar star_seq2 by auto |
1422 using rrewrite.intros(8) apply auto[1] |
1383 next |
1423 using rrewrite.intros(7) apply auto[1] |
1384 case (6 r r' bs rs1 rs2) |
1424 using rrewrite.intros(8) apply force |
1385 then show ?case |
1425 apply (metis append_assoc r_in_rstar rrewrite.intros(9)) |
1386 using contextrewrites2 r_in_rstar by force |
1426 apply (simp add: r_in_rstar rrewrite.intros(10)) |
1387 next |
1427 apply (metis fuse_append r_in_rstar rrewrite.intros(11)) |
1388 case (7 bs rsa rsb) |
1428 using rrewrite.intros(12) by auto |
1389 then show ?case |
1429 |
1390 using rrewrite.intros(7) by force |
|
1391 next |
|
1392 case (8 bs rsa bs1 rs1 rsb) |
|
1393 then show ?case |
|
1394 using rrewrite.intros(8) by force |
|
1395 next |
|
1396 case (9 bs bs1 rs) |
|
1397 then show ?case |
|
1398 by (metis append.assoc fuse.simps(4) r_in_rstar rrewrite.intros(9)) |
|
1399 next |
|
1400 case (10 bs) |
|
1401 then show ?case |
|
1402 by (simp add: r_in_rstar rrewrite.intros(10)) |
|
1403 next |
|
1404 case (11 bs r) |
|
1405 then show ?case |
|
1406 by (metis fuse.simps(4) fuse_append r_in_rstar rrewrite.intros(11)) |
|
1407 next |
|
1408 case (12 a1 a2 bs rsa rsb rsc) |
|
1409 then show ?case |
|
1410 using fuse.simps(4) r_in_rstar rrewrite.intros(12) by auto |
|
1411 qed |
1430 |
1412 |
1431 lemma rewrites_fuse: |
1413 lemma rewrites_fuse: |
1432 assumes "r2 \<leadsto>* r2'" |
1414 assumes "r1 \<leadsto>* r2" |
1433 shows "fuse bs1 r2 \<leadsto>* fuse bs1 r2'" |
1415 shows "fuse bs r1 \<leadsto>* fuse bs r2" |
1434 using assms |
1416 using assms |
1435 apply(induction r2 r2' arbitrary: bs1 rule: rrewrites.induct) |
1417 apply(induction r1 r2 arbitrary: bs rule: rrewrites.induct) |
1436 apply(auto intro: rewrite_fuse real_trans) |
1418 apply(auto intro: rewrite_fuse real_trans) |
1437 done |
1419 done |
1438 |
1420 |
1439 lemma bder_fuse_list: |
1421 lemma bder_fuse_list: |
1440 shows "map (bder c \<circ> fuse bs1) rs1 = map (fuse bs1 \<circ> bder c) rs1" |
1422 shows "map (bder c \<circ> fuse bs1) rs1 = map (fuse bs1 \<circ> bder c) rs1" |
1441 apply(induction rs1) |
1423 apply(induction rs1) |
1442 apply(simp_all add: bder_fuse) |
1424 apply(simp_all add: bder_fuse) |
1443 done |
1425 done |
1444 |
1426 |
1445 |
1427 |
1446 lemma rewrite_der_altmiddle: "bder c (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)) \<leadsto>* bder c (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))" |
1428 lemma rewrite_der_altmiddle: |
|
1429 "bder c (AALTs bs (rsa @ AALTs bs1 rs1 # rsb)) \<leadsto>* bder c (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))" |
1447 apply simp |
1430 apply simp |
1448 apply(simp add: bder_fuse_list del: append.simps) |
1431 apply(simp add: bder_fuse_list del: append.simps) |
1449 by (metis append.assoc map_map r_in_rstar rrewrite.intros(8) threelistsappend) |
1432 by (metis append.assoc map_map r_in_rstar rrewrite.intros(8) threelistsappend) |
1450 |
1433 |
1451 lemma lock_step_der_removal: |
1434 lemma lock_step_der_removal: |
1454 bder c (AALTs bs (rsa @ [a1] @ rsb @ rsc))" |
1437 bder c (AALTs bs (rsa @ [a1] @ rsb @ rsc))" |
1455 apply(simp) |
1438 apply(simp) |
1456 |
1439 |
1457 using rrewrite.intros(12) by auto |
1440 using rrewrite.intros(12) by auto |
1458 |
1441 |
1459 lemma rewrite_after_der: "r1 \<leadsto> r2 \<Longrightarrow> (bder c r1) \<leadsto>* (bder c r2)" |
1442 lemma rewrite_after_der: |
1460 apply(induction r1 r2 arbitrary: c rule: rrewrite.induct) |
1443 assumes "r1 \<leadsto> r2" |
1461 |
1444 shows "(bder c r1) \<leadsto>* (bder c r2)" |
1462 apply (simp add: r_in_rstar rrewrite.intros(1)) |
1445 using assms |
1463 apply simp |
1446 proof(induction r1 r2 rule: rrewrite.induct) |
1464 |
1447 case (1 bs r2) |
1465 apply (meson contextrewrites1 r_in_rstar rrewrite.intros(10) rrewrite.intros(2) rrewrite0away rs2) |
1448 then show "bder c (ASEQ bs AZERO r2) \<leadsto>* bder c AZERO" |
1466 apply(simp) |
1449 by (simp add: continuous_rewrite) |
1467 apply(rule many_steps_later) |
1450 next |
1468 apply(rule to_zero_in_alt) |
1451 case (2 bs r1) |
1469 apply(rule many_steps_later) |
1452 then show "bder c (ASEQ bs r1 AZERO) \<leadsto>* bder c AZERO" |
1470 apply(rule alt_remove0_front) |
1453 apply(simp) |
1471 apply(rule many_steps_later) |
1454 by (meson contextrewrites1 r_in_rstar real_trans rrewrite.intros(10) rrewrite.intros(2) rrewrite0away) |
1472 apply(rule rrewrite.intros(11)) |
1455 next |
1473 using bder_fuse fuse_append rs1 apply presburger |
1456 case (3 bs bs1 r) |
1474 apply(case_tac "bnullable r1") |
1457 then show "bder c (ASEQ bs (AONE bs1) r) \<leadsto>* bder c (fuse (bs @ bs1) r)" |
1475 prefer 2 |
1458 apply(simp) |
1476 apply(subgoal_tac "\<not>bnullable r2") |
1459 by (metis bder_fuse fuse_append rrewrite.intros(11) rrewrite0away rrewrites.simps to_zero_in_alt) |
1477 prefer 2 |
1460 next |
1478 using rewrite_non_nullable apply presburger |
1461 case (4 r1 r2 bs r3) |
1479 apply simp+ |
1462 have as: "r1 \<leadsto> r2" by fact |
1480 |
1463 have IH: "bder c r1 \<leadsto>* bder c r2" by fact |
1481 using star_seq apply auto[1] |
1464 from as IH show "bder c (ASEQ bs r1 r3) \<leadsto>* bder c (ASEQ bs r2 r3)" |
1482 apply(subgoal_tac "bnullable r2") |
1465 by (simp add: contextrewrites1 rewrite_bmkeps rewrite_non_nullable_strong star_seq) |
1483 apply simp+ |
1466 next |
1484 apply(subgoal_tac "bmkeps r1 = bmkeps r2") |
1467 case (5 r3 r4 bs r1) |
1485 prefer 2 |
1468 have as: "r3 \<leadsto> r4" by fact |
1486 using rewrite_bmkeps apply auto[1] |
1469 have IH: "bder c r3 \<leadsto>* bder c r4" by fact |
1487 using contextrewrites1 star_seq apply auto[1] |
1470 from as IH show "bder c (ASEQ bs r1 r3) \<leadsto>* bder c (ASEQ bs r1 r4)" |
1488 using rewrite_nullable apply auto[1] |
1471 apply(simp) |
1489 apply(case_tac "bnullable r1") |
1472 using r_in_rstar rewrites_fuse srewrites_alt1 ss1 ss2 star_seq2 by presburger |
1490 apply simp |
1473 next |
1491 apply(subgoal_tac "ASEQ [] (bder c r1) r3 \<leadsto> ASEQ [] (bder c r1) r4") |
1474 case (6 r r' bs rs1 rs2) |
1492 prefer 2 |
1475 have as: "r \<leadsto> r'" by fact |
1493 using rrewrite.intros(5) apply blast |
1476 have IH: "bder c r \<leadsto>* bder c r'" by fact |
1494 apply(rule many_steps_later) |
1477 from as IH show "bder c (AALTs bs (rs1 @ [r] @ rs2)) \<leadsto>* bder c (AALTs bs (rs1 @ [r'] @ rs2))" |
1495 apply(rule alt_rewrite_front) |
1478 apply(simp) |
1496 apply assumption |
1479 using contextrewrites2 by force |
1497 apply (meson alt_rewrites_back rewrites_fuse) |
1480 next |
1498 |
1481 case (7 bs rsa rsb) |
1499 apply (simp add: r_in_rstar rrewrite.intros(5)) |
1482 then show "bder c (AALTs bs (rsa @ [AZERO] @ rsb)) \<leadsto>* bder c (AALTs bs (rsa @ rsb))" |
1500 |
1483 apply(simp) |
1501 using contextrewrites2 apply force |
1484 using rrewrite.intros(7) by auto |
1502 |
1485 next |
1503 using rrewrite.intros(7) apply force |
1486 case (8 bs rsa bs1 rs1 rsb) |
1504 |
1487 then show |
1505 using rewrite_der_altmiddle apply auto[1] |
1488 "bder c (AALTs bs (rsa @ [AALTs bs1 rs1] @ rsb)) \<leadsto>* bder c (AALTs bs (rsa @ map (fuse bs1) rs1 @ rsb))" |
1506 |
1489 using rewrite_der_altmiddle by auto |
1507 apply (metis bder.simps(4) bder_fuse_list map_map r_in_rstar rrewrite.intros(9)) |
1490 next |
1508 apply (simp add: r_in_rstar rrewrite.intros(10)) |
1491 case (9 bs bs1 rs) |
1509 |
1492 then show "bder c (AALTs (bs @ bs1) rs) \<leadsto>* bder c (AALTs bs (map (fuse bs1) rs))" |
1510 apply (simp add: r_in_rstar rrewrite.intros(10)) |
1493 by (metis bder.simps(4) bder_fuse_list list.map_comp r_in_rstar rrewrite.intros(9)) |
1511 using bder_fuse r_in_rstar rrewrite.intros(11) apply presburger |
1494 next |
1512 |
1495 case (10 bs) |
1513 |
1496 then show "bder c (AALTs bs []) \<leadsto>* bder c AZERO" |
1514 using lock_step_der_removal by auto |
1497 by (simp add: r_in_rstar rrewrite.intros(10)) |
1515 |
1498 next |
|
1499 case (11 bs r) |
|
1500 then show "bder c (AALTs bs [r]) \<leadsto>* bder c (fuse bs r)" |
|
1501 by (simp add: bder_fuse r_in_rstar rrewrite.intros(11)) |
|
1502 next |
|
1503 case (12 a1 a2 bs rsa rsb rsc) |
|
1504 have as: "erase a1 = erase a2" by fact |
|
1505 then show "bder c (AALTs bs (rsa @ [a1] @ rsb @ [a2] @ rsc)) \<leadsto>* bder c (AALTs bs (rsa @ [a1] @ rsb @ rsc))" |
|
1506 using lock_step_der_removal by force |
|
1507 qed |
1516 |
1508 |
1517 |
1509 |
1518 lemma rewrites_after_der: |
1510 lemma rewrites_after_der: |
1519 assumes "r1 \<leadsto>* r2" |
1511 assumes "r1 \<leadsto>* r2" |
1520 shows "bder c r1 \<leadsto>* bder c r2" |
1512 shows "bder c r1 \<leadsto>* bder c r2" |
1521 using assms |
1513 using assms |
1522 apply(induction r1 r2 rule: rrewrites.induct) |
1514 apply(induction r1 r2 rule: rrewrites.induct) |
1523 apply(simp_all add: rewrite_after_der real_trans) |
1515 apply(simp_all add: rewrite_after_der real_trans) |
1524 done |
1516 done |
|
1517 |
1525 |
1518 |
1526 lemma central: |
1519 lemma central: |
1527 shows "bders r s \<leadsto>* bders_simp r s" |
1520 shows "bders r s \<leadsto>* bders_simp r s" |
1528 proof(induct s arbitrary: r rule: rev_induct) |
1521 proof(induct s arbitrary: r rule: rev_induct) |
1529 case Nil |
1522 case Nil |
1538 by (simp add: bsimp_rewrite) |
1531 by (simp add: bsimp_rewrite) |
1539 finally show "bders r (xs @ [x]) \<leadsto>* bders_simp r (xs @ [x])" |
1532 finally show "bders r (xs @ [x]) \<leadsto>* bders_simp r (xs @ [x])" |
1540 by (simp add: bders_simp_append) |
1533 by (simp add: bders_simp_append) |
1541 qed |
1534 qed |
1542 |
1535 |
1543 |
|
1544 lemma quasi_main: |
1536 lemma quasi_main: |
1545 assumes "bnullable (bders r s)" |
1537 assumes "bnullable (bders r s)" |
1546 shows "bmkeps (bders r s) = bmkeps (bders_simp r s)" |
1538 shows "bmkeps (bders r s) = bmkeps (bders_simp r s)" |
1547 using assms central rewrites_bmkeps by blast |
1539 using assms central rewrites_bmkeps |
|
1540 proof - |
|
1541 have "bders r s \<leadsto>* bders_simp r s" by (rule central) |
|
1542 then |
|
1543 show "bmkeps (bders r s) = bmkeps (bders_simp r s)" using assms |
|
1544 by (rule rewrites_bmkeps) |
|
1545 qed |
|
1546 |
1548 |
1547 |
1549 theorem main_main: |
1548 theorem main_main: |
1550 shows "blexer r s = blexer_simp r s" |
1549 shows "blexer r s = blexer_simp r s" |
1551 by (simp add: b4 blexer_def blexer_simp_def quasi_main) |
1550 unfolding blexer_def blexer_simp_def |
|
1551 using b4 quasi_main by simp |
1552 |
1552 |
1553 |
1553 |
1554 theorem blexersimp_correctness: |
1554 theorem blexersimp_correctness: |
1555 shows "lexer r s = blexer_simp r s" |
1555 shows "lexer r s = blexer_simp r s" |
1556 using blexer_correctness main_main by auto |
1556 using blexer_correctness main_main by simp |
1557 |
1557 |
1558 |
1558 |
1559 |
1559 |
1560 export_code blexer_simp blexer lexer bders bders_simp in Scala module_name VerifiedLexers |
1560 export_code blexer_simp blexer lexer bders bders_simp in Scala module_name VerifiedLexers |
1561 |
1561 |