Theory Proper_Venn_Regions

theory Proper_Venn_Regions
  imports MLSSmf_Semantics MLSSmf_to_MLSS MLSSmf_HF_Extras
begin

locale proper_Venn_regions =
    fixes V :: "'a set"
      and 𝒜 :: "'a  hf"
  assumes finite_V: "finite V"
begin

fun proper_Venn_region :: "'a set  hf" where
  "proper_Venn_region α = HF (𝒜 ` α) - HF (𝒜 ` (V - α))"

lemma proper_Venn_region_nonempty_iff[iff]:
  "c  proper_Venn_region α  α  V  α = {x  V. c  𝒜 x}  α  {}"
proof(standard, goal_cases)
  case 1
  then have "c  proper_Venn_region α" "α  V" by blast+
  show ?case
  proof(standard, standard, goal_cases)
    case 1
    then show ?case
    proof
      fix x assume "x  α"
      have "c  HF (𝒜 ` α)"
        using c  proper_Venn_region α by auto
      then have "c  𝒜 x"
        using x  α
        by (metis (mono_tags, opaque_lifting) HInter_hempty HInter_iff hempty_iff hmem_HF_iff imageI)
      then show "x  {x  V. c  𝒜 x}"
        using α  V x  α by blast
    qed
  next
    case 2
    then show ?case
    proof
      fix x assume "x  {x  V. c  𝒜 x}"
      then have "x  V" "c  𝒜 x" by blast+
      show "x  α"
      proof (rule ccontr)
        assume "x  α"
        then have "x  V - α"
          using α  V x  V by blast
        then have "c  HF (𝒜 ` (V - α))"
          using c  𝒜 x finite_V by auto
        then have "c  proper_Venn_region α" by simp
        then show False
          using c  proper_Venn_region α by blast
      qed
    qed
  next
    case 3
    then show ?case
    proof (rule ccontr)
      assume "¬ α  {}"
      then have "α = {}" by fast
      then have "proper_Venn_region α = 0"
        using Zero_hf_def by auto
      then show False
        using c  proper_Venn_region α by simp
    qed
  qed
next
  case 2
  then have "α = {x  V. c  𝒜 x}" "α  {}" by simp+
  then have "α  V" by blast
  moreover
  from 2 finite_V have "finite α" by force
  then have "finite (𝒜 ` α)" by blast
  then have "finite (𝒜 ` (V - α))"
    using finite_V by fast
  from α  {} have "𝒜 ` α  {}" by blast
  from 2 have "x  α. c  𝒜 x" by simp
  then have "x  𝒜 ` α. c  x" by blast
  then have "c  HF (𝒜 ` α)"
    using finite (𝒜 ` α) 𝒜 ` α  {}
    by (metis HInter_iff hfset_0 hfset_HF hmem_HF_iff)
  moreover
  have "c  HF (𝒜 ` (V - α))"
  proof
    assume "c  HF (𝒜 ` (V - α))"
    then obtain x where "c  x" "x  𝒜 ` (V - α)" by auto
    then have "x  𝒜 ` (V) - 𝒜 ` α"
      using 2 by fastforce
    then have "x  𝒜 ` α" by blast
    then show False
      using c  x 2 x  𝒜 ` (V - α) by blast 
  qed
  ultimately show ?case by auto
qed

lemma proper_Venn_region_strongly_injective:
  assumes "proper_Venn_region α  proper_Venn_region β  0"
      and "α  V"
      and "β  V"
    shows "α = β"
proof -
  from proper_Venn_region α  proper_Venn_region β  0
  obtain c where c: "c  proper_Venn_region α" "c  proper_Venn_region β"
    by blast
  then have "α = {x  V. c  𝒜 x}" "β = {x  V. c  𝒜 x}"
    using α  V β  V
    using proper_Venn_region_nonempty_iff by (metis (mono_tags, lifting))+
  then show "α = β" by presburger
qed

lemma proper_Venn_region_disjoint:
  "α  β  α  V  β  V  proper_Venn_region α  proper_Venn_region β = 0"
  using proper_Venn_region_strongly_injective by meson

lemma HUnion_proper_Venn_region_union:
  assumes "l  P+ V"
      and "m  P+ V"
    shows "HF (proper_Venn_region ` (l  m)) = HF (proper_Venn_region ` l)  HF(proper_Venn_region ` m)"
  by (metis HUnion_hunion P_plus_finite assms(1) assms(2) finite_V finite_imageI finite_subset image_Un union_hunion)

