Theory MLSSmf_to_MLSS_Completeness

theory MLSSmf_to_MLSS_Completeness
  imports MLSSmf_Semantics MLSSmf_to_MLSS MLSSmf_HF_Extras
          Proper_Venn_Regions Reduced_MLSS_Formula_Singleton_Model_Property
begin

locale MLSSmf_to_MLSS_complete =
  normalized_MLSSmf_clause š’ž for š’ž :: "('v, 'f) MLSSmf_clause" +
    fixes ℬ :: "('v, 'f) Composite ⇒ hf"
  assumes ℬ: "is_model_for_reduced_dnf ℬ"

    fixes Ī› :: "hf ⇒ 'v set set"
  assumes Ī›_subset_V: "Ī› x āŠ† P+ V"
      and Λ_preserves_zero: "Λ 0 = {}"
      and Ī›_inc: "a ≤ b ⟹ Ī› a āŠ† Ī› b"
      and Ī›_add: "Ī› (a āŠ” b) = Ī› a ∪ Ī› b"
      and Ī›_mul: "Ī› (a āŠ“ b) = Ī› a ∩ Ī› b"
      and Ī›_discr: "l āŠ† P+ V ⟹
                    a = ⨆HF ((ℬ ∘ VennRegion) ` l) ⟹ a = ⨆HF ((ℬ ∘ VennRegion) ` (Ī› a))"
begin

fun discretizev :: "(('v, 'f) Composite ⇒ hf) ⇒ ('v ⇒ hf)" where
  "discretizev ℳ = ℳ ∘ Solo"

fun discretizef :: "(('v, 'f) Composite ⇒ hf) ⇒ ('f ⇒ hf ⇒ hf)" where
  "discretizef ℳ = (Ī»f a. ℳ wā‡˜fā‡™ā‡˜Ī› a⇙)"

interpretation proper_Venn_regions V "discretizev ℬ"
  using finite_V by unfold_locales

