thys/BitCodedCT.thy
changeset 342 f0e876ed43fa
child 346 f1feb44adfe1
equal deleted inserted replaced
341:abf178a5db58 342:f0e876ed43fa
       
     1 
       
     2 theory BitCodedCT
       
     3   imports "Lexer" 
       
     4 begin
       
     5 
       
     6 section \<open>Bit-Encodings\<close>
       
     7 
       
     8 datatype bit = Z | S
       
     9 
       
    10 fun 
       
    11   code :: "val \<Rightarrow> bit list"
       
    12 where
       
    13   "code Void = []"
       
    14 | "code (Char c) = []"
       
    15 | "code (Left v) = Z # (code v)"
       
    16 | "code (Right v) = S # (code v)"
       
    17 | "code (Seq v1 v2) = (code v1) @ (code v2)"
       
    18 | "code (Stars []) = [S]"
       
    19 | "code (Stars (v # vs)) =  (Z # code v) @ code (Stars vs)"
       
    20 
       
    21 
       
    22 fun 
       
    23   Stars_add :: "val \<Rightarrow> val \<Rightarrow> val"
       
    24 where
       
    25   "Stars_add v (Stars vs) = Stars (v # vs)"
       
    26 
       
    27 function
       
    28   decode' :: "bit list \<Rightarrow> rexp \<Rightarrow> (val * bit list)"
       
    29 where
       
    30   "decode' ds ZERO = (Void, [])"
       
    31 | "decode' ds ONE = (Void, ds)"
       
    32 | "decode' ds (CHAR d) = (Char d, ds)"
       
    33 | "decode' [] (ALT r1 r2) = (Void, [])"
       
    34 | "decode' (Z # ds) (ALT r1 r2) = (let (v, ds') = decode' ds r1 in (Left v, ds'))"
       
    35 | "decode' (S # ds) (ALT r1 r2) = (let (v, ds') = decode' ds r2 in (Right v, ds'))"
       
    36 | "decode' ds (SEQ r1 r2) = (let (v1, ds') = decode' ds r1 in
       
    37                              let (v2, ds'') = decode' ds' r2 in (Seq v1 v2, ds''))"
       
    38 | "decode' [] (STAR r) = (Void, [])"
       
    39 | "decode' (S # ds) (STAR r) = (Stars [], ds)"
       
    40 | "decode' (Z # ds) (STAR r) = (let (v, ds') = decode' ds r in
       
    41                                     let (vs, ds'') = decode' ds' (STAR r) 
       
    42                                     in (Stars_add v vs, ds''))"
       
    43 by pat_completeness auto
       
    44 
       
    45 lemma decode'_smaller:
       
    46   assumes "decode'_dom (ds, r)"
       
    47   shows "length (snd (decode' ds r)) \<le> length ds"
       
    48 using assms
       
    49 apply(induct ds r)
       
    50 apply(auto simp add: decode'.psimps split: prod.split)
       
    51 using dual_order.trans apply blast
       
    52 by (meson dual_order.trans le_SucI)
       
    53 
       
    54 termination "decode'"  
       
    55 apply(relation "inv_image (measure(%cs. size cs) <*lex*> measure(%s. size s)) (%(ds,r). (r,ds))") 
       
    56 apply(auto dest!: decode'_smaller)
       
    57 by (metis less_Suc_eq_le snd_conv)
       
    58 
       
    59 definition
       
    60   decode :: "bit list \<Rightarrow> rexp \<Rightarrow> val option"
       
    61 where
       
    62   "decode ds r \<equiv> (let (v, ds') = decode' ds r 
       
    63                   in (if ds' = [] then Some v else None))"
       
    64 
       
    65 lemma decode'_code_Stars:
       
    66   assumes "\<forall>v\<in>set vs. \<Turnstile> v : r \<and> (\<forall>x. decode' (code v @ x) r = (v, x)) \<and> flat v \<noteq> []" 
       
    67   shows "decode' (code (Stars vs) @ ds) (STAR r) = (Stars vs, ds)"
       
    68   using assms
       
    69   apply(induct vs)
       
    70   apply(auto)
       
    71   done
       
    72 
       
    73 lemma decode'_code:
       
    74   assumes "\<Turnstile> v : r"
       
    75   shows "decode' ((code v) @ ds) r = (v, ds)"
       
    76 using assms
       
    77   apply(induct v r arbitrary: ds) 
       
    78   apply(auto)
       
    79   using decode'_code_Stars by blast
       
    80 
       
    81 lemma decode_code:
       
    82   assumes "\<Turnstile> v : r"
       
    83   shows "decode (code v) r = Some v"
       
    84   using assms unfolding decode_def
       
    85   by (smt append_Nil2 decode'_code old.prod.case)
       
    86 
       
    87 
       
    88 section {* Annotated Regular Expressions *}
       
    89 
       
    90 datatype arexp = 
       
    91   AZERO
       
    92 | AONE "bit list"
       
    93 | ACHAR "bit list" char
       
    94 | ASEQ "bit list" arexp arexp
       
    95 | AALTs "bit list" "arexp list"
       
    96 | ASTAR "bit list" arexp
       
    97 
       
    98 abbreviation
       
    99   "AALT bs r1 r2 \<equiv> AALTs bs [r1, r2]"
       
   100 
       
   101 fun asize :: "arexp \<Rightarrow> nat" where
       
   102   "asize AZERO = 1"
       
   103 | "asize (AONE cs) = 1" 
       
   104 | "asize (ACHAR cs c) = 1"
       
   105 | "asize (AALTs cs rs) = Suc (sum_list (map asize rs))"
       
   106 | "asize (ASEQ cs r1 r2) = Suc (asize r1 + asize r2)"
       
   107 | "asize (ASTAR cs r) = Suc (asize r)"
       
   108 
       
   109 fun 
       
   110   erase :: "arexp \<Rightarrow> rexp"
       
   111 where
       
   112   "erase AZERO = ZERO"
       
   113 | "erase (AONE _) = ONE"
       
   114 | "erase (ACHAR _ c) = CHAR c"
       
   115 | "erase (AALTs _ []) = ZERO"
       
   116 | "erase (AALTs _ [r]) = (erase r)"
       
   117 | "erase (AALTs bs (r#rs)) = ALT (erase r) (erase (AALTs bs rs))"
       
   118 | "erase (ASEQ _ r1 r2) = SEQ (erase r1) (erase r2)"
       
   119 | "erase (ASTAR _ r) = STAR (erase r)"
       
   120 
       
   121 lemma decode_code_erase:
       
   122   assumes "\<Turnstile> v : (erase  a)"
       
   123   shows "decode (code v) (erase a) = Some v"
       
   124   using assms
       
   125   by (simp add: decode_code) 
       
   126 
       
   127 
       
   128 fun nonalt :: "arexp \<Rightarrow> bool"
       
   129   where
       
   130   "nonalt (AALTs bs2 rs) = False"
       
   131 | "nonalt r = True"
       
   132 
       
   133 
       
   134 fun good :: "arexp \<Rightarrow> bool" where
       
   135   "good AZERO = False"
       
   136 | "good (AONE cs) = True" 
       
   137 | "good (ACHAR cs c) = True"
       
   138 | "good (AALTs cs []) = False"
       
   139 | "good (AALTs cs [r]) = False"
       
   140 | "good (AALTs cs (r1#r2#rs)) = (\<forall>r' \<in> set (r1#r2#rs). good r' \<and> nonalt r')"
       
   141 | "good (ASEQ _ AZERO _) = False"
       
   142 | "good (ASEQ _ (AONE _) _) = False"
       
   143 | "good (ASEQ _ _ AZERO) = False"
       
   144 | "good (ASEQ cs r1 r2) = (good r1 \<and> good r2)"
       
   145 | "good (ASTAR cs r) = True"
       
   146 
       
   147 
       
   148 
       
   149 
       
   150 fun fuse :: "bit list \<Rightarrow> arexp \<Rightarrow> arexp" where
       
   151   "fuse bs AZERO = AZERO"
       
   152 | "fuse bs (AONE cs) = AONE (bs @ cs)" 
       
   153 | "fuse bs (ACHAR cs c) = ACHAR (bs @ cs) c"
       
   154 | "fuse bs (AALTs cs rs) = AALTs (bs @ cs) rs"
       
   155 | "fuse bs (ASEQ cs r1 r2) = ASEQ (bs @ cs) r1 r2"
       
   156 | "fuse bs (ASTAR cs r) = ASTAR (bs @ cs) r"
       
   157 
       
   158 lemma fuse_append:
       
   159   shows "fuse (bs1 @ bs2) r = fuse bs1 (fuse bs2 r)"
       
   160   apply(induct r)
       
   161   apply(auto)
       
   162   done
       
   163 
       
   164 
       
   165 fun intern :: "rexp \<Rightarrow> arexp" where
       
   166   "intern ZERO = AZERO"
       
   167 | "intern ONE = AONE []"
       
   168 | "intern (CHAR c) = ACHAR [] c"
       
   169 | "intern (ALT r1 r2) = AALT [] (fuse [Z] (intern r1)) 
       
   170                                 (fuse [S]  (intern r2))"
       
   171 | "intern (SEQ r1 r2) = ASEQ [] (intern r1) (intern r2)"
       
   172 | "intern (STAR r) = ASTAR [] (intern r)"
       
   173 
       
   174 
       
   175 fun retrieve :: "arexp \<Rightarrow> val \<Rightarrow> bit list" where
       
   176   "retrieve (AONE bs) Void = bs"
       
   177 | "retrieve (ACHAR bs c) (Char d) = bs"
       
   178 | "retrieve (AALTs bs [r]) v = bs @ retrieve r v" 
       
   179 | "retrieve (AALTs bs (r#rs)) (Left v) = bs @ retrieve r v"
       
   180 | "retrieve (AALTs bs (r#rs)) (Right v) = bs @ retrieve (AALTs [] rs) v"
       
   181 | "retrieve (ASEQ bs r1 r2) (Seq v1 v2) = bs @ retrieve r1 v1 @ retrieve r2 v2"
       
   182 | "retrieve (ASTAR bs r) (Stars []) = bs @ [S]"
       
   183 | "retrieve (ASTAR bs r) (Stars (v#vs)) = 
       
   184      bs @ [Z] @ retrieve r v @ retrieve (ASTAR [] r) (Stars vs)"
       
   185 
       
   186 
       
   187 
       
   188 fun
       
   189  bnullable :: "arexp \<Rightarrow> bool"
       
   190 where
       
   191   "bnullable (AZERO) = False"
       
   192 | "bnullable (AONE bs) = True"
       
   193 | "bnullable (ACHAR bs c) = False"
       
   194 | "bnullable (AALTs bs rs) = (\<exists>r \<in> set rs. bnullable r)"
       
   195 | "bnullable (ASEQ bs r1 r2) = (bnullable r1 \<and> bnullable r2)"
       
   196 | "bnullable (ASTAR bs r) = True"
       
   197 
       
   198 fun 
       
   199   bmkeps :: "arexp \<Rightarrow> bit list"
       
   200 where
       
   201   "bmkeps(AONE bs) = bs"
       
   202 | "bmkeps(ASEQ bs r1 r2) = bs @ (bmkeps r1) @ (bmkeps r2)"
       
   203 | "bmkeps(AALTs bs [r]) = bs @ (bmkeps r)"
       
   204 | "bmkeps(AALTs bs (r#rs)) = (if bnullable(r) then bs @ (bmkeps r) else (bmkeps (AALTs bs rs)))"
       
   205 | "bmkeps(ASTAR bs r) = bs @ [S]"
       
   206 
       
   207 
       
   208 fun
       
   209  bder :: "char \<Rightarrow> arexp \<Rightarrow> arexp"
       
   210 where
       
   211   "bder c (AZERO) = AZERO"
       
   212 | "bder c (AONE bs) = AZERO"
       
   213 | "bder c (ACHAR bs d) = (if c = d then AONE bs else AZERO)"
       
   214 | "bder c (AALTs bs rs) = AALTs bs (map (bder c) rs)"
       
   215 | "bder c (ASEQ bs r1 r2) = 
       
   216      (if bnullable r1
       
   217       then AALT bs (ASEQ [] (bder c r1) r2) (fuse (bmkeps r1) (bder c r2))
       
   218       else ASEQ bs (bder c r1) r2)"
       
   219 | "bder c (ASTAR bs r) = ASEQ bs (fuse [Z] (bder c r)) (ASTAR [] r)"
       
   220 
       
   221 
       
   222 fun 
       
   223   bders :: "arexp \<Rightarrow> string \<Rightarrow> arexp"
       
   224 where
       
   225   "bders r [] = r"
       
   226 | "bders r (c#s) = bders (bder c r) s"
       
   227 
       
   228 lemma bders_append:
       
   229   "bders r (s1 @ s2) = bders (bders r s1) s2"
       
   230   apply(induct s1 arbitrary: r s2)
       
   231   apply(simp_all)
       
   232   done
       
   233 
       
   234 lemma bnullable_correctness:
       
   235   shows "nullable (erase r) = bnullable r"
       
   236   apply(induct r rule: erase.induct)
       
   237   apply(simp_all)
       
   238   done
       
   239 
       
   240 lemma erase_fuse:
       
   241   shows "erase (fuse bs r) = erase r"
       
   242   apply(induct r rule: erase.induct)
       
   243   apply(simp_all)
       
   244   done
       
   245 
       
   246 lemma erase_intern [simp]:
       
   247   shows "erase (intern r) = r"
       
   248   apply(induct r)
       
   249   apply(simp_all add: erase_fuse)
       
   250   done
       
   251 
       
   252 lemma erase_bder [simp]:
       
   253   shows "erase (bder a r) = der a (erase r)"
       
   254   apply(induct r rule: erase.induct)
       
   255   apply(simp_all add: erase_fuse bnullable_correctness)
       
   256   done
       
   257 
       
   258 lemma erase_bders [simp]:
       
   259   shows "erase (bders r s) = ders s (erase r)"
       
   260   apply(induct s arbitrary: r )
       
   261   apply(simp_all)
       
   262   done
       
   263 
       
   264 lemma retrieve_encode_STARS:
       
   265   assumes "\<forall>v\<in>set vs. \<Turnstile> v : r \<and> code v = retrieve (intern r) v"
       
   266   shows "code (Stars vs) = retrieve (ASTAR [] (intern r)) (Stars vs)"
       
   267   using assms
       
   268   apply(induct vs)
       
   269   apply(simp_all)
       
   270   done
       
   271 
       
   272 lemma retrieve_fuse2:
       
   273   assumes "\<Turnstile> v : (erase r)"
       
   274   shows "retrieve (fuse bs r) v = bs @ retrieve r v"
       
   275   using assms
       
   276   apply(induct r arbitrary: v bs)
       
   277          apply(auto elim: Prf_elims)[4]
       
   278    defer
       
   279   using retrieve_encode_STARS
       
   280    apply(auto elim!: Prf_elims)[1]
       
   281    apply(case_tac vs)
       
   282     apply(simp)
       
   283    apply(simp)
       
   284   (* AALTs  case *)
       
   285   apply(simp)
       
   286   apply(case_tac x2a)
       
   287    apply(simp)
       
   288    apply(auto elim!: Prf_elims)[1]
       
   289   apply(simp)
       
   290    apply(case_tac list)
       
   291    apply(simp)
       
   292   apply(auto)
       
   293   apply(auto elim!: Prf_elims)[1]
       
   294   done
       
   295 
       
   296 lemma retrieve_fuse:
       
   297   assumes "\<Turnstile> v : r"
       
   298   shows "retrieve (fuse bs (intern r)) v = bs @ retrieve (intern r) v"
       
   299   using assms 
       
   300   by (simp_all add: retrieve_fuse2)
       
   301 
       
   302 
       
   303 lemma retrieve_code:
       
   304   assumes "\<Turnstile> v : r"
       
   305   shows "code v = retrieve (intern r) v"
       
   306   using assms
       
   307   apply(induct v r )
       
   308   apply(simp_all add: retrieve_fuse retrieve_encode_STARS)
       
   309   done
       
   310 
       
   311 lemma r:
       
   312   assumes "bnullable (AALTs bs (a # rs))"
       
   313   shows "bnullable a \<or> (\<not> bnullable a \<and> bnullable (AALTs bs rs))"
       
   314   using assms
       
   315   apply(induct rs)
       
   316    apply(auto)
       
   317   done
       
   318 
       
   319 lemma r0:
       
   320   assumes "bnullable a" 
       
   321   shows  "bmkeps (AALTs bs (a # rs)) = bs @ (bmkeps a)"
       
   322   using assms
       
   323   by (metis bmkeps.simps(3) bmkeps.simps(4) list.exhaust)
       
   324 
       
   325 lemma r1:
       
   326   assumes "\<not> bnullable a" "bnullable (AALTs bs rs)"
       
   327   shows  "bmkeps (AALTs bs (a # rs)) = bmkeps (AALTs bs rs)"
       
   328   using assms
       
   329   apply(induct rs)
       
   330    apply(auto)
       
   331   done
       
   332 
       
   333 lemma r2:
       
   334   assumes "x \<in> set rs" "bnullable x"
       
   335   shows "bnullable (AALTs bs rs)"
       
   336   using assms
       
   337   apply(induct rs)
       
   338    apply(auto)
       
   339   done
       
   340 
       
   341 lemma  r3:
       
   342   assumes "\<not> bnullable r" 
       
   343           " \<exists> x \<in> set rs. bnullable x"
       
   344   shows "retrieve (AALTs bs rs) (mkeps (erase (AALTs bs rs))) =
       
   345          retrieve (AALTs bs (r # rs)) (mkeps (erase (AALTs bs (r # rs))))"
       
   346   using assms
       
   347   apply(induct rs arbitrary: r bs)
       
   348    apply(auto)[1]
       
   349   apply(auto)
       
   350   using bnullable_correctness apply blast
       
   351     apply(auto simp add: bnullable_correctness mkeps_nullable retrieve_fuse2)
       
   352    apply(subst retrieve_fuse2[symmetric])
       
   353   apply (smt bnullable.simps(4) bnullable_correctness erase.simps(5) erase.simps(6) insert_iff list.exhaust list.set(2) mkeps.simps(3) mkeps_nullable)
       
   354    apply(simp)
       
   355   apply(case_tac "bnullable a")
       
   356   apply (smt append_Nil2 bnullable.simps(4) bnullable_correctness erase.simps(5) erase.simps(6) fuse.simps(4) insert_iff list.exhaust list.set(2) mkeps.simps(3) mkeps_nullable retrieve_fuse2)
       
   357   apply(drule_tac x="a" in meta_spec)
       
   358   apply(drule_tac x="bs" in meta_spec)
       
   359   apply(drule meta_mp)
       
   360    apply(simp)
       
   361   apply(drule meta_mp)
       
   362    apply(auto)
       
   363   apply(subst retrieve_fuse2[symmetric])
       
   364   apply(case_tac rs)
       
   365     apply(simp)
       
   366    apply(auto)[1]
       
   367       apply (simp add: bnullable_correctness)
       
   368   apply (metis append_Nil2 bnullable_correctness erase_fuse fuse.simps(4) list.set_intros(1) mkeps.simps(3) mkeps_nullable nullable.simps(4) r2)
       
   369     apply (simp add: bnullable_correctness)
       
   370   apply (metis append_Nil2 bnullable_correctness erase.simps(6) erase_fuse fuse.simps(4) list.set_intros(2) mkeps.simps(3) mkeps_nullable r2)
       
   371   apply(simp)
       
   372   done
       
   373 
       
   374 
       
   375 lemma t: 
       
   376   assumes "\<forall>r \<in> set rs. nullable (erase r) \<longrightarrow> bmkeps r = retrieve r (mkeps (erase r))" 
       
   377           "nullable (erase (AALTs bs rs))"
       
   378   shows " bmkeps (AALTs bs rs) = retrieve (AALTs bs rs) (mkeps (erase (AALTs bs rs)))"
       
   379   using assms
       
   380   apply(induct rs arbitrary: bs)
       
   381    apply(simp)
       
   382   apply(auto simp add: bnullable_correctness)
       
   383    apply(case_tac rs)
       
   384      apply(auto simp add: bnullable_correctness)[2]
       
   385    apply(subst r1)
       
   386      apply(simp)
       
   387     apply(rule r2)
       
   388      apply(assumption)
       
   389     apply(simp)
       
   390    apply(drule_tac x="bs" in meta_spec)
       
   391    apply(drule meta_mp)
       
   392     apply(auto)[1]
       
   393    prefer 2
       
   394   apply(case_tac "bnullable a")
       
   395     apply(subst r0)
       
   396      apply blast
       
   397     apply(subgoal_tac "nullable (erase a)")
       
   398   prefer 2
       
   399   using bnullable_correctness apply blast
       
   400   apply (metis (no_types, lifting) erase.simps(5) erase.simps(6) list.exhaust mkeps.simps(3) retrieve.simps(3) retrieve.simps(4))
       
   401   apply(subst r1)
       
   402      apply(simp)
       
   403   using r2 apply blast
       
   404   apply(drule_tac x="bs" in meta_spec)
       
   405    apply(drule meta_mp)
       
   406     apply(auto)[1]
       
   407    apply(simp)
       
   408   using r3 apply blast
       
   409   apply(auto)
       
   410   using r3 by blast
       
   411 
       
   412 lemma bmkeps_retrieve:
       
   413   assumes "nullable (erase r)"
       
   414   shows "bmkeps r = retrieve r (mkeps (erase r))"
       
   415   using assms
       
   416   apply(induct r)
       
   417          apply(simp)
       
   418         apply(simp)
       
   419        apply(simp)
       
   420     apply(simp)
       
   421    defer
       
   422    apply(simp)
       
   423   apply(rule t)
       
   424    apply(auto)
       
   425   done
       
   426 
       
   427 lemma bder_retrieve:
       
   428   assumes "\<Turnstile> v : der c (erase r)"
       
   429   shows "retrieve (bder c r) v = retrieve r (injval (erase r) c v)"
       
   430   using assms
       
   431   apply(induct r arbitrary: v rule: erase.induct)
       
   432          apply(simp)
       
   433          apply(erule Prf_elims)
       
   434         apply(simp)
       
   435         apply(erule Prf_elims) 
       
   436         apply(simp)
       
   437       apply(case_tac "c = ca")
       
   438        apply(simp)
       
   439        apply(erule Prf_elims)
       
   440        apply(simp)
       
   441       apply(simp)
       
   442        apply(erule Prf_elims)
       
   443   apply(simp)
       
   444       apply(erule Prf_elims)
       
   445      apply(simp)
       
   446     apply(simp)
       
   447   apply(rename_tac "r\<^sub>1" "r\<^sub>2" rs v)
       
   448     apply(erule Prf_elims)
       
   449      apply(simp)
       
   450     apply(simp)
       
   451     apply(case_tac rs)
       
   452      apply(simp)
       
   453     apply(simp)
       
   454   apply (smt Prf_elims(3) injval.simps(2) injval.simps(3) retrieve.simps(4) retrieve.simps(5) same_append_eq)
       
   455    apply(simp)
       
   456    apply(case_tac "nullable (erase r1)")
       
   457     apply(simp)
       
   458   apply(erule Prf_elims)
       
   459      apply(subgoal_tac "bnullable r1")
       
   460   prefer 2
       
   461   using bnullable_correctness apply blast
       
   462     apply(simp)
       
   463      apply(erule Prf_elims)
       
   464      apply(simp)
       
   465    apply(subgoal_tac "bnullable r1")
       
   466   prefer 2
       
   467   using bnullable_correctness apply blast
       
   468     apply(simp)
       
   469     apply(simp add: retrieve_fuse2)
       
   470     apply(simp add: bmkeps_retrieve)
       
   471    apply(simp)
       
   472    apply(erule Prf_elims)
       
   473    apply(simp)
       
   474   using bnullable_correctness apply blast
       
   475   apply(rename_tac bs r v)
       
   476   apply(simp)
       
   477   apply(erule Prf_elims)
       
   478      apply(clarify)
       
   479   apply(erule Prf_elims)
       
   480   apply(clarify)
       
   481   apply(subst injval.simps)
       
   482   apply(simp del: retrieve.simps)
       
   483   apply(subst retrieve.simps)
       
   484   apply(subst retrieve.simps)
       
   485   apply(simp)
       
   486   apply(simp add: retrieve_fuse2)
       
   487   done
       
   488   
       
   489 
       
   490 
       
   491 lemma MAIN_decode:
       
   492   assumes "\<Turnstile> v : ders s r"
       
   493   shows "Some (flex r id s v) = decode (retrieve (bders (intern r) s) v) r"
       
   494   using assms
       
   495 proof (induct s arbitrary: v rule: rev_induct)
       
   496   case Nil
       
   497   have "\<Turnstile> v : ders [] r" by fact
       
   498   then have "\<Turnstile> v : r" by simp
       
   499   then have "Some v = decode (retrieve (intern r) v) r"
       
   500     using decode_code retrieve_code by auto
       
   501   then show "Some (flex r id [] v) = decode (retrieve (bders (intern r) []) v) r"
       
   502     by simp
       
   503 next
       
   504   case (snoc c s v)
       
   505   have IH: "\<And>v. \<Turnstile> v : ders s r \<Longrightarrow> 
       
   506      Some (flex r id s v) = decode (retrieve (bders (intern r) s) v) r" by fact
       
   507   have asm: "\<Turnstile> v : ders (s @ [c]) r" by fact
       
   508   then have asm2: "\<Turnstile> injval (ders s r) c v : ders s r" 
       
   509     by (simp add: Prf_injval ders_append)
       
   510   have "Some (flex r id (s @ [c]) v) = Some (flex r id s (injval (ders s r) c v))"
       
   511     by (simp add: flex_append)
       
   512   also have "... = decode (retrieve (bders (intern r) s) (injval (ders s r) c v)) r"
       
   513     using asm2 IH by simp
       
   514   also have "... = decode (retrieve (bder c (bders (intern r) s)) v) r"
       
   515     using asm by (simp_all add: bder_retrieve ders_append)
       
   516   finally show "Some (flex r id (s @ [c]) v) = 
       
   517                  decode (retrieve (bders (intern r) (s @ [c])) v) r" by (simp add: bders_append)
       
   518 qed
       
   519 
       
   520 
       
   521 definition blex where
       
   522  "blex a s \<equiv> if bnullable (bders a s) then Some (bmkeps (bders a s)) else None"
       
   523 
       
   524 
       
   525 
       
   526 definition blexer where
       
   527  "blexer r s \<equiv> if bnullable (bders (intern r) s) then 
       
   528                 decode (bmkeps (bders (intern r) s)) r else None"
       
   529 
       
   530 lemma blexer_correctness:
       
   531   shows "blexer r s = lexer r s"
       
   532 proof -
       
   533   { define bds where "bds \<equiv> bders (intern r) s"
       
   534     define ds  where "ds \<equiv> ders s r"
       
   535     assume asm: "nullable ds"
       
   536     have era: "erase bds = ds" 
       
   537       unfolding ds_def bds_def by simp
       
   538     have mke: "\<Turnstile> mkeps ds : ds"
       
   539       using asm by (simp add: mkeps_nullable)
       
   540     have "decode (bmkeps bds) r = decode (retrieve bds (mkeps ds)) r"
       
   541       using bmkeps_retrieve
       
   542       using asm era by (simp add: bmkeps_retrieve)
       
   543     also have "... =  Some (flex r id s (mkeps ds))"
       
   544       using mke by (simp_all add: MAIN_decode ds_def bds_def)
       
   545     finally have "decode (bmkeps bds) r = Some (flex r id s (mkeps ds))" 
       
   546       unfolding bds_def ds_def .
       
   547   }
       
   548   then show "blexer r s = lexer r s"
       
   549     unfolding blexer_def lexer_flex
       
   550     apply(subst bnullable_correctness[symmetric])
       
   551     apply(simp)
       
   552     done
       
   553 qed
       
   554 
       
   555 
       
   556 fun distinctBy :: "'a list \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'b set \<Rightarrow> 'a list"
       
   557   where
       
   558   "distinctBy [] f acc = []"
       
   559 | "distinctBy (x#xs) f acc = 
       
   560      (if (f x) \<in> acc then distinctBy xs f acc 
       
   561       else x # (distinctBy xs f ({f x} \<union> acc)))"
       
   562 
       
   563 fun flts :: "arexp list \<Rightarrow> arexp list"
       
   564   where 
       
   565   "flts [] = []"
       
   566 | "flts (AZERO # rs) = flts rs"
       
   567 | "flts ((AALTs bs  rs1) # rs) = (map (fuse bs) rs1) @ flts rs"
       
   568 | "flts (r1 # rs) = r1 # flts rs"
       
   569 
       
   570 fun li :: "bit list \<Rightarrow> arexp list \<Rightarrow> arexp"
       
   571   where
       
   572   "li _ [] = AZERO"
       
   573 | "li bs [a] = fuse bs a"
       
   574 | "li bs as = AALTs bs as"
       
   575 
       
   576 
       
   577 fun bsimp_ASEQ :: "bit list \<Rightarrow> arexp \<Rightarrow> arexp \<Rightarrow> arexp"
       
   578   where
       
   579   "bsimp_ASEQ _ AZERO _ = AZERO"
       
   580 | "bsimp_ASEQ _ _ AZERO = AZERO"
       
   581 | "bsimp_ASEQ bs1 (AONE bs2) r2 = fuse (bs1 @ bs2) r2"
       
   582 | "bsimp_ASEQ bs1 r1 r2 = ASEQ  bs1 r1 r2"
       
   583 
       
   584 
       
   585 fun bsimp_AALTs :: "bit list \<Rightarrow> arexp list \<Rightarrow> arexp"
       
   586   where
       
   587   "bsimp_AALTs _ [] = AZERO"
       
   588 | "bsimp_AALTs bs1 [r] = fuse bs1 r"
       
   589 | "bsimp_AALTs bs1 rs = AALTs bs1 rs"
       
   590 
       
   591 
       
   592 fun bsimp :: "arexp \<Rightarrow> arexp" 
       
   593   where
       
   594   "bsimp (ASEQ bs1 r1 r2) = bsimp_ASEQ bs1 (bsimp r1) (bsimp r2)"
       
   595 | "bsimp (AALTs bs1 rs) = bsimp_AALTs bs1 (flts (map bsimp rs))"
       
   596 | "bsimp r = r"
       
   597 
       
   598 
       
   599 
       
   600 
       
   601 fun 
       
   602   bders_simp :: "arexp \<Rightarrow> string \<Rightarrow> arexp"
       
   603 where
       
   604   "bders_simp r [] = r"
       
   605 | "bders_simp r (c # s) = bders_simp (bsimp (bder c r)) s"
       
   606 
       
   607 definition blexer_simp where
       
   608  "blexer_simp r s \<equiv> if bnullable (bders_simp (intern r) s) then 
       
   609                 decode (bmkeps (bders_simp (intern r) s)) r else None"
       
   610 
       
   611 
       
   612 lemma asize0:
       
   613   shows "0 < asize r"
       
   614   apply(induct  r)
       
   615        apply(auto)
       
   616   done
       
   617 
       
   618 
       
   619 lemma bders_simp_append:
       
   620   shows "bders_simp r (s1 @ s2) = bders_simp (bders_simp r s1) s2"
       
   621   apply(induct s1 arbitrary: r s2)
       
   622    apply(simp)
       
   623   apply(simp)
       
   624   done
       
   625 
       
   626 lemma bsimp_ASEQ_size:
       
   627   shows "asize (bsimp_ASEQ bs r1 r2) \<le> Suc (asize r1 + asize r2)"
       
   628   apply(induct bs r1 r2 rule: bsimp_ASEQ.induct)
       
   629   apply(auto)
       
   630   done
       
   631 
       
   632 lemma fuse_size:
       
   633   shows "asize (fuse bs r) = asize r"
       
   634   apply(induct r)
       
   635   apply(auto)
       
   636   done
       
   637 
       
   638 lemma flts_size:
       
   639   shows "sum_list (map asize (flts rs)) \<le> sum_list (map asize rs)"
       
   640   apply(induct rs rule: flts.induct)
       
   641         apply(simp_all)
       
   642   by (metis (mono_tags, lifting) add_mono comp_apply eq_imp_le fuse_size le_SucI map_eq_conv)
       
   643   
       
   644 
       
   645 lemma bsimp_AALTs_size:
       
   646   shows "asize (bsimp_AALTs bs rs) \<le> Suc (sum_list (map asize rs))"
       
   647   apply(induct rs rule: bsimp_AALTs.induct)
       
   648   apply(auto simp add: fuse_size)
       
   649   done
       
   650 
       
   651 
       
   652 lemma bsimp_size:
       
   653   shows "asize (bsimp r) \<le> asize r"
       
   654   apply(induct r)
       
   655        apply(simp_all)
       
   656    apply (meson Suc_le_mono add_mono_thms_linordered_semiring(1) bsimp_ASEQ_size le_trans)
       
   657   apply(rule le_trans)
       
   658    apply(rule bsimp_AALTs_size)
       
   659   apply(simp)
       
   660    apply(rule le_trans)
       
   661    apply(rule flts_size)
       
   662   by (simp add: sum_list_mono)
       
   663 
       
   664 lemma bsimp_asize0:
       
   665   shows "(\<Sum>x\<leftarrow>rs. asize (bsimp x)) \<le> sum_list (map asize rs)"
       
   666   apply(induct rs)
       
   667    apply(auto)
       
   668   by (simp add: add_mono bsimp_size)
       
   669 
       
   670 lemma bsimp_AALTs_size2:
       
   671   assumes "\<forall>r \<in> set  rs. nonalt r"
       
   672   shows "asize (bsimp_AALTs bs rs) \<ge> sum_list (map asize rs)"
       
   673   using assms
       
   674   apply(induct rs rule: bsimp_AALTs.induct)
       
   675     apply(simp_all add: fuse_size)
       
   676   done
       
   677 
       
   678 
       
   679 lemma qq:
       
   680   shows "map (asize \<circ> fuse bs) rs = map asize rs"
       
   681   apply(induct rs)
       
   682    apply(auto simp add: fuse_size)
       
   683   done
       
   684 
       
   685 lemma flts_size2:
       
   686   assumes "\<exists>bs rs'. AALTs bs  rs' \<in> set rs"
       
   687   shows "sum_list (map asize (flts rs)) < sum_list (map asize rs)"
       
   688   using assms
       
   689   apply(induct rs)
       
   690    apply(auto simp add: qq)
       
   691    apply (simp add: flts_size less_Suc_eq_le)
       
   692   apply(case_tac a)
       
   693        apply(auto simp add: qq)
       
   694    prefer 2
       
   695    apply (simp add: flts_size le_imp_less_Suc)
       
   696   using less_Suc_eq by auto
       
   697 
       
   698 lemma bsimp_AALTs_size3:
       
   699   assumes "\<exists>r \<in> set  (map bsimp rs). \<not>nonalt r"
       
   700   shows "asize (bsimp (AALTs bs rs)) < asize (AALTs bs rs)"
       
   701   using assms flts_size2
       
   702   apply  -
       
   703   apply(clarify)
       
   704   apply(simp)
       
   705   apply(drule_tac x="map bsimp rs" in meta_spec)
       
   706   apply(drule meta_mp)
       
   707   apply (metis list.set_map nonalt.elims(3))
       
   708   apply(simp)
       
   709   apply(rule order_class.order.strict_trans1)
       
   710    apply(rule bsimp_AALTs_size)
       
   711   apply(simp)
       
   712   by (smt Suc_leI bsimp_asize0 comp_def le_imp_less_Suc le_trans map_eq_conv not_less_eq)
       
   713 
       
   714 
       
   715 
       
   716 
       
   717 lemma L_bsimp_ASEQ:
       
   718   "L (SEQ (erase r1) (erase r2)) = L (erase (bsimp_ASEQ bs r1 r2))"
       
   719   apply(induct bs r1 r2 rule: bsimp_ASEQ.induct)
       
   720   apply(simp_all)
       
   721   by (metis erase_fuse fuse.simps(4))
       
   722 
       
   723 lemma L_bsimp_AALTs:
       
   724   "L (erase (AALTs bs rs)) = L (erase (bsimp_AALTs bs rs))"
       
   725   apply(induct bs rs rule: bsimp_AALTs.induct)
       
   726   apply(simp_all add: erase_fuse)
       
   727   done
       
   728 
       
   729 lemma L_erase_AALTs:
       
   730   shows "L (erase (AALTs bs rs)) = \<Union> (L ` erase ` (set rs))"
       
   731   apply(induct rs)
       
   732    apply(simp)
       
   733   apply(simp)
       
   734   apply(case_tac rs)
       
   735    apply(simp)
       
   736   apply(simp)
       
   737   done
       
   738 
       
   739 lemma L_erase_flts:
       
   740   shows "\<Union> (L ` erase ` (set (flts rs))) = \<Union> (L ` erase ` (set rs))"
       
   741   apply(induct rs rule: flts.induct)
       
   742         apply(simp_all)
       
   743   apply(auto)
       
   744   using L_erase_AALTs erase_fuse apply auto[1]
       
   745   by (simp add: L_erase_AALTs erase_fuse)
       
   746 
       
   747 
       
   748 lemma L_bsimp_erase:
       
   749   shows "L (erase r) = L (erase (bsimp r))"
       
   750   apply(induct r)
       
   751   apply(simp)
       
   752   apply(simp)
       
   753   apply(simp)
       
   754   apply(auto simp add: Sequ_def)[1]
       
   755   apply(subst L_bsimp_ASEQ[symmetric])
       
   756   apply(auto simp add: Sequ_def)[1]
       
   757   apply(subst (asm)  L_bsimp_ASEQ[symmetric])
       
   758   apply(auto simp add: Sequ_def)[1]
       
   759    apply(simp)
       
   760    apply(subst L_bsimp_AALTs[symmetric])
       
   761    defer
       
   762    apply(simp)
       
   763   apply(subst (2)L_erase_AALTs)
       
   764   apply(subst L_erase_flts)
       
   765   apply(auto)
       
   766    apply (simp add: L_erase_AALTs)
       
   767   using L_erase_AALTs by blast
       
   768 
       
   769 lemma bsimp_ASEQ0:
       
   770   shows "bsimp_ASEQ bs r1 AZERO = AZERO"
       
   771   apply(induct r1)
       
   772   apply(auto)
       
   773   done
       
   774 
       
   775 
       
   776 
       
   777 lemma bsimp_ASEQ1:
       
   778   assumes "r1 \<noteq> AZERO" "r2 \<noteq> AZERO" "\<forall>bs. r1 \<noteq> AONE bs"
       
   779   shows "bsimp_ASEQ bs r1 r2 = ASEQ bs r1 r2"
       
   780   using assms
       
   781   apply(induct bs r1 r2 rule: bsimp_ASEQ.induct)
       
   782   apply(auto)
       
   783   done
       
   784 
       
   785 lemma bsimp_ASEQ2:
       
   786   shows "bsimp_ASEQ bs (AONE bs1) r2 = fuse (bs @ bs1) r2"
       
   787   apply(induct r2)
       
   788   apply(auto)
       
   789   done
       
   790 
       
   791 
       
   792 lemma L_bders_simp:
       
   793   shows "L (erase (bders_simp r s)) = L (erase (bders r s))"
       
   794   apply(induct s arbitrary: r rule: rev_induct)
       
   795    apply(simp)
       
   796   apply(simp)
       
   797   apply(simp add: ders_append)
       
   798   apply(simp add: bders_simp_append)
       
   799   apply(simp add: L_bsimp_erase[symmetric])
       
   800   by (simp add: der_correctness)
       
   801 
       
   802 lemma b1:
       
   803   "bsimp_ASEQ bs1 (AONE bs) r =  fuse (bs1 @ bs) r" 
       
   804   apply(induct r)
       
   805        apply(auto)
       
   806   done
       
   807 
       
   808 lemma b2:
       
   809   assumes "bnullable r"
       
   810   shows "bmkeps (fuse bs r) = bs @ bmkeps r"
       
   811   by (simp add: assms bmkeps_retrieve bnullable_correctness erase_fuse mkeps_nullable retrieve_fuse2)
       
   812 
       
   813 lemma b3:
       
   814   shows "bnullable r = bnullable (bsimp r)"
       
   815   using L_bsimp_erase bnullable_correctness nullable_correctness by auto
       
   816 
       
   817 
       
   818 lemma b4:
       
   819   shows "bnullable (bders_simp r s) = bnullable (bders r s)"
       
   820   by (metis L_bders_simp bnullable_correctness lexer.simps(1) lexer_correct_None option.distinct(1))
       
   821 
       
   822 lemma q1:
       
   823   assumes "\<forall>r \<in> set rs. bmkeps(bsimp r) = bmkeps r"
       
   824   shows "map (\<lambda>r. bmkeps(bsimp r)) rs = map bmkeps rs"
       
   825   using assms
       
   826   apply(induct rs)
       
   827   apply(simp)
       
   828   apply(simp)
       
   829   done
       
   830 
       
   831 lemma q3:
       
   832   assumes "\<exists>r \<in> set rs. bnullable r"
       
   833   shows "bmkeps (AALTs bs rs) = bmkeps (bsimp_AALTs bs rs)"
       
   834   using assms
       
   835   apply(induct bs rs rule: bsimp_AALTs.induct)
       
   836     apply(simp)
       
   837    apply(simp)
       
   838   apply (simp add: b2)
       
   839   apply(simp)
       
   840   done
       
   841 
       
   842 lemma qq1:
       
   843   assumes "\<exists>r \<in> set rs. bnullable r"
       
   844   shows "bmkeps (AALTs bs (rs @ rs1)) = bmkeps (AALTs bs rs)"
       
   845   using assms
       
   846   apply(induct rs arbitrary: rs1 bs)
       
   847   apply(simp)
       
   848   apply(simp)
       
   849   by (metis Nil_is_append_conv bmkeps.simps(4) neq_Nil_conv r0 split_list_last)
       
   850 
       
   851 lemma qq2:
       
   852   assumes "\<forall>r \<in> set rs. \<not> bnullable r" "\<exists>r \<in> set rs1. bnullable r"
       
   853   shows "bmkeps (AALTs bs (rs @ rs1)) = bmkeps (AALTs bs rs1)"
       
   854   using assms
       
   855   apply(induct rs arbitrary: rs1 bs)
       
   856   apply(simp)
       
   857   apply(simp)
       
   858   by (metis append_assoc in_set_conv_decomp r1 r2)
       
   859   
       
   860 lemma qq3:
       
   861   shows "bnullable (AALTs bs rs) = (\<exists>r \<in> set rs. bnullable r)"
       
   862   apply(induct rs arbitrary: bs)
       
   863   apply(simp)
       
   864   apply(simp)
       
   865   done
       
   866 
       
   867 lemma fuse_empty:
       
   868   shows "fuse [] r = r"
       
   869   apply(induct r)
       
   870        apply(auto)
       
   871   done
       
   872 
       
   873 lemma flts_fuse:
       
   874   shows "map (fuse bs) (flts rs) = flts (map (fuse bs) rs)"
       
   875   apply(induct rs arbitrary: bs rule: flts.induct)
       
   876         apply(auto simp add: fuse_append)
       
   877   done
       
   878 
       
   879 lemma bsimp_ASEQ_fuse:
       
   880   shows "fuse bs1 (bsimp_ASEQ bs2 r1 r2) = bsimp_ASEQ (bs1 @ bs2) r1 r2"
       
   881   apply(induct r1 r2 arbitrary: bs1 bs2 rule: bsimp_ASEQ.induct)
       
   882   apply(auto)
       
   883   done
       
   884 
       
   885 lemma bsimp_AALTs_fuse:
       
   886   assumes "\<forall>r \<in> set rs. fuse bs1 (fuse bs2 r) = fuse (bs1 @ bs2) r"
       
   887   shows "fuse bs1 (bsimp_AALTs bs2 rs) = bsimp_AALTs (bs1 @ bs2) rs"
       
   888   using assms
       
   889   apply(induct bs2 rs arbitrary: bs1 rule: bsimp_AALTs.induct)
       
   890   apply(auto)
       
   891   done
       
   892 
       
   893 
       
   894 
       
   895 lemma bsimp_fuse:
       
   896   shows "fuse bs (bsimp r) = bsimp (fuse bs r)"
       
   897 apply(induct r arbitrary: bs)
       
   898        apply(simp)
       
   899       apply(simp)
       
   900      apply(simp)
       
   901     prefer 3
       
   902     apply(simp)
       
   903    apply(simp)
       
   904    apply (simp add: bsimp_ASEQ_fuse)
       
   905   apply(simp)
       
   906   by (simp add: bsimp_AALTs_fuse fuse_append)
       
   907 
       
   908 lemma bsimp_fuse_AALTs:
       
   909   shows "fuse bs (bsimp (AALTs [] rs)) = bsimp (AALTs bs rs)"
       
   910   apply(subst bsimp_fuse) 
       
   911   apply(simp)
       
   912   done
       
   913 
       
   914 lemma bsimp_fuse_AALTs2:
       
   915   shows "fuse bs (bsimp_AALTs [] rs) = bsimp_AALTs bs rs"
       
   916   using bsimp_AALTs_fuse fuse_append by auto
       
   917   
       
   918 
       
   919 lemma bsimp_ASEQ_idem:
       
   920   assumes "bsimp (bsimp r1) = bsimp r1" "bsimp (bsimp r2) = bsimp r2"
       
   921   shows "bsimp (bsimp_ASEQ x1 (bsimp r1) (bsimp r2)) = bsimp_ASEQ x1 (bsimp r1) (bsimp r2)"
       
   922   using assms
       
   923   apply(case_tac "bsimp r1 = AZERO")
       
   924     apply(simp)
       
   925  apply(case_tac "bsimp r2 = AZERO")
       
   926     apply(simp)
       
   927   apply (metis bnullable.elims(2) bnullable.elims(3) bsimp.simps(3) bsimp_ASEQ.simps(2) bsimp_ASEQ.simps(3) bsimp_ASEQ.simps(4) bsimp_ASEQ.simps(5) bsimp_ASEQ.simps(6))  
       
   928   apply(case_tac "\<exists>bs. bsimp r1 = AONE bs")
       
   929     apply(auto)[1]
       
   930     apply(subst bsimp_ASEQ2)
       
   931    apply(subst bsimp_ASEQ2)
       
   932   apply (metis assms(2) bsimp_fuse)
       
   933       apply(subst bsimp_ASEQ1)
       
   934       apply(auto)
       
   935   done
       
   936 
       
   937 
       
   938 fun nonnested :: "arexp \<Rightarrow> bool"
       
   939   where
       
   940   "nonnested (AALTs bs2 []) = True"
       
   941 | "nonnested (AALTs bs2 ((AALTs bs1 rs1) # rs2)) = False"
       
   942 | "nonnested (AALTs bs2 (r # rs2)) = nonnested (AALTs bs2 rs2)"
       
   943 | "nonnested r = True"
       
   944 
       
   945 
       
   946 lemma  k0:
       
   947   shows "flts (r # rs1) = flts [r] @ flts rs1"
       
   948   apply(induct r arbitrary: rs1)
       
   949    apply(auto)
       
   950   done
       
   951 
       
   952 lemma  k00:
       
   953   shows "flts (rs1 @ rs2) = flts rs1 @ flts rs2"
       
   954   apply(induct rs1 arbitrary: rs2)
       
   955    apply(auto)
       
   956   by (metis append.assoc k0)
       
   957 
       
   958 lemma  k0a:
       
   959   shows "flts [AALTs bs rs] = map (fuse bs)  rs"
       
   960   apply(simp)
       
   961   done
       
   962 
       
   963 
       
   964 lemma  k0b:
       
   965   assumes "nonalt r" "r \<noteq> AZERO"
       
   966   shows "flts [r] = [r]"
       
   967   using assms
       
   968   apply(case_tac  r)
       
   969   apply(simp_all)
       
   970   done
       
   971 
       
   972 lemma nn1:
       
   973   assumes "nonnested (AALTs bs rs)"
       
   974   shows "\<nexists>bs1 rs1. flts rs = [AALTs bs1 rs1]"
       
   975   using assms
       
   976   apply(induct rs rule: flts.induct)
       
   977   apply(auto)
       
   978   done
       
   979 
       
   980 lemma nn1q:
       
   981   assumes "nonnested (AALTs bs rs)"
       
   982   shows "\<nexists>bs1 rs1. AALTs bs1 rs1 \<in> set (flts rs)"
       
   983   using assms
       
   984   apply(induct rs rule: flts.induct)
       
   985   apply(auto)
       
   986   done
       
   987 
       
   988 lemma nn1qq:
       
   989   assumes "nonnested (AALTs bs rs)"
       
   990   shows "\<nexists>bs1 rs1. AALTs bs1 rs1 \<in> set rs"
       
   991   using assms
       
   992   apply(induct rs rule: flts.induct)
       
   993   apply(auto)
       
   994   done
       
   995 
       
   996 lemma nn10:
       
   997   assumes "nonnested (AALTs cs rs)" 
       
   998   shows "nonnested (AALTs (bs @ cs) rs)"
       
   999   using assms
       
  1000   apply(induct rs arbitrary: cs bs)
       
  1001    apply(simp_all)
       
  1002   apply(case_tac a)
       
  1003        apply(simp_all)
       
  1004   done
       
  1005 
       
  1006 lemma nn11a:
       
  1007   assumes "nonalt r"
       
  1008   shows "nonalt (fuse bs r)"
       
  1009   using assms
       
  1010   apply(induct r)
       
  1011        apply(auto)
       
  1012   done
       
  1013 
       
  1014 
       
  1015 lemma nn1a:
       
  1016   assumes "nonnested r"
       
  1017   shows "nonnested (fuse bs r)"
       
  1018   using assms
       
  1019   apply(induct bs r arbitrary: rule: fuse.induct)
       
  1020        apply(simp_all add: nn10)
       
  1021   done  
       
  1022 
       
  1023 lemma n0:
       
  1024   shows "nonnested (AALTs bs rs) \<longleftrightarrow> (\<forall>r \<in> set rs. nonalt r)"
       
  1025   apply(induct rs  arbitrary: bs)
       
  1026    apply(auto)
       
  1027     apply (metis list.set_intros(1) nn1qq nonalt.elims(3))
       
  1028    apply (metis list.set_intros(2) nn1qq nonalt.elims(3))
       
  1029   by (metis nonalt.elims(2) nonnested.simps(3) nonnested.simps(4) nonnested.simps(5) nonnested.simps(6) nonnested.simps(7))
       
  1030 
       
  1031   
       
  1032   
       
  1033 
       
  1034 lemma nn1c:
       
  1035   assumes "\<forall>r \<in> set rs. nonnested r"
       
  1036   shows "\<forall>r \<in> set (flts rs). nonalt r"
       
  1037   using assms
       
  1038   apply(induct rs rule: flts.induct)
       
  1039         apply(auto)
       
  1040   apply(rule nn11a)
       
  1041   by (metis nn1qq nonalt.elims(3))
       
  1042 
       
  1043 lemma nn1bb:
       
  1044   assumes "\<forall>r \<in> set rs. nonalt r"
       
  1045   shows "nonnested (bsimp_AALTs bs rs)"
       
  1046   using assms
       
  1047   apply(induct bs rs rule: bsimp_AALTs.induct)
       
  1048     apply(auto)
       
  1049    apply (metis nn11a nonalt.simps(1) nonnested.elims(3))
       
  1050   using n0 by auto
       
  1051     
       
  1052 lemma nn1b:
       
  1053   shows "nonnested (bsimp r)"
       
  1054   apply(induct r)
       
  1055        apply(simp_all)
       
  1056   apply(case_tac "bsimp r1 = AZERO")
       
  1057     apply(simp)
       
  1058  apply(case_tac "bsimp r2 = AZERO")
       
  1059    apply(simp)
       
  1060     apply(subst bsimp_ASEQ0)
       
  1061   apply(simp)
       
  1062   apply(case_tac "\<exists>bs. bsimp r1 = AONE bs")
       
  1063     apply(auto)[1]
       
  1064     apply(subst bsimp_ASEQ2)
       
  1065   apply (simp add: nn1a)    
       
  1066    apply(subst bsimp_ASEQ1)
       
  1067       apply(auto)
       
  1068   apply(rule nn1bb)
       
  1069   apply(auto)
       
  1070   by (metis (mono_tags, hide_lams) imageE nn1c set_map)
       
  1071 
       
  1072 lemma nn1d:
       
  1073   assumes "bsimp r = AALTs bs rs"
       
  1074   shows "\<forall>r1 \<in> set rs. \<forall>  bs. r1 \<noteq> AALTs bs  rs2"
       
  1075   using nn1b assms
       
  1076   by (metis nn1qq)
       
  1077 
       
  1078 lemma nn_flts:
       
  1079   assumes "nonnested (AALTs bs rs)"
       
  1080   shows "\<forall>r \<in>  set (flts rs). nonalt r"
       
  1081   using assms
       
  1082   apply(induct rs arbitrary: bs rule: flts.induct)
       
  1083         apply(auto)
       
  1084   done
       
  1085 
       
  1086 lemma rt:
       
  1087   shows "sum_list (map asize (flts (map bsimp rs))) \<le> sum_list (map asize rs)"
       
  1088   apply(induct rs)
       
  1089    apply(simp)
       
  1090   apply(simp)
       
  1091   apply(subst  k0)
       
  1092   apply(simp)
       
  1093   by (smt add_le_cancel_right add_mono bsimp_size flts.simps(1) flts_size k0 le_iff_add list.simps(9) map_append sum_list.Cons sum_list.append trans_le_add1)
       
  1094 
       
  1095 lemma bsimp_AALTs_qq:
       
  1096   assumes "1 < length rs"
       
  1097   shows "bsimp_AALTs bs rs = AALTs bs  rs"
       
  1098   using  assms
       
  1099   apply(case_tac rs)
       
  1100    apply(simp)
       
  1101   apply(case_tac list)
       
  1102    apply(simp_all)
       
  1103   done
       
  1104 
       
  1105 
       
  1106 lemma bsimp_AALTs1:
       
  1107   assumes "nonalt r"
       
  1108   shows "bsimp_AALTs bs (flts [r]) = fuse bs r"
       
  1109   using  assms
       
  1110   apply(case_tac r)
       
  1111    apply(simp_all)
       
  1112   done
       
  1113 
       
  1114 lemma bbbbs:
       
  1115   assumes "good r" "r = AALTs bs1 rs"
       
  1116   shows "bsimp_AALTs bs (flts [r]) = AALTs bs (map (fuse bs1) rs)"
       
  1117   using  assms
       
  1118   by (metis (no_types, lifting) Nil_is_map_conv append.left_neutral append_butlast_last_id bsimp_AALTs.elims butlast.simps(2) good.simps(4) good.simps(5) k0a map_butlast)
       
  1119 
       
  1120 lemma bbbbs1:
       
  1121   shows "nonalt r \<or> (\<exists>bs rs. r  = AALTs bs rs)"
       
  1122   using nonalt.elims(3) by auto
       
  1123   
       
  1124 
       
  1125 lemma good_fuse:
       
  1126   shows "good (fuse bs r) = good r"
       
  1127   apply(induct r arbitrary: bs)
       
  1128        apply(auto)
       
  1129      apply(case_tac r1)
       
  1130           apply(simp_all)
       
  1131   apply(case_tac r2)
       
  1132           apply(simp_all)
       
  1133   apply(case_tac r2)
       
  1134             apply(simp_all)
       
  1135   apply(case_tac r2)
       
  1136            apply(simp_all)
       
  1137   apply(case_tac r2)
       
  1138           apply(simp_all)
       
  1139   apply(case_tac r1)
       
  1140           apply(simp_all)
       
  1141   apply(case_tac r2)
       
  1142            apply(simp_all)
       
  1143   apply(case_tac r2)
       
  1144            apply(simp_all)
       
  1145   apply(case_tac r2)
       
  1146            apply(simp_all)
       
  1147   apply(case_tac r2)
       
  1148          apply(simp_all)
       
  1149   apply(case_tac x2a)
       
  1150     apply(simp_all)
       
  1151   apply(case_tac list)
       
  1152     apply(simp_all)
       
  1153   apply(case_tac x2a)
       
  1154     apply(simp_all)
       
  1155   apply(case_tac list)
       
  1156     apply(simp_all)
       
  1157   done
       
  1158 
       
  1159 lemma good0:
       
  1160   assumes "rs \<noteq> Nil" "\<forall>r \<in> set rs. nonalt r"
       
  1161   shows "good (bsimp_AALTs bs rs) \<longleftrightarrow> (\<forall>r \<in> set rs. good r)"
       
  1162   using  assms
       
  1163   apply(induct bs rs rule: bsimp_AALTs.induct)
       
  1164   apply(auto simp add: good_fuse)
       
  1165   done
       
  1166 
       
  1167 lemma good0a:
       
  1168   assumes "flts (map bsimp rs) \<noteq> Nil" "\<forall>r \<in> set (flts (map bsimp rs)). nonalt r"
       
  1169   shows "good (bsimp (AALTs bs rs)) \<longleftrightarrow> (\<forall>r \<in> set (flts (map bsimp rs)). good r)"
       
  1170   using  assms
       
  1171   apply(simp)
       
  1172   apply(auto)
       
  1173   apply(subst (asm) good0)
       
  1174    apply(simp)
       
  1175     apply(auto)
       
  1176    apply(subst good0)
       
  1177    apply(simp)
       
  1178     apply(auto)
       
  1179   done
       
  1180 
       
  1181 lemma flts0:
       
  1182   assumes "r \<noteq> AZERO" "nonalt r"
       
  1183   shows "flts [r] \<noteq> []"
       
  1184   using  assms
       
  1185   apply(induct r)
       
  1186        apply(simp_all)
       
  1187   done
       
  1188 
       
  1189 lemma flts1:
       
  1190   assumes "good r" 
       
  1191   shows "flts [r] \<noteq> []"
       
  1192   using  assms
       
  1193   apply(induct r)
       
  1194        apply(simp_all)
       
  1195   apply(case_tac x2a)
       
  1196    apply(simp)
       
  1197   apply(simp)
       
  1198   done
       
  1199 
       
  1200 lemma flts2:
       
  1201   assumes "good r" 
       
  1202   shows "\<forall>r' \<in> set (flts [r]). good r' \<and> nonalt r'"
       
  1203   using  assms
       
  1204   apply(induct r)
       
  1205        apply(simp)
       
  1206       apply(simp)
       
  1207      apply(simp)
       
  1208     prefer 2
       
  1209     apply(simp)
       
  1210     apply(auto)[1]
       
  1211      apply (metis bsimp_AALTs.elims good.simps(4) good.simps(5) good.simps(6) good_fuse)
       
  1212   apply (metis bsimp_AALTs.elims good.simps(4) good.simps(5) good.simps(6) nn11a)
       
  1213    apply fastforce
       
  1214   apply(simp)
       
  1215   done  
       
  1216 
       
  1217 
       
  1218 lemma flts3:
       
  1219   assumes "\<forall>r \<in> set rs. good r \<or> r = AZERO" 
       
  1220   shows "\<forall>r \<in> set (flts rs). good r"
       
  1221   using  assms
       
  1222   apply(induct rs arbitrary: rule: flts.induct)
       
  1223         apply(simp_all)
       
  1224   by (metis UnE flts2 k0a set_map)
       
  1225 
       
  1226 lemma flts3b:
       
  1227   assumes "\<exists>r\<in>set rs. good r"
       
  1228   shows "flts rs \<noteq> []"
       
  1229   using  assms
       
  1230   apply(induct rs arbitrary: rule: flts.induct)
       
  1231         apply(simp)
       
  1232        apply(simp)
       
  1233       apply(simp)
       
  1234       apply(auto)
       
  1235   done
       
  1236 
       
  1237 lemma flts4:
       
  1238   assumes "bsimp_AALTs bs (flts rs) = AZERO"
       
  1239   shows "\<forall>r \<in> set rs. \<not> good r"
       
  1240   using assms
       
  1241   apply(induct rs arbitrary: bs rule: flts.induct)
       
  1242         apply(auto)
       
  1243         defer
       
  1244   apply (metis (no_types, lifting) Nil_is_append_conv append_self_conv2 bsimp_AALTs.elims butlast.simps(2) butlast_append flts3b nonalt.simps(1) nonalt.simps(2))
       
  1245   apply (metis arexp.distinct(7) bsimp_AALTs.elims flts2 good.simps(1) good.simps(2) good0 k0b list.distinct(1) list.inject nonalt.simps(3))
       
  1246   apply (metis arexp.distinct(3) arexp.distinct(7) bsimp_AALTs.elims fuse.simps(3) list.distinct(1) list.inject)
       
  1247   apply (metis arexp.distinct(7) bsimp_AALTs.elims good.simps(1) good_fuse list.distinct(1) list.inject)
       
  1248     apply (metis arexp.distinct(7) bsimp_AALTs.elims list.distinct(1) list.inject)
       
  1249   apply (metis arexp.distinct(7) bsimp_AALTs.elims flts2 good.simps(1) good.simps(33) good0 k0b list.distinct(1) list.inject nonalt.simps(6))
       
  1250   by (metis (no_types, lifting) Nil_is_append_conv append_Nil2 arexp.distinct(7) bsimp_AALTs.elims butlast.simps(2) butlast_append flts1 flts2 good.simps(1) good0 k0a)
       
  1251 
       
  1252 
       
  1253 lemma flts_nil:
       
  1254   assumes "\<forall>y. asize y < Suc (sum_list (map asize rs)) \<longrightarrow>
       
  1255             good (bsimp y) \<or> bsimp y = AZERO"
       
  1256   and "\<forall>r\<in>set rs. \<not> good (bsimp r)"
       
  1257   shows "flts (map bsimp rs) = []"
       
  1258   using assms
       
  1259   apply(induct rs)
       
  1260    apply(simp)
       
  1261   apply(simp)
       
  1262   apply(subst k0)
       
  1263   apply(simp)
       
  1264   by force
       
  1265 
       
  1266 lemma flts_nil2:
       
  1267   assumes "\<forall>y. asize y < Suc (sum_list (map asize rs)) \<longrightarrow>
       
  1268             good (bsimp y) \<or> bsimp y = AZERO"
       
  1269   and "bsimp_AALTs bs (flts (map bsimp rs)) = AZERO"
       
  1270   shows "flts (map bsimp rs) = []"
       
  1271   using assms
       
  1272   apply(induct rs arbitrary: bs)
       
  1273    apply(simp)
       
  1274   apply(simp)
       
  1275   apply(subst k0)
       
  1276   apply(simp)
       
  1277   apply(subst (asm) k0)
       
  1278   apply(auto)
       
  1279   apply (metis flts.simps(1) flts.simps(2) flts4 k0 less_add_Suc1 list.set_intros(1))
       
  1280   by (metis flts.simps(2) flts4 k0 less_add_Suc1 list.set_intros(1))
       
  1281   
       
  1282   
       
  1283 
       
  1284 lemma good_SEQ:
       
  1285   assumes "r1 \<noteq> AZERO" "r2 \<noteq> AZERO" "\<forall>bs. r1 \<noteq> AONE bs"
       
  1286   shows "good (ASEQ bs r1 r2) = (good r1 \<and> good r2)"
       
  1287   using assms
       
  1288   apply(case_tac r1)
       
  1289        apply(simp_all)
       
  1290   apply(case_tac r2)
       
  1291           apply(simp_all)
       
  1292   apply(case_tac r2)
       
  1293          apply(simp_all)
       
  1294   apply(case_tac r2)
       
  1295         apply(simp_all)
       
  1296   apply(case_tac r2)
       
  1297        apply(simp_all)
       
  1298   done
       
  1299 
       
  1300 lemma good1:
       
  1301   shows "good (bsimp a) \<or> bsimp a = AZERO"
       
  1302   apply(induct a taking: asize rule: measure_induct)
       
  1303   apply(case_tac x)
       
  1304   apply(simp)
       
  1305   apply(simp)
       
  1306   apply(simp)
       
  1307   prefer 3
       
  1308     apply(simp)
       
  1309    prefer 2
       
  1310   (*  AALTs case  *)
       
  1311   apply(simp only:)
       
  1312    apply(case_tac "x52")
       
  1313     apply(simp)
       
  1314   thm good0a
       
  1315    (*  AALTs list at least one - case *)
       
  1316    apply(simp only: )
       
  1317   apply(frule_tac x="a" in spec)
       
  1318    apply(drule mp)
       
  1319     apply(simp)
       
  1320    (* either first element is good, or AZERO *)
       
  1321     apply(erule disjE)
       
  1322      prefer 2
       
  1323     apply(simp)
       
  1324    (* in  the AZERO case, the size  is smaller *)
       
  1325    apply(drule_tac x="AALTs x51 list" in spec)
       
  1326    apply(drule mp)
       
  1327      apply(simp add: asize0)
       
  1328     apply(subst (asm) bsimp.simps)
       
  1329   apply(subst (asm) bsimp.simps)
       
  1330     apply(assumption)
       
  1331    (* in the good case *)
       
  1332   apply(frule_tac x="AALTs x51 list" in spec)
       
  1333    apply(drule mp)
       
  1334     apply(simp add: asize0)
       
  1335    apply(erule disjE)
       
  1336     apply(rule disjI1)
       
  1337   apply(simp add: good0)
       
  1338     apply(subst good0)
       
  1339       apply (metis Nil_is_append_conv flts1 k0)
       
  1340   apply (metis ex_map_conv list.simps(9) nn1b nn1c)
       
  1341   apply(simp)
       
  1342     apply(subst k0)
       
  1343     apply(simp)
       
  1344     apply(auto)[1]
       
  1345   using flts2 apply blast
       
  1346     apply(subst  (asm) good0)
       
  1347       prefer 3
       
  1348       apply(auto)[1]
       
  1349      apply auto[1]
       
  1350     apply (metis ex_map_conv nn1b nn1c)
       
  1351   (* in  the AZERO case *)
       
  1352    apply(simp)
       
  1353    apply(frule_tac x="a" in spec)
       
  1354    apply(drule mp)
       
  1355   apply(simp)
       
  1356    apply(erule disjE)
       
  1357     apply(rule disjI1)
       
  1358     apply(subst good0)
       
  1359   apply(subst k0)
       
  1360   using flts1 apply blast
       
  1361      apply(auto)[1]
       
  1362   apply (metis (no_types, hide_lams) ex_map_conv list.simps(9) nn1b nn1c)
       
  1363     apply(auto)[1]
       
  1364   apply(subst (asm) k0)
       
  1365   apply(auto)[1]
       
  1366   using flts2 apply blast
       
  1367   apply(frule_tac x="AALTs x51 list" in spec)
       
  1368    apply(drule mp)
       
  1369      apply(simp add: asize0)
       
  1370     apply(erule disjE)
       
  1371      apply(simp)
       
  1372     apply(simp)
       
  1373   apply (metis add.left_commute flts_nil2 less_add_Suc1 less_imp_Suc_add list.distinct(1) list.set_cases nat.inject)
       
  1374    apply(subst (2) k0)
       
  1375   apply(simp)
       
  1376   (* SEQ case *)
       
  1377   apply(simp)
       
  1378   apply(case_tac "bsimp x42 = AZERO")
       
  1379     apply(simp)
       
  1380  apply(case_tac "bsimp x43 = AZERO")
       
  1381    apply(simp)
       
  1382     apply(subst (2) bsimp_ASEQ0)
       
  1383   apply(simp)
       
  1384   apply(case_tac "\<exists>bs. bsimp x42 = AONE bs")
       
  1385     apply(auto)[1]
       
  1386    apply(subst bsimp_ASEQ2)
       
  1387   using good_fuse apply force
       
  1388    apply(subst bsimp_ASEQ1)
       
  1389      apply(auto)
       
  1390   apply(subst  good_SEQ)
       
  1391   apply(simp)
       
  1392     apply(simp)
       
  1393    apply(simp)
       
  1394   using less_add_Suc1 less_add_Suc2 by blast
       
  1395 
       
  1396 lemma good1a:
       
  1397   assumes "L(erase a) \<noteq> {}"
       
  1398   shows "good (bsimp a)"
       
  1399   using good1 assms
       
  1400   using L_bsimp_erase by force
       
  1401   
       
  1402 
       
  1403 
       
  1404 lemma flts_append:
       
  1405   "flts (xs1 @ xs2) = flts xs1 @ flts xs2"
       
  1406   apply(induct xs1  arbitrary: xs2  rule: rev_induct)
       
  1407    apply(auto)
       
  1408   apply(case_tac xs)
       
  1409    apply(auto)
       
  1410    apply(case_tac x)
       
  1411         apply(auto)
       
  1412   apply(case_tac x)
       
  1413         apply(auto)
       
  1414   done
       
  1415 
       
  1416 lemma g1:
       
  1417   assumes "good (bsimp_AALTs bs rs)"
       
  1418   shows "bsimp_AALTs bs rs = AALTs bs rs \<or> (\<exists>r. rs = [r] \<and> bsimp_AALTs bs [r] = fuse bs r)"
       
  1419 using assms
       
  1420     apply(induct rs arbitrary: bs)
       
  1421   apply(simp)
       
  1422   apply(case_tac rs)
       
  1423   apply(simp only:)
       
  1424   apply(simp)
       
  1425   apply(case_tac  list)
       
  1426   apply(simp)
       
  1427   by simp
       
  1428 
       
  1429 lemma flts_0:
       
  1430   assumes "nonnested (AALTs bs  rs)"
       
  1431   shows "\<forall>r \<in> set (flts rs). r \<noteq> AZERO"
       
  1432   using assms
       
  1433   apply(induct rs arbitrary: bs rule: flts.induct)
       
  1434         apply(simp) 
       
  1435        apply(simp) 
       
  1436       defer
       
  1437       apply(simp) 
       
  1438      apply(simp) 
       
  1439     apply(simp) 
       
  1440 apply(simp) 
       
  1441   apply(rule ballI)
       
  1442   apply(simp)
       
  1443   done
       
  1444 
       
  1445 lemma flts_0a:
       
  1446   assumes "nonnested (AALTs bs  rs)"
       
  1447   shows "AZERO \<notin> set (flts rs)"
       
  1448   using assms
       
  1449   using flts_0 by blast 
       
  1450   
       
  1451 lemma qqq1:
       
  1452   shows "AZERO \<notin> set (flts (map bsimp rs))"
       
  1453   by (metis ex_map_conv flts3 good.simps(1) good1)
       
  1454 
       
  1455 
       
  1456 fun nonazero :: "arexp \<Rightarrow> bool"
       
  1457   where
       
  1458   "nonazero AZERO = False"
       
  1459 | "nonazero r = True"
       
  1460 
       
  1461 lemma flts_concat:
       
  1462   shows "flts rs = concat (map (\<lambda>r. flts [r]) rs)"
       
  1463   apply(induct rs)
       
  1464    apply(auto)
       
  1465   apply(subst k0)
       
  1466   apply(simp)
       
  1467   done
       
  1468 
       
  1469 lemma flts_single1:
       
  1470   assumes "nonalt r" "nonazero r"
       
  1471   shows "flts [r] = [r]"
       
  1472   using assms
       
  1473   apply(induct r)
       
  1474   apply(auto)
       
  1475   done
       
  1476 
       
  1477 lemma flts_qq:
       
  1478   assumes "\<forall>y. asize y < Suc (sum_list (map asize rs)) \<longrightarrow> good y \<longrightarrow> bsimp y = y" 
       
  1479           "\<forall>r'\<in>set rs. good r' \<and> nonalt r'"
       
  1480   shows "flts (map bsimp rs) = rs"
       
  1481   using assms
       
  1482   apply(induct rs)
       
  1483    apply(simp)
       
  1484   apply(simp)
       
  1485   apply(subst k0)
       
  1486   apply(subgoal_tac "flts [bsimp a] =  [a]")
       
  1487    prefer 2
       
  1488    apply(drule_tac x="a" in spec)
       
  1489    apply(drule mp)
       
  1490     apply(simp)
       
  1491    apply(auto)[1]
       
  1492   using good.simps(1) k0b apply blast
       
  1493   apply(auto)[1]  
       
  1494   done
       
  1495   
       
  1496 lemma test:
       
  1497   assumes "good r"
       
  1498   shows "bsimp r = r"
       
  1499   using assms
       
  1500   apply(induct r taking: "asize" rule: measure_induct)
       
  1501   apply(erule good.elims)
       
  1502   apply(simp_all)
       
  1503   apply(subst k0)
       
  1504   apply(subst (2) k0)
       
  1505                 apply(subst flts_qq)
       
  1506                   apply(auto)[1]
       
  1507                  apply(auto)[1]
       
  1508                 apply (metis append_Cons append_Nil bsimp_AALTs.simps(3) good.simps(1) k0b)
       
  1509                apply force+
       
  1510   apply (metis (no_types, lifting) add_Suc add_Suc_right asize.simps(5) bsimp.simps(1) bsimp_ASEQ.simps(19) less_add_Suc1 less_add_Suc2)
       
  1511   apply (metis add_Suc add_Suc_right arexp.distinct(5) arexp.distinct(7) asize.simps(4) asize.simps(5) bsimp.simps(1) bsimp.simps(2) bsimp_ASEQ1 good.simps(21) good.simps(8) less_add_Suc1 less_add_Suc2)
       
  1512          apply force+
       
  1513   apply (metis (no_types, lifting) add_Suc add_Suc_right arexp.distinct(5) arexp.distinct(7) asize.simps(4) asize.simps(5) bsimp.simps(1) bsimp.simps(2) bsimp_ASEQ1 good.simps(25) good.simps(8) less_add_Suc1 less_add_Suc2)
       
  1514   apply (metis add_Suc add_Suc_right arexp.distinct(7) asize.simps(4) bsimp.simps(2) bsimp_ASEQ1 good.simps(26) good.simps(8) less_add_Suc1 less_add_Suc2)
       
  1515     apply force+
       
  1516   done
       
  1517 
       
  1518 lemma test2:
       
  1519   assumes "good r"
       
  1520   shows "bsimp r = r"
       
  1521   using assms
       
  1522   apply(induct r taking: "asize" rule: measure_induct)
       
  1523   apply(case_tac x)
       
  1524        apply(simp_all)
       
  1525    defer  
       
  1526   (* AALT case *)
       
  1527    apply(subgoal_tac "1 < length x52")
       
  1528     prefer 2
       
  1529     apply(case_tac x52)
       
  1530      apply(simp)
       
  1531     apply(simp)
       
  1532     apply(case_tac list)
       
  1533      apply(simp)
       
  1534   apply(simp)
       
  1535     apply(subst bsimp_AALTs_qq)
       
  1536     prefer 2
       
  1537     apply(subst flts_qq)
       
  1538       apply(auto)[1]
       
  1539      apply(auto)[1]
       
  1540    apply(case_tac x52)
       
  1541      apply(simp)
       
  1542     apply(simp)
       
  1543     apply(case_tac list)
       
  1544      apply(simp)
       
  1545       apply(simp)
       
  1546       apply(auto)[1]
       
  1547   apply (metis (no_types, lifting) bsimp_AALTs.elims good.simps(6) length_Cons length_pos_if_in_set list.size(3) nat_neq_iff)
       
  1548   apply(simp)  
       
  1549   apply(case_tac x52)
       
  1550      apply(simp)
       
  1551     apply(simp)
       
  1552     apply(case_tac list)
       
  1553      apply(simp)
       
  1554    apply(simp)
       
  1555    apply(subst k0)
       
  1556    apply(simp)
       
  1557    apply(subst (2) k0)
       
  1558    apply(simp)
       
  1559   apply (simp add: Suc_lessI flts1 one_is_add)
       
  1560   (* SEQ case *)
       
  1561   apply(case_tac "bsimp x42 = AZERO")
       
  1562    apply simp
       
  1563   apply (metis asize.elims good.simps(10) good.simps(11) good.simps(12) good.simps(2) good.simps(7) good.simps(9) good_SEQ less_add_Suc1)  
       
  1564    apply(case_tac "\<exists>bs'. bsimp x42 = AONE bs'")
       
  1565    apply(auto)[1]
       
  1566   defer
       
  1567   apply(case_tac "bsimp x43 = AZERO")
       
  1568     apply(simp)
       
  1569   apply (metis bsimp.elims bsimp.simps(3) good.simps(10) good.simps(11) good.simps(12) good.simps(8) good.simps(9) good_SEQ less_add_Suc2)
       
  1570   apply(auto)  
       
  1571    apply (subst bsimp_ASEQ1)
       
  1572       apply(auto)[3]
       
  1573    apply(auto)[1]
       
  1574     apply (metis bsimp.simps(3) good.simps(2) good_SEQ less_add_Suc1)
       
  1575    apply (metis bsimp.simps(3) good.simps(2) good_SEQ less_add_Suc1 less_add_Suc2)
       
  1576   apply (subst bsimp_ASEQ2)
       
  1577   apply(drule_tac x="x42" in spec)
       
  1578   apply(drule mp)
       
  1579    apply(simp)
       
  1580   apply(drule mp)
       
  1581    apply (metis bsimp.elims bsimp.simps(3) good.simps(10) good.simps(11) good.simps(2) good_SEQ)
       
  1582   apply(simp)
       
  1583   done
       
  1584 
       
  1585 
       
  1586 lemma bsimp_idem:
       
  1587   shows "bsimp (bsimp r) = bsimp r"
       
  1588   using test good1
       
  1589   by force
       
  1590 
       
  1591 
       
  1592 lemma q3a:
       
  1593   assumes "\<exists>r \<in> set rs. bnullable r"
       
  1594   shows "bmkeps (AALTs bs (map (fuse bs1) rs)) = bmkeps (AALTs (bs@bs1) rs)"
       
  1595   using assms
       
  1596   apply(induct rs arbitrary: bs bs1)
       
  1597    apply(simp)
       
  1598   apply(simp)
       
  1599   apply(auto)
       
  1600    apply (metis append_assoc b2 bnullable_correctness erase_fuse r0)
       
  1601   apply(case_tac "bnullable a")
       
  1602    apply (metis append.assoc b2 bnullable_correctness erase_fuse r0)
       
  1603   apply(case_tac rs)
       
  1604   apply(simp)
       
  1605   apply(simp)
       
  1606   apply(auto)[1]
       
  1607    apply (metis bnullable_correctness erase_fuse)+
       
  1608   done
       
  1609 
       
  1610 lemma qq4:
       
  1611   assumes "\<exists>x\<in>set list. bnullable x"
       
  1612   shows "\<exists>x\<in>set (flts list). bnullable x"
       
  1613   using assms
       
  1614   apply(induct list rule: flts.induct)
       
  1615         apply(auto)
       
  1616   by (metis UnCI bnullable_correctness erase_fuse imageI)
       
  1617   
       
  1618 
       
  1619 lemma qs3:
       
  1620   assumes "\<exists>r \<in> set rs. bnullable r"
       
  1621   shows "bmkeps (AALTs bs rs) = bmkeps (AALTs bs (flts rs))"
       
  1622   using assms
       
  1623   apply(induct rs arbitrary: bs taking: size rule: measure_induct)
       
  1624   apply(case_tac x)
       
  1625   apply(simp)
       
  1626   apply(simp)
       
  1627   apply(case_tac a)
       
  1628        apply(simp)
       
  1629        apply (simp add: r1)
       
  1630       apply(simp)
       
  1631       apply (simp add: r0)
       
  1632      apply(simp)
       
  1633      apply(case_tac "flts list")
       
  1634       apply(simp)
       
  1635   apply (metis L_erase_AALTs L_erase_flts L_flat_Prf1 L_flat_Prf2 Prf_elims(1) bnullable_correctness erase.simps(4) mkeps_nullable r2)
       
  1636      apply(simp)
       
  1637      apply (simp add: r1)
       
  1638     prefer 3
       
  1639     apply(simp)
       
  1640     apply (simp add: r0)
       
  1641    prefer 2
       
  1642    apply(simp)
       
  1643   apply(case_tac "\<exists>x\<in>set x52. bnullable x")
       
  1644   apply(case_tac "list")
       
  1645     apply(simp)
       
  1646     apply (metis b2 fuse.simps(4) q3a r2)
       
  1647    apply(erule disjE)
       
  1648     apply(subst qq1)
       
  1649      apply(auto)[1]
       
  1650      apply (metis bnullable_correctness erase_fuse)
       
  1651     apply(simp)
       
  1652      apply (metis b2 fuse.simps(4) q3a r2)
       
  1653     apply(simp)
       
  1654     apply(auto)[1]
       
  1655      apply(subst qq1)
       
  1656       apply (metis bnullable_correctness erase_fuse image_eqI set_map)
       
  1657      apply (metis b2 fuse.simps(4) q3a r2)
       
  1658   apply(subst qq1)
       
  1659       apply (metis bnullable_correctness erase_fuse image_eqI set_map)
       
  1660     apply (metis b2 fuse.simps(4) q3a r2)
       
  1661    apply(simp)
       
  1662    apply(subst qq2)
       
  1663      apply (metis bnullable_correctness erase_fuse imageE set_map)
       
  1664   prefer 2
       
  1665   apply(case_tac "list")
       
  1666      apply(simp)
       
  1667     apply(simp)
       
  1668    apply (simp add: qq4)
       
  1669   apply(simp)
       
  1670   apply(auto)
       
  1671    apply(case_tac list)
       
  1672     apply(simp)
       
  1673    apply(simp)
       
  1674    apply (simp add: r0)
       
  1675   apply(case_tac "bnullable (ASEQ x41 x42 x43)")
       
  1676    apply(case_tac list)
       
  1677     apply(simp)
       
  1678    apply(simp)
       
  1679    apply (simp add: r0)
       
  1680   apply(simp)
       
  1681   using qq4 r1 r2 by auto
       
  1682 
       
  1683 
       
  1684 
       
  1685 lemma k1:
       
  1686   assumes "\<And>x2aa. \<lbrakk>x2aa \<in> set x2a; bnullable x2aa\<rbrakk> \<Longrightarrow> bmkeps x2aa = bmkeps (bsimp x2aa)"
       
  1687           "\<exists>x\<in>set x2a. bnullable x"
       
  1688         shows "bmkeps (AALTs x1 (flts x2a)) = bmkeps (AALTs x1 (flts (map bsimp x2a)))"
       
  1689   using assms
       
  1690   apply(induct x2a)
       
  1691   apply fastforce
       
  1692   apply(simp)
       
  1693   apply(subst k0)
       
  1694   apply(subst (2) k0)
       
  1695   apply(auto)[1]
       
  1696   apply (metis b3 k0 list.set_intros(1) qs3 r0)
       
  1697   by (smt b3 imageI insert_iff k0 list.set(2) qq3 qs3 r0 r1 set_map)
       
  1698   
       
  1699   
       
  1700   
       
  1701 lemma bmkeps_simp:
       
  1702   assumes "bnullable r"
       
  1703   shows "bmkeps r = bmkeps (bsimp r)"
       
  1704   using  assms
       
  1705   apply(induct r)
       
  1706        apply(simp)
       
  1707       apply(simp)
       
  1708      apply(simp)
       
  1709     apply(simp)
       
  1710     prefer 3
       
  1711   apply(simp)
       
  1712    apply(case_tac "bsimp r1 = AZERO")
       
  1713     apply(simp)
       
  1714     apply(auto)[1]
       
  1715   apply (metis L_bsimp_erase L_flat_Prf1 L_flat_Prf2 Prf_elims(1) bnullable_correctness erase.simps(1) mkeps_nullable)
       
  1716  apply(case_tac "bsimp r2 = AZERO")
       
  1717     apply(simp)  
       
  1718     apply(auto)[1]
       
  1719   apply (metis L_bsimp_erase L_flat_Prf1 L_flat_Prf2 Prf_elims(1) bnullable_correctness erase.simps(1) mkeps_nullable)
       
  1720   apply(case_tac "\<exists>bs. bsimp r1 = AONE bs")
       
  1721     apply(auto)[1]
       
  1722     apply(subst b1)
       
  1723     apply(subst b2)
       
  1724   apply(simp add: b3[symmetric])
       
  1725     apply(simp)
       
  1726    apply(subgoal_tac "bsimp_ASEQ x1 (bsimp r1) (bsimp r2) = ASEQ x1 (bsimp r1) (bsimp r2)")
       
  1727     prefer 2
       
  1728   apply (smt b3 bnullable.elims(2) bsimp_ASEQ.simps(17) bsimp_ASEQ.simps(19) bsimp_ASEQ.simps(20) bsimp_ASEQ.simps(21) bsimp_ASEQ.simps(22) bsimp_ASEQ.simps(24) bsimp_ASEQ.simps(25) bsimp_ASEQ.simps(26) bsimp_ASEQ.simps(27) bsimp_ASEQ.simps(29) bsimp_ASEQ.simps(30) bsimp_ASEQ.simps(31))
       
  1729    apply(simp)
       
  1730   apply(simp)
       
  1731   thm q3
       
  1732   apply(subst q3[symmetric])
       
  1733    apply simp
       
  1734   using b3 qq4 apply auto[1]
       
  1735   apply(subst qs3)
       
  1736    apply simp
       
  1737   using k1 by blast
       
  1738 
       
  1739 thm bmkeps_retrieve bmkeps_simp bder_retrieve
       
  1740 
       
  1741 lemma bmkeps_bder_AALTs:
       
  1742   assumes "\<exists>r \<in> set rs. bnullable (bder c r)" 
       
  1743   shows "bmkeps (bder c (bsimp_AALTs bs rs)) = bmkeps (bsimp_AALTs bs (map (bder c) rs))"
       
  1744   using assms
       
  1745   apply(induct rs)
       
  1746    apply(simp)
       
  1747   apply(simp)
       
  1748   apply(auto)
       
  1749   apply(case_tac rs)
       
  1750     apply(simp)
       
  1751   apply (metis (full_types) Prf_injval bder_retrieve bmkeps_retrieve bnullable_correctness erase_bder erase_fuse mkeps_nullable retrieve_fuse2)
       
  1752    apply(simp)
       
  1753   apply(case_tac  rs)
       
  1754    apply(simp_all)
       
  1755   done
       
  1756 
       
  1757 lemma bbs0:
       
  1758   shows "blexer_simp r [] = blexer r []"
       
  1759   apply(simp add: blexer_def blexer_simp_def)
       
  1760   done
       
  1761 
       
  1762 lemma bbs1:
       
  1763   shows "blexer_simp r [c] = blexer r [c]"
       
  1764   apply(simp add: blexer_def blexer_simp_def)
       
  1765   apply(auto)
       
  1766     defer
       
  1767   using b3 apply auto[1]
       
  1768   using b3 apply auto[1]  
       
  1769   apply(subst bmkeps_simp[symmetric])
       
  1770    apply(simp)
       
  1771   apply(simp)
       
  1772   done
       
  1773 
       
  1774 lemma oo:
       
  1775   shows "(case (blexer (der c r) s) of None \<Rightarrow> None | Some v \<Rightarrow> Some (injval r c v)) = blexer r (c # s)"
       
  1776   apply(simp add: blexer_correctness)
       
  1777   done
       
  1778 
       
  1779 
       
  1780 lemma bder_fuse:
       
  1781   shows "bder c (fuse bs a) = fuse bs  (bder c a)"
       
  1782   apply(induct a arbitrary: bs c)
       
  1783        apply(simp_all)
       
  1784   done
       
  1785 
       
  1786 lemma XXX2_helper:
       
  1787   assumes "\<forall>y. asize y < Suc (sum_list (map asize rs)) \<longrightarrow> good y \<longrightarrow> bsimp y = y" 
       
  1788           "\<forall>r'\<in>set rs. good r' \<and> nonalt r'"
       
  1789   shows "flts (map (bsimp \<circ> bder c) (flts (map bsimp rs))) = flts (map (bsimp \<circ> bder c) rs)"
       
  1790   using assms
       
  1791   apply(induct rs arbitrary: c)
       
  1792    apply(simp)
       
  1793   apply(simp)
       
  1794   apply(subst k0)
       
  1795   apply(simp add: flts_append)
       
  1796   apply(subst (2) k0)
       
  1797   apply(simp add: flts_append)
       
  1798   apply(subgoal_tac "flts [a] =  [a]")
       
  1799    prefer 2
       
  1800   using good.simps(1) k0b apply blast
       
  1801   apply(simp)
       
  1802   done
       
  1803 
       
  1804 lemma bmkeps_good:
       
  1805   assumes "good a"
       
  1806   shows "bmkeps (bsimp a) = bmkeps a"
       
  1807   using assms
       
  1808   using test2 by auto
       
  1809 
       
  1810 
       
  1811 lemma xxx_bder:
       
  1812   assumes "good r"
       
  1813   shows "L (erase r) \<noteq> {}"
       
  1814   using assms
       
  1815   apply(induct r rule: good.induct)
       
  1816   apply(auto simp add: Sequ_def)
       
  1817   done
       
  1818 
       
  1819 lemma xxx_bder2:
       
  1820   assumes "L (erase (bsimp r)) = {}"
       
  1821   shows "bsimp r = AZERO"
       
  1822   using assms xxx_bder test2 good1
       
  1823   by blast
       
  1824 
       
  1825 lemma XXX2aa:
       
  1826   assumes "good a"
       
  1827   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  1828   using  assms
       
  1829   by (simp add: test2)
       
  1830 
       
  1831 lemma XXX2aa_ders:
       
  1832   assumes "good a"
       
  1833   shows "bsimp (bders (bsimp a) s) = bsimp (bders a s)"
       
  1834   using  assms
       
  1835   by (simp add: test2)
       
  1836 
       
  1837 lemma XXX4a:
       
  1838   shows "good (bders_simp (bsimp r) s)  \<or> bders_simp (bsimp r) s = AZERO"
       
  1839   apply(induct s arbitrary: r rule:  rev_induct)
       
  1840    apply(simp)
       
  1841   apply (simp add: good1)
       
  1842   apply(simp add: bders_simp_append)
       
  1843   apply (simp add: good1)
       
  1844   done
       
  1845 
       
  1846 lemma XXX4a_good:
       
  1847   assumes "good a"
       
  1848   shows "good (bders_simp a s) \<or> bders_simp a s = AZERO"
       
  1849   using assms
       
  1850   apply(induct s arbitrary: a rule:  rev_induct)
       
  1851    apply(simp)
       
  1852   apply(simp add: bders_simp_append)
       
  1853   apply (simp add: good1)
       
  1854   done
       
  1855 
       
  1856 lemma XXX4a_good_cons:
       
  1857   assumes "s \<noteq> []"
       
  1858   shows "good (bders_simp a s) \<or> bders_simp a s = AZERO"
       
  1859   using assms
       
  1860   apply(case_tac s)
       
  1861    apply(auto)
       
  1862   using XXX4a by blast
       
  1863 
       
  1864 lemma XXX4b:
       
  1865   assumes "good a" "L (erase (bders_simp a s)) \<noteq> {}"
       
  1866   shows "good (bders_simp a s)"
       
  1867   using assms
       
  1868   apply(induct s arbitrary: a)
       
  1869    apply(simp)
       
  1870   apply(simp)
       
  1871   apply(subgoal_tac "L (erase (bder a aa)) = {} \<or> L (erase (bder a aa)) \<noteq> {}")
       
  1872    prefer 2
       
  1873    apply(auto)[1]
       
  1874   apply(erule disjE)
       
  1875    apply(subgoal_tac "bsimp (bder a aa) = AZERO")
       
  1876     prefer 2
       
  1877   using L_bsimp_erase xxx_bder2 apply auto[1]
       
  1878    apply(simp)
       
  1879   apply (metis L.simps(1) XXX4a erase.simps(1))  
       
  1880   apply(drule_tac x="bsimp (bder a aa)" in meta_spec)
       
  1881   apply(drule meta_mp)
       
  1882   apply simp
       
  1883   apply(rule good1a)
       
  1884   apply(auto)
       
  1885   done
       
  1886 
       
  1887 lemma bders_AZERO:
       
  1888   shows "bders AZERO s = AZERO"
       
  1889   and   "bders_simp AZERO s = AZERO"
       
  1890    apply (induct s)
       
  1891      apply(auto)
       
  1892   done
       
  1893 
       
  1894 lemma LA:
       
  1895   assumes "\<Turnstile> v : ders s (erase r)"
       
  1896   shows "retrieve (bders r s) v = retrieve r (flex (erase r) id s v)"
       
  1897   using assms
       
  1898   apply(induct s arbitrary: r v rule: rev_induct)
       
  1899    apply(simp)
       
  1900   apply(simp add: bders_append ders_append)
       
  1901   apply(subst bder_retrieve)
       
  1902    apply(simp)
       
  1903   apply(drule Prf_injval)
       
  1904   by (simp add: flex_append)
       
  1905 
       
  1906 
       
  1907 lemma LB:
       
  1908   assumes "s \<in> (erase r) \<rightarrow> v" 
       
  1909   shows "retrieve r v = retrieve r (flex (erase r) id s (mkeps (ders s (erase r))))"
       
  1910   using assms
       
  1911   apply(induct s arbitrary: r v rule: rev_induct)
       
  1912    apply(simp)
       
  1913    apply(subgoal_tac "v = mkeps (erase r)")
       
  1914     prefer 2
       
  1915   apply (simp add: Posix1(1) Posix_determ Posix_mkeps nullable_correctness)
       
  1916    apply(simp)
       
  1917   apply(simp add: flex_append ders_append)
       
  1918   by (metis Posix_determ Posix_flex Posix_injval Posix_mkeps ders_snoc lexer_correctness(2) lexer_flex)
       
  1919 
       
  1920 lemma LB_sym:
       
  1921   assumes "s \<in> (erase r) \<rightarrow> v" 
       
  1922   shows "retrieve r v = retrieve r (flex (erase r) id s (mkeps (erase (bders r s))))"
       
  1923   using assms
       
  1924   by (simp add: LB)
       
  1925 
       
  1926 
       
  1927 lemma LC:
       
  1928   assumes "s \<in> (erase r) \<rightarrow> v" 
       
  1929   shows "retrieve r v = retrieve (bders r s) (mkeps (erase (bders r s)))"
       
  1930   apply(simp)
       
  1931   by (metis LA LB Posix1(1) assms lexer_correct_None lexer_flex mkeps_nullable)
       
  1932 
       
  1933 
       
  1934 lemma L0:
       
  1935   assumes "bnullable a"
       
  1936   shows "retrieve (bsimp a) (mkeps (erase (bsimp a))) = retrieve a (mkeps (erase a))"
       
  1937   using assms
       
  1938   by (metis b3 bmkeps_retrieve bmkeps_simp bnullable_correctness)
       
  1939 
       
  1940 thm bmkeps_retrieve
       
  1941 
       
  1942 lemma L0a:
       
  1943   assumes "s \<in> L(erase a)"
       
  1944   shows "retrieve (bsimp (bders a s)) (mkeps (erase (bsimp (bders a s)))) = 
       
  1945          retrieve (bders a s) (mkeps (erase (bders a s)))"
       
  1946   using assms
       
  1947   by (metis L0 bnullable_correctness erase_bders lexer_correct_None lexer_flex)
       
  1948   
       
  1949 lemma L0aa:
       
  1950   assumes "s \<in> L (erase a)"
       
  1951   shows "[] \<in> erase (bsimp (bders a s)) \<rightarrow> mkeps (erase (bsimp (bders a s)))"
       
  1952   using assms
       
  1953   by (metis Posix_mkeps b3 bnullable_correctness erase_bders lexer_correct_None lexer_flex)
       
  1954 
       
  1955 lemma L0aaa:
       
  1956   assumes "[c] \<in> L (erase a)"
       
  1957   shows "[c] \<in> (erase a) \<rightarrow> flex (erase a) id [c] (mkeps (erase (bder c a)))"
       
  1958   using assms
       
  1959   by (metis bders.simps(1) bders.simps(2) erase_bders lexer_correct_None lexer_correct_Some lexer_flex option.inject)
       
  1960 
       
  1961 lemma L0aaaa:
       
  1962   assumes "[c] \<in> L (erase a)"
       
  1963   shows "[c] \<in> (erase a) \<rightarrow> flex (erase a) id [c] (mkeps (erase (bders a [c])))"
       
  1964   using assms
       
  1965   using L0aaa by auto
       
  1966     
       
  1967 
       
  1968 lemma L02:
       
  1969   assumes "bnullable (bder c a)"
       
  1970   shows "retrieve (bsimp a) (flex (erase (bsimp a)) id [c] (mkeps (erase (bder c (bsimp a))))) = 
       
  1971          retrieve (bder c (bsimp a)) (mkeps (erase (bder c (bsimp a))))"
       
  1972   using assms
       
  1973   apply(simp)
       
  1974   using bder_retrieve L0 bmkeps_simp bmkeps_retrieve L0  LA LB
       
  1975   apply(subst bder_retrieve[symmetric])
       
  1976   apply (metis L_bsimp_erase bnullable_correctness der_correctness erase_bder mkeps_nullable nullable_correctness)
       
  1977   apply(simp)
       
  1978   done
       
  1979 
       
  1980 lemma L02_bders:
       
  1981   assumes "bnullable (bders a s)"
       
  1982   shows "retrieve (bsimp a) (flex (erase (bsimp a)) id s (mkeps (erase (bders (bsimp a) s)))) = 
       
  1983          retrieve (bders (bsimp a) s) (mkeps (erase (bders (bsimp a) s)))"
       
  1984   using assms
       
  1985   by (metis LA L_bsimp_erase bnullable_correctness ders_correctness erase_bders mkeps_nullable nullable_correctness)
       
  1986 
       
  1987 
       
  1988   
       
  1989 
       
  1990 lemma L03:
       
  1991   assumes "bnullable (bder c a)"
       
  1992   shows "retrieve (bder c (bsimp a)) (mkeps (erase (bder c (bsimp a)))) =
       
  1993          bmkeps (bsimp (bder c (bsimp a)))"
       
  1994   using assms
       
  1995   by (metis L0 L_bsimp_erase bmkeps_retrieve bnullable_correctness der_correctness erase_bder nullable_correctness)
       
  1996 
       
  1997 lemma L04:
       
  1998   assumes "bnullable (bder c a)"
       
  1999   shows "retrieve (bder c (bsimp a)) (mkeps (erase (bder c (bsimp a)))) =
       
  2000          retrieve (bsimp (bder c (bsimp a))) (mkeps (erase (bsimp (bder c (bsimp a)))))"     
       
  2001   using assms
       
  2002   by (metis L0 L_bsimp_erase bnullable_correctness der_correctness erase_bder nullable_correctness)
       
  2003     
       
  2004 lemma L05:
       
  2005   assumes "bnullable (bder c a)"
       
  2006   shows "retrieve (bder c (bsimp a)) (mkeps (erase (bder c (bsimp a)))) =
       
  2007          retrieve (bsimp (bder c (bsimp a))) (mkeps (erase (bsimp (bder c (bsimp a)))))" 
       
  2008   using assms
       
  2009   using L04 by auto 
       
  2010 
       
  2011 lemma L06:
       
  2012   assumes "bnullable (bder c a)"
       
  2013   shows "bmkeps (bder c (bsimp a)) = bmkeps (bsimp (bder c (bsimp a)))"
       
  2014   using assms
       
  2015   by (metis L03 L_bsimp_erase bmkeps_retrieve bnullable_correctness der_correctness erase_bder nullable_correctness) 
       
  2016 
       
  2017 lemma L07:
       
  2018   assumes "s \<in> L (erase r)"
       
  2019   shows "retrieve r (flex (erase r) id s (mkeps (ders s (erase r)))) 
       
  2020             = retrieve (bders r s) (mkeps (erase (bders r s)))"
       
  2021   using assms
       
  2022   using LB LC lexer_correct_Some by auto
       
  2023 
       
  2024 lemma LXXX:
       
  2025   assumes "s \<in> (erase r) \<rightarrow> v" "s \<in> (erase (bsimp r)) \<rightarrow> v'"
       
  2026   shows "retrieve r v = retrieve (bsimp r) v'"
       
  2027   using  assms
       
  2028   apply -
       
  2029   thm LC
       
  2030   apply(subst LC)
       
  2031    apply(assumption)
       
  2032   apply(subst  L0[symmetric])
       
  2033   using bnullable_correctness lexer_correctness(2) lexer_flex apply fastforce
       
  2034   apply(subst (2) LC)
       
  2035    apply(assumption)
       
  2036   apply(subst (2)  L0[symmetric])
       
  2037   using bnullable_correctness lexer_correctness(2) lexer_flex apply fastforce
       
  2038    
       
  2039   oops  
       
  2040 
       
  2041 
       
  2042 lemma L07a:
       
  2043   assumes "s \<in> L (erase r)"
       
  2044   shows "retrieve (bsimp r) (flex (erase (bsimp r)) id s (mkeps (ders s (erase (bsimp r))))) 
       
  2045          = retrieve r (flex (erase r) id s (mkeps (ders s (erase r))))"
       
  2046   using assms
       
  2047   apply(induct s arbitrary: r)
       
  2048    apply(simp)
       
  2049   using L0a apply force
       
  2050   apply(drule_tac x="(bder a r)" in meta_spec)
       
  2051   apply(drule meta_mp)
       
  2052   apply (metis L_bsimp_erase erase_bder lexer.simps(2) lexer_correct_None option.case(1))
       
  2053   apply(drule sym)
       
  2054   apply(simp)
       
  2055   apply(subst (asm) bder_retrieve)
       
  2056    apply (metis Posix_Prf Posix_flex Posix_mkeps ders.simps(2) lexer_correct_None lexer_flex)
       
  2057   apply(simp only: flex_fun_apply)
       
  2058   apply(simp)
       
  2059   using L0[no_vars] bder_retrieve[no_vars] LA[no_vars] LC[no_vars] L07[no_vars]
       
  2060   oops
       
  2061 
       
  2062 lemma L08:
       
  2063   assumes "s \<in> L (erase r)"
       
  2064   shows "retrieve (bders (bsimp r) s) (mkeps (erase (bders (bsimp r) s)))
       
  2065          = retrieve (bders r s) (mkeps (erase (bders r s)))"
       
  2066   using assms
       
  2067   apply(induct s arbitrary: r)
       
  2068    apply(simp)
       
  2069   using L0 bnullable_correctness nullable_correctness apply blast
       
  2070   apply(simp add: bders_append)
       
  2071   apply(drule_tac x="(bder a (bsimp r))" in meta_spec)
       
  2072   apply(drule meta_mp)
       
  2073   apply (metis L_bsimp_erase erase_bder lexer.simps(2) lexer_correct_None option.case(1))
       
  2074   apply(drule sym)
       
  2075   apply(simp)
       
  2076   apply(subst LA)
       
  2077   apply (metis L0aa L_bsimp_erase Posix1(1) ders.simps(2) ders_correctness erase_bder erase_bders mkeps_nullable nullable_correctness)
       
  2078   apply(subst LA)
       
  2079   using lexer_correct_None lexer_flex mkeps_nullable apply force
       
  2080   
       
  2081   using L0[no_vars] bder_retrieve[no_vars] LA[no_vars] LC[no_vars] L07[no_vars]
       
  2082 
       
  2083 thm L0[no_vars] bder_retrieve[no_vars] LA[no_vars] LC[no_vars] L07[no_vars]
       
  2084   oops
       
  2085 
       
  2086 lemma test:
       
  2087   assumes "s = [c]"
       
  2088   shows "retrieve (bders r s) v = XXX" and "YYY = retrieve r (flex (erase r) id s v)"
       
  2089   using assms
       
  2090    apply(simp only: bders.simps)
       
  2091    defer
       
  2092   using assms
       
  2093    apply(simp only: flex.simps id_simps)
       
  2094   using  L0[no_vars] bder_retrieve[no_vars] LA[no_vars] LC[no_vars] 
       
  2095   find_theorems "retrieve (bders _ _) _"
       
  2096   find_theorems "retrieve _ (mkeps _)"
       
  2097   oops
       
  2098 
       
  2099 lemma L06X:
       
  2100   assumes "bnullable (bder c a)"
       
  2101   shows "bmkeps (bder c (bsimp a)) = bmkeps (bder c a)"
       
  2102   using assms
       
  2103   apply(induct a arbitrary: c)
       
  2104        apply(simp)
       
  2105       apply(simp)
       
  2106      apply(simp)
       
  2107     prefer 3
       
  2108     apply(simp)
       
  2109    prefer 2
       
  2110    apply(simp)
       
  2111   
       
  2112    defer
       
  2113   oops
       
  2114 
       
  2115 lemma L06_2:
       
  2116   assumes "bnullable (bders a [c,d])"
       
  2117   shows "bmkeps (bders (bsimp a) [c,d]) = bmkeps (bsimp (bders (bsimp a) [c,d]))"
       
  2118   using assms
       
  2119   apply(simp)
       
  2120   by (metis L_bsimp_erase bmkeps_simp bnullable_correctness der_correctness erase_bder nullable_correctness)
       
  2121   
       
  2122 lemma L06_bders:
       
  2123   assumes "bnullable (bders a s)"
       
  2124   shows "bmkeps (bders (bsimp a) s) = bmkeps (bsimp (bders (bsimp a) s))"
       
  2125   using assms
       
  2126   by (metis L_bsimp_erase bmkeps_simp bnullable_correctness ders_correctness erase_bders nullable_correctness)
       
  2127 
       
  2128 lemma LLLL:
       
  2129   shows "L (erase a) =  L (erase (bsimp a))"
       
  2130   and "L (erase a) = {flat v | v. \<Turnstile> v: (erase a)}"
       
  2131   and "L (erase a) = {flat v | v. \<Turnstile> v: (erase (bsimp a))}"
       
  2132   using L_bsimp_erase apply(blast)
       
  2133   apply (simp add: L_flat_Prf)
       
  2134   using L_bsimp_erase L_flat_Prf apply(auto)[1]
       
  2135   done  
       
  2136     
       
  2137 
       
  2138 
       
  2139 lemma L07XX:
       
  2140   assumes "s \<in> L (erase a)"
       
  2141   shows "s \<in> erase a \<rightarrow> flex (erase a) id s (mkeps (ders s (erase a)))"
       
  2142   using assms
       
  2143   by (meson lexer_correct_None lexer_correctness(1) lexer_flex)
       
  2144 
       
  2145 lemma LX0:
       
  2146   assumes "s \<in> L r"
       
  2147   shows "decode (bmkeps (bders (intern r) s)) r = Some(flex r id s (mkeps (ders s r)))"
       
  2148   by (metis assms blexer_correctness blexer_def lexer_correct_None lexer_flex)
       
  2149 
       
  2150 
       
  2151 lemma L02_bders2:
       
  2152   assumes "bnullable (bders a s)" "s = [c]"
       
  2153   shows "retrieve (bders (bsimp a) s) (mkeps (erase (bders (bsimp a) s)))  =
       
  2154          retrieve (bders a s) (mkeps (erase (bders a s)))"
       
  2155   using assms
       
  2156   apply(simp)
       
  2157   
       
  2158   apply(induct s arbitrary: a)
       
  2159    apply(simp)
       
  2160   using L0 apply auto[1]
       
  2161   oops
       
  2162 
       
  2163 thm bmkeps_retrieve bmkeps_simp Posix_mkeps
       
  2164 
       
  2165 lemma WQ1:
       
  2166   assumes "s \<in> L (der c r)"
       
  2167   shows "s \<in> der c r \<rightarrow> mkeps (ders s (der c r))"
       
  2168   using assms
       
  2169   oops
       
  2170 
       
  2171 lemma L02_bsimp:
       
  2172   assumes "bnullable (bders a s)"
       
  2173   shows "retrieve (bsimp a) (flex (erase (bsimp a)) id s (mkeps (erase (bders (bsimp a) s)))) =
       
  2174          retrieve a (flex (erase a) id s (mkeps (erase (bders a s))))"
       
  2175   using assms
       
  2176   apply(induct s arbitrary: a)
       
  2177    apply(simp)
       
  2178    apply (simp add: L0)
       
  2179   apply(simp)
       
  2180   apply(drule_tac x="bder a aa" in meta_spec)
       
  2181   apply(simp)
       
  2182   apply(subst (asm) bder_retrieve)
       
  2183   using Posix_Prf Posix_flex Posix_mkeps bnullable_correctness apply fastforce
       
  2184   apply(simp add: flex_fun_apply)
       
  2185   apply(drule sym)
       
  2186   apply(simp)
       
  2187   apply(subst flex_injval)
       
  2188   apply(subst bder_retrieve[symmetric])
       
  2189   apply (metis L_bsimp_erase Posix_Prf Posix_flex Posix_mkeps bders.simps(2) bnullable_correctness ders.simps(2) erase_bders lexer_correct_None lexer_flex option.distinct(1))
       
  2190   apply(simp only: erase_bder[symmetric] erase_bders[symmetric])  
       
  2191   apply(subst LB_sym[symmetric])
       
  2192    apply(simp)
       
  2193   oops
       
  2194 
       
  2195 lemma L1:
       
  2196   assumes "s \<in> r \<rightarrow> v" 
       
  2197   shows "decode (bmkeps (bders (intern r) s)) r = Some v"
       
  2198   using assms
       
  2199   by (metis blexer_correctness blexer_def lexer_correctness(1) option.distinct(1))
       
  2200 
       
  2201 lemma L2:
       
  2202   assumes "s \<in> (der c r) \<rightarrow> v" 
       
  2203   shows "decode (bmkeps (bders (intern r) (c # s))) r = Some (injval r c v)"
       
  2204   using assms
       
  2205   apply(subst bmkeps_retrieve)
       
  2206   using Posix1(1) lexer_correct_None lexer_flex apply fastforce
       
  2207   using MAIN_decode
       
  2208   apply(subst MAIN_decode[symmetric])
       
  2209    apply(simp)
       
  2210    apply (meson Posix1(1) lexer_correct_None lexer_flex mkeps_nullable)
       
  2211   apply(simp)
       
  2212   apply(subgoal_tac "v = flex (der c r) id s (mkeps (ders s (der c r)))")
       
  2213    prefer 2
       
  2214    apply (metis Posix_determ lexer_correctness(1) lexer_flex option.distinct(1))
       
  2215   apply(simp)
       
  2216   apply(subgoal_tac "injval r c (flex (der c r) id s (mkeps (ders s (der c r)))) =
       
  2217     (flex (der c r) ((\<lambda>v. injval r c v) o id) s (mkeps (ders s (der c r))))")
       
  2218    apply(simp)
       
  2219   using flex_fun_apply by blast
       
  2220   
       
  2221 lemma L3:
       
  2222   assumes "s2 \<in> (ders s1 r) \<rightarrow> v" 
       
  2223   shows "decode (bmkeps (bders (intern r) (s1 @ s2))) r = Some (flex r id s1 v)"
       
  2224   using assms
       
  2225   apply(induct s1 arbitrary: r s2 v rule: rev_induct)
       
  2226    apply(simp)
       
  2227   using L1 apply blast
       
  2228   apply(simp add: ders_append)
       
  2229   apply(drule_tac x="r" in meta_spec)
       
  2230   apply(drule_tac x="x # s2" in meta_spec)
       
  2231   apply(drule_tac x="injval (ders xs r) x v" in meta_spec)
       
  2232   apply(drule meta_mp)
       
  2233    defer
       
  2234    apply(simp)
       
  2235    apply(simp add:  flex_append)
       
  2236   by (simp add: Posix_injval)
       
  2237 
       
  2238 
       
  2239 
       
  2240 lemma bders_snoc:
       
  2241   "bder c (bders a s) = bders a (s @ [c])"
       
  2242   apply(simp add: bders_append)
       
  2243   done
       
  2244 
       
  2245 
       
  2246 lemma QQ1:
       
  2247   shows "bsimp (bders (bsimp a) []) = bders_simp (bsimp a) []"
       
  2248   apply(simp)
       
  2249   apply(simp add: bsimp_idem)
       
  2250   done
       
  2251 
       
  2252 lemma QQ2:
       
  2253   shows "bsimp (bders (bsimp a) [c]) = bders_simp (bsimp a) [c]"
       
  2254   apply(simp)
       
  2255   done
       
  2256 
       
  2257 lemma XXX2a_long:
       
  2258   assumes "good a"
       
  2259   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  2260   using  assms
       
  2261   apply(induct a arbitrary: c taking: asize rule: measure_induct)
       
  2262   apply(case_tac x)
       
  2263        apply(simp)
       
  2264       apply(simp)
       
  2265      apply(simp)
       
  2266   prefer 3
       
  2267     apply(simp)
       
  2268    apply(simp)
       
  2269    apply(auto)[1]
       
  2270 apply(case_tac "x42 = AZERO")
       
  2271      apply(simp)
       
  2272    apply(case_tac "x43 = AZERO")
       
  2273      apply(simp)
       
  2274   using test2 apply force  
       
  2275   apply(case_tac "\<exists>bs. x42 = AONE bs")
       
  2276      apply(clarify)
       
  2277      apply(simp)
       
  2278     apply(subst bsimp_ASEQ1)
       
  2279        apply(simp)
       
  2280   using b3 apply force
       
  2281   using bsimp_ASEQ0 test2 apply force
       
  2282   thm good_SEQ test2
       
  2283      apply (simp add: good_SEQ test2)
       
  2284     apply (simp add: good_SEQ test2)
       
  2285   apply(case_tac "x42 = AZERO")
       
  2286      apply(simp)
       
  2287    apply(case_tac "x43 = AZERO")
       
  2288     apply(simp)
       
  2289   apply (simp add: bsimp_ASEQ0)
       
  2290   apply(case_tac "\<exists>bs. x42 = AONE bs")
       
  2291      apply(clarify)
       
  2292      apply(simp)
       
  2293     apply(subst bsimp_ASEQ1)
       
  2294       apply(simp)
       
  2295   using bsimp_ASEQ0 test2 apply force
       
  2296      apply (simp add: good_SEQ test2)
       
  2297     apply (simp add: good_SEQ test2)
       
  2298   apply (simp add: good_SEQ test2)
       
  2299   (* AALTs case *)
       
  2300   apply(simp)
       
  2301   using test2 by fastforce
       
  2302 
       
  2303 lemma XXX2a_long_without_good:
       
  2304   assumes "a = AALTs bs0  [AALTs bs1 [AALTs bs2 [ASTAR [] (AONE bs7), AONE bs6, ASEQ bs3 (ACHAR bs4 d) (AONE bs5)]]]" 
       
  2305   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  2306         "bsimp (bder c (bsimp a)) = XXX"
       
  2307         "bsimp (bder c a) = YYY"
       
  2308   using  assms
       
  2309     apply(simp)
       
  2310   using  assms
       
  2311    apply(simp)
       
  2312    prefer 2
       
  2313   using  assms
       
  2314    apply(simp)
       
  2315   oops
       
  2316 
       
  2317 lemma bder_bsimp_AALTs:
       
  2318   shows "bder c (bsimp_AALTs bs rs) = bsimp_AALTs bs (map (bder c) rs)"
       
  2319   apply(induct bs rs rule: bsimp_AALTs.induct)  
       
  2320     apply(simp)
       
  2321    apply(simp)
       
  2322    apply (simp add: bder_fuse)
       
  2323   apply(simp)
       
  2324   done
       
  2325 
       
  2326 lemma flts_nothing:
       
  2327   assumes "\<forall>r \<in> set rs. r \<noteq> AZERO" "\<forall>r \<in> set rs. nonalt r"
       
  2328   shows "flts rs = rs"
       
  2329   using assms
       
  2330   apply(induct rs rule: flts.induct)
       
  2331         apply(auto)
       
  2332   done
       
  2333 
       
  2334 lemma flts_flts:
       
  2335   assumes "\<forall>r \<in> set rs. good r"
       
  2336   shows "flts (flts rs) = flts rs"
       
  2337   using assms
       
  2338   apply(induct rs taking: "\<lambda>rs. sum_list  (map asize rs)" rule: measure_induct)
       
  2339   apply(case_tac x)
       
  2340    apply(simp)
       
  2341   apply(simp)
       
  2342   apply(case_tac a)
       
  2343        apply(simp_all  add: bder_fuse flts_append)
       
  2344   apply(subgoal_tac "\<forall>r \<in> set x52. r \<noteq> AZERO")
       
  2345    prefer 2
       
  2346   apply (metis Nil_is_append_conv bsimp_AALTs.elims good.simps(1) good.simps(5) good0 list.distinct(1) n0 nn1b split_list_last test2)
       
  2347   apply(subgoal_tac "\<forall>r \<in> set x52. nonalt r")
       
  2348    prefer 2
       
  2349    apply (metis n0 nn1b test2)
       
  2350   by (metis flts_fuse flts_nothing)
       
  2351 
       
  2352 
       
  2353 lemma PP:
       
  2354   assumes "bnullable (bders r s)" 
       
  2355   shows "bmkeps (bders (bsimp r) s) = bmkeps (bders r s)"
       
  2356   using assms
       
  2357   apply(induct s arbitrary: r)
       
  2358    apply(simp)
       
  2359   using bmkeps_simp apply auto[1]
       
  2360   apply(simp add: bders_append bders_simp_append)
       
  2361   oops
       
  2362 
       
  2363 lemma PP:
       
  2364   assumes "bnullable (bders r s)"
       
  2365   shows "bmkeps (bders_simp (bsimp r) s) = bmkeps (bders r s)"
       
  2366   using assms
       
  2367   apply(induct s arbitrary: r rule: rev_induct)
       
  2368    apply(simp)
       
  2369   using bmkeps_simp apply auto[1]
       
  2370   apply(simp add: bders_append bders_simp_append)
       
  2371   apply(drule_tac x="bder a (bsimp r)" in meta_spec)
       
  2372   apply(drule_tac meta_mp)
       
  2373    defer
       
  2374   oops
       
  2375 
       
  2376 
       
  2377 lemma
       
  2378   assumes "asize (bsimp a) = asize a"  "a = AALTs bs [AALTs bs2 [], AZERO, AONE bs3]"
       
  2379   shows "bsimp a = a"
       
  2380   using assms
       
  2381   apply(simp)
       
  2382   oops
       
  2383 
       
  2384 
       
  2385 lemma iii:
       
  2386   assumes "bsimp_AALTs bs rs \<noteq> AZERO"
       
  2387   shows "rs \<noteq> []"
       
  2388   using assms
       
  2389   apply(induct bs  rs rule: bsimp_AALTs.induct)
       
  2390     apply(auto)
       
  2391   done
       
  2392 
       
  2393 lemma
       
  2394   assumes "\<forall>y. asize y < Suc (sum_list (map asize x52)) \<longrightarrow> asize (bsimp y) = asize y \<longrightarrow> bsimp y \<noteq> AZERO \<longrightarrow> bsimp y = y"
       
  2395    "asize (bsimp_AALTs x51 (flts (map bsimp x52))) = Suc (sum_list (map asize x52))" 
       
  2396           "bsimp_AALTs x51 (flts (map bsimp x52)) \<noteq> AZERO"
       
  2397    shows "bsimp_AALTs x51 (flts (map bsimp x52)) = AALTs x51 x52"
       
  2398   using assms
       
  2399   apply(induct x52 arbitrary: x51)
       
  2400    apply(simp)
       
  2401   oops
       
  2402   
       
  2403 
       
  2404 lemma
       
  2405   assumes "asize (bsimp a) = asize a" "bsimp a \<noteq> AZERO"
       
  2406   shows "bsimp a = a"
       
  2407   using assms
       
  2408   apply(induct a taking: asize rule: measure_induct)
       
  2409   apply(case_tac x)
       
  2410        apply(simp_all)
       
  2411    apply(case_tac "(bsimp x42) = AZERO")
       
  2412     apply(simp add: asize0)
       
  2413   apply(case_tac "(bsimp x43) = AZERO")
       
  2414     apply(simp add: asize0)
       
  2415     apply (metis bsimp_ASEQ0)
       
  2416    apply(case_tac "\<exists>bs. (bsimp x42) = AONE bs")
       
  2417     apply(auto)[1]
       
  2418     apply (metis b1 bsimp_size fuse_size less_add_Suc2 not_less)
       
  2419   apply (metis Suc_inject add.commute asize.simps(5) bsimp_ASEQ1 bsimp_size leD le_neq_implies_less less_add_Suc2 less_add_eq_less)
       
  2420   (* ALT case *)
       
  2421   apply(frule iii)
       
  2422   apply(case_tac x52)
       
  2423    apply(simp)
       
  2424   apply(simp)
       
  2425   apply(subst k0)
       
  2426   apply(subst (asm) k0)
       
  2427   apply(subst (asm) (2) k0)
       
  2428   apply(subst (asm) (3) k0)
       
  2429   apply(case_tac "(bsimp a) = AZERO")
       
  2430    apply(simp)
       
  2431   apply (metis (no_types, lifting) Suc_le_lessD asize0 bsimp_AALTs_size le_less_trans less_add_same_cancel2 not_less_eq rt)
       
  2432   apply(simp)
       
  2433   apply(case_tac "nonalt  (bsimp a)")
       
  2434    prefer 2
       
  2435   apply(drule_tac  x="AALTs x51 (bsimp a # list)" in  spec)
       
  2436    apply(drule mp)
       
  2437   apply (metis asize.simps(4) bsimp.simps(2) bsimp_AALTs_size3 k0 less_not_refl list.set_intros(1) list.simps(9) sum_list.Cons)
       
  2438    apply(drule mp)  
       
  2439     apply(simp)
       
  2440   apply (metis asize.simps(4) bsimp.simps(2) bsimp_AALTs_size3 k0 lessI list.set_intros(1) list.simps(9) not_less_eq sum_list.Cons)
       
  2441    apply(drule mp)
       
  2442   apply(simp)
       
  2443   using bsimp_idem apply auto[1]
       
  2444     apply(simp add: bsimp_idem)
       
  2445   apply (metis append.left_neutral append_Cons asize.simps(4) bsimp.simps(2) bsimp_AALTs_size3 k00 less_not_refl list.set_intros(1) list.simps(9) sum_list.Cons)
       
  2446   apply (metis bsimp.simps(2) bsimp_idem k0 list.simps(9) nn1b nonalt.elims(3) nonnested.simps(2))
       
  2447   apply(subgoal_tac "flts [bsimp a] = [bsimp a]")
       
  2448   prefer 2
       
  2449   using k0b apply blast
       
  2450   apply(clarify)
       
  2451   apply(simp only:)
       
  2452   apply(simp)
       
  2453   apply(case_tac "flts (map bsimp list) = Nil")
       
  2454    apply (metis bsimp_AALTs1 bsimp_size fuse_size less_add_Suc1 not_less) 
       
  2455   apply (subgoal_tac "bsimp_AALTs x51 (bsimp a # flts (map bsimp list)) =  AALTs x51 (bsimp a # flts (map bsimp list))")
       
  2456    prefer 2
       
  2457    apply (metis bsimp_AALTs.simps(3) neq_Nil_conv)
       
  2458   apply(auto)
       
  2459    apply (metis add.commute bsimp_size leD le_neq_implies_less less_add_Suc1 less_add_eq_less rt)
       
  2460   oops
       
  2461 
       
  2462 
       
  2463 
       
  2464 
       
  2465 lemma OOO:
       
  2466   shows "bsimp (bsimp_AALTs bs rs) = bsimp_AALTs bs (flts (map bsimp rs))"
       
  2467   apply(induct rs arbitrary: bs taking: "\<lambda>rs. sum_list (map asize rs)" rule: measure_induct)
       
  2468   apply(case_tac x)
       
  2469    apply(simp)
       
  2470   apply(simp)
       
  2471   apply(case_tac "a = AZERO")
       
  2472    apply(simp)
       
  2473   apply(case_tac "list")
       
  2474     apply(simp)
       
  2475   apply(simp)
       
  2476   apply(case_tac "bsimp a = AZERO")
       
  2477    apply(simp)
       
  2478   apply(case_tac "list")
       
  2479     apply(simp)
       
  2480     apply(simp add: bsimp_fuse[symmetric])
       
  2481   apply(simp)
       
  2482   apply(case_tac "nonalt (bsimp a)")
       
  2483   apply(case_tac list)
       
  2484   apply(simp)
       
  2485     apply(subst k0b)
       
  2486       apply(simp)
       
  2487      apply(simp)
       
  2488     apply(simp add: bsimp_fuse)
       
  2489    apply(simp)
       
  2490   apply(subgoal_tac "asize (bsimp a) < asize a \<or> asize (bsimp a) = asize a")
       
  2491    prefer 2
       
  2492   using bsimp_size le_neq_implies_less apply blast
       
  2493    apply(erule disjE)
       
  2494   apply(drule_tac x="(bsimp a) # list" in spec)
       
  2495   apply(drule mp)
       
  2496     apply(simp)
       
  2497    apply(simp)
       
  2498   apply (metis bsimp.simps(2) bsimp_AALTs.elims bsimp_AALTs.simps(2) bsimp_fuse bsimp_idem list.distinct(1) list.inject list.simps(9))
       
  2499     apply(subgoal_tac "\<exists>bs rs. bsimp a = AALTs bs rs  \<and> rs \<noteq> Nil \<and> length rs > 1")
       
  2500    prefer 2
       
  2501   apply (metis bbbbs1 bsimp.simps(2) bsimp_AALTs.simps(1) bsimp_idem flts.simps(1) good.simps(5) good1 length_0_conv length_Suc_conv less_one list.simps(8) nat_neq_iff not_less_eq)
       
  2502   apply(auto)
       
  2503   oops
       
  2504 
       
  2505 
       
  2506 lemma  
       
  2507   assumes "rs = [AALTs bsa [AONE bsb, AONE bsb]]"
       
  2508   shows "bsimp (bsimp_AALTs bs rs) = bsimp_AALTs bs (flts (map bsimp rs))"
       
  2509   using assms
       
  2510   apply(simp)
       
  2511   oops
       
  2512 
       
  2513 
       
  2514 
       
  2515 lemma CT1:
       
  2516   shows "bsimp (AALTs bs as) = bsimp(AALTs bs (map  bsimp as))"
       
  2517   apply(induct as arbitrary: bs)
       
  2518    apply(simp)
       
  2519   apply(simp)
       
  2520   by (simp add: bsimp_idem comp_def)
       
  2521   
       
  2522 lemma CT1a:
       
  2523   shows "bsimp (AALT bs a1 a2) = bsimp(AALT bs (bsimp a1) (bsimp a2))"
       
  2524   by (metis CT1 list.simps(8) list.simps(9))
       
  2525 
       
  2526 (* CT *)
       
  2527 
       
  2528 lemma CTU:
       
  2529   shows "bsimp_AALTs bs as = li bs as"
       
  2530   apply(induct bs as rule: li.induct)
       
  2531     apply(auto)
       
  2532   done
       
  2533 
       
  2534 
       
  2535 
       
  2536 lemma CTa:
       
  2537   assumes "\<forall>r \<in> set as. nonalt r \<and> r \<noteq> AZERO"
       
  2538   shows  "flts as = as"
       
  2539   using assms
       
  2540   apply(induct as)
       
  2541    apply(simp)
       
  2542   apply(case_tac as)
       
  2543    apply(simp)
       
  2544   apply (simp add: k0b)
       
  2545   using flts_nothing by auto
       
  2546 
       
  2547 lemma CT0:
       
  2548   assumes "\<forall>r \<in> set as1. nonalt r \<and> r \<noteq> AZERO" 
       
  2549   shows "flts [bsimp_AALTs bs1 as1] =  flts (map (fuse bs1) as1)"
       
  2550   using assms CTa
       
  2551   apply(induct as1 arbitrary: bs1)
       
  2552     apply(simp)
       
  2553    apply(simp)
       
  2554   apply(case_tac as1)
       
  2555    apply(simp)
       
  2556   apply(simp)
       
  2557 proof -
       
  2558 fix a :: arexp and as1a :: "arexp list" and bs1a :: "bit list" and aa :: arexp and list :: "arexp list"
       
  2559   assume a1: "nonalt a \<and> a \<noteq> AZERO \<and> nonalt aa \<and> aa \<noteq> AZERO \<and> (\<forall>r\<in>set list. nonalt r \<and> r \<noteq> AZERO)"
       
  2560   assume a2: "\<And>as. \<forall>r\<in>set as. nonalt r \<and> r \<noteq> AZERO \<Longrightarrow> flts as = as"
       
  2561   assume a3: "as1a = aa # list"
       
  2562   have "flts [a] = [a]"
       
  2563 using a1 k0b by blast
       
  2564 then show "fuse bs1a a # fuse bs1a aa # map (fuse bs1a) list = flts (fuse bs1a a # fuse bs1a aa # map (fuse bs1a) list)"
       
  2565   using a3 a2 a1 by (metis (no_types) append.left_neutral append_Cons flts_fuse k00 k0b list.simps(9))
       
  2566 qed
       
  2567   
       
  2568   
       
  2569 lemma CT01:
       
  2570   assumes "\<forall>r \<in> set as1. nonalt r \<and> r \<noteq> AZERO" "\<forall>r \<in> set as2. nonalt r \<and> r \<noteq> AZERO" 
       
  2571   shows "flts [bsimp_AALTs bs1 as1, bsimp_AALTs bs2 as2] =  flts ((map (fuse bs1) as1) @ (map (fuse bs2) as2))"
       
  2572   using assms CT0
       
  2573   by (metis k0 k00)
       
  2574   
       
  2575 
       
  2576 
       
  2577 
       
  2578 lemma 
       
  2579   shows "bsimp (AALT bs (AALTs bs1 (map (bder c) as1)) (AALTs bs2 (map (bder c) as2)))
       
  2580           = bsimp (AALTs bs ((map (fuse bs1) (map (bder c) as1)) @
       
  2581                              (map (fuse bs2) (map (bder c) as2))))"
       
  2582   apply(subst  bsimp_idem[symmetric])
       
  2583   apply(simp)
       
  2584   oops
       
  2585 
       
  2586 lemma CT_exp:
       
  2587   assumes "\<forall>a \<in> set as. bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  2588   shows "map bsimp (map (bder c) as) = map bsimp (map (bder c) (map bsimp as))"
       
  2589   using assms
       
  2590   apply(induct as)
       
  2591    apply(auto)
       
  2592   done
       
  2593 
       
  2594 lemma asize_set:
       
  2595   assumes "a \<in> set as"
       
  2596   shows "asize a < Suc (sum_list (map asize as))"
       
  2597   using assms
       
  2598   apply(induct as arbitrary: a)
       
  2599    apply(auto)
       
  2600   using le_add2 le_less_trans not_less_eq by blast
       
  2601   
       
  2602 
       
  2603 lemma XXX2a_long_without_good:
       
  2604   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  2605   apply(induct a arbitrary: c taking: "\<lambda>a. asize a" rule: measure_induct)
       
  2606   apply(case_tac x)
       
  2607        apply(simp)
       
  2608       apply(simp)
       
  2609      apply(simp)
       
  2610   prefer 3
       
  2611     apply(simp)
       
  2612   (* AALT case *)
       
  2613    prefer 2
       
  2614    apply(simp del: bsimp.simps)
       
  2615    apply(subst (2) CT1)
       
  2616    apply(subst CT_exp)
       
  2617     apply(auto)[1]
       
  2618   using asize_set apply blast
       
  2619    apply(subst CT1[symmetric])
       
  2620   apply(simp)
       
  2621   oops
       
  2622 
       
  2623 lemma YY:
       
  2624   assumes "flts (map bsimp as1) = xs"
       
  2625   shows "flts (map bsimp (map (fuse bs1) as1)) = map (fuse bs1) xs"
       
  2626   using assms
       
  2627   apply(induct as1 arbitrary: bs1 xs)
       
  2628    apply(simp)
       
  2629   apply(auto)
       
  2630   by (metis bsimp_fuse flts_fuse k0 list.simps(9))
       
  2631   
       
  2632 
       
  2633 lemma flts_nonalt:
       
  2634   assumes "flts (map bsimp xs) = ys"
       
  2635   shows "\<forall>y \<in> set ys. nonalt y"
       
  2636   using assms
       
  2637   apply(induct xs arbitrary: ys)
       
  2638    apply(auto)
       
  2639   apply(case_tac xs)
       
  2640    apply(auto)
       
  2641   using flts2 good1 apply fastforce
       
  2642   by (smt ex_map_conv list.simps(9) nn1b nn1c)
       
  2643 
       
  2644 lemma WWW2:
       
  2645   shows "bsimp (bsimp_AALTs bs1 (flts (map bsimp as1))) =
       
  2646          bsimp_AALTs bs1 (flts (map bsimp as1))"
       
  2647   by (metis bsimp.simps(2) bsimp_idem)
       
  2648 
       
  2649 lemma WWW3:
       
  2650   shows "flts [bsimp_AALTs bs1 (flts (map bsimp as1))] =
       
  2651          flts (map bsimp (map (fuse bs1) as1))"
       
  2652   by (metis CT0 YY flts_nonalt flts_nothing qqq1)
       
  2653 
       
  2654 lemma WWW4:
       
  2655   shows "map (bder c \<circ> fuse bs1) as1 = map (fuse bs1) (map (bder c) as1)"
       
  2656   apply(induct as1)
       
  2657    apply(auto)
       
  2658   using bder_fuse by blast
       
  2659 
       
  2660 lemma WWW5:
       
  2661   shows "map (bsimp \<circ> bder c) as1 = map bsimp (map (bder c) as1)"
       
  2662   apply(induct as1)
       
  2663    apply(auto)
       
  2664   done
       
  2665 
       
  2666 lemma WWW6:
       
  2667   shows "bsimp (bder c (bsimp_AALTs x51 (flts [bsimp a1, bsimp a2]) ) )  = 
       
  2668  bsimp(bsimp_AALTs x51 (map (bder c) (flts [bsimp a1, bsimp a2]))) "
       
  2669   using bder_bsimp_AALTs by auto
       
  2670 
       
  2671 lemma WWW7:
       
  2672   shows "bsimp (bsimp_AALTs x51 (map (bder c) (flts [bsimp a1, bsimp a2]))) =
       
  2673   bsimp(bsimp_AALTs x51 (flts (map (bder c) [bsimp a1, bsimp a2])))"
       
  2674   sorry
       
  2675 
       
  2676 
       
  2677 lemma stupid:
       
  2678   assumes "a = b"
       
  2679   shows "bsimp(a) = bsimp(b)"
       
  2680   using assms
       
  2681   apply(auto)
       
  2682   done
       
  2683 (*
       
  2684 proving idea:
       
  2685 bsimp_AALTs x51  (map (bder c) (flts [a1, a2])) = bsimp_AALTs x51 (map (bder c) (flts [a1]++[a2]))
       
  2686 = bsimp_AALTs x51  (map (bder c) ((flts [a1])++(flts [a2]))) =  
       
  2687 bsimp_AALTs x51 (map (bder c) (flts [a1]))++(map (bder c) (flts [a2])) = A
       
  2688 and then want to prove that
       
  2689 map (bder c) (flts [a]) = flts [bder c a] under the condition 
       
  2690 that a is either a seq with the first elem being not nullable, or a character equal to c,
       
  2691 or an AALTs, or a star
       
  2692 Then, A = bsimp_AALTs x51 (flts [bder c a]) ++ (map (bder c) (flts [a2])) = A1
       
  2693 Using the same condition for a2, we get
       
  2694 A1 = bsimp_AALTs x51 (flts [bder c a1]) ++ (flts [bder c a2])
       
  2695 =bsimp_AALTs x51 flts ([bder c a1] ++ [bder c a2])
       
  2696 =bsimp_AALTs x51 flts ([bder c a1, bder c a2])
       
  2697  *)
       
  2698 lemma manipulate_flts:
       
  2699   shows "bsimp_AALTs x51  (map (bder c) (flts [a1, a2])) = 
       
  2700 bsimp_AALTs x51 ((map (bder c) (flts [a1])) @ (map (bder c) (flts [a2])))"
       
  2701   by (metis k0 map_append)
       
  2702   
       
  2703 lemma go_inside_flts:
       
  2704   assumes " (bder c a1 \<noteq> AZERO) "
       
  2705  "\<not>(\<exists> a01 a02 x02. (  (a1 = ASEQ x02 a01 a02) \<and> bnullable(a01) )      )"
       
  2706 shows "map (bder c) (flts [a1]) = flts [bder c a1]"
       
  2707   using assms
       
  2708   apply -
       
  2709   apply(case_tac a1)
       
  2710   apply(simp)
       
  2711   apply(simp)
       
  2712      apply(case_tac "x32 = c")
       
  2713   prefer 2
       
  2714       apply(simp)
       
  2715      apply(simp)
       
  2716     apply(simp)
       
  2717   apply (simp add: WWW4)
       
  2718    apply(simp add: bder_fuse)
       
  2719   done
       
  2720 
       
  2721 lemma medium010:
       
  2722   assumes " (bder c a1 = AZERO) "
       
  2723   shows "map (bder c) (flts [a1]) = [AZERO] \<or> map (bder c) (flts [a1]) = []"
       
  2724   using assms
       
  2725   apply -
       
  2726   apply(case_tac a1)
       
  2727        apply(simp)
       
  2728       apply(simp)
       
  2729   apply(simp)
       
  2730     apply(simp)
       
  2731   apply(simp)
       
  2732   apply(simp)
       
  2733   done
       
  2734 
       
  2735 lemma medium011:
       
  2736   assumes " (bder c a1 = AZERO) "
       
  2737   shows "flts (map (bder c)  [a1, a2]) = flts [bder c a2]"
       
  2738   using assms
       
  2739   apply -
       
  2740   apply(simp)
       
  2741   done
       
  2742 
       
  2743 lemma medium01central:
       
  2744   shows "bsimp(bsimp_AALTs x51 (map (bder c) (flts [a2])) ) = bsimp(bsimp_AALTs x51 (flts [bder c a2]))"
       
  2745   sorry
       
  2746 
       
  2747 
       
  2748 lemma plus_bsimp:
       
  2749   assumes "bsimp( bsimp a) = bsimp (bsimp b)"
       
  2750   shows "bsimp a = bsimp b"
       
  2751   using assms
       
  2752   apply -
       
  2753   by (simp add: bsimp_idem)
       
  2754 lemma patience_good5:
       
  2755   assumes "bsimp r = AALTs x y"
       
  2756   shows " \<exists> a aa list. y = a#aa#list"
       
  2757   by (metis Nil_is_map_conv arexp.simps(13) assms bsimp_AALTs.elims flts1 good.simps(5) good1 k0a)
       
  2758 
       
  2759 (*SAD*)
       
  2760 (*this does not hold actually
       
  2761 lemma bsimp_equiv0:
       
  2762   shows "bsimp(bsimp r) = bsimp(bsimp (AALTs []  [r]))"
       
  2763   apply(simp)
       
  2764   apply(case_tac "bsimp r")
       
  2765        apply(simp)
       
  2766       apply(simp)
       
  2767      apply(simp)
       
  2768     apply(simp)
       
  2769  thm good1
       
  2770   using good1
       
  2771    apply -
       
  2772    apply(drule_tac x="r" in meta_spec)
       
  2773    apply(erule disjE)
       
  2774 
       
  2775     apply(simp only: bsimp_AALTs.simps)
       
  2776     apply(simp only:flts.simps)
       
  2777     apply(drule patience_good5)
       
  2778     apply(clarify)
       
  2779     apply(subst  bsimp_AALTs_qq)
       
  2780      apply simp
       
  2781     prefer 2
       
  2782   sorry*)
       
  2783 
       
  2784 (*exercise: try multiple ways of proving this*)
       
  2785 (*this lemma does not hold.........
       
  2786 lemma bsimp_equiv1:
       
  2787   shows "bsimp r = bsimp (AALTs []  [r])"
       
  2788   using plus_bsimp
       
  2789   apply -
       
  2790   using bsimp_equiv0 by blast
       
  2791   (*apply(simp)
       
  2792   apply(case_tac "bsimp r")
       
  2793        apply(simp)
       
  2794       apply(simp)
       
  2795      apply(simp)
       
  2796     apply(simp)
       
  2797 (*use lemma good1*)
       
  2798   thm good1
       
  2799   using good1
       
  2800    apply -
       
  2801    apply(drule_tac x="r" in meta_spec)
       
  2802    apply(erule disjE)
       
  2803   
       
  2804   apply(subst flts_single1)
       
  2805   apply(simp only: bsimp_AALTs.simps)
       
  2806     prefer 2
       
  2807   
       
  2808   thm flts_single1
       
  2809 
       
  2810   find_theorems "flts _ = _"*)
       
  2811 *)
       
  2812 lemma bsimp_equiv2:
       
  2813   shows "bsimp (AALTs x51 [r])  =  bsimp (AALT x51 AZERO r)"
       
  2814   sorry
       
  2815 
       
  2816 lemma medium_stupid_isabelle:
       
  2817   assumes "rs = a # list"
       
  2818   shows  "bsimp_AALTs x51 (AZERO # rs) = AALTs x51 (AZERO#rs)"
       
  2819   using assms
       
  2820   apply -
       
  2821   apply(simp)
       
  2822   done 
       
  2823 (*
       
  2824 lemma mediumlittle:
       
  2825   shows "bsimp(bsimp_AALTs x51 rs) = bsimp(bsimp_AALTs x51 (AZERO # rs))"
       
  2826   apply(case_tac rs)
       
  2827    apply(simp)
       
  2828   apply(case_tac list)
       
  2829    apply(subst medium_stupid_isabelle)
       
  2830     apply(simp)
       
  2831    prefer 2
       
  2832    apply simp
       
  2833   apply(rule_tac s="a#list" and t="rs" in subst)
       
  2834    apply(simp)
       
  2835   apply(rule_tac t="list" and s= "[]" in subst)
       
  2836    apply(simp)
       
  2837  (*dunno what is the rule for x#nil = x*)
       
  2838    apply(case_tac a)
       
  2839         apply(simp)
       
  2840        apply(simp)
       
  2841      apply(simp)
       
  2842     prefer 3
       
  2843     apply simp
       
  2844    apply(simp only:bsimp_AALTs.simps)
       
  2845 
       
  2846   apply simp
       
  2847      apply(case_tac "bsimp x42")
       
  2848         apply(simp)
       
  2849        apply simp
       
  2850        apply(case_tac "bsimp x43")
       
  2851             apply simp
       
  2852            apply simp
       
  2853   apply simp
       
  2854          apply simp
       
  2855         apply(simp only:bsimp_ASEQ.simps)
       
  2856   using good1
       
  2857         apply -
       
  2858         apply(drule_tac x="x43" in meta_spec)
       
  2859   apply(erule disjE)
       
  2860         apply(subst bsimp_AALTs_qq)
       
  2861   using patience_good5 apply force
       
  2862          apply(simp only:bsimp_AALTs.simps)
       
  2863   apply(simp only:fuse.simps)
       
  2864          apply(simp only:flts.simps)
       
  2865 (*OK from here you actually realize this lemma doesnt hold*)
       
  2866   apply(simp)
       
  2867         apply(simp)
       
  2868        apply(rule_tac t="rs" and s="a#list" in subst)
       
  2869         apply(simp)
       
  2870    apply(rule_tac t="list" and s="[]" in subst)
       
  2871         apply(simp)
       
  2872        (*apply(simp only:bsimp_AALTs.simps)*)
       
  2873        (*apply(simp only:fuse.simps)*)
       
  2874   sorry
       
  2875 *)
       
  2876 lemma singleton_list_map:
       
  2877   shows"map f [a] = [f a]"
       
  2878   apply simp
       
  2879   done
       
  2880 lemma map_application2:
       
  2881   shows"map f [a,b] = [f a, f b]"
       
  2882   apply simp
       
  2883   done
       
  2884 (*SAD*)
       
  2885 (* bsimp (bder c (bsimp_AALTs x51 (flts [bsimp a1, bsimp a2]))) =
       
  2886        bsimp (AALT x51 (bder c (bsimp a1)) (bder c (bsimp a2)))*)
       
  2887 (*This equality does not hold*)
       
  2888 lemma medium01:
       
  2889   assumes " (bder c a1 = AZERO) "
       
  2890   shows "bsimp(bsimp_AALTs x51 (map (bder c) (flts [ a1, a2]))) =
       
  2891          bsimp(bsimp_AALTs x51 (flts (map (bder c) [ a1, a2])))"
       
  2892   apply(subst manipulate_flts)
       
  2893   using assms
       
  2894   apply -
       
  2895   apply(subst medium011)
       
  2896    apply(simp)
       
  2897   apply(case_tac "map (bder c) (flts [a1]) = []")
       
  2898    apply(simp)
       
  2899   using medium01central apply blast
       
  2900 apply(frule medium010)
       
  2901   apply(erule disjE)
       
  2902   prefer 2
       
  2903    apply(simp)
       
  2904   apply(simp)
       
  2905   apply(case_tac a2)
       
  2906        apply simp
       
  2907       apply simp
       
  2908      apply simp
       
  2909     apply(simp only:flts.simps)
       
  2910 (*HOW do i say here to replace ASEQ ..... back into a2*)
       
  2911 (*how do i say here to use the definition of map function
       
  2912 without lemma, of course*)
       
  2913 (*how do i say here that AZERO#map (bder c) [ASEQ x41 x42 x43]'s list.len >1
       
  2914 without a lemma, of course*)
       
  2915     apply(subst singleton_list_map)
       
  2916     apply(simp only: bsimp_AALTs.simps)
       
  2917     apply(case_tac "bder c (ASEQ x41 x42 x43)")
       
  2918          apply simp
       
  2919         apply simp
       
  2920        apply simp
       
  2921       prefer 3
       
  2922       apply simp
       
  2923      apply(rule_tac t="bder c (ASEQ x41 x42 x43)" 
       
  2924 and s="ASEQ x41a x42a x43a" in subst)
       
  2925       apply simp
       
  2926      apply(simp only: flts.simps)
       
  2927      apply(simp only: bsimp_AALTs.simps)
       
  2928      apply(simp only: fuse.simps)
       
  2929      apply(subst (2) bsimp_idem[symmetric])
       
  2930      apply(subst (1) bsimp_idem[symmetric])
       
  2931      apply(simp only:bsimp.simps)
       
  2932      apply(subst map_application2)
       
  2933      apply(simp only: bsimp.simps)
       
  2934      apply(simp only:flts.simps)
       
  2935 (*want to happily change between a2 and ASEQ x41 42 43, and eliminate now 
       
  2936 redundant conditions such as  map (bder c) (flts [a1]) = [AZERO] *)
       
  2937      apply(case_tac "bsimp x42a")
       
  2938           apply(simp)
       
  2939          apply(case_tac "bsimp x43a")
       
  2940               apply(simp)
       
  2941              apply(simp)
       
  2942             apply(simp)
       
  2943            apply(simp)
       
  2944           prefer 2
       
  2945           apply(simp)
       
  2946      apply(rule_tac t="bsimp x43a" 
       
  2947 and s="AALTs x51a x52" in subst)
       
  2948           apply simp
       
  2949          apply(simp only:bsimp_ASEQ.simps)
       
  2950          apply(simp only:fuse.simps)
       
  2951          apply(simp only:flts.simps)
       
  2952          
       
  2953   using medium01central mediumlittle by auto
       
  2954  
       
  2955   
       
  2956 
       
  2957 lemma medium1:
       
  2958   assumes " (bder c a1 \<noteq> AZERO) "
       
  2959  "\<not>(\<exists> a01 a02 x02. (  (a1 = ASEQ x02 a01 a02) \<and> bnullable(a01) )      )"
       
  2960 " (bder c a2 \<noteq> AZERO)"
       
  2961  "\<not>(\<exists> a11 a12 x12. (  (a2 = ASEQ x12 a11 a12) \<and> bnullable(a11) )      )"
       
  2962   shows "bsimp_AALTs x51 (map (bder c) (flts [ a1, a2])) =
       
  2963          bsimp_AALTs x51 (flts (map (bder c) [ a1, a2]))"
       
  2964   using assms
       
  2965   apply -
       
  2966   apply(subst manipulate_flts)
       
  2967   apply(case_tac "a1")
       
  2968        apply(simp)
       
  2969       apply(simp)
       
  2970      apply(case_tac "x32 = c")
       
  2971       prefer 2
       
  2972   apply(simp)
       
  2973      prefer 2
       
  2974      apply(case_tac "bnullable x42")
       
  2975       apply(simp)
       
  2976        apply(simp)
       
  2977 
       
  2978   apply(case_tac "a2")
       
  2979             apply(simp)
       
  2980          apply(simp)
       
  2981         apply(case_tac "x32 = c")
       
  2982          prefer 2 
       
  2983   apply(simp)
       
  2984         apply(simp)
       
  2985        apply(case_tac "bnullable x42a")
       
  2986         apply(simp)
       
  2987        apply(subst go_inside_flts)
       
  2988   apply(simp)
       
  2989         apply(simp)
       
  2990        apply(simp)
       
  2991       apply(simp)
       
  2992       apply (simp add: WWW4)
       
  2993       apply(simp)
       
  2994       apply (simp add: WWW4)
       
  2995   apply (simp add: go_inside_flts)
       
  2996   apply (metis (no_types, lifting) go_inside_flts k0 list.simps(8) list.simps(9))
       
  2997   by (smt bder.simps(6) flts.simps(1) flts.simps(6) flts.simps(7) go_inside_flts k0 list.inject list.simps(9))
       
  2998   
       
  2999 lemma big0:
       
  3000   shows "bsimp (AALT x51 (AALTs bs1 as1) (AALTs bs2 as2)) =
       
  3001          bsimp (AALTs x51 ((map (fuse bs1) as1) @ (map (fuse bs2) as2)))"
       
  3002   by (smt WWW3 bsimp.simps(2) k0 k00 list.simps(8) list.simps(9) map_append)
       
  3003 
       
  3004 lemma bignA:
       
  3005   shows "bsimp (AALTs x51 (AALTs bs1 as1 # as2)) =
       
  3006          bsimp (AALTs x51 ((map (fuse bs1) as1) @ as2))"
       
  3007   apply(simp)
       
  3008   apply(subst k0)
       
  3009   apply(subst WWW3)
       
  3010   apply(simp add: flts_append)
       
  3011   done
       
  3012 
       
  3013 lemma XXX2a_long_without_good:
       
  3014   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  3015   apply(induct a arbitrary: c taking: "\<lambda>a. asize a" rule: measure_induct)
       
  3016   apply(case_tac x)
       
  3017        apply(simp)
       
  3018       apply(simp)
       
  3019      apply(simp)
       
  3020     prefer 3
       
  3021     apply(simp)
       
  3022   (* AALT case *)
       
  3023    prefer 2
       
  3024    apply(simp only:)
       
  3025    apply(case_tac "\<exists>a1 a2. x52 = [a1, a2]")
       
  3026     apply(clarify)
       
  3027   apply(simp del: bsimp.simps)
       
  3028   apply(subst (2) CT1) 
       
  3029     apply(simp del: bsimp.simps)
       
  3030   apply(rule_tac t="bsimp (bder c a1)" and  s="bsimp (bder c (bsimp a1))" in subst)
       
  3031   apply(simp del: bsimp.simps)
       
  3032   apply(rule_tac t="bsimp (bder c a2)" and  s="bsimp (bder c (bsimp a2))" in subst)
       
  3033      apply(simp del: bsimp.simps)
       
  3034     apply(subst  CT1a[symmetric])
       
  3035     apply(subst bsimp.simps)
       
  3036     apply(simp del: bsimp.simps)
       
  3037 (*bsimp_AALTs x51 (map (bder c) (flts [a1, a2])) =
       
  3038     bsimp_AALTs x51 (flts (map (bder c) [a1, a2]))*)
       
  3039   apply(case_tac "\<exists>bs1 as1. bsimp a1 = AALTs bs1 as1")
       
  3040   apply(case_tac "\<exists>bs2 as2. bsimp a2 = AALTs bs2 as2")
       
  3041       apply(clarify)
       
  3042   apply(simp only:)
       
  3043       apply(simp del: bsimp.simps bder.simps)
       
  3044       apply(subst bsimp_AALTs_qq)
       
  3045        prefer 2
       
  3046        apply(simp del: bsimp.simps)
       
  3047        apply(subst big0)
       
  3048        apply(simp add: WWW4)
       
  3049   apply (metis One_nat_def Suc_eq_plus1 Suc_lessI arexp.distinct(7) bsimp.simps(2) bsimp_AALTs.simps(1) bsimp_idem flts.simps(1) length_append length_greater_0_conv length_map not_add_less2 not_less_eq)
       
  3050   oops
       
  3051 
       
  3052 lemma XXX2a_long_without_good:
       
  3053   shows "bsimp (bder c (bsimp a)) = bsimp (bder c a)"
       
  3054   apply(induct a arbitrary: c taking: "\<lambda>a. asize a" rule: measure_induct)
       
  3055   apply(case_tac x)
       
  3056        apply(simp)
       
  3057       apply(simp)
       
  3058      apply(simp)
       
  3059   prefer 3
       
  3060     apply(simp)
       
  3061   (* AALT case *)
       
  3062    prefer 2
       
  3063    apply(subgoal_tac "nonnested (bsimp x)")
       
  3064     prefer 2
       
  3065   using nn1b apply blast
       
  3066    apply(simp only:)
       
  3067   apply(drule_tac x="AALTs x51 (flts x52)" in spec)
       
  3068    apply(drule mp)
       
  3069     defer
       
  3070     apply(drule_tac x="c" in spec)
       
  3071     apply(simp)
       
  3072     apply(rotate_tac 2)
       
  3073   
       
  3074     apply(drule sym)
       
  3075   apply(simp)
       
  3076 
       
  3077    apply(simp only: bder.simps)
       
  3078    apply(simp only: bsimp.simps)
       
  3079    apply(subst bder_bsimp_AALTs)
       
  3080    apply(case_tac x52)
       
  3081     apply(simp)
       
  3082    apply(simp)
       
  3083   apply(case_tac list)
       
  3084     apply(simp)
       
  3085     apply(case_tac a)
       
  3086          apply(simp)
       
  3087         apply(simp)
       
  3088        apply(simp)
       
  3089       defer
       
  3090       apply(simp)
       
  3091   
       
  3092 
       
  3093    (* case AALTs list is not empty *)
       
  3094    apply(simp)
       
  3095    apply(subst k0)
       
  3096    apply(subst (2) k0)
       
  3097    apply(simp)
       
  3098    apply(case_tac "bsimp a = AZERO")
       
  3099     apply(subgoal_tac "bsimp (bder c a) = AZERO")
       
  3100      prefer 2
       
  3101   using less_iff_Suc_add apply auto[1]
       
  3102     apply(simp)
       
  3103   apply(drule_tac x="AALTs x51 list" in  spec)
       
  3104    apply(drule mp)
       
  3105     apply(simp add: asize0)
       
  3106    apply(drule_tac x="c" in spec)
       
  3107     apply(simp add: bder_bsimp_AALTs)
       
  3108    apply(case_tac  "nonalt (bsimp a)")
       
  3109     prefer 2
       
  3110   apply(drule_tac x="bsimp (AALTs x51 (a#list))" in  spec)
       
  3111     apply(drule mp)
       
  3112      apply(rule order_class.order.strict_trans2)
       
  3113       apply(rule bsimp_AALTs_size3)
       
  3114       apply(auto)[1]
       
  3115      apply(simp)
       
  3116     apply(subst (asm) bsimp_idem)
       
  3117   apply(drule_tac x="c" in spec)
       
  3118   apply(simp)  
       
  3119   find_theorems "_ < _ \<Longrightarrow> _ \<le> _ \<Longrightarrow>_ < _"
       
  3120   apply(rule le_trans)
       
  3121   apply(subgoal_tac "flts [bsimp a] = [bsimp a]")
       
  3122      prefer 2
       
  3123   using k0b apply blast
       
  3124     apply(simp)
       
  3125   find_theorems "asize _ < asize _"
       
  3126   
       
  3127   using bder_bsimp_AALTs
       
  3128    apply(case_tac list)
       
  3129     apply(simp)
       
  3130    sledgeha mmer [timeout=6000]  
       
  3131 
       
  3132    apply(case_tac "\<exists>r \<in> set (map bsimp x52). \<not>nonalt r")
       
  3133     apply(drule_tac x="bsimp (AALTs x51 x52)" in spec)
       
  3134     apply(drule mp)
       
  3135   using bsimp_AALTs_size3 apply blast
       
  3136     apply(drule_tac x="c" in spec)
       
  3137   apply(subst (asm) (2) test)
       
  3138   
       
  3139    apply(case_tac x52)
       
  3140     apply(simp)
       
  3141    apply(simp)
       
  3142   apply(case_tac "bsimp a = AZERO")
       
  3143      apply(simp)
       
  3144      apply(subgoal_tac "bsimp (bder c a) = AZERO")
       
  3145       prefer 2
       
  3146      apply auto[1]
       
  3147   apply (metis L.simps(1) L_bsimp_erase der.simps(1) der_correctness erase.simps(1) erase_bder xxx_bder2)
       
  3148     apply(simp)
       
  3149     apply(drule_tac x="AALTs x51 list" in spec)
       
  3150     apply(drule mp)
       
  3151      apply(simp add: asize0)
       
  3152   apply(simp)
       
  3153    apply(case_tac list)
       
  3154     prefer 2
       
  3155     apply(simp)
       
  3156   apply(case_tac "bsimp aa = AZERO")
       
  3157      apply(simp)
       
  3158      apply(subgoal_tac "bsimp (bder c aa) = AZERO")
       
  3159       prefer 2
       
  3160       apply auto[1]
       
  3161       apply (metis add.left_commute bder.simps(1) bsimp.simps(3) less_add_Suc1)
       
  3162      apply(simp)
       
  3163   apply(drule_tac x="AALTs x51 (a#lista)" in spec)
       
  3164     apply(drule mp)
       
  3165      apply(simp  add: asize0)
       
  3166      apply(simp)
       
  3167      apply (metis flts.simps(2) k0)
       
  3168     apply(subst k0)
       
  3169   apply(subst (2) k0)
       
  3170   
       
  3171   
       
  3172   using less_add_Suc1 apply fastforce
       
  3173     apply(subst k0)
       
  3174   
       
  3175 
       
  3176     apply(simp)
       
  3177     apply(case_tac "bsimp a = AZERO")
       
  3178      apply(simp)
       
  3179      apply(subgoal_tac "bsimp (bder c a) = AZERO")
       
  3180       prefer 2
       
  3181   apply auto[1]
       
  3182      apply(simp)
       
  3183   apply(case_tac "nonalt (bsimp a)")
       
  3184      apply(subst bsimp_AALTs1)
       
  3185       apply(simp)
       
  3186   using less_add_Suc1 apply fastforce
       
  3187   
       
  3188      apply(subst bsimp_AALTs1)
       
  3189   
       
  3190   using nn11a apply b last
       
  3191 
       
  3192   (* SEQ case *)
       
  3193    apply(clarify)
       
  3194   apply(subst  bsimp.simps)
       
  3195    apply(simp del: bsimp.simps)
       
  3196    apply(auto simp del: bsimp.simps)[1]
       
  3197     apply(subgoal_tac "bsimp x42 \<noteq> AZERO")
       
  3198   prefer 2
       
  3199   using b3 apply force
       
  3200   apply(case_tac "bsimp x43 = AZERO")
       
  3201      apply(simp)
       
  3202      apply (simp add: bsimp_ASEQ0)
       
  3203   apply (metis bder.simps(1) bsimp.simps(3) bsimp_AALTs.simps(1) bsimp_fuse flts.simps(1) flts.simps(2) fuse.simps(1) less_add_Suc2)
       
  3204     apply(case_tac "\<exists>bs. bsimp x42 = AONE bs")
       
  3205      apply(clarify)
       
  3206      apply(simp)
       
  3207      apply(subst bsimp_ASEQ2)
       
  3208      apply(subgoal_tac "bsimp (bder c x42) = AZERO")
       
  3209       prefer 2
       
  3210   using less_add_Suc1 apply fastforce
       
  3211      apply(simp)
       
  3212      apply(frule_tac x="x43" in spec)
       
  3213   apply(drule mp)
       
  3214      apply(simp)
       
  3215   apply(drule_tac x="c" in spec)
       
  3216      apply(subst bder_fuse)
       
  3217   apply(subst bsimp_fuse[symmetric])
       
  3218      apply(simp)
       
  3219   apply(subgoal_tac "bmkeps x42 = bs")
       
  3220       prefer 2
       
  3221       apply (simp add: bmkeps_simp)
       
  3222      apply(simp)
       
  3223      apply(subst bsimp_fuse[symmetric])
       
  3224   apply(case_tac "nonalt (bsimp (bder c x43))")
       
  3225       apply(subst bsimp_AALTs1)
       
  3226   using nn11a apply blast
       
  3227   using fuse_append apply blast
       
  3228      apply(subgoal_tac "\<exists>bs rs. bsimp (bder c x43) = AALTs bs rs")
       
  3229       prefer 2
       
  3230   using bbbbs1 apply blast
       
  3231   apply(clarify)
       
  3232      apply(simp)
       
  3233      apply(case_tac rs)
       
  3234       apply(simp)
       
  3235       apply (metis arexp.distinct(7) good.simps(4) good1)
       
  3236      apply(simp)
       
  3237      apply(case_tac list)
       
  3238       apply(simp)
       
  3239       apply (metis arexp.distinct(7) good.simps(5) good1)
       
  3240   apply(simp del: bsimp_AALTs.simps)
       
  3241   apply(simp only: bsimp_AALTs.simps)
       
  3242      apply(simp)
       
  3243   
       
  3244   
       
  3245 
       
  3246 
       
  3247 (* HERE *)
       
  3248 apply(case_tac "x42 = AZERO")
       
  3249      apply(simp)
       
  3250    apply(case_tac "bsimp x43 = AZERO")
       
  3251      apply(simp)
       
  3252      apply (simp add: bsimp_ASEQ0)
       
  3253      apply(subgoal_tac "bsimp (fuse (bmkeps x42) (bder c x43)) = AZERO")
       
  3254       apply(simp)
       
  3255   apply (met is bder.simps(1) bsimp.simps(3) bsimp_fuse fuse.simps(1) less_add_Suc2)
       
  3256   apply(case_tac "\<exists>bs. bsimp x42 = AONE bs")
       
  3257      apply(clarify)
       
  3258      apply(simp)
       
  3259      apply(subst bsimp_ASEQ2)
       
  3260      apply(subgoal_tac "bsimp (bder c x42) = AZERO")
       
  3261       apply(simp)
       
  3262   prefer 2
       
  3263   using less_add_Suc1 apply fastforce
       
  3264      apply(subgoal_tac "bmkeps x42 = bs")
       
  3265       prefer 2
       
  3266       apply (simp add: bmkeps_simp)
       
  3267      apply(simp)
       
  3268      apply(case_tac "nonalt (bsimp (bder c x43))")
       
  3269   apply (metis bder_fuse bsimp_AALTs.simps(1) bsimp_AALTs.simps(2) bsimp_fuse flts.simps(1) flts.simps(2) fuse.simps(1) fuse_append k0b less_add_Suc2 nn11a)
       
  3270      apply(subgoal_tac "nonnested (bsimp (bder c x43))")
       
  3271       prefer 2
       
  3272   using nn1b apply blast
       
  3273      apply(case_tac x43)
       
  3274           apply(simp)
       
  3275          apply(simp)
       
  3276         apply(simp)
       
  3277        prefer 3
       
  3278        apply(simp)
       
  3279        apply (metis arexp.distinct(25) arexp.distinct(7) arexp.distinct(9) bsimp_ASEQ.simps(1) bsimp_ASEQ.simps(11) bsimp_ASEQ1 nn11a nonalt.elims(3) nonalt.simps(6)) 
       
  3280       apply(simp)
       
  3281       apply(auto)[1]
       
  3282        apply(case_tac "(bsimp (bder c x42a)) = AZERO")
       
  3283         apply(simp)
       
  3284   
       
  3285        apply(simp)
       
  3286   
       
  3287   
       
  3288   
       
  3289      apply(subgoal_tac "(\<exists>bs1 rs1. 1 < length rs1 \<and> bsimp (bder c x43) =  AALTs bs1 rs1 ) \<or>
       
  3290                         (\<exists>bs1 r. bsimp (bder c x43) =  fuse bs1 r)")
       
  3291       prefer 2
       
  3292   apply (metis fuse_empty)
       
  3293      apply(erule disjE)
       
  3294   prefer 2
       
  3295      apply(clarify)
       
  3296      apply(simp only:)
       
  3297      apply(simp)
       
  3298      apply(simp add: fuse_append)
       
  3299      apply(subst bder_fuse)
       
  3300      apply(subst bsimp_fuse[symmetric])
       
  3301      apply(subst bder_fuse)
       
  3302      apply(subst bsimp_fuse[symmetric])
       
  3303      apply(subgoal_tac "bsimp (bder c (bsimp x43)) = bsimp (bder c x43)")
       
  3304       prefer 2
       
  3305   using less_add_Suc2 apply bl ast
       
  3306      apply(simp only: )
       
  3307      apply(subst bsimp_fuse[symmetric])
       
  3308       apply(simp only: )
       
  3309   
       
  3310      apply(simp only: fuse.simps)
       
  3311   apply(simp)
       
  3312       apply(case_tac rs1)
       
  3313       apply(simp)
       
  3314       apply (me tis arexp.distinct(7) fuse.simps(1) good.simps(4) good1 good_fuse)
       
  3315   apply(simp)
       
  3316   apply(case_tac list)
       
  3317       apply(simp)
       
  3318       apply (me tis arexp.distinct(7) fuse.simps(1) good.simps(5) good1 good_fuse)
       
  3319      apply(simp only: bsimp_AALTs.simps map_cons.simps)
       
  3320      apply(auto)[1]
       
  3321   
       
  3322   
       
  3323       
       
  3324       apply(subst bsimp_fuse[symmetric])
       
  3325   apply(subgoal_tac "bmkeps x42 = bs")
       
  3326       prefer 2
       
  3327       apply (simp add: bmkeps_simp)
       
  3328   
       
  3329   
       
  3330         apply(simp)
       
  3331   
       
  3332   using b3 apply force
       
  3333   using bsimp_ASEQ0 test2 apply fo rce
       
  3334   thm good_SEQ test2
       
  3335      apply (simp add: good_SEQ test2)
       
  3336     apply (simp add: good_SEQ test2)
       
  3337   apply(case_tac "x42 = AZERO")
       
  3338      apply(simp)
       
  3339    apply(case_tac "x43 = AZERO")
       
  3340     apply(simp)
       
  3341   apply (simp add: bsimp_ASEQ0)
       
  3342   apply(case_tac "\<exists>bs. x42 = AONE bs")
       
  3343      apply(clarify)
       
  3344      apply(simp)
       
  3345     apply(subst bsimp_ASEQ1)
       
  3346       apply(simp)
       
  3347   using bsimp_ASEQ0 test2 apply fo rce
       
  3348      apply (simp add: good_SEQ test2)
       
  3349     apply (simp add: good_SEQ test2)
       
  3350   apply (simp add: good_SEQ test2)
       
  3351   (* AALTs case *)
       
  3352   apply(simp)
       
  3353   using test2 by fa st force
       
  3354 
       
  3355 
       
  3356 lemma XXX4ab:
       
  3357   shows "good (bders_simp (bsimp r) s)  \<or> bders_simp (bsimp r) s = AZERO"
       
  3358   apply(induct s arbitrary: r rule:  rev_induct)
       
  3359    apply(simp)
       
  3360   apply (simp add: good1)
       
  3361   apply(simp add: bders_simp_append)
       
  3362   apply (simp add: good1)
       
  3363   done
       
  3364 
       
  3365 lemma XXX4:
       
  3366   assumes "good a"
       
  3367   shows "bders_simp a s = bsimp (bders a s)"
       
  3368   using  assms
       
  3369   apply(induct s arbitrary: a rule: rev_induct)
       
  3370    apply(simp)
       
  3371    apply (simp add: test2)
       
  3372   apply(simp add: bders_append bders_simp_append)
       
  3373   oops
       
  3374 
       
  3375 
       
  3376 lemma MAINMAIN:
       
  3377   "blexer r s = blexer_simp r s"
       
  3378   apply(induct s arbitrary: r)
       
  3379   apply(simp add: blexer_def blexer_simp_def)
       
  3380   apply(simp add: blexer_def blexer_simp_def del: bders.simps bders_simp.simps)
       
  3381   apply(auto simp del: bders.simps bders_simp.simps)
       
  3382     prefer 2
       
  3383   apply (metis b4 bders.simps(2) bders_simp.simps(2))
       
  3384    prefer 2
       
  3385   apply (metis b4 bders.simps(2))
       
  3386   apply(subst bmkeps_simp)
       
  3387    apply(simp)
       
  3388   apply(case_tac s)
       
  3389    apply(simp only: bders.simps)
       
  3390    apply(subst bders_simp.simps)
       
  3391   apply(simp)
       
  3392   oops   
       
  3393 
       
  3394 
       
  3395 lemma
       
  3396   fixes n :: nat
       
  3397   shows "(\<Sum>i \<in> {0..n}. i) = n * (n + 1) div 2"
       
  3398   apply(induct n)
       
  3399   apply(simp)
       
  3400   apply(simp)
       
  3401   done
       
  3402 
       
  3403 
       
  3404 
       
  3405 
       
  3406 
       
  3407 end