lemma HUnion_proper_Venn_region_inter:
  assumes "l  P+ V"
      and "m  P+ V"
    shows "HF (proper_Venn_region ` (l  m)) = HF (proper_Venn_region ` l)  HF(proper_Venn_region ` m)"
proof -
  from l  P+ V have "finite l"
    using finite_V P_plus_finite by (metis finite_subset)
  from m  P+ V have "finite m"
    using finite_V P_plus_finite by (metis finite_subset)
  
  have "HF (proper_Venn_region ` (l  m))  HF (proper_Venn_region ` l)  HF (proper_Venn_region ` m)"
    using proper_Venn_region_disjoint finite l finite m
    by auto
  moreover
  have "c  HF (proper_Venn_region ` (l  m))" if "c  HF (proper_Venn_region ` l)  HF (proper_Venn_region ` m)" for c
  proof -
    from that have "c  HF (proper_Venn_region ` l)" "c  HF (proper_Venn_region ` m)" by blast+
    then obtain α β where "α  l" "β  m" and c_mem: "c  proper_Venn_region α" "c  proper_Venn_region β" by auto
    with l  P+ V m  P+ V finite_V have "α  V" "β  V" by auto
    with proper_Venn_region_strongly_injective c_mem have "α = β" by blast
    with α  l β  m have "α  l  m" by blast
    with c_mem show ?thesis
      using HUnion_iff finite l hmem_def by auto 
  qed
  then have "HF (proper_Venn_region ` l)  HF (proper_Venn_region ` m)  HF (proper_Venn_region ` (l  m))" by blast
  ultimately show ?thesis by order
qed

text ‹⋃_{α∈L_y} v_α = y›
lemma variable_as_composition_of_proper_Venn_regions:
  assumes "y  V"
    shows "HF (proper_Venn_region `  V y) = 𝒜 y"
proof(standard; standard)
  fix c assume c: "c  HF (proper_Venn_region ` ( V y))"
  then obtain α where α: "α   V y" "c  proper_Venn_region α"
    by auto
  then have "y  α" using y  V by fastforce
  then have "𝒜 y  𝒜 ` α" by blast
  from finite_V α   V y y  V have "finite α" "α  {}" by auto
  then have "finite (𝒜 ` α)" "𝒜 ` α  {}" by simp+
  with 𝒜 y  𝒜 ` α have "(HF (𝒜 ` α))  𝒜 y"
    by (metis HInter_iff hfset_0 hfset_HF hmem_HF_iff hsubsetI)
  then show "c  𝒜 y"
    using α by fastforce
next
  fix c assume "c  𝒜 y"
  let  = "{x  V. c  𝒜 x}"
  from c  𝒜 y y  V have "y  " by blast
  then have "   V y" by auto
  then have "  {}" by auto
  then have "c  proper_Venn_region "
    using proper_Venn_region_nonempty_iff
    by (metis (mono_tags, lifting))
  moreover
  from    V y have "proper_Venn_region   proper_Venn_region `  V y" by fast
  moreover
  have "finite ( V y)" using finite_V by simp
  ultimately
  show "c  HF (proper_Venn_region ` ( V y))"
    by (smt (verit, best) HUnion_iff finite_imageI hmem_HF_iff)
qed

lemma proper_Venn_region_subset_variable_iff:
  assumes "α  V"
      and "x  V"
      and "proper_Venn_region α  0"
    shows "x  α  proper_Venn_region α  𝒜 x"
proof
  assume "x  α"
  then have "HF (𝒜 ` α)  𝒜 x" using α  V finite_V
    by (smt (verit, ccfv_SIG) HInter_iff ball_imageD finite_imageI hemptyE hmem_HF_iff hsubsetI rev_finite_subset)
  then show "proper_Venn_region α  𝒜 x" by auto
next
  assume "proper_Venn_region α  𝒜 x"
  moreover
  from variable_as_composition_of_proper_Venn_regions x  V
  have "𝒜 x = HF (proper_Venn_region `  V x)"
    by presburger
  ultimately
  have "proper_Venn_region α  HF (proper_Venn_region `  V x)"
    by argo
  show "x  α"
  proof (rule ccontr)
    assume "x  α"
    then have "α   V x" by simp
    moreover
    from proper_Venn_region α  HF (proper_Venn_region `  V x) proper_Venn_region α  0
    have "proper_Venn_region α  HF (proper_Venn_region `  V x)  0" by fast
    then obtain β where "β   V x" "proper_Venn_region α  proper_Venn_region β  0"
      by auto
    with proper_Venn_region_strongly_injective have "α = β"
      using β   V x α  V by auto
    with β   V x have "α   V x" by blast
    ultimately
    show False by blast
  qed
qed

end

end