lemma all_literal_sat: "āˆ€lt ∈ set š’ž. Il (discretizev ℬ) (discretizef ℬ) lt"
proof
  fix lt assume "lt ∈ set š’ž"

  from ℬ obtain clause where clause: "clause ∈ reduced_dnf"
                         and ℬ_sat_clause: "āˆ€lt ∈ clause. interp Isa ℬ lt"
    unfolding is_model_for_reduced_dnf_def by blast

  from ‹lt ∈ set š’žā€ŗ have "norm_literal lt"
    using norm_š’ž by blast
  then show "Il (discretizev ℬ) (discretizef ℬ) lt"
  proof (cases lt rule: norm_literal.cases)
    case (inc f)
    have "s ≤ t ⟹ discretizef ℬ f s ≤ discretizef ℬ f t" for s t
    proof -
      let ?atom = "Var wā‡˜fā‡™ā‡˜Ī› t⇙ =s Var wā‡˜fā‡™ā‡˜Ī› t⇙ āŠ”s Var wā‡˜fā‡™ā‡˜Ī› s⇙"
      assume "s ≤ t"
      then have "Ī› s āŠ† Ī› t" using Ī›_inc by simp
      then have "?atom ∈ reduce_atom (inc(f))"
        using Λ_subset_V
        by (simp add: V_def)
      then have "AT ?atom ∈ clause"
        using ‹lt = ATm (inc(f))› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom" by fastforce
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› t⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› t⇙ āŠ” ℬ wā‡˜fā‡™ā‡˜Ī› s⇙" by simp
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ ≤ ℬ wā‡˜fā‡™ā‡˜Ī› t⇙"
        by (simp add: sup.order_iff)
      then show "discretizef ℬ f s ≤ discretizef ℬ f t" by simp
    qed
    then show ?thesis using inc by auto

  next
    case (dec f)
    have "s ≤ t ⟹ discretizef ℬ f t ≤ discretizef ℬ f s" for s t
    proof -
      let ?atom = "Var wā‡˜fā‡™ā‡˜Ī› s⇙ =s Var wā‡˜fā‡™ā‡˜Ī› s⇙ āŠ”s Var wā‡˜fā‡™ā‡˜Ī› t⇙"
      assume "s ≤ t"
      then have "Ī› s āŠ† Ī› t" using Ī›_inc by simp
      then have "?atom ∈ reduce_atom (dec(f))"
        using Λ_subset_V
        by (simp add: V_def)
      then have "AT ?atom ∈ clause"
        using ‹lt = ATm (dec(f))› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom" by fastforce
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ āŠ” ℬ wā‡˜fā‡™ā‡˜Ī› t⇙" by simp
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› t⇙ ≤ ℬ wā‡˜fā‡™ā‡˜Ī› s⇙"
        by (simp add: sup.order_iff)
      then show "discretizef ℬ f t ≤ discretizef ℬ f s" by simp
    qed
    then show ?thesis using dec by auto

  next
    case (add f)
    have "discretizef ℬ f (s āŠ” t) = discretizef ℬ f s āŠ” discretizef ℬ f t" for s t
    proof -
      let ?atom = "Var wā‡˜fā‡™ā‡˜Ī› (s āŠ” t)⇙ =s Var wā‡˜fā‡™ā‡˜Ī› s⇙ āŠ”s Var wā‡˜fā‡™ā‡˜Ī› t⇙"
      have "?atom ∈ reduce_atom (add(f))"
        using Λ_subset_V Λ_add 
        by (simp add: V_def)
      then have "AT ?atom ∈ clause"
        using ‹lt = ATm (add(f))› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom" by fastforce
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› (s āŠ” t)⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ āŠ” ℬ wā‡˜fā‡™ā‡˜Ī› t⇙" by simp
      then show "discretizef ℬ f (s āŠ” t) = discretizef ℬ f s āŠ” discretizef ℬ f t" by simp
    qed
    then show ?thesis using add by auto

  next
    case (mul f)
    have "discretizef ℬ f (s āŠ“ t) = discretizef ℬ f s āŠ“ discretizef ℬ f t" for s t
    proof -
      let ?atom_1 = "Var (InterOfWAux f (Ī› s) (Ī› t)) =s Var wā‡˜fā‡™ā‡˜Ī› s⇙ -s Var wā‡˜fā‡™ā‡˜Ī› t⇙"
      have "?atom_1 ∈ reduce_atom (mul(f))"
        using Λ_subset_V 
        by (simp add: V_def)
      then have "AT ?atom_1 ∈ clause"
        using ‹lt = ATm (mul(f))› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom_1" by fastforce
      then have "ℬ (InterOfWAux f (Ī› s) (Ī› t)) = ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ - ℬ wā‡˜fā‡™ā‡˜Ī› t⇙" by simp
      moreover
      let ?atom_2 = "Var wā‡˜fā‡™ā‡˜Ī› (s āŠ“ t)⇙ =s Var wā‡˜fā‡™ā‡˜Ī› s⇙ -s Var (InterOfWAux f (Ī› s) (Ī› t))"
      have "?atom_2 ∈ reduce_atom (mul(f))"
        using Λ_subset_V Λ_mul
        by (simp add: V_def)
      then have "AT ?atom_2 ∈ clause"
        using ‹lt = ATm (mul(f))› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom_2" by fastforce
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› (s āŠ“ t)⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ - ℬ (InterOfWAux f (Ī› s) (Ī› t))" by simp
      ultimately
      have "ℬ wā‡˜fā‡™ā‡˜Ī› (s āŠ“ t)⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ āŠ“ ℬ wā‡˜fā‡™ā‡˜Ī› t⇙" by auto
      then show "discretizef ℬ f (s āŠ“ t) = discretizef ℬ f s āŠ“ discretizef ℬ f t" by simp
    qed
    then show ?thesis using mul by auto

  next
    case (le f g)
    have "discretizef ℬ f s ≤ discretizef ℬ g s" for s
    proof -
      let ?atom = "Var wā‡˜gā‡™ā‡˜Ī› s⇙ =s Var wā‡˜gā‡™ā‡˜Ī› s⇙ āŠ”s Var wā‡˜fā‡™ā‡˜Ī› s⇙"
      have "?atom ∈ reduce_atom (f ≼m g)"
        using Λ_subset_V 
        by (simp add: V_def)
      then have "AT ?atom ∈ clause"
        using ‹lt = ATm (f ≼m g)› ‹lt ∈ set š’žā€ŗ clause
        unfolding reduced_dnf_def reduce_clause_def by fastforce
      with ℬ_sat_clause have "Isa ℬ ?atom" by fastforce
      then have "ℬ wā‡˜gā‡™ā‡˜Ī› s⇙ = ℬ wā‡˜gā‡™ā‡˜Ī› s⇙ āŠ” ℬ wā‡˜fā‡™ā‡˜Ī› s⇙" by simp
      then have "ℬ wā‡˜fā‡™ā‡˜Ī› s⇙ ≤ ℬ wā‡˜gā‡™ā‡˜Ī› s⇙"
        by (simp add: sup.orderI)
      then show "discretizef ℬ f s ≤ discretizef ℬ g s" by simp
    qed
    then show ?thesis using le by auto

  next
    case (eq_empty x n)
    let ?lt = "AT (Var (Solo x) =s āˆ… n)"
    from eq_empty have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with eq_empty show ?thesis by simp

  next
    case (eq x y)
    let ?lt = "AT (Var (Solo x) =s Var (Solo y))"
    from eq have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with eq show ?thesis by simp

  next
    case (neq x y)
    let ?lt = "AF (Var (Solo x) =s Var (Solo y))"
    from neq have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with neq show ?thesis by simp

  next
    case (union x y z)
    let ?lt = "AT (Var (Solo x) =s Var (Solo y) āŠ”s Var (Solo z))"
    from union have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using neq ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with union show ?thesis by simp

  next
    case (diff x y z)
    let ?lt = "AT (Var (Solo x) =s Var (Solo y) -s Var (Solo z))"
    from diff have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using neq ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with diff show ?thesis by simp

  next
    case (single x y)
    let ?lt = "AT (Var (Solo x) =s Single (Var (Solo y)))"
    from single have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using neq ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    with single show ?thesis by simp

  next
    case (app x f y)
    with ‹lt ∈ set š’žā€ŗ have "f ∈ F" unfolding F_def by force
    from ℬ_sat_clause clause eval_v
    have ℬ_v: "(ℬ ∘ VennRegion) α = proper_Venn_region α" if "α ∈ P+ V" for α
      unfolding reduced_dnf_def
      using proper_Venn_region.simps that by force
    from ℬ_sat_clause clause eval_w
    have ℬ_w: "⨆HF ((ℬ ∘ VennRegion) ` l) = ⨆HF ((ℬ ∘ VennRegion) ` m) ⟶ ℬ wā‡˜fā‡™ā‡˜l⇙ = ℬ wā‡˜fā‡™ā‡˜m⇙"
      if "l āŠ† P+ V" "m āŠ† P+ V" "f ∈ F" for l m f
      by (meson in_mono introduce_UnionOfVennRegions_subset_reduced_fms introduce_w_subset_reduced_fms that)
    
    from app ‹lt ∈ set š’žā€ŗ have "y ∈ V" using V_def by fastforce
    with variable_as_composition_of_proper_Venn_regions
    have "⨆HF (proper_Venn_region ` ā„’ V y) = discretizev ℬ y" by blast
    with Ī›_discr ā„’_subset_P_plus ℬ_v
    have "⨆HF ((ℬ ∘ VennRegion) ` ā„’ V y) = ⨆HF ((ℬ ∘ VennRegion) ` Ī› (discretizev ℬ y))"
      by (smt (verit, best) HUnion_eq subset_eq)
    with ℬ_w have ℬ_w_eq: "ℬ wā‡˜fā‡™ā‡˜ā„’ V y⇙ = ℬ wā‡˜fā‡™ā‡˜Ī› (discretizev ℬ y)⇙"
      using ā„’_subset_P_plus Ī›_subset_V ‹f ∈ F› finite_V by meson

    let ?lt = "AT (Var (Solo x) =s Var wā‡˜fā‡™ā‡˜ā„’ V y⇙)"
    from app have "?lt ∈ reduce_literal lt"
      using ‹lt ∈ set š’žā€ŗ by simp
    then have "?lt ∈ clause"
      using neq ‹lt ∈ set š’žā€ŗ clause
      unfolding reduced_dnf_def reduce_clause_def by fastforce
    with ℬ_sat_clause have "interp Isa ℬ ?lt" by fastforce
    then have "ℬ (Solo x) = ℬ wā‡˜fā‡™ā‡˜ā„’ V y⇙" by simp
    with ℬ_w_eq have "ℬ (Solo x) = ℬ wā‡˜fā‡™ā‡˜Ī› (discretizev ℬ y)⇙" by argo
    then have "ℬ (Solo x) = (discretizef ℬ f) (discretizev ℬ y)" by simp
    then have "discretizev ℬ x = (discretizef ℬ f) (discretizev ℬ y)" by simp
    with app show ?thesis by simp
  qed
