Nominal/FSet.thy
changeset 2525 c848f93807b9
parent 2524 693562f03eee
child 2528 9bde8a508594
equal deleted inserted replaced
2524:693562f03eee 2525:c848f93807b9
    88 qed
    88 qed
    89 
    89 
    90 lemma Quotient_fset_list:
    90 lemma Quotient_fset_list:
    91   shows "Quotient (list_all2 op \<approx>) (map abs_fset) (map rep_fset)"
    91   shows "Quotient (list_all2 op \<approx>) (map abs_fset) (map rep_fset)"
    92   by (fact list_quotient[OF Quotient_fset])
    92   by (fact list_quotient[OF Quotient_fset])
    93 
       
    94 (*
       
    95 lemma set_in_eq: "(\<forall>e. ((e \<in> xs) \<longleftrightarrow> (e \<in> ys))) \<equiv> xs = ys"
       
    96   by (rule eq_reflection) auto
       
    97 *)
       
    98 
    93 
    99 lemma map_rel_cong: "b \<approx> ba \<Longrightarrow> map f b \<approx> map f ba"
    94 lemma map_rel_cong: "b \<approx> ba \<Longrightarrow> map f b \<approx> map f ba"
   100   unfolding list_eq.simps
    95   unfolding list_eq.simps
   101   by (simp only: set_map)
    96   by (simp only: set_map)
   102 
    97 
   153     then show "(list_all2 op \<approx> OOO op \<approx>) r s"
   148     then show "(list_all2 op \<approx> OOO op \<approx>) r s"
   154       using a c pred_compI by simp
   149       using a c pred_compI by simp
   155   qed
   150   qed
   156 qed
   151 qed
   157 
   152 
       
   153 
       
   154 lemma set_finter_raw[simp]:
       
   155   "set (finter_raw xs ys) = set xs \<inter> set ys"
       
   156   by (induct xs) (auto simp add: memb_def)
       
   157 
       
   158 lemma set_fminus_raw[simp]: 
       
   159   "set (fminus_raw xs ys) = (set xs - set ys)"
       
   160   by (induct ys arbitrary: xs) (auto)
       
   161 
       
   162 
   158 text {* Respectfullness *}
   163 text {* Respectfullness *}
   159 
   164 
   160 lemma append_rsp[quot_respect]:
   165 lemma append_rsp[quot_respect]:
   161   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) append append"
   166   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) append append"
   162   by (simp)
   167   by (simp)
   163 
   168 
   164 (*
   169 lemma sub_list_rsp[quot_respect]:
   165 lemma append_rsp_unfolded:
       
   166   "\<lbrakk>x \<approx> y; v \<approx> w\<rbrakk> \<Longrightarrow> x @ v \<approx> y @ w"
       
   167   by auto
       
   168 *)
       
   169 
       
   170 lemma [quot_respect]:
       
   171   shows "(op \<approx> ===> op \<approx> ===> op =) sub_list sub_list"
   170   shows "(op \<approx> ===> op \<approx> ===> op =) sub_list sub_list"
   172   by (auto simp add: sub_list_def)
   171   by (auto simp add: sub_list_def)
   173 
   172 
   174 lemma memb_rsp[quot_respect]:
   173 lemma memb_rsp[quot_respect]:
   175   shows "(op = ===> op \<approx> ===> op =) memb memb"
   174   shows "(op = ===> op \<approx> ===> op =) memb memb"
   176   by (auto simp add: memb_def)
   175   by (auto simp add: memb_def)
   177 
   176 
   178 lemma nil_rsp[quot_respect]:
   177 lemma nil_rsp[quot_respect]:
   179   shows "[] \<approx> []"
   178   shows "(op \<approx>) Nil Nil"
   180   by simp
   179   by simp
   181 
   180 
   182 lemma cons_rsp[quot_respect]:
   181 lemma cons_rsp[quot_respect]:
   183   shows "(op = ===> op \<approx> ===> op \<approx>) Cons Cons"
   182   shows "(op = ===> op \<approx> ===> op \<approx>) Cons Cons"
   184   by simp
   183   by simp
   193 
   192 
   194 lemma list_equiv_rsp[quot_respect]:
   193 lemma list_equiv_rsp[quot_respect]:
   195   shows "(op \<approx> ===> op \<approx> ===> op =) op \<approx> op \<approx>"
   194   shows "(op \<approx> ===> op \<approx> ===> op =) op \<approx> op \<approx>"
   196   by auto
   195   by auto
   197 
   196 
       
   197 lemma finter_raw_rsp[quot_respect]:
       
   198   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) finter_raw finter_raw"
       
   199   by simp
       
   200 
       
   201 lemma removeAll_rsp[quot_respect]:
       
   202   shows "(op = ===> op \<approx> ===> op \<approx>) removeAll removeAll"
       
   203   by simp
       
   204 
       
   205 lemma fminus_raw_rsp[quot_respect]:
       
   206   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) fminus_raw fminus_raw"
       
   207   by simp
       
   208 
       
   209 lemma fcard_raw_rsp[quot_respect]:
       
   210   shows "(op \<approx> ===> op =) fcard_raw fcard_raw"
       
   211   by (simp add: fcard_raw_def)
       
   212 
       
   213 
       
   214 
   198 lemma not_memb_nil:
   215 lemma not_memb_nil:
   199   shows "\<not> memb x []"
   216   shows "\<not> memb x []"
   200   by (simp add: memb_def)
   217   by (simp add: memb_def)
   201 
   218 
   202 lemma memb_cons_iff:
   219 lemma memb_cons_iff:
   203   shows "memb x (y # xs) = (x = y \<or> memb x xs)"
   220   shows "memb x (y # xs) = (x = y \<or> memb x xs)"
   204   by (induct xs) (auto simp add: memb_def)
   221   by (induct xs) (auto simp add: memb_def)
   205 
   222 
   206 lemma set_finter_raw[simp]:
       
   207   "set (finter_raw xs ys) = set xs \<inter> set ys"
       
   208   by (induct xs) (auto simp add: memb_def)
       
   209 
       
   210 lemma [quot_respect]:
       
   211   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) finter_raw finter_raw"
       
   212   by (simp)
       
   213 
       
   214 (*
       
   215 lemma memb_removeAll:
       
   216   "memb x (removeAll y xs) \<longleftrightarrow> memb x xs \<and> x \<noteq> y"
       
   217   by (induct xs arbitrary: x y) (auto simp add: memb_def)
       
   218 *)
       
   219 
       
   220 lemma [quot_respect]:
       
   221   shows "(op = ===> op \<approx> ===> op \<approx>) removeAll removeAll"
       
   222   by (simp)
       
   223 
       
   224 lemma set_fminus_raw[simp]: 
       
   225   "set (fminus_raw xs ys) = (set xs - set ys)"
       
   226   by (induct ys arbitrary: xs) (auto)
       
   227 
       
   228 lemma [quot_respect]:
       
   229   shows "(op \<approx> ===> op \<approx> ===> op \<approx>) fminus_raw fminus_raw"
       
   230   by simp
       
   231 
       
   232 lemma fcard_raw_rsp[quot_respect]:
       
   233   shows "(op \<approx> ===> op =) fcard_raw fcard_raw"
       
   234   by (simp add: fcard_raw_def)
       
   235 
       
   236 lemma memb_absorb:
   223 lemma memb_absorb:
   237   shows "memb x xs \<Longrightarrow> x # xs \<approx> xs"
   224   shows "memb x xs \<Longrightarrow> x # xs \<approx> xs"
   238   by (induct xs) (auto simp add: memb_def)
   225   by (induct xs) (auto simp add: memb_def)
   239 
   226 
   240 lemma none_memb_nil:
   227 lemma none_memb_nil:
   241   "(\<forall>x. \<not> memb x xs) = (xs \<approx> [])"
   228   "(\<forall>x. \<not> memb x xs) = (xs \<approx> [])"
   242   by (simp add: memb_def)
   229   by (simp add: memb_def)
   243 
   230 
   244 lemma not_memb_removeAll_ident:
       
   245   shows "\<not> memb x xs \<Longrightarrow> removeAll x xs = xs"
       
   246   by (induct xs) (auto simp add: memb_def)
       
   247 
   231 
   248 lemma memb_commute_ffold_raw:
   232 lemma memb_commute_ffold_raw:
   249   "rsp_fold f \<Longrightarrow> h \<in> set b \<Longrightarrow> ffold_raw f z b = f h (ffold_raw f z (removeAll h b))"
   233   "rsp_fold f \<Longrightarrow> h \<in> set b \<Longrightarrow> ffold_raw f z b = f h (ffold_raw f z (removeAll h b))"
   250   apply (induct b)
   234   apply (induct b)
   251   apply (auto simp add: rsp_fold_def)
   235   apply (auto simp add: rsp_fold_def)
   267   apply(auto)
   251   apply(auto)
   268   apply(drule meta_mp)
   252   apply(drule meta_mp)
   269   apply(blast)
   253   apply(blast)
   270   by (metis List.set.simps(2) emptyE ffold_raw.simps(2) in_listsp_conv_set listsp.simps mem_def)
   254   by (metis List.set.simps(2) emptyE ffold_raw.simps(2) in_listsp_conv_set listsp.simps mem_def)
   271 
   255 
   272 lemma [quot_respect]:
   256 lemma ffold_raw_rsp[quot_respect]:
   273   shows "(op = ===> op = ===> op \<approx> ===> op =) ffold_raw ffold_raw"
   257   shows "(op = ===> op = ===> op \<approx> ===> op =) ffold_raw ffold_raw"
   274   unfolding fun_rel_def
   258   unfolding fun_rel_def
   275   apply(auto intro: ffold_raw_rsp_pre)
   259   apply(auto intro: ffold_raw_rsp_pre)
   276   done
   260   done
   277 
   261 
   735 qed
   719 qed
   736 
   720 
   737 
   721 
   738 section {* deletion *}
   722 section {* deletion *}
   739 
   723 
   740 lemma memb_removeAll_ident:
       
   741   shows "\<not> memb x (removeAll x xs)"
       
   742   by (induct xs) (auto simp add: memb_def)
       
   743 
   724 
   744 lemma fset_raw_removeAll_cases:
   725 lemma fset_raw_removeAll_cases:
   745   "xs = [] \<or> (\<exists>x. memb x xs \<and> xs \<approx> x # removeAll x xs)"
   726   "xs = [] \<or> (\<exists>x. memb x xs \<and> xs \<approx> x # removeAll x xs)"
   746   by (induct xs) (auto simp add: memb_def)
   727   by (induct xs) (auto simp add: memb_def)
   747 
   728 
   788   apply (simp_all)
   769   apply (simp_all)
   789   apply (case_tac "memb a A")
   770   apply (case_tac "memb a A")
   790   apply (auto simp add: memb_def)[2]
   771   apply (auto simp add: memb_def)[2]
   791   apply (metis list_eq2.intros(3) list_eq2.intros(4) list_eq2.intros(5) list_eq2.intros(6))
   772   apply (metis list_eq2.intros(3) list_eq2.intros(4) list_eq2.intros(5) list_eq2.intros(6))
   792   apply (metis list_eq2.intros(1) list_eq2.intros(5) list_eq2.intros(6))
   773   apply (metis list_eq2.intros(1) list_eq2.intros(5) list_eq2.intros(6))
   793   apply (auto simp add: list_eq2_refl not_memb_removeAll_ident)
   774   apply (auto simp add: list_eq2_refl memb_def)
   794   done
   775   done
   795 
   776 
   796 lemma memb_delete_list_eq2:
   777 lemma memb_delete_list_eq2:
   797   assumes a: "memb e r"
   778   assumes a: "memb e r"
   798   shows "list_eq2 (e # removeAll e r) r"
   779   shows "list_eq2 (e # removeAll e r) r"
   799   using a cons_delete_list_eq2[of e r]
   780   using a cons_delete_list_eq2[of e r]
   800   by simp
   781   by simp
   801 
       
   802 lemma removeAll_rsp:
       
   803   "xs \<approx> ys \<Longrightarrow> removeAll x xs \<approx> removeAll x ys"
       
   804   by (simp add: memb_def[symmetric])
       
   805 
   782 
   806 lemma list_eq2_equiv:
   783 lemma list_eq2_equiv:
   807   "(l \<approx> r) \<longleftrightarrow> (list_eq2 l r)"
   784   "(l \<approx> r) \<longleftrightarrow> (list_eq2 l r)"
   808 proof
   785 proof
   809   show "list_eq2 l r \<Longrightarrow> l \<approx> r" by (induct rule: list_eq2.induct) auto
   786   show "list_eq2 l r \<Longrightarrow> l \<approx> r" by (induct rule: list_eq2.induct) auto
   831 	done
   808 	done
   832       then obtain a where e: "memb a l" by auto
   809       then obtain a where e: "memb a l" by auto
   833       then have e': "memb a r" using list_eq.simps[simplified memb_def[symmetric], of l r] b 
   810       then have e': "memb a r" using list_eq.simps[simplified memb_def[symmetric], of l r] b 
   834 	unfolding memb_def by auto
   811 	unfolding memb_def by auto
   835       have f: "fcard_raw (removeAll a l) = m" using fcard_raw_delete[of a l] e d by simp
   812       have f: "fcard_raw (removeAll a l) = m" using fcard_raw_delete[of a l] e d by simp
   836       have g: "removeAll a l \<approx> removeAll a r" using removeAll_rsp[OF b] by simp
   813       have g: "removeAll a l \<approx> removeAll a r" using removeAll_rsp b by simp
   837       have "list_eq2 (removeAll a l) (removeAll a r)" by (rule Suc.hyps[OF f g])
   814       have "list_eq2 (removeAll a l) (removeAll a r)" by (rule Suc.hyps[OF f g])
   838       then have h: "list_eq2 (a # removeAll a l) (a # removeAll a r)" by (rule list_eq2.intros(5))
   815       then have h: "list_eq2 (a # removeAll a l) (a # removeAll a r)" by (rule list_eq2.intros(5))
   839       have i: "list_eq2 l (a # removeAll a l)"
   816       have i: "list_eq2 l (a # removeAll a l)"
   840         by (rule list_eq2.intros(3)[OF memb_delete_list_eq2[OF e]])
   817         by (rule list_eq2.intros(3)[OF memb_delete_list_eq2[OF e]])
   841       have "list_eq2 l (a # removeAll a r)" by (rule list_eq2.intros(6)[OF i h])
   818       have "list_eq2 l (a # removeAll a r)" by (rule list_eq2.intros(6)[OF i h])
  1121 
  1098 
  1122 lemma fin_fdelete:
  1099 lemma fin_fdelete:
  1123   shows "x |\<in>| fdelete y S \<longleftrightarrow> x |\<in>| S \<and> x \<noteq> y"
  1100   shows "x |\<in>| fdelete y S \<longleftrightarrow> x |\<in>| S \<and> x \<noteq> y"
  1124   by (descending) (simp add: memb_def)
  1101   by (descending) (simp add: memb_def)
  1125 
  1102 
  1126 lemma fin_fdelete_ident:
  1103 lemma fnotin_fdelete:
  1127   shows "x |\<notin>| fdelete x S"
  1104   shows "x |\<notin>| fdelete x S"
  1128   by (lifting memb_removeAll_ident)
  1105   by (descending) (simp add: memb_def)
  1129 
  1106 
  1130 lemma not_memb_fdelete_ident:
  1107 lemma fnotin_fdelete_ident:
  1131   shows "x |\<notin>| S \<Longrightarrow> fdelete x S = S"
  1108   shows "x |\<notin>| S \<Longrightarrow> fdelete x S = S"
  1132   by (lifting not_memb_removeAll_ident)
  1109   by (descending) (simp add: memb_def)
  1133 
  1110 
  1134 lemma fset_fdelete_cases:
  1111 lemma fset_fdelete_cases:
  1135   shows "S = {||} \<or> (\<exists>x. x |\<in>| S \<and> S = finsert x (fdelete x S))"
  1112   shows "S = {||} \<or> (\<exists>x. x |\<in>| S \<and> S = finsert x (fdelete x S))"
  1136   by (lifting fset_raw_removeAll_cases)
  1113   by (lifting fset_raw_removeAll_cases)
  1137 
  1114