src/HOL/Library/Quotient_Set.thy
changeset 47647 ec29cc09599d
parent 47626 f7b1034cb9ce
child 47648 6b9d20a095ae
equal deleted inserted replaced
47646:9460f3f22365 47647:ec29cc09599d
     8 imports Main Quotient_Syntax
     8 imports Main Quotient_Syntax
     9 begin
     9 begin
    10 
    10 
    11 subsection {* set map (vimage) and set relation *}
    11 subsection {* set map (vimage) and set relation *}
    12 
    12 
    13 definition "set_rel R xs ys \<equiv> \<forall>x y. R x y \<longrightarrow> x \<in> xs \<longleftrightarrow> y \<in> ys"
    13 definition "vset_rel R xs ys \<equiv> \<forall>x y. R x y \<longrightarrow> x \<in> xs \<longleftrightarrow> y \<in> ys"
    14 
    14 
    15 lemma set_rel_eq [id_simps]:
    15 lemma vset_rel_eq [id_simps]:
    16   "set_rel op = = op ="
    16   "vset_rel op = = op ="
    17   by (subst fun_eq_iff, subst fun_eq_iff) (simp add: set_eq_iff set_rel_def)
    17   by (subst fun_eq_iff, subst fun_eq_iff) (simp add: set_eq_iff vset_rel_def)
    18 
    18 
    19 lemma set_rel_equivp:
    19 lemma vset_rel_equivp:
    20   assumes e: "equivp R"
    20   assumes e: "equivp R"
    21   shows "set_rel R xs ys \<longleftrightarrow> xs = ys \<and> (\<forall>x y. x \<in> xs \<longrightarrow> R x y \<longrightarrow> y \<in> xs)"
    21   shows "vset_rel R xs ys \<longleftrightarrow> xs = ys \<and> (\<forall>x y. x \<in> xs \<longrightarrow> R x y \<longrightarrow> y \<in> xs)"
    22   unfolding set_rel_def
    22   unfolding vset_rel_def
    23   using equivp_reflp[OF e]
    23   using equivp_reflp[OF e]
    24   by auto (metis, metis equivp_symp[OF e])
    24   by auto (metis, metis equivp_symp[OF e])
    25 
    25 
    26 lemma set_quotient [quot_thm]:
    26 lemma set_quotient [quot_thm]:
    27   assumes "Quotient3 R Abs Rep"
    27   assumes "Quotient3 R Abs Rep"
    28   shows "Quotient3 (set_rel R) (vimage Rep) (vimage Abs)"
    28   shows "Quotient3 (vset_rel R) (vimage Rep) (vimage Abs)"
    29 proof (rule Quotient3I)
    29 proof (rule Quotient3I)
    30   from assms have "\<And>x. Abs (Rep x) = x" by (rule Quotient3_abs_rep)
    30   from assms have "\<And>x. Abs (Rep x) = x" by (rule Quotient3_abs_rep)
    31   then show "\<And>xs. Rep -` (Abs -` xs) = xs"
    31   then show "\<And>xs. Rep -` (Abs -` xs) = xs"
    32     unfolding vimage_def by auto
    32     unfolding vimage_def by auto
    33 next
    33 next
    34   show "\<And>xs. set_rel R (Abs -` xs) (Abs -` xs)"
    34   show "\<And>xs. vset_rel R (Abs -` xs) (Abs -` xs)"
    35     unfolding set_rel_def vimage_def
    35     unfolding vset_rel_def vimage_def
    36     by auto (metis Quotient3_rel_abs[OF assms])+
    36     by auto (metis Quotient3_rel_abs[OF assms])+
    37 next
    37 next
    38   fix r s
    38   fix r s
    39   show "set_rel R r s = (set_rel R r r \<and> set_rel R s s \<and> Rep -` r = Rep -` s)"
    39   show "vset_rel R r s = (vset_rel R r r \<and> vset_rel R s s \<and> Rep -` r = Rep -` s)"
    40     unfolding set_rel_def vimage_def set_eq_iff
    40     unfolding vset_rel_def vimage_def set_eq_iff
    41     by auto (metis rep_abs_rsp[OF assms] assms[simplified Quotient3_def])+
    41     by auto (metis rep_abs_rsp[OF assms] assms[simplified Quotient3_def])+
    42 qed
    42 qed
    43 
    43 
    44 declare [[mapQ3 set = (set_rel, set_quotient)]]
    44 declare [[mapQ3 set = (vset_rel, set_quotient)]]
    45 
    45 
    46 lemma empty_set_rsp[quot_respect]:
    46 lemma empty_set_rsp[quot_respect]:
    47   "set_rel R {} {}"
    47   "vset_rel R {} {}"
    48   unfolding set_rel_def by simp
    48   unfolding vset_rel_def by simp
    49 
    49 
    50 lemma collect_rsp[quot_respect]:
    50 lemma collect_rsp[quot_respect]:
    51   assumes "Quotient3 R Abs Rep"
    51   assumes "Quotient3 R Abs Rep"
    52   shows "((R ===> op =) ===> set_rel R) Collect Collect"
    52   shows "((R ===> op =) ===> vset_rel R) Collect Collect"
    53   by (intro fun_relI) (simp add: fun_rel_def set_rel_def)
    53   by (intro fun_relI) (simp add: fun_rel_def vset_rel_def)
    54 
    54 
    55 lemma collect_prs[quot_preserve]:
    55 lemma collect_prs[quot_preserve]:
    56   assumes "Quotient3 R Abs Rep"
    56   assumes "Quotient3 R Abs Rep"
    57   shows "((Abs ---> id) ---> op -` Rep) Collect = Collect"
    57   shows "((Abs ---> id) ---> op -` Rep) Collect = Collect"
    58   unfolding fun_eq_iff
    58   unfolding fun_eq_iff
    59   by (simp add: Quotient3_abs_rep[OF assms])
    59   by (simp add: Quotient3_abs_rep[OF assms])
    60 
    60 
    61 lemma union_rsp[quot_respect]:
    61 lemma union_rsp[quot_respect]:
    62   assumes "Quotient3 R Abs Rep"
    62   assumes "Quotient3 R Abs Rep"
    63   shows "(set_rel R ===> set_rel R ===> set_rel R) op \<union> op \<union>"
    63   shows "(vset_rel R ===> vset_rel R ===> vset_rel R) op \<union> op \<union>"
    64   by (intro fun_relI) (simp add: set_rel_def)
    64   by (intro fun_relI) (simp add: vset_rel_def)
    65 
    65 
    66 lemma union_prs[quot_preserve]:
    66 lemma union_prs[quot_preserve]:
    67   assumes "Quotient3 R Abs Rep"
    67   assumes "Quotient3 R Abs Rep"
    68   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<union> = op \<union>"
    68   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<union> = op \<union>"
    69   unfolding fun_eq_iff
    69   unfolding fun_eq_iff
    70   by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]])
    70   by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]])
    71 
    71 
    72 lemma diff_rsp[quot_respect]:
    72 lemma diff_rsp[quot_respect]:
    73   assumes "Quotient3 R Abs Rep"
    73   assumes "Quotient3 R Abs Rep"
    74   shows "(set_rel R ===> set_rel R ===> set_rel R) op - op -"
    74   shows "(vset_rel R ===> vset_rel R ===> vset_rel R) op - op -"
    75   by (intro fun_relI) (simp add: set_rel_def)
    75   by (intro fun_relI) (simp add: vset_rel_def)
    76 
    76 
    77 lemma diff_prs[quot_preserve]:
    77 lemma diff_prs[quot_preserve]:
    78   assumes "Quotient3 R Abs Rep"
    78   assumes "Quotient3 R Abs Rep"
    79   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op - = op -"
    79   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op - = op -"
    80   unfolding fun_eq_iff
    80   unfolding fun_eq_iff
    81   by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]] vimage_Diff)
    81   by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]] vimage_Diff)
    82 
    82 
    83 lemma inter_rsp[quot_respect]:
    83 lemma inter_rsp[quot_respect]:
    84   assumes "Quotient3 R Abs Rep"
    84   assumes "Quotient3 R Abs Rep"
    85   shows "(set_rel R ===> set_rel R ===> set_rel R) op \<inter> op \<inter>"
    85   shows "(vset_rel R ===> vset_rel R ===> vset_rel R) op \<inter> op \<inter>"
    86   by (intro fun_relI) (auto simp add: set_rel_def)
    86   by (intro fun_relI) (auto simp add: vset_rel_def)
    87 
    87 
    88 lemma inter_prs[quot_preserve]:
    88 lemma inter_prs[quot_preserve]:
    89   assumes "Quotient3 R Abs Rep"
    89   assumes "Quotient3 R Abs Rep"
    90   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<inter> = op \<inter>"
    90   shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<inter> = op \<inter>"
    91   unfolding fun_eq_iff
    91   unfolding fun_eq_iff
    95   assumes "Quotient3 R Abs Rep"
    95   assumes "Quotient3 R Abs Rep"
    96   shows "(Rep ---> op -` Abs ---> id) op \<in> = op \<in>"
    96   shows "(Rep ---> op -` Abs ---> id) op \<in> = op \<in>"
    97   by (simp add: fun_eq_iff Quotient3_abs_rep[OF assms])
    97   by (simp add: fun_eq_iff Quotient3_abs_rep[OF assms])
    98 
    98 
    99 lemma mem_rsp[quot_respect]:
    99 lemma mem_rsp[quot_respect]:
   100   shows "(R ===> set_rel R ===> op =) op \<in> op \<in>"
   100   shows "(R ===> vset_rel R ===> op =) op \<in> op \<in>"
   101   by (intro fun_relI) (simp add: set_rel_def)
   101   by (intro fun_relI) (simp add: vset_rel_def)
   102 
   102 
   103 end
   103 end