Theory Suppes_Theorem

chapter ‹ Suppes' Theorem \label{sec:suppes-theorem} ›

theory Suppes_Theorem
  imports Probability_Logic
begin

unbundle no funcset_syntax

text ‹ An elementary completeness theorem for inequalities for probability logic
       is due to Patrick Suppes @{cite suppesProbabilisticInferenceConcept1966}. ›

text ‹ A consequence of this Suppes' theorem is an elementary form of ∗‹collapse›,
       which asserts that inequalities for probabilities are logically
       equivalent to the more restricted class of ∗‹Dirac measures› as
       defined in \S\ref{sec:dirac-measures}. ›

section ‹ Suppes' List Theorem \label{sec:suppes-theorem-for-lists} ›

text ‹ We first establish Suppes' theorem for lists of propositions. This
       is done by establishing our first completeness theorem using
       ∗‹Dirac measures›. ›

text ‹ First, we use the result from \S\ref{sec:basic-probability-inequality-results}
       that shows ‹⊢ φ → ⨆ Ψ› implies ‹𝒫 φ ≤ (∑ψ←Ψ. 𝒫 ψ)›.
       This can be understood as a ∗‹soundness› result. ›

text ‹ To show completeness, assume ‹¬ ⊢ φ → ⨆ Ψ›. From this
       obtain a maximally consistent term‹Ω› such that ‹φ → ⨆ Ψ ∉ Ω›. 
       We then define term‹δ χ = (if (χ ∈ Ω) then 1 else 0)› and 
       show term‹δ› is a  ∗‹Dirac measure› such that ‹δ φ ≤ (∑ψ←Ψ. δ ψ)›. ›

lemma (in classical_logic) dirac_list_summation_completeness:
  "(∀ δ ∈ dirac_measures. δ φ ≤ (∑ψ←Ψ. δ ψ)) = ⊢ φ → ⨆ Ψ"
proof -
  {
    fix δ :: "'a ⇒ real"
    assume "δ ∈ dirac_measures"
    from this interpret probability_logic "(λ φ. ⊢ φ)" "(→)" "⊥" "δ"
      unfolding dirac_measures_def
      by auto
    assume "⊢ φ → ⨆ Ψ"
    hence "δ φ ≤ (∑ψ←Ψ. δ ψ)"
      using implication_list_summation_inequality
      by auto
  }
  moreover {
    assume "¬ ⊢ φ → ⨆ Ψ"
    from this obtain Ω where Ω:
      "MCS Ω"
      "φ ∈ Ω"
      "⨆ Ψ ∉ Ω"
      by (meson
            insert_subset
            formula_consistent_def
            formula_maximal_consistency
            formula_maximally_consistent_extension
            formula_maximally_consistent_set_def_def
            set_deduction_base_theory
            set_deduction_reflection
            set_deduction_theorem)
    hence"∀ ψ ∈ set Ψ. ψ ∉ Ω"
      using arbitrary_disjunction_exclusion_MCS by blast
    define δ where "δ = (λ χ . if χ∈Ω then (1 :: real) else 0)"
    from ‹∀ ψ ∈ set Ψ. ψ ∉ Ω› have "(∑ψ←Ψ. δ ψ) = 0"
      unfolding δ_def
      by (induct Ψ, simp, simp)
    hence "¬ δ φ ≤ (∑ψ←Ψ. δ ψ)"
      unfolding δ_def
      by (simp add: Ω(2))
    hence
      "∃ δ ∈ dirac_measures. ¬ (δ φ ≤ (∑ψ←Ψ. δ ψ))"
      unfolding δ_def
      using Ω(1) MCS_dirac_measure by auto
  }
  ultimately show ?thesis by blast
qed

theorem (in classical_logic) list_summation_completeness:
  "(∀ 𝒫 ∈ probabilities. 𝒫 φ ≤ (∑ψ←Ψ. 𝒫 ψ)) = ⊢ φ → ⨆ Ψ"
  (is "?lhs = ?rhs")