qed

lemma š’ž_sat: "Icl (discretizev ℬ) (discretizef ℬ) š’ž"
  using all_literal_sat by blast

end
                          
lemma (in normalized_MLSSmf_clause) MLSSmf_to_MLSS_completeness:
  assumes "is_model_for_reduced_dnf M"
    shows "∃Mv Mf. Icl Mv Mf š’ž"
proof -
  from assms singleton_model_for_reduced_MLSS_clause obtain ℳ where
    ℳ_singleton: "āˆ€Ī± ∈ P+ V. hcard (ℳ (vā‡˜Ī±ā‡™)) ≤ 1" and
    ℳ_model: "is_model_for_reduced_dnf ℳ"
    using normalized_MLSSmf_clause_axioms V_def by blast
  then obtain clause where "clause ∈ reduced_dnf" "āˆ€lt ∈ clause. interp Isa ℳ lt"
    unfolding is_model_for_reduced_dnf_def by blast
  with normalized_clause_contains_all_v_α have v_α_in_vars:
    "āˆ€Ī±āˆˆP+ V. vā‡˜Ī±ā‡™ ∈ ā‹ƒ (vars ` clause)"
    by blast

  from ℳ_singleton have assigned_set_card_0_or_1:
    "āˆ€Ī± ∈ P+ V. hcard (ℳ (vā‡˜Ī±ā‡™)) = 0 ∨ hcard (ℳ (vā‡˜Ī±ā‡™)) = 1"
    using antisym_conv2 by blast

  let ?Ī› = "Ī»a. {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0}"

  have Ī›_subset_V: "?Ī› x āŠ† P+ V" for x
    by fast

  have Λ_preserves_zero: "?Λ 0 = {}" by blast

  have Ī›_inc: "a ≤ b ⟹ ?Ī› a āŠ† ?Ī› b" for a b
    by (smt (verit) Collect_mono hinter_hempty_right inf.absorb_iff1 inf_left_commute)

  have Ī›_add: "?Ī› (a āŠ” b) = ?Ī› a ∪ ?Ī› b" for a b
  proof (standard; standard)
    fix α assume α: "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ” b) ≠ 0}"
    then have "α ∈ P+ V" "ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ” b) ≠ 0" by blast+
    then have "ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0 ∨ ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0"
      by (metis hunion_hempty_right inf_sup_distrib1) 
    then show "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0} ∪ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0}"
      using α by blast
  next
    fix α assume "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0} ∪ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0}"
    then have "α ∈ P+ V" "ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0 ∨ ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0"
      by blast+
    then have "ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ” b) ≠ 0"
      by (metis hinter_hempty_right hunion_hempty_left inf_sup_absorb inf_sup_distrib1)
    then show "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ” b) ≠ 0}"
      using ‹α ∈ P+ V› by blast
  qed

  have Ī›_mul: "?Ī› (a āŠ“ b) = ?Ī› a ∩ ?Ī› b" for a b
  proof (standard; standard)
    fix α assume α: "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ“ b) ≠ 0}"
    then have "α ∈ P+ V" "ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ“ b) ≠ 0" by blast+
    then have "ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0 ∧ ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0"
      by (metis hinter_hempty_left inf_assoc inf_left_commute)
    then show "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0} ∩ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0}"
      using α by blast
  next
    fix α assume "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0} ∩ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0}"
    then have "α ∈ P+ V" "ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0" "ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0"
      by blast+
    then have "ℳ vā‡˜Ī±ā‡™ ≠ 0" by force
    then have "hcard (ℳ vā‡˜Ī±ā‡™) ≠ 0" using hcard_0E by blast
    then have "hcard (ℳ vā‡˜Ī±ā‡™) = 1"
      using assigned_set_card_0_or_1 v_α_in_vars ‹α ∈ P+ V›
      by fastforce
    then obtain c where "ℳ vā‡˜Ī±ā‡™ = 0 ā—ƒ c"
      using hcard_1E by blast
    moreover
    from ‹ℳ vā‡˜Ī±ā‡™ = 0 ā—ƒ c› ‹ℳ vā‡˜Ī±ā‡™ āŠ“ a ≠ 0›
    have "ℳ vā‡˜Ī±ā‡™ āŠ“ a = 0 ā—ƒ c" by auto
    moreover
    from ‹ℳ vā‡˜Ī±ā‡™ = 0 ā—ƒ c› ‹ℳ vā‡˜Ī±ā‡™ āŠ“ b ≠ 0›
    have "ℳ vā‡˜Ī±ā‡™ āŠ“ b = 0 ā—ƒ c" by auto
    ultimately
    have "ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ“ b) = 0 ā—ƒ c"
      by (simp add: inf_commute inf_left_commute)
    then have "ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ“ b) ≠ 0" by simp
    then show "α ∈ {α ∈ P+ V. ℳ vā‡˜Ī±ā‡™ āŠ“ (a āŠ“ b) ≠ 0}"
      using ‹α ∈ P+ V› by blast
  qed

  have "l āŠ† P+ V ⟹
        a = ⨆HF ((ℳ ∘ VennRegion) ` l) ⟹ a ≤ ⨆HF ((ℳ ∘ VennRegion) ` (?Ī› a))" for l a
  proof
    fix c assume l_a_c: "l āŠ† P+ V" "a = ⨆HF ((ℳ ∘ VennRegion) ` l)" "c ∈ a"
    then obtain α where "α ∈ l" "c ∈ ℳ vā‡˜Ī±ā‡™" by auto
    then have "α ∈ ?Ī› a" using l_a_c by blast
    then have "ℳ vā‡˜Ī±ā‡™ ∈ (ℳ ∘ VennRegion) ` (?Ī› a)" by simp
    then have "ℳ vā‡˜Ī±ā‡™ ∈ HF ((ℳ ∘ VennRegion) ` (?Ī› a))" by fastforce
    with ‹c ∈ ℳ vā‡˜Ī±ā‡™ā€ŗ show "c ∈ ⨆HF ((ℳ ∘ VennRegion) ` (?Ī› a))" by blast
  qed
  moreover
  have "l āŠ† P+ V ⟹
        a = ⨆HF ((ℳ ∘ VennRegion) ` l) ⟹ ⨆HF ((ℳ ∘ VennRegion) ` (?Ī› a)) ≤ a" for l a
  proof -
    assume "l āŠ† P+ V" and a: "a = ⨆HF ((ℳ ∘ VennRegion) ` l)"
    then have "finite l"
      by (simp add: finite_V finite_subset)
    have "?Ī› a āŠ† l"
    proof
      fix α assume "α ∈ ?Ī› a"
      then obtain c where "c ∈ ℳ vā‡˜Ī±ā‡™ āŠ“ a" by blast
      then have "c ∈ ℳ vā‡˜Ī±ā‡™" "c ∈ a" by blast+
      then obtain β where "β ∈ l" "c ∈ ℳ vā‡˜Ī²ā‡™" using a by force


      interpret proper_Venn_regions V "ℳ ∘ Solo"
        using finite_V by unfold_locales
      from ‹α ∈ ?Ī› a› have "α ∈ P+ V" by auto
      moreover
      from ‹l āŠ† P+ V› ‹β ∈ l› have "β ∈ P+ V" by auto
      moreover
      from ‹c ∈ ℳ vā‡˜Ī±ā‡™ā€ŗ have "c ∈ proper_Venn_region α"
        using eval_v ‹α ∈ P+ V› ℳ_model
        unfolding is_model_for_reduced_dnf_def reduced_dnf_def
        by fastforce
      moreover
      from ‹c ∈ ℳ vā‡˜Ī²ā‡™ā€ŗ have "c ∈ proper_Venn_region β"
        using eval_v ‹β ∈ P+ V› ℳ_model
        unfolding is_model_for_reduced_dnf_def reduced_dnf_def
        by fastforce
      ultimately
      have "α = β"
        using finite_V proper_Venn_region_strongly_injective by auto
      with ‹β ∈ l› show "α ∈ l" by simp
    qed
    then have "(ℳ ∘ VennRegion) ` ?Ī› a āŠ† (ℳ ∘ VennRegion) ` l" by blast
    moreover
    from ‹finite l› have "finite ((ℳ ∘ VennRegion) ` l)" by blast
    ultimately
    have "⨆HF ((ℳ ∘ VennRegion) ` ?Ī› a) ≤ ⨆HF ((ℳ ∘ VennRegion) ` l)"
      by (metis (no_types, lifting) HUnion_hunion finite_subset sup.orderE sup.orderI union_hunion)
    then show "⨆HF ((ℳ ∘ VennRegion) ` (?Ī› a)) ≤ a"
      using a by blast
  qed
  ultimately
  have Ī›_discr: "l āŠ† P+ V ⟹
                 a = ⨆HF ((ℳ ∘ VennRegion) ` l) ⟹ a = ⨆HF ((ℳ ∘ VennRegion) ` (?Ī› a))" for l a
    by (simp add: inf.absorb_iff1 inf_commute)

  interpret Ī›_plus: MLSSmf_to_MLSS_complete š’ž ℳ ?Ī›
    using assms ℳ_singleton ℳ_model
          Λ_subset_V Λ_preserves_zero Λ_inc Λ_add Λ_mul Λ_discr
    by unfold_locales

  show ?thesis
    using Ī›_plus.š’ž_sat by fast
qed

end