# HG changeset patch # User Chengsong # Date 1646656047 0 # Node ID 09a57446696a8a1451c78cc8fb68bcd5a19e5994 # Parent 426a93160f4a39d72d39e78091308a38083c8571 some changes diff -r 426a93160f4a -r 09a57446696a thys2/SizeBound6CT.thy --- a/thys2/SizeBound6CT.thy Sat Mar 05 11:31:59 2022 +0000 +++ b/thys2/SizeBound6CT.thy Mon Mar 07 12:27:27 2022 +0000 @@ -868,182 +868,6 @@ |"rexp_enum (Suc n) = [(RSEQ r1 r2). r1 \ set (rexp_enum i) \ r2 \ set (rexp_enum j) \ i + j = n]" *) -definition SEQ_set where - "SEQ_set A n \ {RSEQ r1 r2 | r1 r2. r1 \ A \ r2 \ A \ rsize r1 + rsize r2 \ n}" - -definition ALT_set where -"ALT_set A n \ {RALTS rs | rs. set rs \ A \ sum_list (map rsize rs) \ n}" - -context notes rev_conj_cong[fundef_cong] begin -function (sequential) rexp_enum :: "nat \ rrexp set" - where -"rexp_enum 0 = {}" -|"rexp_enum (Suc 0) = {RALTS []} \ {RZERO} \ {RONE} \ { (RCHAR c) |c::char. True }" -|"rexp_enum (Suc n) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = n} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc n \ i \ n \ j \ n} \ -{RSTAR r0 | r0. r0 \ (rexp_enum n)} \ -(rexp_enum n)" - by pat_completeness auto -termination - by (relation "measure size") auto -end - -lemma rexp_enum_inclusion: - shows "(rexp_enum n) \ (rexp_enum (Suc n))" - apply(induct n) - apply auto[1] - apply(simp) - done - -lemma rexp_enum_mono: - shows "n \ m \ (rexp_enum n) \ (rexp_enum m)" - by (simp add: lift_Suc_mono_le rexp_enum_inclusion) - -lemma zero_in_Suc0: - shows "RZERO \ rexp_enum (Suc 0)" -and "RZERO \ rexp_enum 1" - apply simp - by simp - -lemma one_in_Suc0: - shows "RONE \ rexp_enum (Suc 0)" -and "RONE \ rexp_enum 1" - apply simp - by simp - -lemma char_in_Suc0: - shows "RCHAR c \ rexp_enum (Suc 0)" - apply simp - done - - -lemma char_in1: - shows "RCHAR c \ rexp_enum 1" - using One_nat_def char_in_Suc0 by presburger - -lemma alts_nil_in_Suc0: - shows "RALTS [] \ rexp_enum (Suc 0)" - and "RALTS [] \ rexp_enum 1" - apply simp - by simp - - -lemma zero_in_positive: - shows "RZERO \ rexp_enum (Suc N)" - by (metis le_add1 plus_1_eq_Suc rexp_enum_mono subsetD zero_in_Suc0(2)) - -lemma one_in_positive: - shows "RONE \ rexp_enum (Suc N)" - by (metis le_add1 plus_1_eq_Suc rexp_enum_mono subsetD one_in_Suc0(2)) - -lemma alts_in_positive: - shows "RALTS [] \ rexp_enum (Suc N)" - by (metis One_nat_def alts_nil_in_Suc0(1) le_add_same_cancel1 less_Suc_eq_le plus_1_eq_Suc rexp_enum_mono subsetD zero_less_Suc) - -lemma char_in_positive: - shows "RCHAR c \ rexp_enum (Suc N)" - apply(cases c) - apply (metis Suc_eq_plus1 char_in1 le_add2 rexp_enum_mono subsetD)+ - done - -lemma enum_inductive_cases: - shows "rsize (RSEQ r1 r2) = Suc n \ \i j. rsize r1 = i \ rsize r2 = j\ i + j = n" - by (metis Suc_inject rsize.simps(5)) - - -lemma enumeration_finite: - shows "\Nn. card (rexp_enum n) < Nn" - apply(simp add:no_top_class.gt_ex) - done - - -lemma s1: -"{r::rexp . size r = 0} = ({ZERO, ONE} \ {CH c| c. True})" -apply(auto) -apply(case_tac x) -apply(simp_all) -done - - - - -lemma enum_Suc0: - shows " rexp_enum (Suc 0) = {RZERO} \ {RONE} \ {RCHAR c | c. True} \ {RALTS []}" - by auto - -lemma enumeration_chars_finite: - shows "finite {RCHAR c |c. True}" - apply(subgoal_tac "finite (RCHAR ` (UNIV::char set))") - prefer 2 - using finite_code apply blast - by (simp add: full_SetCompr_eq) - -lemma enum_Suc0_finite: - shows "finite (rexp_enum (Suc 0))" - apply(subgoal_tac "finite ( {RZERO} \ {RONE} \ {RCHAR c | c. True} \ {RALTS []})") - using enum_Suc0 apply presburger - using enumeration_chars_finite by blast - -lemma enum_1_finite: - shows "finite (rexp_enum 1)" - using enum_Suc0_finite by force - -lemma enum_stars_finite: - shows " finite (rexp_enum n) \ finite {RSTAR r0 | r0. r0 \ (rexp_enum n)}" - apply(induct n) - apply simp - apply simp - done - -definition RSEQ_set - where - "RSEQ_set A B \ (\(r1, r2) . (RSEQ r1 r2 )) ` (A \ B)" - - -lemma enum_seq_finite: - shows "(\k. k < n \ finite (rexp_enum k)) \ finite -{(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = n}" - apply(induct n) - apply simp - apply(subgoal_tac "{(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = Suc n} -\ RSEQ_set (rexp_enum n) (rexp_enum n)") - apply(subgoal_tac "finite ( RSEQ_set (rexp_enum n) (rexp_enum n))") - using rev_finite_subset - apply fastforce - - sorry - - - -lemma enum_induct_finite: - shows " finite ( {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = n} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc n \ i \ n \ j \ n} \ -{RSTAR r0 | r0. r0 \ (rexp_enum n)} \ -(rexp_enum n))" - apply(induct n) - apply simp - sorry - -lemma enumeration_finite2: - shows "finite (rexp_enum n)" - apply(cases n) - apply auto[1] - apply(case_tac nat) - using enum_Suc0_finite apply blast - apply(subgoal_tac "rexp_enum ( Suc n) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = n} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc n \ i \ n \ j \ n} \ -{RSTAR r0 | r0. r0 \ (rexp_enum n)} \ -(rexp_enum n)") - prefer 2 - using rexp_enum.simps(3) apply presburger - using enum_induct_finite by auto - - -lemma size1_rexps: - shows "RCHAR x \ rexp_enum 1" - apply(cases x) - apply auto - done lemma non_zero_size: shows "rsize r \ Suc 0" @@ -1070,147 +894,68 @@ apply simp done -lemma rexp_enum_case3: - shows "N \ Suc 0 \ rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = N} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc N \ i \ N \ j \ N} \ -{RSTAR r0 | r0. r0 \ (rexp_enum N)} \ -(rexp_enum N)" - apply(case_tac N) - apply simp - apply auto - done - - - -lemma def_enum_alts: - shows "\ r = RALTS x5; x5 = a # list; - rsize a = i \ rsize (RALTS list) = j \ i + j = Suc N \ a \ (rexp_enum i) \ (RALTS list) \ (rexp_enum j) \ - \ r \ rexp_enum (Suc N)" - apply(subgoal_tac "N \ 1") - prefer 2 - apply (metis One_nat_def add_is_1 less_Suc0 linorder_le_less_linear non_zero_size) - apply(subgoal_tac " rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = N} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc N\ i \ N \ j \ N} \ -{RSTAR r0 | r0. r0 \ (rexp_enum N)} \ -(rexp_enum N)") - prefer 2 - using One_nat_def rexp_enum_case3 apply presburger - apply(subgoal_tac "i \ N \ j \ N") - prefer 2 - using non_zero_size apply auto[1] - apply(subgoal_tac "r \ {uu. - \a rs i j. uu = RALTS (a # rs) \ a \ rexp_enum i \ RALTS rs \ rexp_enum j \ i + j = Suc N \ i \ N \ j \ N}") - apply auto[1] - apply(subgoal_tac "RALTS (a # list) \ {uu. - \a rs i j. uu = RALTS (a # rs) \ a \ rexp_enum i \ RALTS rs \ rexp_enum j \ i + j = Suc N \ i \ N \ j \ N}") - apply fastforce - apply(subgoal_tac "a \ rexp_enum i") - prefer 2 - apply linarith - by blast - -thm rsize.elims - -lemma rexp_enum_covers: - shows " rsize r \ N \ r \ rexp_enum N \ r \ rexp_enum (rsize r)" - apply(induct N arbitrary : r) - apply simp - - using rsize.elims apply auto[1] - apply(case_tac "rsize r \ N") - using enumeration_finite - - apply (meson in_mono rexp_enum_inclusion) - apply(subgoal_tac "rsize r = Suc N") - prefer 2 - using le_Suc_eq apply blast +definition SEQ_set where + "SEQ_set A n \ {RSEQ r1 r2 | r1 r2. r1 \ A \ r2 \ A \ rsize r1 + rsize r2 \ n}" - apply(case_tac r) - prefer 5 - apply(case_tac x5) - apply(subgoal_tac "rsize r =1") - prefer 2 - using hand_made_def_rlist_size rlist_size.simps(2) rsize.simps(4) apply presburger - apply simp - apply(subgoal_tac "a \ rexp_enum (rsize a)") - apply(subgoal_tac "RALTS list \ rexp_enum (rsize (RALTS list))") - - apply (meson def_enum_alts rexp_size_induct) - apply(subgoal_tac "rsize (RALTS list) \ N") - apply(subgoal_tac "RALTS list \ rexp_enum N") - prefer 2 - apply presburger - using def_enum_alts rexp_size_induct apply presburger - using rexp_size_induct apply presburger - using rexp_size_induct apply presburger - using rexp_size_induct apply presburger - apply(subgoal_tac "r \ rexp_enum 1") - apply (metis rsize.simps(1)) - apply(subgoal_tac "rsize r = Suc 0") - prefer 2 - using rsize.simps(1) apply presburger - apply(subgoal_tac "r \ rexp_enum (Suc 0)") - apply force - using zero_in_Suc0 apply blast - apply simp - - using one_in_positive apply auto[1] - - apply (metis char_in_positive) - apply(subgoal_tac "rsize x41 \ N") - apply(subgoal_tac "rsize x42 \ N") - prefer 2 - apply auto[1] - prefer 2 - using enum_inductive_cases nat_le_iff_add apply blast - apply(subgoal_tac "x41 \ rexp_enum (rsize x41)") - prefer 2 - apply blast - apply(subgoal_tac "x42 \ rexp_enum (rsize x42)") - prefer 2 - apply blast - apply(subgoal_tac "rsize x42 + rsize x41 = N") - prefer 2 - using add.commute enum_inductive_cases apply blast - apply(subgoal_tac "rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = N} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc N \ i \ N \ j \ N} \ -{RSTAR r0 | r0. r0 \ (rexp_enum N)} \ -(rexp_enum N)") - apply (smt (verit, del_insts) UnCI mem_Collect_eq old.nat.inject rsize.simps(5)) - apply (smt (verit, ccfv_threshold) One_nat_def nle_le not_less_eq_eq rexp_enum_case3 size_geq1) - apply(subgoal_tac "x6 \ rexp_enum N") - prefer 2 +definition SEQ_set_cartesian where +"SEQ_set_cartesian A n = {RSEQ r1 r2 | r1 r2. r1 \ A \ r2 \ A}" - apply force - apply(subgoal_tac "N \ Suc 0") - prefer 2 - apply (metis less_Suc_eq_le non_zero_size rsize.simps(6)) - apply(subgoal_tac "rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \ (rexp_enum i) \ r2 \ (rexp_enum j) \ i + j = N} \ -{(RALTS (a # rs)) | a rs i j. a \ (rexp_enum i) \ (RALTS rs) \ (rexp_enum j) \ i + j = Suc N \ i \ N \ j \ N} \ -{RSTAR r0 | r0. r0 \ (rexp_enum N)} \ -(rexp_enum N)") - prefer 2 - using rexp_enum_case3 apply presburger - by (metis (mono_tags, lifting) Un_iff mem_Collect_eq) - - - +definition ALT_set where +"ALT_set A n \ {RALTS rs | rs. set rs \ A \ sum_list (map rsize rs) \ n}" definition "sizeNregex N \ {r. rsize r \ N}" +lemma sizenregex_induct: + shows "sizeNregex (Suc n) = sizeNregex n \ {RZERO, RONE, RALTS []} \ {RCHAR c| c. True} \ +SEQ_set ( sizeNregex n) n \ ALT_set (sizeNregex n) n \ (RSTAR ` (sizeNregex n))" + sorry -lemma sizeNregex_covered: - shows "sizeNregex N \ rexp_enum N" - using rexp_enum_covers sizeNregex_def by auto +lemma chars_finite: + shows "finite (RCHAR ` (UNIV::(char set)))" + apply(simp) + done + +thm full_SetCompr_eq -lemma finiteness_of_sizeN_regex: - shows "finite (sizeNregex N)" - by (meson enumeration_finite2 rev_finite_subset sizeNregex_covered) +lemma size1finite: + shows "finite (sizeNregex (Suc 0))" + apply(subst sizenregex_induct) + apply(subst finite_Un)+ + apply(subgoal_tac "sizeNregex 0 = {}") + apply(rule conjI)+ + apply (metis Collect_empty_eq finite.emptyI non_zero_size not_less_eq_eq sizeNregex_def) + apply simp + apply (simp add: full_SetCompr_eq) + apply (simp add: SEQ_set_def) + apply (simp add: ALT_set_def) + apply(simp add: full_SetCompr_eq) + using non_zero_size not_less_eq_eq sizeNregex_def by fastforce + +lemma seq_included_in_cart: + shows "SEQ_set A n \ SEQ_set_cartesian A n" + sledgehammer + +lemma finite_seq: + shows " finite (sizeNregex n) \ finite (SEQ_set (sizeNregex n) n)" + apply(rule finite_subset) + sorry +lemma finite_size_n: + shows "finite (sizeNregex n)" + apply(induct n) + apply (metis Collect_empty_eq finite.emptyI non_zero_size not_less_eq_eq sizeNregex_def) + apply(subst sizenregex_induct) + apply(subst finite_Un)+ + apply(rule conjI)+ + apply simp + apply simp + apply (simp add: full_SetCompr_eq) + + sorry (*below probably needs proved concurrently*) diff -r 426a93160f4a -r 09a57446696a thys2/SizeBoundStrong.thy --- a/thys2/SizeBoundStrong.thy Sat Mar 05 11:31:59 2022 +0000 +++ b/thys2/SizeBoundStrong.thy Mon Mar 07 12:27:27 2022 +0000 @@ -621,12 +621,15 @@ where "dBStrong [] acc = []" | "dBStrong (r # rs) acc = (if (erase r) \ (set acc) then dBStrong rs acc - else (case (pruneRexp r (addToAcc r acc)) of - AZERO \ dBStrong rs ((addToAcc r acc) @ acc) | - r1 \ r1 # (dBStrong rs ((addToAcc r acc) @ acc)) + else let newSubRexps = (addToAcc r acc) in + (case (pruneRexp r newSubRexps) of + AZERO \ dBStrong rs (newSubRexps @ acc) | + r1 \ r1 # (dBStrong rs (newSubRexps @ acc)) ) ) " + + fun bsimpStrong :: "arexp \ arexp " where "bsimpStrong (ASEQ bs1 r1 r2) = bsimp_ASEQ bs1 (bsimpStrong r1) (bsimpStrong r2)" @@ -937,6 +940,22 @@ apply(simp_all) done +fun pAKC_aux :: "arexp list \ arexp \ rexp \ arexp" + where +"pAKC_aux rsa r ctx = (if (L (SEQ (erase r) ctx)) \ (L (erase (AALTs [] rsa))) then AZERO else + case r of (ASEQ bs r1 r2) \ pAKC_aux rsa r1 (SEQ (erase r1) ctx) | + (AALTs bs rs) \ AALTs bs (map (\r. pAKC_aux rsa r ctx) rs) | + r \ r +)" + +|"pAKC_aux rsa (ASEQ bs1 a1 a2) ctx = (if (L (SEQ (SEQ (erase a1) (erase a2)) ctx)) \ + L (erase (AALTs [] rsa)) + then AZERO + else (pAKC_aux rsa a1 (ASEQ bs1 a2 ctx)))" +| "pAKC_aux rsa (AALTs bs1 rs1) ctx = ctx " + +fun pruneAwayKnownComponents :: "arexp list \ arexp \ arexp" where +"pruneAwayKnownComponents rsa (ASEQ bs r1 r2) = (pAKC_aux rsa r1 r2)" @@ -955,6 +974,7 @@ | "AALTs bs [] \ AZERO" | "AALTs bs [r] \ fuse bs r" | "erase a1 = erase a2 \ AALTs bs (rsa@[a1]@rsb@[a2]@rsc) \ AALTs bs (rsa@[a1]@rsb@rsc)" +| "pruneAwayKnownComponents rsa a2 = a2' \ AALTs bs (rsa @ [a2] @ rsb) \ AALTs bs (rsa @ [a2'] @ rsb)" inductive