Theory conditions_negative_infinitary

theory conditions_negative_infinitary
  imports conditions_negative conditions_positive_infinitary
begin

subsection ‹Infinitary Negative Conditions›

text‹We define and interrelate infinitary variants for some previously introduced
 axiomatic conditions on operators.›

text‹Anti-distribution over infinite joins (suprema) or infinite anti-additivity (inADDI).›
definition inADDI::"('w σ ⇒ 'w σ) ⇒ bool" (‹inADDI›)
  where "inADDI φ  ≡ ∀S. φ(⋁S) = ⋀⟦φ S⟧" 
definition inADDI_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹inADDIa›)
  where "inADDIa φ ≡ ∀S. ⋀⟦φ S⟧ ≤ φ(⋁S)  " 
definition inADDI_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹inADDIb›)
  where "inADDIb φ ≡ ∀S. φ(⋁S) ≤ ⋀⟦φ S⟧"

text‹Anti-distribution over infinite meets (infima) or infinite anti-multiplicativity (inMULT).›
definition inMULT::"('w σ ⇒ 'w σ) ⇒ bool" (‹inMULT›)
  where "inMULT φ  ≡ ∀S. φ(⋀S) = ⋁⟦φ S⟧" 
definition inMULT_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹inMULTa›)
  where "inMULTa φ ≡ ∀S. ⋁⟦φ S⟧ ≤ φ(⋀S)"
definition inMULT_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹inMULTb›)
  where "inMULTb φ ≡ ∀S. φ(⋀S) ≤ ⋁⟦φ S⟧"

declare inADDI_def[cond] inADDI_a_def[cond] inADDI_b_def[cond]
        inMULT_def[cond] inMULT_a_def[cond] inMULT_b_def[cond]

lemma inADDI_char: "inADDI φ = (inADDIa φ ∧ inADDIb φ)" unfolding cond using setequ_char by blast
lemma inMULT_char: "inMULT φ = (inMULTa φ ∧ inMULTb φ)" unfolding cond using setequ_char by blast

