143 | "rnullable (RCHAR c) = False" |
138 | "rnullable (RCHAR c) = False" |
144 | "rnullable (RALTS rs) = (\<exists>r \<in> set rs. rnullable r)" |
139 | "rnullable (RALTS rs) = (\<exists>r \<in> set rs. rnullable r)" |
145 | "rnullable (RSEQ r1 r2) = (rnullable r1 \<and> rnullable r2)" |
140 | "rnullable (RSEQ r1 r2) = (rnullable r1 \<and> rnullable r2)" |
146 | "rnullable (RSTAR r) = True" |
141 | "rnullable (RSTAR r) = True" |
147 |
142 |
148 fun convert_cchar_char :: "cchar \<Rightarrow> char" |
|
149 where |
|
150 "convert_cchar_char Achar = (CHR 0x41) " |
|
151 | "convert_cchar_char Bchar = (CHR 0x42) " |
|
152 | "convert_cchar_char Cchar = (CHR 0x43) " |
|
153 | "convert_cchar_char Dchar = (CHR 0x44) " |
|
154 |
143 |
155 fun |
144 fun |
156 rder :: "char \<Rightarrow> rrexp \<Rightarrow> rrexp" |
145 rder :: "char \<Rightarrow> rrexp \<Rightarrow> rrexp" |
157 where |
146 where |
158 "rder c (RZERO) = RZERO" |
147 "rder c (RZERO) = RZERO" |
159 | "rder c (RONE) = RZERO" |
148 | "rder c (RONE) = RZERO" |
160 | "rder c (RCHAR d) = (if c = (convert_cchar_char d) then RONE else RZERO)" |
149 | "rder c (RCHAR d) = (if c = d then RONE else RZERO)" |
161 | "rder c (RALTS rs) = RALTS (map (rder c) rs)" |
150 | "rder c (RALTS rs) = RALTS (map (rder c) rs)" |
162 | "rder c (RSEQ r1 r2) = |
151 | "rder c (RSEQ r1 r2) = |
163 (if rnullable r1 |
152 (if rnullable r1 |
164 then RALT (RSEQ (rder c r1) r2) (rder c r2) |
153 then RALT (RSEQ (rder c r1) r2) (rder c r2) |
165 else RSEQ (rder c r1) r2)" |
154 else RSEQ (rder c r1) r2)" |
877 "rexp_enum 0 = []" |
866 "rexp_enum 0 = []" |
878 |"rexp_enum (Suc 0) = RALTS [] # RZERO # (RONE # (map RCHAR (all_chars 255)))" |
867 |"rexp_enum (Suc 0) = RALTS [] # RZERO # (RONE # (map RCHAR (all_chars 255)))" |
879 |"rexp_enum (Suc n) = [(RSEQ r1 r2). r1 \<in> set (rexp_enum i) \<and> r2 \<in> set (rexp_enum j) \<and> i + j = n]" |
868 |"rexp_enum (Suc n) = [(RSEQ r1 r2). r1 \<in> set (rexp_enum i) \<and> r2 \<in> set (rexp_enum j) \<and> i + j = n]" |
880 |
869 |
881 *) |
870 *) |
|
871 definition SEQ_set where |
|
872 "SEQ_set A n \<equiv> {RSEQ r1 r2 | r1 r2. r1 \<in> A \<and> r2 \<in> A \<and> rsize r1 + rsize r2 \<le> n}" |
|
873 |
|
874 definition ALT_set where |
|
875 "ALT_set A n \<equiv> {RALTS rs | rs. set rs \<subseteq> A \<and> sum_list (map rsize rs) \<le> n}" |
|
876 |
882 context notes rev_conj_cong[fundef_cong] begin |
877 context notes rev_conj_cong[fundef_cong] begin |
883 function (sequential) rexp_enum :: "nat \<Rightarrow> rrexp set" |
878 function (sequential) rexp_enum :: "nat \<Rightarrow> rrexp set" |
884 where |
879 where |
885 "rexp_enum 0 = {}" |
880 "rexp_enum 0 = {}" |
886 |"rexp_enum (Suc 0) = {RALTS []} \<union> {RZERO} \<union> {RONE} \<union> { (RCHAR c) |c. c \<in>{Achar, Bchar, Cchar, Dchar} }" |
881 |"rexp_enum (Suc 0) = {RALTS []} \<union> {RZERO} \<union> {RONE} \<union> { (RCHAR c) |c::char. True }" |
887 |"rexp_enum (Suc n) = {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = n} \<union> |
882 |"rexp_enum (Suc n) = {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = n} \<union> |
888 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc n \<and> i \<le> n \<and> j \<le> n} \<union> |
883 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc n \<and> i \<le> n \<and> j \<le> n} \<union> |
889 {RSTAR r0 | r0. r0 \<in> (rexp_enum n)} \<union> |
884 {RSTAR r0 | r0. r0 \<in> (rexp_enum n)} \<union> |
890 (rexp_enum n)" |
885 (rexp_enum n)" |
891 by pat_completeness auto |
886 by pat_completeness auto |
902 |
897 |
903 lemma rexp_enum_mono: |
898 lemma rexp_enum_mono: |
904 shows "n \<le> m \<Longrightarrow> (rexp_enum n) \<subseteq> (rexp_enum m)" |
899 shows "n \<le> m \<Longrightarrow> (rexp_enum n) \<subseteq> (rexp_enum m)" |
905 by (simp add: lift_Suc_mono_le rexp_enum_inclusion) |
900 by (simp add: lift_Suc_mono_le rexp_enum_inclusion) |
906 |
901 |
|
902 lemma zero_in_Suc0: |
|
903 shows "RZERO \<in> rexp_enum (Suc 0)" |
|
904 and "RZERO \<in> rexp_enum 1" |
|
905 apply simp |
|
906 by simp |
|
907 |
|
908 lemma one_in_Suc0: |
|
909 shows "RONE \<in> rexp_enum (Suc 0)" |
|
910 and "RONE \<in> rexp_enum 1" |
|
911 apply simp |
|
912 by simp |
|
913 |
|
914 lemma char_in_Suc0: |
|
915 shows "RCHAR c \<in> rexp_enum (Suc 0)" |
|
916 apply simp |
|
917 done |
|
918 |
|
919 |
|
920 lemma char_in1: |
|
921 shows "RCHAR c \<in> rexp_enum 1" |
|
922 using One_nat_def char_in_Suc0 by presburger |
|
923 |
|
924 lemma alts_nil_in_Suc0: |
|
925 shows "RALTS [] \<in> rexp_enum (Suc 0)" |
|
926 and "RALTS [] \<in> rexp_enum 1" |
|
927 apply simp |
|
928 by simp |
|
929 |
|
930 |
|
931 lemma zero_in_positive: |
|
932 shows "RZERO \<in> rexp_enum (Suc N)" |
|
933 by (metis le_add1 plus_1_eq_Suc rexp_enum_mono subsetD zero_in_Suc0(2)) |
|
934 |
|
935 lemma one_in_positive: |
|
936 shows "RONE \<in> rexp_enum (Suc N)" |
|
937 by (metis le_add1 plus_1_eq_Suc rexp_enum_mono subsetD one_in_Suc0(2)) |
|
938 |
|
939 lemma alts_in_positive: |
|
940 shows "RALTS [] \<in> rexp_enum (Suc N)" |
|
941 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) |
|
942 |
|
943 lemma char_in_positive: |
|
944 shows "RCHAR c \<in> rexp_enum (Suc N)" |
|
945 apply(cases c) |
|
946 apply (metis Suc_eq_plus1 char_in1 le_add2 rexp_enum_mono subsetD)+ |
|
947 done |
|
948 |
907 lemma enum_inductive_cases: |
949 lemma enum_inductive_cases: |
908 shows "rsize (RSEQ r1 r2) = Suc n \<Longrightarrow> \<exists>i j. rsize r1 = i \<and> rsize r2 = j\<and> i + j = n" |
950 shows "rsize (RSEQ r1 r2) = Suc n \<Longrightarrow> \<exists>i j. rsize r1 = i \<and> rsize r2 = j\<and> i + j = n" |
909 by (metis Suc_inject rsize.simps(5)) |
951 by (metis Suc_inject rsize.simps(5)) |
910 thm rsize.simps(5) |
952 |
911 |
953 |
912 lemma enumeration_finite: |
954 lemma enumeration_finite: |
913 shows "\<exists>Nn. card (rexp_enum n) < Nn" |
955 shows "\<exists>Nn. card (rexp_enum n) < Nn" |
914 apply(simp add:no_top_class.gt_ex) |
956 apply(simp add:no_top_class.gt_ex) |
915 done |
957 done |
|
958 |
|
959 |
|
960 lemma s1: |
|
961 "{r::rexp . size r = 0} = ({ZERO, ONE} \<union> {CH c| c. True})" |
|
962 apply(auto) |
|
963 apply(case_tac x) |
|
964 apply(simp_all) |
|
965 done |
|
966 |
|
967 |
|
968 |
|
969 |
|
970 lemma enum_Suc0: |
|
971 shows " rexp_enum (Suc 0) = {RZERO} \<union> {RONE} \<union> {RCHAR c | c. True} \<union> {RALTS []}" |
|
972 by auto |
|
973 |
|
974 lemma enumeration_chars_finite: |
|
975 shows "finite {RCHAR c |c. True}" |
|
976 apply(subgoal_tac "finite (RCHAR ` (UNIV::char set))") |
|
977 prefer 2 |
|
978 using finite_code apply blast |
|
979 by (simp add: full_SetCompr_eq) |
|
980 |
|
981 lemma enum_Suc0_finite: |
|
982 shows "finite (rexp_enum (Suc 0))" |
|
983 apply(subgoal_tac "finite ( {RZERO} \<union> {RONE} \<union> {RCHAR c | c. True} \<union> {RALTS []})") |
|
984 using enum_Suc0 apply presburger |
|
985 using enumeration_chars_finite by blast |
|
986 |
|
987 lemma enum_1_finite: |
|
988 shows "finite (rexp_enum 1)" |
|
989 using enum_Suc0_finite by force |
|
990 |
|
991 lemma enum_stars_finite: |
|
992 shows " finite (rexp_enum n) \<Longrightarrow> finite {RSTAR r0 | r0. r0 \<in> (rexp_enum n)}" |
|
993 apply(induct n) |
|
994 apply simp |
|
995 apply simp |
|
996 done |
|
997 |
|
998 definition RSEQ_set |
|
999 where |
|
1000 "RSEQ_set A B \<equiv> (\<lambda>(r1, r2) . (RSEQ r1 r2 )) ` (A \<times> B)" |
|
1001 |
|
1002 |
|
1003 lemma enum_seq_finite: |
|
1004 shows "(\<forall>k. k < n \<longrightarrow> finite (rexp_enum k)) \<Longrightarrow> finite |
|
1005 {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = n}" |
|
1006 apply(induct n) |
|
1007 apply simp |
|
1008 apply(subgoal_tac "{(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = Suc n} |
|
1009 \<subseteq> RSEQ_set (rexp_enum n) (rexp_enum n)") |
|
1010 apply(subgoal_tac "finite ( RSEQ_set (rexp_enum n) (rexp_enum n))") |
|
1011 using rev_finite_subset |
|
1012 apply fastforce |
|
1013 |
|
1014 sorry |
|
1015 |
|
1016 |
|
1017 |
|
1018 lemma enum_induct_finite: |
|
1019 shows " finite ( {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = n} \<union> |
|
1020 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc n \<and> i \<le> n \<and> j \<le> n} \<union> |
|
1021 {RSTAR r0 | r0. r0 \<in> (rexp_enum n)} \<union> |
|
1022 (rexp_enum n))" |
|
1023 apply(induct n) |
|
1024 apply simp |
|
1025 sorry |
|
1026 |
|
1027 lemma enumeration_finite2: |
|
1028 shows "finite (rexp_enum n)" |
|
1029 apply(cases n) |
|
1030 apply auto[1] |
|
1031 apply(case_tac nat) |
|
1032 using enum_Suc0_finite apply blast |
|
1033 apply(subgoal_tac "rexp_enum ( Suc n) = {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = n} \<union> |
|
1034 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc n \<and> i \<le> n \<and> j \<le> n} \<union> |
|
1035 {RSTAR r0 | r0. r0 \<in> (rexp_enum n)} \<union> |
|
1036 (rexp_enum n)") |
|
1037 prefer 2 |
|
1038 using rexp_enum.simps(3) apply presburger |
|
1039 using enum_induct_finite by auto |
|
1040 |
916 |
1041 |
917 lemma size1_rexps: |
1042 lemma size1_rexps: |
918 shows "RCHAR x \<in> rexp_enum 1" |
1043 shows "RCHAR x \<in> rexp_enum 1" |
919 apply(cases x) |
1044 apply(cases x) |
920 apply auto |
1045 apply auto |
976 apply(subgoal_tac "r \<in> {uu. |
1101 apply(subgoal_tac "r \<in> {uu. |
977 \<exists>a rs i j. uu = RALTS (a # rs) \<and> a \<in> rexp_enum i \<and> RALTS rs \<in> rexp_enum j \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N}") |
1102 \<exists>a rs i j. uu = RALTS (a # rs) \<and> a \<in> rexp_enum i \<and> RALTS rs \<in> rexp_enum j \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N}") |
978 apply auto[1] |
1103 apply auto[1] |
979 apply(subgoal_tac "RALTS (a # list) \<in> {uu. |
1104 apply(subgoal_tac "RALTS (a # list) \<in> {uu. |
980 \<exists>a rs i j. uu = RALTS (a # rs) \<and> a \<in> rexp_enum i \<and> RALTS rs \<in> rexp_enum j \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N}") |
1105 \<exists>a rs i j. uu = RALTS (a # rs) \<and> a \<in> rexp_enum i \<and> RALTS rs \<in> rexp_enum j \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N}") |
981 |
|
982 |
|
983 apply fastforce |
1106 apply fastforce |
984 apply(subgoal_tac "a \<in> rexp_enum i") |
1107 apply(subgoal_tac "a \<in> rexp_enum i") |
985 prefer 2 |
1108 prefer 2 |
986 |
|
987 apply linarith |
1109 apply linarith |
988 by blast |
1110 by blast |
|
1111 |
|
1112 thm rsize.elims |
989 |
1113 |
990 lemma rexp_enum_covers: |
1114 lemma rexp_enum_covers: |
991 shows " rsize r \<le> N \<Longrightarrow> r \<in> rexp_enum N \<and> r \<in> rexp_enum (rsize r)" |
1115 shows " rsize r \<le> N \<Longrightarrow> r \<in> rexp_enum N \<and> r \<in> rexp_enum (rsize r)" |
992 apply(induct N arbitrary : r) |
1116 apply(induct N arbitrary : r) |
993 apply simp |
1117 apply simp |
1014 apply (meson def_enum_alts rexp_size_induct) |
1138 apply (meson def_enum_alts rexp_size_induct) |
1015 apply(subgoal_tac "rsize (RALTS list) \<le> N") |
1139 apply(subgoal_tac "rsize (RALTS list) \<le> N") |
1016 apply(subgoal_tac "RALTS list \<in> rexp_enum N") |
1140 apply(subgoal_tac "RALTS list \<in> rexp_enum N") |
1017 prefer 2 |
1141 prefer 2 |
1018 apply presburger |
1142 apply presburger |
1019 |
1143 using def_enum_alts rexp_size_induct apply presburger |
1020 sorry |
1144 using rexp_size_induct apply presburger |
1021 |
1145 using rexp_size_induct apply presburger |
1022 |
1146 using rexp_size_induct apply presburger |
1023 lemma finite_size_finite_regx: |
1147 apply(subgoal_tac "r \<in> rexp_enum 1") |
1024 shows " \<exists>l. \<forall>rs. ((\<forall>r \<in> (set rs). rsize r < N) \<and> (distinct rs) \<longrightarrow> (length rs) < l) " |
1148 apply (metis rsize.simps(1)) |
1025 |
1149 apply(subgoal_tac "rsize r = Suc 0") |
1026 sorry |
1150 prefer 2 |
|
1151 using rsize.simps(1) apply presburger |
|
1152 apply(subgoal_tac "r \<in> rexp_enum (Suc 0)") |
|
1153 apply force |
|
1154 using zero_in_Suc0 apply blast |
|
1155 apply simp |
|
1156 |
|
1157 using one_in_positive apply auto[1] |
|
1158 |
|
1159 apply (metis char_in_positive) |
|
1160 apply(subgoal_tac "rsize x41 \<le> N") |
|
1161 apply(subgoal_tac "rsize x42 \<le> N") |
|
1162 prefer 2 |
|
1163 apply auto[1] |
|
1164 prefer 2 |
|
1165 using enum_inductive_cases nat_le_iff_add apply blast |
|
1166 apply(subgoal_tac "x41 \<in> rexp_enum (rsize x41)") |
|
1167 prefer 2 |
|
1168 apply blast |
|
1169 apply(subgoal_tac "x42 \<in> rexp_enum (rsize x42)") |
|
1170 prefer 2 |
|
1171 apply blast |
|
1172 apply(subgoal_tac "rsize x42 + rsize x41 = N") |
|
1173 prefer 2 |
|
1174 using add.commute enum_inductive_cases apply blast |
|
1175 apply(subgoal_tac "rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = N} \<union> |
|
1176 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N} \<union> |
|
1177 {RSTAR r0 | r0. r0 \<in> (rexp_enum N)} \<union> |
|
1178 (rexp_enum N)") |
|
1179 apply (smt (verit, del_insts) UnCI mem_Collect_eq old.nat.inject rsize.simps(5)) |
|
1180 apply (smt (verit, ccfv_threshold) One_nat_def nle_le not_less_eq_eq rexp_enum_case3 size_geq1) |
|
1181 apply(subgoal_tac "x6 \<in> rexp_enum N") |
|
1182 prefer 2 |
|
1183 |
|
1184 apply force |
|
1185 apply(subgoal_tac "N \<ge> Suc 0") |
|
1186 prefer 2 |
|
1187 apply (metis less_Suc_eq_le non_zero_size rsize.simps(6)) |
|
1188 apply(subgoal_tac "rexp_enum (Suc N) = {(RSEQ r1 r2)|r1 r2 i j. r1 \<in> (rexp_enum i) \<and> r2 \<in> (rexp_enum j) \<and> i + j = N} \<union> |
|
1189 {(RALTS (a # rs)) | a rs i j. a \<in> (rexp_enum i) \<and> (RALTS rs) \<in> (rexp_enum j) \<and> i + j = Suc N \<and> i \<le> N \<and> j \<le> N} \<union> |
|
1190 {RSTAR r0 | r0. r0 \<in> (rexp_enum N)} \<union> |
|
1191 (rexp_enum N)") |
|
1192 prefer 2 |
|
1193 using rexp_enum_case3 apply presburger |
|
1194 by (metis (mono_tags, lifting) Un_iff mem_Collect_eq) |
|
1195 |
|
1196 |
|
1197 |
|
1198 |
|
1199 |
|
1200 definition |
|
1201 "sizeNregex N \<equiv> {r. rsize r \<le> N}" |
|
1202 |
|
1203 |
|
1204 |
|
1205 lemma sizeNregex_covered: |
|
1206 shows "sizeNregex N \<subseteq> rexp_enum N" |
|
1207 using rexp_enum_covers sizeNregex_def by auto |
|
1208 |
|
1209 lemma finiteness_of_sizeN_regex: |
|
1210 shows "finite (sizeNregex N)" |
|
1211 by (meson enumeration_finite2 rev_finite_subset sizeNregex_covered) |
|
1212 |
|
1213 |
1027 |
1214 |
1028 (*below probably needs proved concurrently*) |
1215 (*below probably needs proved concurrently*) |
1029 |
1216 |
1030 lemma finite_r1r2_ders_list: |
1217 lemma finite_r1r2_ders_list: |
1031 shows "(\<forall>s. rsize (rders_simp r1 s) < N1 \<and> rsize (rders_simp r2 s) < N2) |
1218 shows "(\<forall>s. rsize (rders_simp r1 s) < N1 \<and> rsize (rders_simp r2 s) < N2) |