thys3/HarderProps.thy
changeset 556 c27f04bb2262
equal deleted inserted replaced
555:aecf1ddf3541 556:c27f04bb2262
       
     1 theory HarderProps imports BasicIdentities
       
     2 begin
       
     3 
       
     4 
       
     5 
       
     6 
       
     7 lemma spawn_simp_rsimpalts:
       
     8   shows "rsimp (rsimp_ALTs rs) = rsimp (rsimp_ALTs (map rsimp rs))"
       
     9   apply(cases rs)
       
    10    apply simp
       
    11   apply(case_tac list)
       
    12    apply simp
       
    13    apply(subst rsimp_idem[symmetric])
       
    14    apply simp
       
    15   apply(subgoal_tac "rsimp_ALTs rs = RALTS rs")
       
    16    apply(simp only:)
       
    17    apply(subgoal_tac "rsimp_ALTs (map rsimp rs) = RALTS (map rsimp rs)")
       
    18     apply(simp only:)
       
    19   prefer 2
       
    20   apply simp
       
    21    prefer 2
       
    22   using rsimp_ALTs.simps(3) apply presburger
       
    23   apply auto
       
    24   apply(subst rsimp_idem)+
       
    25   by (metis comp_apply rsimp_idem)
       
    26 
       
    27 
       
    28 
       
    29 
       
    30 lemma good1_rsimpalts:
       
    31   shows "rsimp r = RALTS rs \<Longrightarrow> rsimp_ALTs rs = RALTS rs"
       
    32   by (metis no_alt_short_list_after_simp) 
       
    33   
       
    34 
       
    35 
       
    36 
       
    37 lemma good1_flatten:
       
    38   shows "\<lbrakk> rsimp r =  (RALTS rs1)\<rbrakk>
       
    39        \<Longrightarrow> rflts (rsimp_ALTs rs1 # map rsimp rsb) = rflts (rs1 @ map rsimp rsb)"
       
    40   apply(subst good1_rsimpalts)
       
    41    apply simp+
       
    42   apply(subgoal_tac "rflts (rs1 @ map rsimp rsb) = rs1 @ rflts (map rsimp rsb)")
       
    43    apply simp
       
    44   using flts_append rsimp_inner_idem4 by presburger
       
    45 
       
    46   
       
    47 lemma flatten_rsimpalts:
       
    48   shows "rflts (rsimp_ALTs (rdistinct (rflts (map rsimp rsa)) {}) # map rsimp rsb) = 
       
    49          rflts ( (rdistinct (rflts (map rsimp rsa)) {}) @ map rsimp rsb)"
       
    50   apply(case_tac "map rsimp rsa")
       
    51    apply simp
       
    52   apply(case_tac "list")
       
    53    apply simp
       
    54    apply(case_tac a)
       
    55         apply simp+
       
    56     apply(rename_tac rs1)
       
    57     apply (metis good1_flatten map_eq_Cons_D no_further_dB_after_simp)
       
    58   
       
    59   apply simp
       
    60   
       
    61   apply(subgoal_tac "\<forall>r \<in> set( rflts (map rsimp rsa)). good r")
       
    62    apply(case_tac "rdistinct (rflts (map rsimp rsa)) {}")
       
    63     apply simp
       
    64    apply(case_tac "listb")
       
    65     apply simp+
       
    66   apply (metis Cons_eq_appendI good1_flatten rflts.simps(3) rsimp.simps(2) rsimp_ALTs.simps(3))
       
    67   by (metis (mono_tags, lifting) flts3 good1 image_iff list.set_map)
       
    68 
       
    69 
       
    70 
       
    71 
       
    72 
       
    73 
       
    74 lemma simp_flatten:
       
    75   shows "rsimp (RALTS ((RALTS rsa) # rsb)) = rsimp (RALTS (rsa @ rsb))"
       
    76   apply simp
       
    77   apply(subst flatten_rsimpalts)
       
    78   apply(simp add: flts_append)
       
    79   by (metis Diff_empty distinct_once_enough flts_append nonalt0_fltseq nonalt_flts_rd qqq1 rdistinct_set_equality1)
       
    80 
       
    81 
       
    82 
       
    83 
       
    84 
       
    85 lemma simp_flatten_aux0:
       
    86   shows "rsimp (RALTS rs) = rsimp (RALTS (map rsimp rs))"
       
    87   apply(induct rs)
       
    88    apply simp+
       
    89   by (metis (mono_tags, opaque_lifting) comp_eq_dest_lhs map_eq_conv rsimp_idem)
       
    90   
       
    91 
       
    92 
       
    93 
       
    94 
       
    95 
       
    96 lemma good_singleton:
       
    97   shows "good a \<and> nonalt a  \<Longrightarrow> rflts [a] = [a]"
       
    98   using good.simps(1) k0b by blast
       
    99 
       
   100 
       
   101 
       
   102 
       
   103 
       
   104 lemma good_flatten_aux_aux1:
       
   105   shows "\<lbrakk> size rs \<ge>2; 
       
   106 \<forall>r \<in> set rs. good r \<and> r \<noteq> RZERO \<and> nonalt r; \<forall>r \<in> set rsb. good r \<and> r \<noteq> RZERO \<and> nonalt r \<rbrakk>
       
   107        \<Longrightarrow> rdistinct (rs @ rsb) rset =
       
   108            rdistinct (rflts [rsimp_ALTs (rdistinct rs {})] @ rsb) rset"
       
   109   apply(induct rs arbitrary: rset)
       
   110    apply simp
       
   111   apply(case_tac "a \<in> rset")
       
   112    apply simp
       
   113    apply(case_tac "rdistinct rs {a}")
       
   114     apply simp
       
   115     apply(subst good_singleton)
       
   116      apply force
       
   117   apply simp
       
   118     apply (meson all_that_same_elem)
       
   119    apply(subgoal_tac "rflts [rsimp_ALTs (a # rdistinct rs {a})] = a # rdistinct rs {a} ")
       
   120   prefer 2
       
   121   using k0a rsimp_ALTs.simps(3) apply presburger
       
   122   apply(simp only:)
       
   123   apply(subgoal_tac "rdistinct (rs @ rsb) rset = rdistinct ((rdistinct (a # rs) {}) @ rsb) rset ")
       
   124     apply (metis insert_absorb insert_is_Un insert_not_empty rdistinct.simps(2))
       
   125    apply (meson distinct_eq_interesting1)
       
   126   apply simp
       
   127   apply(case_tac "rdistinct rs {a}")
       
   128   prefer 2
       
   129    apply(subgoal_tac "rsimp_ALTs (a # rdistinct rs {a}) = RALTS (a # rdistinct rs {a})")
       
   130   apply(simp only:)
       
   131   apply(subgoal_tac "a # rdistinct (rs @ rsb) (insert a rset) =
       
   132            rdistinct (rflts [RALTS (a # rdistinct rs {a})] @ rsb) rset")
       
   133    apply simp
       
   134   apply (metis append_Cons distinct_early_app empty_iff insert_is_Un k0a rdistinct.simps(2))
       
   135   using rsimp_ALTs.simps(3) apply presburger
       
   136   by (metis Un_insert_left append_Cons distinct_early_app empty_iff good_singleton rdistinct.simps(2) rsimp_ALTs.simps(2) sup_bot_left)
       
   137 
       
   138 
       
   139 
       
   140   
       
   141 
       
   142 lemma good_flatten_aux_aux:
       
   143   shows "\<lbrakk>\<exists>a aa lista list. rs = a # list \<and> list = aa # lista; 
       
   144 \<forall>r \<in> set rs. good r \<and> r \<noteq> RZERO \<and> nonalt r; \<forall>r \<in> set rsb. good r \<and> r \<noteq> RZERO \<and> nonalt r \<rbrakk>
       
   145        \<Longrightarrow> rdistinct (rs @ rsb) rset =
       
   146            rdistinct (rflts [rsimp_ALTs (rdistinct rs {})] @ rsb) rset"
       
   147   apply(erule exE)+
       
   148   apply(subgoal_tac "size rs \<ge> 2")
       
   149    apply (metis good_flatten_aux_aux1)
       
   150   by (simp add: Suc_leI length_Cons less_add_Suc1)
       
   151 
       
   152 
       
   153 
       
   154 lemma good_flatten_aux:
       
   155   shows " \<lbrakk>\<forall>r\<in>set rs. good r \<or> r = RZERO; \<forall>r\<in>set rsa . good r \<or> r = RZERO; 
       
   156            \<forall>r\<in>set rsb. good r \<or> r = RZERO;
       
   157      rsimp (RALTS (rsa @ rs @ rsb)) = rsimp_ALTs (rdistinct (rflts (rsa @ rs @ rsb)) {});
       
   158      rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) =
       
   159      rsimp_ALTs (rdistinct (rflts (rsa @ [rsimp (RALTS rs)] @ rsb)) {});
       
   160      map rsimp rsa = rsa; 
       
   161      map rsimp rsb = rsb; 
       
   162      map rsimp rs = rs;
       
   163      rdistinct (rflts rsa @ rflts rs @ rflts rsb) {} =
       
   164      rdistinct (rflts rsa) {} @ rdistinct (rflts rs @ rflts rsb) (set (rflts rsa));
       
   165      rdistinct (rflts rsa @ rflts [rsimp (RALTS rs)] @ rflts rsb) {} =
       
   166      rdistinct (rflts rsa) {} @ rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))\<rbrakk>
       
   167     \<Longrightarrow>    rdistinct (rflts rs @ rflts rsb) rset =
       
   168            rdistinct (rflts [rsimp (RALTS rs)] @ rflts rsb) rset"
       
   169   apply simp
       
   170   apply(case_tac "rflts rs ")
       
   171    apply simp
       
   172   apply(case_tac "list")
       
   173    apply simp
       
   174    apply(case_tac "a \<in> rset")
       
   175     apply simp
       
   176   apply (metis append.left_neutral append_Cons equals0D k0b list.set_intros(1) nonalt_flts_rd qqq1 rdistinct.simps(2))
       
   177    apply simp
       
   178   apply (metis Un_insert_left append_Cons append_Nil ex_in_conv flts_single1 insertI1 list.simps(15) nonalt_flts_rd nonazero.elims(3) qqq1 rdistinct.simps(2) sup_bot_left)
       
   179   apply(subgoal_tac "\<forall>r \<in> set (rflts rs). good r \<and> r \<noteq> RZERO \<and> nonalt r")
       
   180    prefer 2
       
   181   apply (metis Diff_empty flts3 nonalt_flts_rd qqq1 rdistinct_set_equality1)  
       
   182   apply(subgoal_tac "\<forall>r \<in> set (rflts rsb). good r \<and> r \<noteq> RZERO \<and> nonalt r")
       
   183    prefer 2
       
   184   apply (metis Diff_empty flts3 good.simps(1) nonalt_flts_rd rdistinct_set_equality1)  
       
   185   by (smt (verit, ccfv_threshold) good_flatten_aux_aux)
       
   186 
       
   187   
       
   188 
       
   189 
       
   190 lemma good_flatten_middle:
       
   191   shows "\<lbrakk>\<forall>r \<in> set rs. good r \<or> r = RZERO; 
       
   192           \<forall>r \<in> set rsa. good r \<or> r = RZERO; 
       
   193           \<forall>r \<in> set rsb. good r \<or> r = RZERO\<rbrakk> \<Longrightarrow>
       
   194 rsimp (RALTS (rsa @ rs @ rsb)) = 
       
   195 rsimp (RALTS (rsa @ [RALTS rs] @ rsb))"
       
   196   apply(subgoal_tac "rsimp (RALTS (rsa @ rs @ rsb)) = rsimp_ALTs (rdistinct (rflts (map rsimp rsa @ 
       
   197 map rsimp rs @ map rsimp rsb)) {})")
       
   198   prefer 2
       
   199   apply simp
       
   200   apply(simp only:)
       
   201     apply(subgoal_tac "rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) = rsimp_ALTs (rdistinct (rflts (map rsimp rsa @ 
       
   202 [rsimp (RALTS rs)] @ map rsimp rsb)) {})")
       
   203   prefer 2
       
   204    apply simp
       
   205   apply(simp only:)
       
   206   apply(subgoal_tac "map rsimp rsa = rsa")
       
   207   prefer 2
       
   208   apply (metis map_idI rsimp.simps(3) test)
       
   209   apply(simp only:)
       
   210   apply(subgoal_tac "map rsimp rsb = rsb")
       
   211    prefer 2
       
   212   apply (metis map_idI rsimp.simps(3) test)
       
   213   apply(simp only:)
       
   214   apply(subst flts_append)+
       
   215   apply(subgoal_tac "map rsimp rs = rs")
       
   216    apply(simp only:)
       
   217    prefer 2
       
   218   apply (metis map_idI rsimp.simps(3) test)
       
   219   apply(subgoal_tac "rdistinct (rflts rsa @ rflts rs @ rflts rsb) {} = 
       
   220 rdistinct (rflts rsa) {} @ rdistinct  (rflts rs @ rflts rsb) (set (rflts rsa))")
       
   221    apply(simp only:)
       
   222   prefer 2
       
   223   using rdistinct_concat_general apply blast
       
   224   apply(subgoal_tac "rdistinct (rflts rsa @ rflts [rsimp (RALTS rs)] @ rflts rsb) {} = 
       
   225 rdistinct (rflts rsa) {} @ rdistinct  (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))")
       
   226    apply(simp only:)
       
   227   prefer 2
       
   228   using rdistinct_concat_general apply blast
       
   229   apply(subgoal_tac "rdistinct (rflts rs @ rflts rsb) (set (rflts rsa)) = 
       
   230                      rdistinct  (rflts [rsimp (RALTS rs)] @ rflts rsb) (set (rflts rsa))")
       
   231    apply presburger
       
   232   using good_flatten_aux by blast
       
   233 
       
   234 
       
   235 
       
   236 lemma simp_flatten3:
       
   237   shows "rsimp (RALTS (rsa @ [RALTS rs ] @ rsb)) = rsimp (RALTS (rsa @ rs @ rsb))"
       
   238   apply(subgoal_tac "rsimp (RALTS (rsa @ [RALTS rs] @ rsb)) = 
       
   239                      rsimp (RALTS (map rsimp rsa @ [rsimp (RALTS rs)] @ map rsimp rsb)) ")
       
   240   prefer 2
       
   241    apply (metis append.left_neutral append_Cons list.simps(9) map_append simp_flatten_aux0)
       
   242   apply (simp only:)
       
   243   apply(subgoal_tac "rsimp (RALTS (rsa @ rs @ rsb)) = 
       
   244 rsimp (RALTS (map rsimp rsa @ map rsimp rs @ map rsimp rsb))")
       
   245   prefer 2
       
   246    apply (metis map_append simp_flatten_aux0)
       
   247   apply(simp only:)
       
   248   apply(subgoal_tac "rsimp  (RALTS (map rsimp rsa @ map rsimp rs @ map rsimp rsb)) =
       
   249  rsimp (RALTS (map rsimp rsa @ [RALTS (map rsimp rs)] @ map rsimp rsb))")
       
   250   
       
   251    apply (metis (no_types, lifting) head_one_more_simp map_append simp_flatten_aux0)
       
   252   apply(subgoal_tac "\<forall>r \<in> set (map rsimp rsa). good r \<or> r = RZERO")
       
   253    apply(subgoal_tac "\<forall>r \<in> set (map rsimp rs). good r \<or> r = RZERO")
       
   254     apply(subgoal_tac "\<forall>r \<in> set (map rsimp rsb). good r \<or> r = RZERO")
       
   255   
       
   256   using good_flatten_middle apply presburger
       
   257   apply (simp add: good1)
       
   258   apply (simp add: good1)
       
   259   apply (simp add: good1)
       
   260   done
       
   261 
       
   262 
       
   263 lemma simp_removes_duplicate1:
       
   264   shows  " a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ [a])) =  rsimp (RALTS (rsa))"
       
   265 and " rsimp (RALTS (a1 # rsa @ [a1])) = rsimp (RALTS (a1 # rsa))"
       
   266   apply(induct rsa arbitrary: a1)
       
   267      apply simp
       
   268     apply simp
       
   269   prefer 2
       
   270   apply(case_tac "a = aa")
       
   271      apply simp
       
   272     apply simp
       
   273   apply (metis Cons_eq_appendI Cons_eq_map_conv distinct_removes_duplicate_flts list.set_intros(2))
       
   274   apply (metis append_Cons append_Nil distinct_removes_duplicate_flts list.set_intros(1) list.simps(8) list.simps(9))
       
   275   by (metis (mono_tags, lifting) append_Cons distinct_removes_duplicate_flts list.set_intros(1) list.simps(8) list.simps(9) map_append rsimp.simps(2))
       
   276 
       
   277 lemma simp_removes_duplicate2:
       
   278   shows "a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ [a] @ rsb)) = rsimp (RALTS (rsa @ rsb))"
       
   279   apply(induct rsb arbitrary: rsa)
       
   280    apply simp
       
   281   using distinct_removes_duplicate_flts apply auto[1]
       
   282   by (metis append.assoc head_one_more_simp rsimp.simps(2) simp_flatten simp_removes_duplicate1(1))
       
   283 
       
   284 lemma simp_removes_duplicate3:
       
   285   shows "a \<in> set rsa \<Longrightarrow> rsimp (RALTS (rsa @ a # rsb)) = rsimp (RALTS (rsa @ rsb))"
       
   286   using simp_removes_duplicate2 by auto
       
   287 
       
   288 
       
   289 end