diff -r aecf1ddf3541 -r c27f04bb2262 thys3/BasicIdentities.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thys3/BasicIdentities.thy Wed Jun 29 12:38:05 2022 +0100 @@ -0,0 +1,630 @@ +theory BasicIdentities + imports "RfltsRdistinctProps" +begin + + + +lemma rder_rsimp_ALTs_commute: + shows " (rder x (rsimp_ALTs rs)) = rsimp_ALTs (map (rder x) rs)" + apply(induct rs) + apply simp + apply(case_tac rs) + apply simp + apply auto + done + + + +lemma rsimp_aalts_smaller: + shows "rsize (rsimp_ALTs rs) \ rsize (RALTS rs)" + apply(induct rs) + apply simp + apply simp + apply(case_tac "rs = []") + apply simp + apply(subgoal_tac "\rsp ap. rs = ap # rsp") + apply(erule exE)+ + apply simp + apply simp + by(meson neq_Nil_conv) + + + + + +lemma rSEQ_mono: + shows "rsize (rsimp_SEQ r1 r2) \rsize (RSEQ r1 r2)" + apply auto + apply(induct r1) + apply auto + apply(case_tac "r2") + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + done + +lemma ralts_cap_mono: + shows "rsize (RALTS rs) \ Suc (rsizes rs)" + by simp + + + + +lemma rflts_mono: + shows "rsizes (rflts rs) \ rsizes rs" + apply(induct rs) + apply simp + apply(case_tac "a = RZERO") + apply simp + apply(case_tac "\rs1. a = RALTS rs1") + apply(erule exE) + apply simp + apply(subgoal_tac "rflts (a # rs) = a # (rflts rs)") + prefer 2 + + using rflts_def_idiot apply blast + apply simp + done + +lemma rdistinct_smaller: + shows "rsizes (rdistinct rs ss) \ rsizes rs" + apply (induct rs arbitrary: ss) + apply simp + by (simp add: trans_le_add2) + + +lemma rsimp_alts_mono : + shows "\x. (\xa. xa \ set x \ rsize (rsimp xa) \ rsize xa) \ + rsize (rsimp_ALTs (rdistinct (rflts (map rsimp x)) {})) \ Suc (rsizes x)" + apply(subgoal_tac "rsize (rsimp_ALTs (rdistinct (rflts (map rsimp x)) {} )) + \ rsize (RALTS (rdistinct (rflts (map rsimp x)) {} ))") + prefer 2 + using rsimp_aalts_smaller apply auto[1] + apply(subgoal_tac "rsize (RALTS (rdistinct (rflts (map rsimp x)) {})) \Suc (rsizes (rdistinct (rflts (map rsimp x)) {}))") + prefer 2 + using ralts_cap_mono apply blast + apply(subgoal_tac "rsizes (rdistinct (rflts (map rsimp x)) {}) \ rsizes (rflts (map rsimp x))") + prefer 2 + using rdistinct_smaller apply presburger + apply(subgoal_tac "rsizes (rflts (map rsimp x)) \ rsizes (map rsimp x)") + prefer 2 + using rflts_mono apply blast + apply(subgoal_tac "rsizes (map rsimp x) \ rsizes x") + prefer 2 + + apply (simp add: sum_list_mono) + by linarith + + + + + +lemma rsimp_mono: + shows "rsize (rsimp r) \ rsize r" + apply(induct r) + apply simp_all + apply(subgoal_tac "rsize (rsimp_SEQ (rsimp r1) (rsimp r2)) \ rsize (RSEQ (rsimp r1) (rsimp r2))") + apply force + using rSEQ_mono + apply presburger + using rsimp_alts_mono by auto + +lemma idiot: + shows "rsimp_SEQ RONE r = r" + apply(case_tac r) + apply simp_all + done + + + + + +lemma idiot2: + shows " \r1 \ RZERO; r1 \ RONE;r2 \ RZERO\ + \ rsimp_SEQ r1 r2 = RSEQ r1 r2" + apply(case_tac r1) + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + apply(case_tac r2) + apply simp_all + done + +lemma rders__onechar: + shows " (rders_simp r [c]) = (rsimp (rders r [c]))" + by simp + +lemma rders_append: + "rders c (s1 @ s2) = rders (rders c s1) s2" + apply(induct s1 arbitrary: c s2) + apply(simp_all) + done + +lemma rders_simp_append: + "rders_simp c (s1 @ s2) = rders_simp (rders_simp c s1) s2" + apply(induct s1 arbitrary: c s2) + apply(simp_all) + done + + +lemma rders_simp_one_char: + shows "rders_simp r [c] = rsimp (rder c r)" + apply auto + done + + + + + +lemma k0a: + shows "rflts [RALTS rs] = rs" + apply(simp) + done + +lemma bbbbs: + assumes "good r" "r = RALTS rs" + shows "rsimp_ALTs (rflts [r]) = RALTS rs" + using assms + by (metis good.simps(4) good.simps(5) k0a rsimp_ALTs.elims) + +lemma bbbbs1: + shows "nonalt r \ (\ rs. r = RALTS rs)" + by (meson nonalt.elims(3)) + + + +lemma good0: + assumes "rs \ Nil" "\r \ set rs. nonalt r" "distinct rs" + shows "good (rsimp_ALTs rs) \ (\r \ set rs. good r)" + using assms + apply(induct rs rule: rsimp_ALTs.induct) + apply(auto) + done + +lemma flts1: + assumes "good r" + shows "rflts [r] \ []" + using assms + apply(induct r) + apply(simp_all) + using good.simps(4) by blast + +lemma flts2: + assumes "good r" + shows "\r' \ set (rflts [r]). good r' \ nonalt r'" + using assms + apply(induct r) + apply(simp) + apply(simp) + apply(simp) + prefer 2 + apply(simp) + apply(auto)[1] + + apply (metis flts1 good.simps(5) good.simps(6) k0a neq_Nil_conv) + apply (metis flts1 good.simps(5) good.simps(6) k0a neq_Nil_conv) + apply fastforce + apply(simp) + done + + + +lemma flts3: + assumes "\r \ set rs. good r \ r = RZERO" + shows "\r \ set (rflts rs). good r" + using assms + apply(induct rs rule: rflts.induct) + apply(simp_all) + by (metis UnE flts2 k0a) + + +lemma k0: + shows "rflts (r # rs1) = rflts [r] @ rflts rs1" + apply(induct r arbitrary: rs1) + apply(auto) + done + + +lemma good_SEQ: + assumes "r1 \ RZERO" "r2 \ RZERO" " r1 \ RONE" + shows "good (RSEQ r1 r2) = (good r1 \ good r2)" + using assms + apply(case_tac r1) + apply(simp_all) + apply(case_tac r2) + apply(simp_all) + apply(case_tac r2) + apply(simp_all) + apply(case_tac r2) + apply(simp_all) + apply(case_tac r2) + apply(simp_all) + done + +lemma rsize0: + shows "0 < rsize r" + apply(induct r) + apply(auto) + done + + + + + + + + + + + +lemma nn1qq: + assumes "nonnested (RALTS rs)" + shows "\ rs1. RALTS rs1 \ set rs" + using assms + apply(induct rs rule: rflts.induct) + apply(auto) + done + + + +lemma n0: + shows "nonnested (RALTS rs) \ (\r \ set rs. nonalt r)" + apply(induct rs ) + apply(auto) + apply (metis list.set_intros(1) nn1qq nonalt.elims(3)) + apply (metis nonalt.elims(2) nonnested.simps(3) nonnested.simps(4) nonnested.simps(5) nonnested.simps(6) nonnested.simps(7)) + using bbbbs1 apply fastforce + by (metis bbbbs1 list.set_intros(2) nn1qq) + + + + +lemma nn1c: + assumes "\r \ set rs. nonnested r" + shows "\r \ set (rflts rs). nonalt r" + using assms + apply(induct rs rule: rflts.induct) + apply(auto) + using n0 by blast + +lemma nn1bb: + assumes "\r \ set rs. nonalt r" + shows "nonnested (rsimp_ALTs rs)" + using assms + apply(induct rs rule: rsimp_ALTs.induct) + apply(auto) + using nonalt.simps(1) nonnested.elims(3) apply blast + using n0 by auto + +lemma bsimp_ASEQ0: + shows "rsimp_SEQ r1 RZERO = RZERO" + apply(induct r1) + apply(auto) + done + +lemma nn1b: + shows "nonnested (rsimp r)" + apply(induct r) + apply(simp_all) + apply(case_tac "rsimp r1 = RZERO") + apply(simp) + apply(case_tac "rsimp r2 = RZERO") + apply(simp) + apply(subst bsimp_ASEQ0) + apply(simp) + apply(case_tac "\bs. rsimp r1 = RONE") + apply(auto)[1] + using idiot apply fastforce + using idiot2 nonnested.simps(11) apply presburger + by (metis (mono_tags, lifting) Diff_empty image_iff list.set_map nn1bb nn1c rdistinct_set_equality1) + +lemma nonalt_flts_rd: + shows "\xa \ set (rdistinct (rflts (map rsimp rs)) {})\ + \ nonalt xa" + by (metis Diff_empty ex_map_conv nn1b nn1c rdistinct_set_equality1) + + + + +lemma bsimp_ASEQ2: + shows "rsimp_SEQ RONE r2 = r2" + apply(induct r2) + apply(auto) + done + +lemma elem_smaller_than_set: + shows "xa \ set list \ rsize xa < Suc (rsizes list)" + apply(induct list) + apply simp + by (metis image_eqI le_imp_less_Suc list.set_map member_le_sum_list) + +lemma rsimp_list_mono: + shows "rsizes (map rsimp rs) \ rsizes rs" + apply(induct rs) + apply simp+ + by (simp add: add_mono_thms_linordered_semiring(1) rsimp_mono) + + +(*says anything coming out of simp+flts+db will be good*) +lemma good2_obv_simplified: + shows " \\y. rsize y < Suc (rsizes rs) \ good (rsimp y) \ rsimp y = RZERO; + xa \ set (rdistinct (rflts (map rsimp rs)) {})\ \ good xa" + apply(subgoal_tac " \xa' \ set (map rsimp rs). good xa' \ xa' = RZERO") + prefer 2 + apply (simp add: elem_smaller_than_set) + by (metis Diff_empty flts3 rdistinct_set_equality1) + + + + +lemma good1: + shows "good (rsimp a) \ rsimp a = RZERO" + apply(induct a taking: rsize rule: measure_induct) + apply(case_tac x) + apply(simp) + apply(simp) + apply(simp) + prefer 3 + apply(simp) + prefer 2 + apply(simp only:) + apply simp + apply (smt (verit, ccfv_threshold) add_mono_thms_linordered_semiring(1) elem_smaller_than_set good0 good2_obv_simplified le_eq_less_or_eq nonalt_flts_rd order_less_trans plus_1_eq_Suc rdistinct_does_the_job rdistinct_smaller rflts_mono rsimp_ALTs.simps(1) rsimp_list_mono) + apply simp + apply(subgoal_tac "good (rsimp x41) \ rsimp x41 = RZERO") + apply(subgoal_tac "good (rsimp x42) \ rsimp x42 = RZERO") + apply(case_tac "rsimp x41 = RZERO") + apply simp + apply(case_tac "rsimp x42 = RZERO") + apply simp + using bsimp_ASEQ0 apply blast + apply(subgoal_tac "good (rsimp x41)") + apply(subgoal_tac "good (rsimp x42)") + apply simp + apply (metis bsimp_ASEQ2 good_SEQ idiot2) + apply blast + apply fastforce + using less_add_Suc2 apply blast + using less_iff_Suc_add by blast + +lemma RL_rnullable: + shows "rnullable r = ([] \ RL r)" + apply(induct r) + apply(auto simp add: Sequ_def) + done + +lemma RL_rder: + shows "RL (rder c r) = Der c (RL r)" + apply(induct r) + apply(auto simp add: Sequ_def Der_def) + apply (metis append_Cons) + using RL_rnullable apply blast + apply (metis append_eq_Cons_conv) + apply (metis append_Cons) + apply (metis RL_rnullable append_eq_Cons_conv) + apply (metis Star.step append_Cons) + using Star_decomp by auto + + + + +lemma RL_rsimp_RSEQ: + shows "RL (rsimp_SEQ r1 r2) = (RL r1 ;; RL r2)" + apply(induct r1 r2 rule: rsimp_SEQ.induct) + apply(simp_all) + done + + + +lemma RL_rsimp_RALTS: + shows "RL (rsimp_ALTs rs) = (\ (set (map RL rs)))" + apply(induct rs rule: rsimp_ALTs.induct) + apply(simp_all) + done + +lemma RL_rsimp_rdistinct: + shows "(\ (set (map RL (rdistinct rs {})))) = (\ (set (map RL rs)))" + apply(auto) + apply (metis Diff_iff rdistinct_set_equality1) + by (metis Diff_empty rdistinct_set_equality1) + +lemma RL_rsimp_rflts: + shows "(\ (set (map RL (rflts rs)))) = (\ (set (map RL rs)))" + apply(induct rs rule: rflts.induct) + apply(simp_all) + done + +lemma RL_rsimp: + shows "RL r = RL (rsimp r)" + apply(induct r rule: rsimp.induct) + apply(auto simp add: Sequ_def RL_rsimp_RSEQ) + using RL_rsimp_RALTS RL_rsimp_rdistinct RL_rsimp_rflts apply auto[1] + by (smt (verit, del_insts) RL_rsimp_RALTS RL_rsimp_rdistinct RL_rsimp_rflts UN_E image_iff list.set_map) + + + +lemma der_simp_nullability: + shows "rnullable r = rnullable (rsimp r)" + using RL_rnullable RL_rsimp by auto + + +lemma qqq1: + shows "RZERO \ set (rflts (map rsimp rs))" + by (metis ex_map_conv flts3 good.simps(1) good1) + + + + + +lemma flts_single1: + assumes "nonalt r" "nonazero r" + shows "rflts [r] = [r]" + using assms + apply(induct r) + apply(auto) + done + +lemma nonalt0_flts_keeps: + shows "(a \ RZERO) \ (\rs. a \ RALTS rs) \ rflts (a # xs) = a # rflts xs" + apply(case_tac a) + apply simp+ + done + + +lemma nonalt0_fltseq: + shows "\r \ set rs. r \ RZERO \ nonalt r \ rflts rs = rs" + apply(induct rs) + apply simp + apply(case_tac "a = RZERO") + apply fastforce + apply(case_tac "\rs1. a = RALTS rs1") + apply(erule exE) + apply simp+ + using nonalt0_flts_keeps by presburger + + + + +lemma goodalts_nonalt: + shows "good (RALTS rs) \ rflts rs = rs" + apply(induct x == "RALTS rs" arbitrary: rs rule: good.induct) + apply simp + + using good.simps(5) apply blast + apply simp + apply(case_tac "r1 = RZERO") + using good.simps(1) apply force + apply(case_tac "r2 = RZERO") + using good.simps(1) apply force + apply(subgoal_tac "rflts (r1 # r2 # rs) = r1 # r2 # rflts rs") + prefer 2 + apply (metis nonalt.simps(1) rflts_def_idiot) + apply(subgoal_tac "\r \ set rs. r \ RZERO \ nonalt r") + apply(subgoal_tac "rflts rs = rs") + apply presburger + using nonalt0_fltseq apply presburger + using good.simps(1) by blast + + + + + +lemma test: + assumes "good r" + shows "rsimp r = r" + + using assms + apply(induct rule: good.induct) + apply simp + apply simp + apply simp + apply simp + apply simp + apply(subgoal_tac "distinct (r1 # r2 # rs)") + prefer 2 + using good.simps(6) apply blast + apply(subgoal_tac "rflts (r1 # r2 # rs ) = r1 # r2 # rs") + prefer 2 + using goodalts_nonalt apply blast + + apply(subgoal_tac "r1 \ r2") + prefer 2 + apply (meson distinct_length_2_or_more) + apply(subgoal_tac "r1 \ set rs") + apply(subgoal_tac "r2 \ set rs") + apply(subgoal_tac "\r \ set rs. rsimp r = r") + apply(subgoal_tac "map rsimp rs = rs") + apply simp + apply(subgoal_tac "\r \ {r1, r2}. r \ set rs") + apply (metis distinct_not_exist rdistinct_on_distinct) + + apply blast + apply (meson map_idI) + apply (metis good.simps(6) insert_iff list.simps(15)) + + apply (meson distinct.simps(2)) + apply (simp add: distinct_length_2_or_more) + apply simp+ + done + + + +lemma rsimp_idem: + shows "rsimp (rsimp r) = rsimp r" + using test good1 + by force + +corollary rsimp_inner_idem4: + shows "rsimp r = RALTS rs \ rflts rs = rs" + by (metis good1 goodalts_nonalt rrexp.simps(12)) + + +corollary head_one_more_simp: + shows "map rsimp (r # rs) = map rsimp (( rsimp r) # rs)" + by (simp add: rsimp_idem) + + + + +lemma basic_regex_property1: + shows "rnullable r \ rsimp r \ RZERO" + apply(induct r rule: rsimp.induct) + apply(auto) + apply (metis idiot idiot2 rrexp.distinct(5)) + by (metis der_simp_nullability rnullable.simps(1) rnullable.simps(4) rsimp.simps(2)) + + + +lemma no_alt_short_list_after_simp: + shows "RALTS rs = rsimp r \ rsimp_ALTs rs = RALTS rs" + by (metis bbbbs good1 k0a rrexp.simps(12)) + + +lemma no_further_dB_after_simp: + shows "RALTS rs = rsimp r \ rdistinct rs {} = rs" + apply(subgoal_tac "good (RALTS rs)") + apply(subgoal_tac "distinct rs") + using rdistinct_on_distinct apply blast + apply (metis distinct.simps(1) distinct.simps(2) empty_iff good.simps(6) list.exhaust set_empty2) + using good1 by fastforce + + +lemma idem_after_simp1: + shows "rsimp_ALTs (rdistinct (rflts [rsimp aa]) {}) = rsimp aa" + apply(case_tac "rsimp aa") + apply simp+ + apply (metis no_alt_short_list_after_simp no_further_dB_after_simp) + by simp + + + + + +(*equalities with rsimp *) +lemma identity_wwo0: + shows "rsimp (rsimp_ALTs (RZERO # rs)) = rsimp (rsimp_ALTs rs)" + by (metis idem_after_simp1 list.exhaust list.simps(8) list.simps(9) rflts.simps(2) rsimp.simps(2) rsimp.simps(3) rsimp_ALTs.simps(1) rsimp_ALTs.simps(2) rsimp_ALTs.simps(3)) + + + + + + + +(*some basic facts about rsimp*) + +unused_thms + + +end \ No newline at end of file