proof
  assume ?lhs
  hence "∀ δ ∈ dirac_measures. δ φ ≤ (∑ψ←Ψ. δ ψ)"
    unfolding dirac_measures_def probabilities_def
    by blast
  thus ?rhs
    using dirac_list_summation_completeness by blast
next
  assume ?rhs
  show ?lhs
  proof
    fix 𝒫 :: "'a ⇒ real"
    assume "𝒫 ∈ probabilities"
    from this interpret probability_logic "(λ φ. ⊢ φ)" "(→)" ⊥ 𝒫
      unfolding probabilities_def
      by auto
    show "𝒫 φ ≤ (∑ψ←Ψ. 𝒫 ψ)"
      using ‹?rhs› implication_list_summation_inequality
      by simp
  qed
qed

text ‹ The collapse theorem asserts that to prove an inequalities for all 
       probabilities in probability logic, one only needs to consider the 
       case of functions which take on values of 0 or 1. ›

lemma (in classical_logic) suppes_collapse:
  "(∀ 𝒫 ∈ probabilities. 𝒫 φ ≤ (∑ψ←Ψ. 𝒫 ψ))
      = (∀ δ ∈ dirac_measures. δ φ ≤ (∑ψ←Ψ. δ ψ))"
  by (simp add:
        dirac_list_summation_completeness
        list_summation_completeness)

lemma (in classical_logic) probability_member_neg:
  fixes 𝒫
  assumes "𝒫 ∈ probabilities"
  shows "𝒫 (∼ φ) = 1 - 𝒫 φ"
proof -
  from assms interpret probability_logic "(λ φ. ⊢ φ)" "(→)" ⊥ 𝒫
    unfolding probabilities_def
    by auto
  show ?thesis
    by (simp add: complementation)
qed

text ‹ Suppes' theorem has a philosophical interpretation.
       It asserts that if term‹Ψ :⊢ φ›, then our ∗‹uncertainty›
       in term‹φ› is bounded above by our uncertainty in term‹Ψ›.
       Here the uncertainty in the proposition term‹φ› is ‹1 - 𝒫 φ›.
       Our uncertainty in term‹Ψ›, on the other hand, is
       ‹∑ψ←Ψ. 1 - 𝒫 ψ›. ›

theorem (in classical_logic) suppes_list_theorem:
  "Ψ :⊢ φ = (∀ 𝒫 ∈ probabilities. (∑ψ←Ψ. 1 - 𝒫 ψ) ≥ 1 - 𝒫 φ)"
proof -
  have
    "Ψ :⊢ φ = (∀ 𝒫 ∈ probabilities. (∑ψ ← ∼ Ψ. 𝒫 ψ) ≥ 𝒫 (∼ φ))"
    using
      list_summation_completeness
      weak_biconditional_weaken
      contra_list_curry_uncurry
      list_deduction_def
    by blast
  moreover have
    "∀ 𝒫 ∈ probabilities. (∑ψ ← (∼ Ψ). 𝒫 ψ) = (∑ψ ← Ψ. 𝒫 (∼ ψ))"
    by (induct Ψ, auto)
  ultimately show ?thesis
    using probability_member_neg
    by (induct Ψ, simp+)
qed

section ‹ Suppes' Set Theorem ›

text ‹ Suppes theorem also obtains for ∗‹sets›. ›

lemma (in classical_logic) dirac_set_summation_completeness:
  "(∀ δ ∈ dirac_measures. δ φ ≤ (∑ψ∈ set Ψ. δ ψ)) = ⊢ φ → ⨆ Ψ"
  by (metis
        dirac_list_summation_completeness
        modus_ponens
        arbitrary_disjunction_remdups
        biconditional_left_elimination
        biconditional_right_elimination
        hypothetical_syllogism
        sum.set_conv_list)