text‹nADDI-b and inADDI-b are in fact equivalent.›
lemma inADDIb_equ: "inADDIb φ = nADDIb φ" proof -
  have lr: "inADDIb φ ⟹ nADDIb φ" proof - (*prove as a one-liner by instantiating inADDI_b_def with S=(λZ. Z=A ∨ Z=B)*)
  assume inaddib: "inADDIb φ"
  { fix A::"'a σ" and B::"'a σ" (* for some reason Isabelle doesn't like other letters as type variable. Why?*)
    let ?S="λZ. Z=A ∨ Z=B"
    have "⋁?S = A ∨ B" unfolding supremum_def join_def by blast
    hence p1: "φ(⋁?S) = φ(A ∨ B)" by simp
    have "⟦φ ?S⟧ = (λZ. Z=(φ A) ∨ Z=(φ B))" unfolding image_def by metis
    hence p2: "⋀⟦φ ?S⟧ = (φ A) ∧ (φ B)" unfolding infimum_def meet_def by auto
    have "φ(⋁?S) ≤ ⋀⟦φ ?S⟧" using inaddib inADDI_b_def by blast
    hence "φ(A ∨ B) ≤ (φ A) ∧ (φ B)" using p1 p2 by simp
  } thus ?thesis by (simp add: nADDI_b_def) qed
  have rl: "nADDIb φ ⟹ inADDIb φ" unfolding inADDI_b_def ANTI_nADDIb ANTI_def image_def
    by (smt (verit) glb_def inf_glb lower_bounds_def lub_def sup_lub upper_bounds_def)
  from lr rl show ?thesis by auto
qed
text‹nMULT-a and inMULT-a are also equivalent.›
lemma inMULTa_equ: "inMULTa φ = nMULTa φ" proof -
  have lr: "inMULTa φ ⟹ nMULTa φ" proof - (*prove as a one-liner by instantiating inMULT_a_def with S=(λZ. Z=A ∨ Z=B)*)
  assume inmulta: "inMULTa φ"
  { fix A::"'a σ" and B::"'a σ"
    let ?S="λZ. Z=A ∨ Z=B"
    have "⋀?S = A ∧ B" unfolding infimum_def meet_def by blast
    hence p1: "φ(⋀?S) = φ(A ∧ B)" by simp
    have "⟦φ ?S⟧ = (λZ. Z=(φ A) ∨ Z=(φ B))" unfolding image_def by metis
    hence p2: "⋁⟦φ ?S⟧ = (φ A) ∨ (φ B)" unfolding supremum_def join_def by auto
    have "⋁⟦φ ?S⟧ ≤ φ(⋀?S)" using inmulta inMULT_a_def by blast    
    hence "(φ A) ∨ (φ B) ≤ φ(A ∧ B)" using p1 p2 by simp
  } thus ?thesis by (simp add: nMULT_a_def) qed
  have rl: "nMULTa φ ⟹ inMULTa φ" unfolding inMULT_a_def ANTI_nMULTa ANTI_def image_def
    by (smt (verit) glb_def inf_glb lower_bounds_def lub_def sup_lub upper_bounds_def)
  from lr rl show ?thesis by blast
qed

text‹Thus we have that ANTI, nADDI-b/inADDI-b and nMULT-a/inMULT-a are all equivalent.›
lemma ANTI_inADDIb: "inADDIb φ = ANTI φ" unfolding ANTI_nADDIb inADDIb_equ by simp
lemma ANTI_inMULTa: "inMULTa φ = ANTI φ" unfolding ANTI_nMULTa inMULTa_equ by simp


text‹Below we prove several duality relationships between inADDI(a/b) and inMULT(a/b).›

text‹Duality between inMULT-a and inADDI-b (an easy corollary from the previous equivalence).›
lemma inMULTa_inADDIb_dual1: "inMULTa φ = inADDIb φd" by (simp add: nMULTa_nADDIb_dual1 inADDIb_equ inMULTa_equ)
lemma inMULTa_inADDIb_dual2: "inADDIb φ = inMULTa φd" by (simp add: nMULTa_nADDIb_dual2 inADDIb_equ inMULTa_equ)
text‹Duality between inADDI-a and inMULT-b.›
lemma inADDIa_inMULTb_dual1: "inADDIa φ = inMULTb φd" by (smt (z3) BA_cmpl_equ BA_cp dualcompl_invol inADDI_a_def iDM_a inMULT_b_def im_prop1 op_dual_def setequ_ext)
lemma inADDIa_inMULTb_dual2: "inMULTb φ = inADDIa φd" by (simp add: dual_invol inADDIa_inMULTb_dual1)
text‹Duality between inADDI and inMULT.›
lemma inADDI_inMULT_dual1: "inADDI φ = inMULT φd" using inADDI_char inADDIa_inMULTb_dual1 inMULT_char inMULTa_inADDIb_dual2 by blast
lemma inADDI_inMULT_dual2: "inMULT φ = inADDI φd" by (simp add: dual_invol inADDI_inMULT_dual1)

text‹inADDI and inMULT are the 'complements' of iADDI and iMULT respectively.›
lemma inADDIa_compl: "iADDIa φ = inADDIa φ-" by (metis BA_cmpl_equ BA_cp iADDI_a_def iDM_a im_prop2 inADDI_a_def setequ_ext svfun_compl_def)
lemma inADDIb_compl: "iADDIb φ = inADDIb φ-" by (simp add: ANTI_MONO ANTI_inADDIb MONO_iADDIb)
lemma inADDI_compl: "iADDI φ = inADDI φ-" by (simp add: iADDI_char inADDI_char inADDIa_compl inADDIb_compl)
lemma inMULTa_compl: "iMULTa φ = inMULTa φ-" by (simp add: ANTI_MONO ANTI_inMULTa MONO_iMULTa)
lemma inMULTb_compl: "iMULTb φ = inMULTb φ-" by (metis dual_compl_char1 dual_compl_char2 iADDIa_iMULTb_dual2 inADDIa_compl inADDIa_inMULTb_dual2)
lemma inMULT_compl: "iMULT φ = inMULT φ-" by (simp add: iMULT_char inMULT_char inMULTa_compl inMULTb_compl)

text‹In fact, infinite anti-additivity (anti-multiplicativity) entails (dual) anti-normality:›
lemma inADDI_nNORM: "inADDI φ ⟶ nNORM φ" by (metis bottom_def inADDI_def inf_empty image_def nNORM_def setequ_ext sup_empty)
lemma inMULT_nDNRM: "inMULT φ ⟶ nDNRM φ" by (simp add: inADDI_inMULT_dual2 inADDI_nNORM nNOR_dual2)

end