diff -r feacb89b784c -r 4bf2367e6e53 thys2/ClosedForms.thy --- a/thys2/ClosedForms.thy Thu Apr 07 21:38:01 2022 +0100 +++ b/thys2/ClosedForms.thy Fri Apr 08 21:45:32 2022 +0100 @@ -1264,7 +1264,144 @@ apply(subgoal_tac "rnullable (rsimp r1)") apply simp using rsimp_idem apply presburger + using der_simp_nullability by presburger + +inductive + hrewrite:: "rrexp \ rrexp \ bool" ("_ \ _" [99, 99] 99) +where + "RSEQ RZERO r2 \ RZERO" +| "RSEQ r1 RZERO \ RZERO" +| "RSEQ RONE r \ r" +| "r1 \ r2 \ RSEQ r1 r3 \ RSEQ r2 r3" +| "r3 \ r4 \ RSEQ r1 r3 \ RSEQ r1 r4" +| "r \ r' \ (RALTS (rs1 @ [r] @ rs2)) \ (RALTS (rs1 @ [r'] @ rs2))" +(*context rule for eliminating 0, alts--corresponds to the recursive call flts r::rs = r::(flts rs)*) +| "RALTS (rsa @ [AZERO] @ rsb) \ RALTS (rsa @ rsb)" +| "RALTS (rsa @ [RALTS rs1] @ rsb) \ RALTS (rsa @ rs1 @ rsb)" +| "RALTS [] \ RZERO" +| "RALTS [r] \ r" +| "a1 = a2 \ RALTS (rsa@[a1]@rsb@[a2]@rsc) \ RALTS (rsa @ [a1] @ rsb @ rsc)" + +inductive + hrewrites:: "rrexp \ rrexp \ bool" ("_ \* _" [100, 100] 100) +where + rs1[intro, simp]:"r \* r" +| rs2[intro]: "\r1 \* r2; r2 \ r3\ \ r1 \* r3" + + +lemma hr_in_rstar : "r1 \ r2 \ r1 \* r2" + using hrewrites.intros(1) hrewrites.intros(2) by blast + +lemma hreal_trans[trans]: + assumes a1: "r1 \* r2" and a2: "r2 \* r3" + shows "r1 \* r3" + using a2 a1 + apply(induct r2 r3 arbitrary: r1 rule: hrewrites.induct) + apply(auto) + done + +lemma hmany_steps_later: "\r1 \ r2; r2 \* r3 \ \ r1 \* r3" + by (meson hr_in_rstar hreal_trans) + +lemma hrewrites_seq_context: + shows "r1 \* r2 \ RSEQ r1 r3 \* RSEQ r2 r3" + apply(induct r1 r2 rule: hrewrites.induct) + apply simp + using hrewrite.intros(4) by blast + +lemma hrewrites_seq_context2: + shows "r1 \* r2 \ RSEQ r0 r1 \* RSEQ r0 r2" + apply(induct r1 r2 rule: hrewrites.induct) + apply simp + using hrewrite.intros(5) by blast + +lemma hrewrites_seq_context0: + shows "r1 \* RZERO \ RSEQ r1 r3 \* RZERO" + apply(subgoal_tac "RSEQ r1 r3 \* RSEQ RZERO r3") + using hrewrite.intros(1) apply blast + by (simp add: hrewrites_seq_context) + +lemma hrewrites_seq_contexts: + shows "\r1 \* r2; r3 \* r4\ \ RSEQ r1 r3 \* RSEQ r2 r4" + by (meson hreal_trans hrewrites_seq_context hrewrites_seq_context2) + +lemma hrewrites_simpeq: + shows "r1 \* r2 \ rsimp r1 = rsimp r2" + sorry + +lemma distinct_grewrites_subgoal1: + shows " \rs1 rs2 rs3 a list. + \rs1 \g* [a]; RALTS rs1 \* a; [a] \g rs3; rs2 = [a]; list = []\ \ RALTS rs1 \* rsimp_ALTs rs3" + (* apply (smt (z3) append.left_neutral append.right_neutral append_Cons grewrite.simps grewrite_singleton hrewrite.intros(10) hrewrite.intros(9) hrewrites.simps list.inject r_finite1 rsimp_ALTs.elims rsimp_ALTs.simps(2) rsimp_alts_equal)*) + sorry + +lemma grewrite_ralts: + shows "rs \g rs' \ RALTS rs \* RALTS rs'" + by (smt (verit) grewrite_cases_middle hr_in_rstar hrewrite.intros(11) hrewrite.intros(7) hrewrite.intros(8)) + + + + +lemma grewrites_ralts: + shows "rs \g* rs' \ RALTS rs \* RALTS rs'" + apply(induct rs rs' rule: grewrites.induct) + apply simp + using grewrite_ralts hreal_trans by blast + + +lemma grewrites_ralts_rsimpalts: + shows "rs \g* rs' \ RALTS rs \* rsimp_ALTs rs' " + apply(induct rs rs' rule: grewrites.induct) + apply(case_tac rs) + using hrewrite.intros(9) apply force + apply(case_tac list) + apply simp + using hr_in_rstar hrewrite.intros(10) rsimp_ALTs.simps(2) apply presburger + apply simp + apply(case_tac rs2) + apply simp + apply (metis grewrite.intros(3) grewrite_singleton rsimp_ALTs.simps(1)) + apply(case_tac list) + apply(simp) + using distinct_grewrites_subgoal1 apply blast + apply simp + apply(case_tac rs3) + apply simp + using grewrites_ralts hrewrite.intros(9) apply blast + by (metis (no_types, opaque_lifting) grewrite_ralts hr_in_rstar hreal_trans hrewrite.intros(10) neq_Nil_conv rsimp_ALTs.simps(2) rsimp_ALTs.simps(3)) + +lemma hrewrites_list: + shows "\r \ set rs. r \* f r \ rs \g* map f rs" + sorry + + +lemma simp_hrewrites: + shows "r1 \* rsimp r1" + apply(induct r1) + apply simp+ + apply(case_tac "rsimp r11 = RONE") + apply simp + apply(subst basic_rsimp_SEQ_property1) + apply(subgoal_tac "RSEQ r11 r12 \* RSEQ RONE r12") + using hreal_trans hrewrite.intros(3) apply blast + using hrewrites_seq_context apply presburger + apply(case_tac "rsimp r11 = RZERO") + apply simp + using hrewrite.intros(1) hrewrites_seq_context apply blast + apply(case_tac "rsimp r12 = RZERO") + apply simp + apply(subst basic_rsimp_SEQ_property3) + apply (meson hrewrite.intros(2) hrewrites.simps hrewrites_seq_context2) + apply(subst basic_rsimp_SEQ_property2) + apply simp+ + using hrewrites_seq_contexts apply presburger + apply simp + apply(subgoal_tac "RALTS x \* RALTS (map rsimp x)") + apply(subgoal_tac "RALTS (map rsimp x) \* rsimp_ALTs (rdistinct (rflts (map rsimp x)) {}) ") + using hreal_trans apply blast + apply (meson flts_gstar greal_trans grewrites_ralts_rsimpalts gstar_rdistinct) +sledgehammer sorry @@ -1276,9 +1413,14 @@ apply simp using inside_simp_seq_nullable apply blast + apply simp + apply (smt (verit, del_insts) basic_rsimp_SEQ_property2 basic_rsimp_SEQ_property3 der_simp_nullability rder.simps(1) rder.simps(5) rnullable.simps(2) rsimp.simps(1) rsimp_SEQ.simps(1) rsimp_idem) + + sorry + lemma rders_simp_same_simpders: shows "s \ [] \ rders_simp r s = rsimp (rders r s)" apply(induct s rule: rev_induct) @@ -1394,17 +1536,121 @@ apply simp sorry +thm vsuf.simps + +lemma rsimp_seq_equal1: + shows "rsimp_SEQ (rsimp r1) (rsimp r2) = rsimp_ALTs (rdistinct (rflts [rsimp_SEQ (rsimp r1) (rsimp r2)]) {})" + by (metis idem_after_simp1 rsimp.simps(1)) + + + +lemma vsuf_der_stepwise: + shows "rsimp (RALTS (RSEQ (rders_simp r1 (xs @ [x])) r2 # map (rders_simp r2) (vsuf (xs @ [x]) r1))) = +rsimp (rder x (rsimp (RALTS (RSEQ (rders_simp r1 xs) r2 # map (rders_simp r2) (vsuf xs r1)))))" + apply simp + apply(subst rders_simp_append) + + oops + +fun sflat :: "rrexp \ rrexp list " where + "sflat (RALT r1 r2) = sflat r1 @ [r2]" +| "sflat (RALTS rs) = rs" +| "sflat r = [r]" + +lemma seq_sflat0: + shows "sflat (rders (RSEQ r1 r2) s) = sflat (RALTS ( (RSEQ (rders r1 s) r2) # + (map (rders r2) (vsuf s r1))) )" + + sorry + +lemma seq_sflat1: + shows "sflat ( RALTS ( (RSEQ (rders r1 (s @ [c])) r2) # + (map (rders r2) (vsuf (s @ [c]) r1)) + ) ) = sflat (rders (RSEQ r1 r2) (s @ [c]))" + sorry + + +lemma seq_sflat: + shows "sflat ( RALTS ( (RSEQ (rders r1 (s @ [c])) r2) # + (map (rders r2) (vsuf (s @ [c]) r1)) + ) ) = sflat ( rder x (RALTS ( (RSEQ (rders r1 s) r2) # + (map (rders r2) (vsuf s r1)) + )) )" + sorry + + + +lemma sflat_rsimpeq: + shows "sflat r1 = sflat r2 \ rsimp r1 = rsimp r2" + sorry + + + +lemma seq_closed_form_general: + shows "rsimp (rders (RSEQ r1 r2) s) = +rsimp ( (RALTS ( (RSEQ (rders r1 s) r2 # (map (rders r2) (vsuf s r1))))))" + apply(subgoal_tac "sflat (rders (RSEQ r1 r2) s) = sflat (RALTS ( (RSEQ (rders r1 s) r2 # (map (rders r2) (vsuf s r1)))))") + using sflat_rsimpeq apply blast + by (simp add: seq_sflat0) + +lemma seq_closed_form_aux1: + shows "rsimp ( (RALTS ( (RSEQ (rders r1 s) r2 # (map (rders r2) (vsuf s r1)))))) = +rsimp ( (RALTS ( (RSEQ (rders_simp r1 s) r2 # (map (rders r2) (vsuf s r1))))))" + by (smt (verit, best) list.simps(9) rders.simps(1) rders_simp.simps(1) rders_simp_same_simpders rsimp.simps(1) rsimp.simps(2) rsimp_idem) + +lemma add_simp_to_rest: + shows "rsimp (RALTS (r # rs)) = rsimp (RALTS (r # map rsimp rs))" + by (metis append_Nil2 grewrite.intros(2) grewrite_simpalts head_one_more_simp list.simps(9) rsimp_ALTs.simps(2) spawn_simp_rsimpalts) + +lemma rsimp_compose_der: + shows "map rsimp (map (rders r) ss) = map (\s. rsimp (rders r s)) ss" + apply simp + done + +lemma rsimp_compose_der2: + shows "\s \ set ss. s \ [] \ map rsimp (map (rders r) ss) = map (\s. (rders_simp r s)) ss" + by (simp add: rders_simp_same_simpders) + +lemma vsuf_nonempty: + shows "\s \ set ( vsuf s1 r). s \ []" + apply(induct s1 arbitrary: r) + apply simp + apply simp + done + +lemma rsimp_compose_der3: + shows " map rsimp (map (rders r) (vsuf s1 r')) = map (\s. rsimp (rders_simp r s)) (vsuf s1 r')" + by (simp add: rders_simp_same_simpders rsimp_idem vsuf_nonempty) + +thm rders_simp_same_simpders + + + +lemma seq_closed_form_aux2: + shows "s \ [] \ rsimp ( (RALTS ( (RSEQ (rders_simp r1 s) r2 # (map (rders r2) (vsuf s r1)))))) = + rsimp ( (RALTS ( (RSEQ (rders_simp r1 s) r2 # (map (rders_simp r2) (vsuf s r1))))))" + + by (metis add_simp_to_rest rsimp_compose_der2 vsuf_nonempty) + + lemma seq_closed_form: shows "rsimp (rders_simp (RSEQ r1 r2) s) = rsimp ( RALTS ( (RSEQ (rders_simp r1 s) r2) # (map (rders_simp r2) (vsuf s r1)) ) )" - apply(induct s) - apply simp - sorry + apply(case_tac s ) + apply simp + apply (metis idem_after_simp1 rsimp.simps(1)) + apply(subgoal_tac " s \ []") + using rders_simp_same_simpders rsimp_idem seq_closed_form_aux1 seq_closed_form_aux2 seq_closed_form_general apply presburger + + by fastforce + + + lemma seq_closed_form_variant: shows