theorem (in classical_logic) set_summation_completeness:
  "(∀ δ ∈ probabilities. δ φ ≤ (∑ψ∈ set Ψ. δ ψ)) = ⊢ φ → ⨆ Ψ"
  by (metis
        dirac_list_summation_completeness
        dirac_set_summation_completeness
        list_summation_completeness
        sum.set_conv_list)

lemma (in classical_logic) suppes_set_collapse:
  "(∀ 𝒫 ∈ probabilities. 𝒫 φ ≤ (∑ψ ∈ set Ψ. 𝒫 ψ))
      = (∀ δ ∈ dirac_measures. δ φ ≤ (∑ψ ∈ set Ψ. δ ψ))"
  by (simp add:
        dirac_set_summation_completeness
        set_summation_completeness)

text ‹ In our formulation of logic, there is not reason that ‹∼ a = ∼ b›
       while term‹a ≠ b›.  As a consequence the Suppes theorem
       for sets presented below is different than the one given in
       \S\ref{sec:suppes-theorem-for-lists}. ›

theorem (in classical_logic) suppes_set_theorem:
  "Ψ :⊢ φ
     = (∀ 𝒫 ∈ probabilities. (∑ψ ∈ set (∼ Ψ). 𝒫 ψ) ≥ 1 - 𝒫 φ)"
proof -
  have "Ψ :⊢ φ
          = (∀ 𝒫 ∈ probabilities. (∑ψ ∈ set (∼ Ψ). 𝒫 ψ) ≥ 𝒫 (∼ φ))"
    using
      contra_list_curry_uncurry
      list_deduction_def
      set_summation_completeness
      weak_biconditional_weaken
    by blast
  thus ?thesis
    using probability_member_neg
    by (induct Ψ, auto)
qed

section ‹ Converse Suppes' Theorem ›

text ‹ A formulation of the converse of Suppes' theorem obtains
       for lists/sets of ∗‹logically disjoint› propositions. ›

lemma (in probability_logic) exclusive_sum_list_identity:
  assumes "⊢ ∐ Φ"
  shows "𝒫 (⨆ Φ) = (∑φ←Φ. 𝒫 φ)"
  using assms
proof (induct Φ)
  case Nil
  then show ?case
    by (simp add: gaines_weatherson_antithesis)
next
  case (Cons φ Φ)
  assume "⊢ ∐ (φ # Φ)"
  hence "⊢ ∼ (φ ⊓ ⨆ Φ)" "⊢ ∐ Φ" by simp+
  hence "𝒫 (⨆(φ # Φ)) = 𝒫 φ + 𝒫 (⨆ Φ)"
        "𝒫 (⨆ Φ) = (∑φ←Φ. 𝒫 φ)"
    using Cons.hyps probability_additivity by auto
  hence "𝒫 (⨆(φ # Φ)) = 𝒫 φ + (∑φ←Φ. 𝒫 φ)" by auto
  thus ?case by simp
qed

lemma sum_list_monotone:
  fixes f :: "'a ⇒ real"
  assumes "∀ x. f x ≥ 0"
     and  "set Φ ⊆ set Ψ"
     and  "distinct Φ"
   shows "(∑φ←Φ. f φ) ≤ (∑ψ←Ψ. f ψ)"
  using assms
proof -
  assume "∀ x. f x ≥ 0"
  have "∀Φ. set Φ ⊆ set Ψ
             ⟶ distinct Φ
             ⟶ (∑φ←Φ. f φ) ≤ (∑ψ←Ψ. f ψ)"
  proof (induct Ψ)
    case Nil
    then show ?case by simp
  next
    case (Cons ψ Ψ)
    {
      fix Φ
      assume "set Φ ⊆ set (ψ # Ψ)"
         and "distinct Φ"
      have "(∑φ←Φ. f φ) ≤ (∑ψ'←(ψ # Ψ). f ψ')"
      proof -
        {
          assume "ψ ∉ set Φ"
          with ‹set Φ ⊆ set (ψ # Ψ)› have "set Φ ⊆ set Ψ" by auto
          hence "(∑φ←Φ. f φ) ≤ (∑ψ←Ψ. f ψ)"
            using Cons.hyps ‹distinct Φ› by auto
          moreover have "f ψ ≥ 0" using ‹∀ x. f x ≥ 0› by metis
          ultimately have ?thesis by simp
        }
        moreover
        {
          assume "ψ ∈ set Φ"
          hence "set Φ = insert ψ (set (removeAll ψ Φ))"
            by auto
          with ‹set Φ ⊆ set (ψ # Ψ)› have "set (removeAll ψ Φ) ⊆ set Ψ"
            by (metis
                  insert_subset
                  list.simps(15)
                  set_removeAll
                  subset_insert_iff)
          moreover from ‹distinct Φ› have "distinct (removeAll ψ Φ)"
            by (meson distinct_removeAll)
          ultimately have "(∑φ←(removeAll ψ Φ). f φ) ≤ (∑ψ←Ψ. f ψ)"
            using Cons.hyps
            by simp
          moreover from ‹ψ ∈ set Φ› ‹distinct Φ›
          have "(∑φ←Φ. f φ) = f ψ + (∑φ←(removeAll ψ Φ). f φ)"
            using distinct_remove1_removeAll sum_list_map_remove1
            by fastforce
          ultimately have ?thesis using ‹∀ x. f x ≥ 0›
            by simp
        }
        ultimately show ?thesis by blast
      qed
    }
    thus ?case by blast
  qed
  moreover assume "set Φ ⊆ set Ψ" and "distinct Φ"
  ultimately show ?thesis by blast
qed

lemma count_remove_all_sum_list:
  fixes f :: "'a ⇒ real"
  shows "real (count_list xs x) * f x + (∑x'←(removeAll x xs). f x')
           = (∑x←xs. f x)"
  by (induct xs, simp, simp, metis combine_common_factor mult_cancel_right1)

lemma (in classical_logic) dirac_exclusive_implication_completeness:
  "(∀ δ ∈ dirac_measures. (∑φ←Φ. δ φ) ≤ δ ψ) = (⊢ ∐ Φ ∧  ⊢ ⨆ Φ → ψ)"
proof -
  {
    fix δ
    assume "δ ∈ dirac_measures"
    from this interpret probability_logic "(λ φ. ⊢ φ)" "(→)" "⊥" "δ"
      unfolding dirac_measures_def
      by simp
    assume "⊢ ∐ Φ" "⊢ ⨆ Φ → ψ"
    hence "(∑φ←Φ. δ φ) ≤ δ ψ"
      using exclusive_sum_list_identity monotonicity by fastforce
  }
  moreover
  {
    assume "¬ ⊢ ∐ Φ"
    hence "(∃ φ ∈ set Φ. ∃ ψ ∈ set Φ.
              φ ≠ ψ ∧ ¬ ⊢ ∼ (φ ⊓ ψ)) ∨ (∃ φ ∈ duplicates Φ. ¬ ⊢ ∼ φ)"
      using exclusive_equivalence set_deduction_base_theory by blast
    hence "¬ (∀ δ ∈ dirac_measures. (∑φ←Φ. δ φ) ≤ δ ψ)"
    proof (elim disjE)
      assume "∃ φ ∈ set Φ. ∃ χ ∈ set Φ. φ ≠ χ ∧ ¬ ⊢ ∼ (φ ⊓ χ)"
      from this obtain φ and χ
        where φχ_properties:
          "φ ∈ set Φ"
          "χ ∈ set Φ"
          "φ ≠ χ"
          "¬ ⊢ ∼ (φ ⊓ χ)"
        by blast
      from this obtain Ω where Ω: "MCS Ω" "∼ (φ ⊓ χ) ∉ Ω"
        by (meson
              insert_subset
              formula_consistent_def
              formula_maximal_consistency
              formula_maximally_consistent_extension
              formula_maximally_consistent_set_def_def
              set_deduction_base_theory
              set_deduction_reflection
              set_deduction_theorem)
      let ?δ = "λ χ. if χ∈Ω then (1 :: real) else 0"
      from Ω have "φ ∈ Ω" "χ ∈ Ω"
        by (metis
              formula_maximally_consistent_set_def_implication
              maximally_consistent_set_def
              conjunction_def
              negation_def)+
      with φχ_properties have
          "(∑φ←[φ, χ]. ?δ φ) = 2"
          "set [φ, χ] ⊆ set Φ"
          "distinct [φ, χ]"
          "∀φ. ?δ φ ≥ 0"
        by simp+
      hence "(∑φ←Φ. ?δ φ) ≥ 2" using sum_list_monotone by metis
      hence "¬ (∑φ←Φ. ?δ φ) ≤ ?δ (ψ)" by auto
      thus ?thesis
        using Ω(1) MCS_dirac_measure
        by auto
    next
      assume "∃ φ ∈ duplicates Φ. ¬ ⊢ ∼ φ"
      from this obtain φ where φ: "φ ∈ duplicates Φ" "¬ ⊢ ∼ φ"
        using
          exclusive_equivalence [where Γ="{}"]
          set_deduction_base_theory
        by blast
      from φ obtain Ω where Ω: "MCS Ω" "∼ φ ∉ Ω"
        by (meson
              insert_subset
              formula_consistent_def
              formula_maximal_consistency
              formula_maximally_consistent_extension
              formula_maximally_consistent_set_def_def
              set_deduction_base_theory
              set_deduction_reflection
              set_deduction_theorem)
      hence "φ ∈ Ω"
        using negation_def by auto
      let ?δ = "λ χ. if χ∈Ω then (1 :: real) else 0"
      from φ have "count_list Φ φ ≥ 2"
        using duplicates_alt_def [where xs="Φ"]
        by blast
      hence "real (count_list Φ φ) * ?δ φ ≥ 2" using ‹φ ∈ Ω› by simp
      moreover
      {
        fix Ψ
        have "(∑φ←Ψ. ?δ φ) ≥ 0" by (induct Ψ, simp, simp)
      }
      moreover have "(0::real)
                          ≤ (∑a←removeAll φ Φ. if a ∈ Ω then 1 else 0)"
        using ‹⋀Ψ. 0 ≤ (∑φ←Ψ. if φ ∈ Ω then 1 else 0)›
        by presburger
      ultimately have "real (count_list Φ φ) * ?δ φ
                            + (∑ φ ← (removeAll φ Φ). ?δ φ) ≥ 2"
        using ‹2 ≤ real (count_list Φ φ) * (if φ ∈ Ω then 1 else 0)›
        by linarith
      hence "(∑φ←Φ. ?δ φ) ≥ 2" by (metis count_remove_all_sum_list)
      hence "¬ (∑φ←Φ. ?δ φ) ≤ ?δ (ψ)" by auto
      thus ?thesis
        using Ω(1) MCS_dirac_measure
        by auto
    qed
  }
  moreover
  {
    assume "¬ ⊢ ⨆ Φ → ψ"
    from this obtain Ω φ
      where
        Ω: "MCS Ω"
        and ψ: "ψ ∉ Ω"
        and φ: "φ ∈ set Φ" "φ ∈ Ω"
      by (meson
            insert_subset
            formula_consistent_def
            formula_maximal_consistency
            formula_maximally_consistent_extension
            formula_maximally_consistent_set_def_def
            arbitrary_disjunction_exclusion_MCS
            set_deduction_base_theory
            set_deduction_reflection
            set_deduction_theorem)
    let ?δ = "λ χ. if χ∈Ω then (1 :: real) else 0"
    from φ have "(∑φ←Φ. ?δ φ) ≥ 1"
    proof (induct Φ)
      case Nil
      then show ?case by simp
    next
      case (Cons φ' Φ)
      obtain f :: "real list ⇒ real" where f:
        "∀rs. f rs ∈ set rs ∧ ¬ 0 ≤ f rs ∨ 0 ≤ sum_list rs"
        using sum_list_nonneg by metis
      moreover have "f (map ?δ Φ) ∉ set (map ?δ Φ) ∨ 0 ≤ f (map ?δ Φ)"
        by fastforce
      ultimately show ?case
        by (simp, metis Cons.hyps Cons.prems(1) φ(2) set_ConsD)
    qed
    hence "¬ (∑φ←Φ. ?δ φ) ≤ ?δ (ψ)" using ψ by auto
    hence "¬ (∀ δ ∈ dirac_measures. (∑φ←Φ. δ φ) ≤ δ ψ)"
      using Ω(1) MCS_dirac_measure
      by auto
  }
  ultimately show ?thesis by blast
qed

theorem (in classical_logic) exclusive_implication_completeness:
  "(∀ 𝒫 ∈ probabilities. (∑φ←Φ. 𝒫 φ) ≤ 𝒫 ψ) = (⊢ ∐ Φ ∧  ⊢ ⨆ Φ → ψ)"
  (is "?lhs = ?rhs")
proof
  assume ?lhs
  thus ?rhs
    by (meson
          dirac_exclusive_implication_completeness
          dirac_measures_subset
          subset_eq)
next
  assume ?rhs
  show ?lhs
  proof
    fix 𝒫 :: "'a ⇒ real"
    assume "𝒫 ∈ probabilities"
    from this interpret probability_logic "(λ φ. ⊢ φ)" "(→)" ⊥ 𝒫
      unfolding probabilities_def
      by simp
    show "(∑φ←Φ. 𝒫 φ) ≤ 𝒫 ψ"
      using
        ‹?rhs›
        exclusive_sum_list_identity
        monotonicity
      by fastforce
  qed
qed

lemma (in classical_logic) dirac_inequality_completeness:
  "(∀ δ ∈ dirac_measures. δ φ ≤ δ ψ) = ⊢ φ → ψ"
proof -
  have "⊢ ∐ [φ]"
    by (simp add: conjunction_right_elimination negation_def)
  hence "(⊢ ∐ [φ] ∧  ⊢ ⨆ [φ] → ψ) = ⊢ φ → ψ"
    by (metis
          arbitrary_disjunction.simps(1)
          arbitrary_disjunction.simps(2)
          disjunction_def implication_equivalence
          negation_def
          weak_biconditional_weaken)
  thus ?thesis
    using dirac_exclusive_implication_completeness [where Φ="[φ]"]
    by auto
qed

section ‹ Implication Inequality Completeness ›

text ‹ The following theorem establishes the converse of
       ‹⊢ φ → ψ ⟹ 𝒫 φ ≤ 𝒫 ψ›, which was
       proved in \S\ref{sec:prob-logic-alt-def}. ›

theorem (in classical_logic) implication_inequality_completeness:
  "(∀ 𝒫 ∈ probabilities. 𝒫 φ ≤ 𝒫 ψ) = ⊢ φ → ψ"
proof -
  have "⊢ ∐ [φ]"
    by (simp add: conjunction_right_elimination negation_def)
  hence "(⊢ ∐ [φ] ∧  ⊢ ⨆ [φ] → ψ) = ⊢ φ → ψ"
    by (metis
          arbitrary_disjunction.simps(1)
          arbitrary_disjunction.simps(2)
          disjunction_def implication_equivalence
          negation_def
          weak_biconditional_weaken)
  thus ?thesis
    using exclusive_implication_completeness [where Φ="[φ]"]
    by simp
qed

section ‹ Characterizing Logical Exclusiveness In Probability Logic ›

text ‹ Finally, we can say that ‹𝒫 (⨆ Φ) = (∑φ←Φ. 𝒫 φ)› if and only
       if the propositions in term‹Φ› are mutually exclusive (i.e. ‹⊢ ∐ Φ›).
       This result also obtains for sets. ›

lemma (in classical_logic) dirac_exclusive_list_summation_completeness:
  "(∀ δ ∈ dirac_measures. δ (⨆ Φ) = (∑φ←Φ. δ φ)) = ⊢ ∐ Φ"
  by (metis
        antisym_conv
        dirac_exclusive_implication_completeness
        dirac_list_summation_completeness
        trivial_implication)

theorem (in classical_logic) exclusive_list_summation_completeness:
  "(∀ 𝒫 ∈ probabilities. 𝒫 (⨆ Φ) = (∑φ←Φ. 𝒫 φ)) = ⊢ ∐ Φ"
  by (metis
        antisym_conv
        exclusive_implication_completeness
        list_summation_completeness
        trivial_implication)

lemma (in classical_logic) dirac_exclusive_set_summation_completeness:
  "(∀ δ ∈ dirac_measures. δ (⨆ Φ) = (∑φ ∈ set Φ. δ φ))
      = ⊢ ∐ (remdups Φ)"
  by (metis
        (mono_tags)
        eq_iff
        dirac_exclusive_implication_completeness
        dirac_set_summation_completeness
        trivial_implication
        set_remdups
        sum.set_conv_list    eq_iff
        dirac_exclusive_implication_completeness
        dirac_set_summation_completeness
        trivial_implication
        set_remdups
        sum.set_conv_list
        antisym_conv)

theorem (in classical_logic) exclusive_set_summation_completeness:
  "(∀ 𝒫 ∈ probabilities.
        𝒫 (⨆ Φ) = (∑φ ∈ set Φ. 𝒫 φ)) = ⊢ ∐ (remdups Φ)"
  by (metis
        (mono_tags, opaque_lifting)
        antisym_conv
        exclusive_list_summation_completeness
        exclusive_implication_completeness
        implication_inequality_completeness
        set_summation_completeness
        order.refl
        sum.set_conv_list)

lemma (in probability_logic) exclusive_list_set_inequality:
  assumes "⊢ ∐ Φ"
  shows "(∑φ←Φ. 𝒫 φ) = (∑φ∈set Φ. 𝒫 φ)"
proof -
  have "distinct (remdups Φ)" using distinct_remdups by auto
  hence "duplicates (remdups Φ) = {}"
    by (induct "Φ", simp+)
  moreover have "set (remdups Φ) = set Φ"
    by (induct "Φ", simp, simp add: insert_absorb)
  moreover have "(∀φ ∈ duplicates Φ. ⊢ ∼ φ)
               ∧ (∀ φ ∈ set Φ. ∀ ψ ∈ set Φ. (φ ≠ ψ) ⟶ ⊢ ∼ (φ ⊓ ψ))"
    using
      assms
      exclusive_elimination1
      exclusive_elimination2
      set_deduction_base_theory
    by blast
  ultimately have
    "(∀φ∈duplicates (remdups Φ). ⊢ ∼ φ)
   ∧ (∀ φ ∈ set (remdups Φ). ∀ ψ ∈ set (remdups Φ).
          (φ ≠ ψ) ⟶ ⊢ ∼ (φ ⊓ ψ))"
    by auto
  hence "⊢ ∐ (remdups Φ)"
    by (meson exclusive_equivalence set_deduction_base_theory)
  hence "(∑φ∈set Φ. 𝒫 φ) = 𝒫 (⨆ Φ)"
    by (metis
          arbitrary_disjunction_remdups
          biconditional_equivalence
          exclusive_sum_list_identity
          sum.set_conv_list)
  moreover have "(∑φ←Φ. 𝒫 φ) = 𝒫 (⨆ Φ)"
    by (simp add: assms exclusive_sum_list_identity)
  ultimately show ?thesis by metis
qed

unbundle funcset_syntax

end