Theory conditions_relativized

theory conditions_relativized
  imports conditions_negative
begin

subsection ‹Relativized Conditions›

text‹We continue defining and interrelating axiomatic conditions on unary operations (operators). 
 This time we consider their 'relativized' variants.›

text‹Relativized order and equality relations.›
definition subset_in::‹'p σ ⇒ 'p σ ⇒ 'p σ ⇒ bool› (‹_≤⇩__›) 
  where ‹A ≤⇩U B ≡ ∀x. U x ⟶ (A x ⟶ B x)›
definition subset_out::‹'p σ ⇒ 'p σ ⇒ 'p σ ⇒ bool› (‹_≤⇧__›) 
  where ‹A ≤⇧U B ≡ ∀x. ¬U x ⟶ (A x ⟶ B x)›
definition setequ_in::‹'p σ ⇒ 'p σ ⇒ 'p σ ⇒ bool› (‹_=⇩__›) 
  where ‹A =⇩U B ≡ ∀x. U x ⟶ (A x ⟷ B x)›
definition setequ_out::‹'p σ ⇒ 'p σ ⇒ 'p σ ⇒ bool› (‹_=⇧__›) 
  where ‹A =⇧U B ≡ ∀x. ¬U x ⟶ (A x ⟷ B x)›

declare subset_in_def[order] subset_out_def[order] setequ_in_def[order] setequ_out_def[order]

lemma subset_in_out: "(let U=C in (A ≤⇩U B)) = (let U=─C in (A ≤⇧U B))" by (simp add: compl_def subset_in_def subset_out_def)
lemma setequ_in_out: "(let U=C in (A =⇩U B)) = (let U=─C in (A =⇧U B))" by (simp add: compl_def setequ_in_def setequ_out_def)

lemma subset_in_char: "(A ≤⇩U B) = (U ∧ A ≤ U ∧ B)" unfolding order conn by blast
lemma subset_out_char: "(A ≤⇧U B) = (U ∨ A ≤ U ∨ B)" unfolding order conn by blast
lemma setequ_in_char: "(A =⇩U B) = (U ∧ A = U ∧ B)" unfolding order conn by blast
lemma setequ_out_char: "(A =⇧U B) = (U ∨ A = U ∨ B)" unfolding order conn by blast

text‹Relativization cannot be meaningfully applied to conditions (n)NORM or (n)DNRM.›
lemma "NORM φ  = (let U = ⊤ in ((φ ⊥) =⇩U ⊥))" by (simp add: NORM_def setequ_def setequ_in_def top_def)
lemma "(let U = ⊥ in ((φ ⊥) =⇩U ⊥))" by (simp add: bottom_def setequ_in_def)

text‹Relativization ('in' resp. 'out') leaves (n)EXPN/(n)CNTR unchanged or trivializes them.›
lemma "EXPN φ  = (∀A. A ≤⇩A φ A)" by (simp add: EXPN_def subset_def subset_in_def)
lemma "CNTR φ  = (∀A. (φ A) ≤⇧A A)" by (metis (mono_tags, lifting) CNTR_def subset_def subset_out_def)
lemma "∀A. A ≤⇧A φ A" by (simp add: subset_out_def)
lemma "∀A. (φ A) ≤⇩A A" by (simp add: subset_in_def)


text‹Relativized ADDI variants.›
definition ADDIr::"('w σ ⇒ 'w σ) ⇒ bool" (‹ADDIr›)
  where "ADDIr φ  ≡ ∀A B. let U = (A ∨ B) in      (φ(A ∨ B) =⇧U (φ A) ∨ (φ B))"
definition ADDIr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹ADDIra›)
  where "ADDIra φ ≡ ∀A B. let U = (A ∨ B) in      (φ(A ∨ B) ≤⇧U (φ A) ∨ (φ B))" 
definition ADDIr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹ADDIrb›)
  where "ADDIrb φ ≡ ∀A B. let U = (A ∨ B) in ((φ A) ∨ (φ B) ≤⇧U φ(A ∨ B))"
 
declare ADDIr_def[cond] ADDIr_a_def[cond] ADDIr_b_def[cond]

lemma ADDIr_char: "ADDIr φ = (ADDIra φ ∧ ADDIrb φ)" unfolding cond by (meson setequ_char setequ_out_char subset_out_char)

lemma ADDIr_a_impl: "ADDIa φ ⟶ ADDIra φ" by (simp add: ADDI_a_def ADDIr_a_def subset_def subset_out_def)
lemma ADDIr_a_equ:  "EXPN φ ⟹ ADDIra φ = ADDIa φ" unfolding cond by (smt (verit, del_insts) join_def subset_def subset_out_def)
lemma ADDIr_a_equ':"nEXPN φ ⟹ ADDIra φ = ADDIa φ" unfolding cond by (smt (verit, ccfv_threshold) compl_def subset_def subset_out_def)

lemma ADDIr_b_impl: "ADDIb φ ⟶ ADDIrb φ" by (simp add: ADDI_b_def ADDIr_b_def subset_def subset_out_def)
lemma "nEXPN φ ⟹ ADDIrb φ ⟶ ADDIb φ" nitpick oops ―‹ countermodel ›
lemma ADDIr_b_equ: "EXPN φ ⟹ ADDIrb φ = ADDIb φ" unfolding cond by (smt (z3) subset_def subset_out_def)


text‹Relativized MULT variants.›
definition MULTr::"('w σ ⇒ 'w σ) ⇒ bool" (‹MULTr›)
  where "MULTr φ  ≡ ∀A B. let U = (A ∧ B) in      (φ(A ∧ B) =⇩U (φ A) ∧ (φ B))"
definition MULTr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹MULTra›)
  where "MULTra φ ≡ ∀A B. let U = (A ∧ B) in      (φ(A ∧ B) ≤⇩U (φ A) ∧ (φ B))"
definition MULTr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹MULTrb›)
  where "MULTrb φ ≡ ∀A B. let U = (A ∧ B) in ((φ A) ∧ (φ B) ≤⇩U φ(A ∧ B))"

declare MULTr_def[cond] MULTr_a_def[cond] MULTr_b_def[cond]

lemma MULTr_char: "MULTr φ = (MULTra φ ∧ MULTrb φ)" unfolding cond by (meson setequ_char setequ_in_char subset_in_char)

lemma MULTr_a_impl: "MULTa φ ⟶ MULTra φ" by (simp add: MULT_a_def MULTr_a_def subset_def subset_in_def)
lemma "nCNTR φ ⟹ MULTra φ ⟶ MULTa φ" nitpick oops ―‹ countermodel ›
lemma MULTr_a_equ: "CNTR φ ⟹ MULTra φ = MULTa φ" unfolding cond by (smt (verit, del_insts) subset_def subset_in_def)

lemma MULTr_b_impl: "MULTb φ ⟶ MULTrb φ" by (simp add: MULT_b_def MULTr_b_def subset_def subset_in_def)
lemma "MULTrb φ ⟶ MULTb φ" nitpick oops ―‹ countermodel ›
lemma MULTr_b_equ:  "CNTR φ ⟹ MULTrb φ = MULTb φ" unfolding cond by (smt (verit, del_insts) meet_def subset_def subset_in_def)
lemma MULTr_b_equ':"nCNTR φ ⟹ MULTrb φ = MULTb φ" unfolding cond by (smt (z3) compl_def subset_def subset_in_def)

text‹Weak variants of monotonicity.›
definition MONOw1::"('w σ ⇒ 'w σ) ⇒ bool" (‹MONOw1›) 
  where "MONOw1 φ ≡ ∀A B. A ≤ B ⟶ (φ A) ≤ B ∨ (φ B)"
definition MONOw2::"('w σ ⇒ 'w σ) ⇒ bool" (‹MONOw2›)
  where "MONOw2 φ ≡ ∀A B. A ≤ B ⟶ A ∧ (φ A) ≤ (φ B)"

declare MONOw1_def[cond] MONOw2_def[cond]

lemma MONOw1_ADDIr_b: "MONOw1 φ = ADDIrb φ" proof -
  have l2r: "MONOw1 φ ⟶ ADDIrb φ"  unfolding cond subset_out_char by (metis (mono_tags, opaque_lifting) L7 join_def subset_def) 
  have r2l: "ADDIrb φ ⟶ MONOw1 φ" unfolding cond subset_out_char by (metis (full_types) L9 join_def setequ_ext subset_def)
  show ?thesis using l2r r2l by blast
qed
lemma MONOw2_MULTr_a: "MONOw2 φ = MULTra φ" proof -
  have l2r: "MONOw2 φ ⟶ MULTra φ" unfolding cond subset_in_char by (meson L4 L5 L8 L9)
  have r2l:"MULTra φ ⟶ MONOw2 φ" unfolding cond subset_in_char by (metis BA_distr1 L2 L5 L6 L9 setequ_ext)
  show ?thesis using l2r r2l by blast
qed

lemma MONOw1_impl: "MONO φ ⟶ MONOw1 φ" by (simp add: ADDIr_b_impl MONO_ADDIb MONOw1_ADDIr_b)
lemma "MONOw1 φ ⟶ MONO φ" nitpick oops ―‹ countermodel ›
lemma MONOw2_impl: "MONO φ ⟶ MONOw2 φ" by (simp add: MONO_MULTa MONOw2_MULTr_a MULTr_a_impl)
lemma "MONOw2 φ ⟶ MONO φ" nitpick oops ―‹ countermodel ›


text‹We have in fact that (n)CNTR (resp. (n)EXPN) implies MONOw-1/ADDIr-b (resp. MONOw-2/MULTr-a).›
lemma CNTR_MONOw1_impl: "CNTR φ ⟶ MONOw1 φ" by (metis CNTR_def L3 MONOw1_def subset_char1)
lemma nCNTR_MONOw1_impl: "nCNTR φ ⟶ MONOw1 φ" by (smt (verit, ccfv_threshold) MONOw1_def compl_def join_def nCNTR_def subset_def)
lemma EXPN_MONOw2_impl: "EXPN φ ⟶ MONOw2 φ" by (metis EXPN_def L4 MONOw2_def subset_char1)
lemma nEXPN_MONOw2_impl: "nEXPN φ ⟶ MONOw2 φ" by (smt (verit) MONOw2_def compl_def meet_def nEXPN_def subset_def)

text‹Relativized nADDI variants.›
definition nADDIr::"('w σ ⇒ 'w σ) ⇒ bool" (‹nADDIr›)
  where "nADDIr φ  ≡ ∀A B. let U = (A ∨ B) in      (φ(A ∨ B) =⇧U (φ A) ∧ (φ B))"
definition nADDIr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹nADDIra›)
  where "nADDIra φ ≡ ∀A B. let U = (A ∨ B) in ((φ A) ∧ (φ B) ≤⇧U φ(A ∨ B))" 
definition nADDIr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹nADDIrb›)
  where "nADDIrb φ ≡ ∀A B. let U = (A ∨ B) in      (φ(A ∨ B) ≤⇧U (φ A) ∧ (φ B))"
 
declare nADDIr_def[cond] nADDIr_a_def[cond] nADDIr_b_def[cond]

lemma nADDIr_char: "nADDIr φ = (nADDIra φ ∧ nADDIrb φ)" unfolding cond by (meson setequ_char setequ_out_char subset_out_char)

lemma nADDIr_a_impl: "nADDIa φ ⟶ nADDIra φ" unfolding cond by (simp add: subset_def subset_out_def)
lemma "nADDIra φ ⟶ nADDIa φ" nitpick oops ―‹ countermodel ›
lemma nADDIr_a_equ:  "EXPN φ ⟹ nADDIra φ = nADDIa φ" unfolding cond by (smt (z3) subset_def subset_out_def)
lemma nADDIr_a_equ':"nEXPN φ ⟹ nADDIra φ = nADDIa φ" unfolding cond by (smt (z3) compl_def join_def meet_def subset_def subset_out_def)

lemma nADDIr_b_impl: "nADDIb φ ⟶ nADDIrb φ" by (simp add: nADDI_b_def nADDIr_b_def subset_def subset_out_def)
lemma "EXPN φ ⟹ nADDIrb φ ⟶ nADDIb φ" nitpick oops ―‹ countermodel ›
lemma nADDIr_b_equ: "nEXPN φ ⟹ nADDIrb φ = nADDIb φ" unfolding cond by (smt (z3) compl_def subset_def subset_out_def)


text‹Relativized nMULT variants.›
definition nMULTr::"('w σ ⇒ 'w σ) ⇒ bool" (‹nMULTr›)
  where "nMULTr φ  ≡ ∀A B. let U = (A ∧ B) in      (φ(A ∧ B) =⇩U (φ A) ∨ (φ B))"
definition nMULTr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹nMULTra›)
  where "nMULTra φ ≡ ∀A B. let U = (A ∧ B) in ((φ A) ∨ (φ B) ≤⇩U φ(A ∧ B))"
definition nMULTr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹nMULTrb›)
  where "nMULTrb φ ≡ ∀A B. let U = (A ∧ B) in      (φ(A ∧ B) ≤⇩U (φ A) ∨ (φ B))"

declare nMULTr_def[cond] nMULTr_a_def[cond] nMULTr_b_def[cond]

lemma nMULTr_char: "nMULTr φ = (nMULTra φ ∧ nMULTrb φ)" unfolding cond by (meson setequ_char setequ_in_char subset_in_char)

lemma nMULTr_a_impl: "nMULTa φ ⟶ nMULTra φ" by (simp add: nMULT_a_def nMULTr_a_def subset_def subset_in_def)
lemma "CNTR φ ⟹ nMULTra φ ⟶ nMULTa φ" nitpick oops ―‹ countermodel ›
lemma nMULTr_a_equ: "nCNTR φ ⟹ nMULTra φ = nMULTa φ" unfolding cond by (smt (z3) compl_def subset_def subset_in_def)

lemma nMULTr_b_impl: "nMULTb φ ⟶ nMULTrb φ" by (simp add: nMULT_b_def nMULTr_b_def subset_def subset_in_def)
lemma "nMULTrb φ ⟶ nMULTb φ" nitpick oops ―‹ countermodel ›
lemma nMULTr_b_equ:  "CNTR φ ⟹ nMULTrb φ = nMULTb φ" unfolding cond by (smt (z3) compl_def join_def meet_def subset_def subset_in_def)
lemma nMULTr_b_equ':"nCNTR φ ⟹ nMULTrb φ = nMULTb φ" unfolding cond by (smt (z3) compl_def join_def meet_def subset_def subset_in_def)


text‹Weak variants of antitonicity.›
definition ANTIw1::"('w σ ⇒ 'w σ) ⇒ bool" (‹ANTIw1›) 
  where "ANTIw1 φ ≡ ∀A B. A ≤ B ⟶ (φ B) ≤ B ∨ (φ A)"
definition ANTIw2::"('w σ ⇒ 'w σ) ⇒ bool" (‹ANTIw2›)
  where "ANTIw2 φ ≡ ∀A B. A ≤ B ⟶ A ∧ (φ B) ≤ (φ A)"

declare ANTIw1_def[cond] ANTIw2_def[cond]

lemma ANTIw1_nADDIr_b: "ANTIw1 φ = nADDIrb φ" proof -
  have l2r: "ANTIw1 φ ⟶ nADDIrb φ" unfolding cond subset_out_char by (smt (verit, ccfv_SIG) BA_distr2 L8 join_def setequ_ext subset_def)
  have r2l: "nADDIrb φ ⟶ ANTIw1 φ" unfolding cond subset_out_def by (metis (full_types) L9 join_def meet_def setequ_ext subset_def)
  show ?thesis using l2r r2l by blast
qed
lemma ANTIw2_nMULTr_a: "ANTIw2 φ = nMULTra φ" proof -
  have l2r: "ANTIw2 φ ⟶ nMULTra φ" unfolding cond subset_in_char by (metis BA_distr1 L3 L4 L5 L7 L8 setequ_ext)
  have r2l: "nMULTra φ ⟶ ANTIw2 φ" unfolding cond subset_in_def by (metis (full_types) L10 join_def meet_def setequ_ext subset_def)
  show ?thesis using l2r r2l by blast
qed

lemma "ANTI φ ⟶ ANTIw1 φ" by (simp add: ANTI_nADDIb ANTIw1_nADDIr_b nADDIr_b_impl)
lemma "ANTIw1 φ ⟶ ANTI φ" nitpick oops ―‹ countermodel ›
lemma "ANTI φ ⟶ ANTIw2 φ" by (simp add: ANTI_nMULTa ANTIw2_nMULTr_a nMULTr_a_impl)
lemma "ANTIw2 φ ⟶ ANTI φ" nitpick oops ―‹ countermodel ›

text‹We have in fact that (n)CNTR (resp. (n)EXPN) implies ANTIw-1/nADDIr-b (resp. ANTIw-2/nMULTr-a).›
lemma CNTR_ANTIw1_impl: "CNTR φ ⟶ ANTIw1 φ" unfolding cond using L3 subset_char1 by blast
lemma nCNTR_ANTIw1_impl: "nCNTR φ ⟶ ANTIw1 φ" unfolding cond by (metis (full_types) compl_def join_def subset_def)
lemma EXPN_ANTIw2_impl: "EXPN φ ⟶ ANTIw2 φ" unfolding cond using L4 subset_char1 by blast
lemma nEXPN_ANTIw2_impl: "nEXPN φ ⟶ ANTIw2 φ" unfolding cond by (metis (full_types) compl_def meet_def subset_def)

text‹Dual interrelations.›
lemma ADDIr_dual1: "ADDIra φ = MULTrb φd" unfolding cond subset_in_char subset_out_char by (smt (z3) BA_cp BA_deMorgan1 BA_dn op_dual_def setequ_ext)
lemma ADDIr_dual2: "ADDIrb φ = MULTra φd" unfolding cond subset_in_char subset_out_char by (smt (verit, ccfv_threshold) BA_cp BA_deMorgan1 BA_dn op_dual_def setequ_ext)
lemma ADDIr_dual:  "ADDIr φ = MULTr φd" using ADDIr_char ADDIr_dual1 ADDIr_dual2 MULTr_char by blast

lemma nADDIr_dual1: "nADDIra φ = nMULTrb φd" unfolding cond subset_in_char subset_out_char by (smt (verit, del_insts) BA_cp BA_deMorgan1 BA_dn op_dual_def setequ_ext)
lemma nADDIr_dual2: "nADDIrb φ = nMULTra φd" by (smt (z3) BA_deMorgan1 BA_dn compl_def nADDIr_b_def nMULTr_a_def op_dual_def setequ_ext subset_in_def subset_out_def)
lemma nADDIr_dual: "nADDIr φ = nMULTr φd" using nADDIr_char nADDIr_dual1 nADDIr_dual2 nMULTr_char by blast


text‹Complement interrelations.›
lemma ADDIr_a_cmpl: "ADDIra φ = nADDIra φ-" unfolding cond by (smt (verit, del_insts) BA_deMorgan1 compl_def setequ_ext subset_out_def svfun_compl_def)
lemma ADDIr_b_cmpl: "ADDIrb φ = nADDIrb φ-" unfolding cond by (smt (verit, del_insts) BA_deMorgan1 compl_def setequ_ext subset_out_def svfun_compl_def)
lemma ADDIr_cmpl: "ADDIr φ = nADDIr φ-" by (simp add: ADDIr_a_cmpl ADDIr_b_cmpl ADDIr_char nADDIr_char)
lemma MULTr_a_cmpl: "MULTra φ = nMULTra φ-" unfolding cond by (smt (verit, del_insts) BA_deMorgan2 compl_def setequ_ext subset_in_def svfun_compl_def)
lemma MULTr_b_cmpl: "MULTrb φ = nMULTrb φ-" unfolding cond by (smt (verit, ccfv_threshold) BA_deMorgan2 compl_def setequ_ext subset_in_def svfun_compl_def)
lemma MULTr_cmpl: "MULTr φ = nMULTr φ-" by (simp add: MULTr_a_cmpl MULTr_b_cmpl MULTr_char nMULTr_char)


text‹Fixed-point interrelations.›
lemma EXPN_fp:  "EXPN φ = EXPN φfp" by (simp add: EXPN_def dimpl_def op_fixpoint_def subset_def)
lemma EXPN_fpc: "EXPN φ = nEXPN φfp-" using EXPN_fp nEXPN_CNTR_compl by blast
lemma CNTR_fp:  "CNTR φ = nCNTR φfp" by (metis EXPN_CNTR_dual1 EXPN_fp dual_compl_char2 dual_invol nCNTR_EXPN_compl ofp_comm_dc1 sfun_compl_invol)
lemma CNTR_fpc: "CNTR φ = CNTR φfp-" by (metis CNTR_fp nCNTR_EXPN_compl ofp_comm_compl ofp_invol)

lemma nNORM_fp: "NORM φ = nNORM φfp" by (metis NORM_def fixpoints_def fp_rel nNORM_def)
lemma NORM_fpc: "NORM φ = NORM φfp-" by (simp add: NORM_def bottom_def ofp_fixpoint_compl_def sdiff_def)
lemma DNRM_fp:  "DNRM φ = DNRM φfp" by (simp add: DNRM_def dimpl_def op_fixpoint_def top_def)
lemma DNRM_fpc: "DNRM φ = nDNRM φfp-" using DNRM_fp nDNRM_DNRM_compl by blast

lemma ADDIr_a_fpc: "ADDIra φ = ADDIra φfp-" unfolding cond subset_out_def by (simp add: join_def ofp_fixpoint_compl_def sdiff_def)
lemma ADDIr_a_fp: "ADDIra φ = nADDIra φfp" by (metis ADDIr_a_cmpl ADDIr_a_fpc sfun_compl_invol)
lemma ADDIr_b_fpc: "ADDIrb φ = ADDIrb φfp-" unfolding cond subset_out_def by (simp add: join_def ofp_fixpoint_compl_def sdiff_def)
lemma ADDIr_b_fp: "ADDIrb φ = nADDIrb φfp" by (metis ADDIr_b_cmpl ADDIr_b_fpc sfun_compl_invol)

lemma MULTr_a_fp: "MULTra φ = MULTra φfp" unfolding cond subset_in_def by (simp add: dimpl_def meet_def op_fixpoint_def)
lemma MULTr_a_fpc: "MULTra φ = nMULTra φfp-" using MULTr_a_cmpl MULTr_a_fp by blast
lemma MULTr_b_fp: "MULTrb φ = MULTrb φfp" unfolding cond subset_in_def by (simp add: dimpl_def meet_def op_fixpoint_def)
lemma MULTr_b_fpc: "MULTrb φ = nMULTrb φfp-" using MULTr_b_cmpl MULTr_b_fp by blast


text‹Relativized IDEM variants.›
definition IDEMr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹IDEMra›)
  where "IDEMra φ ≡ ∀A. φ(A ∨ φ A) ≤⇧A (φ A)"
definition IDEMr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹IDEMrb›) 
  where "IDEMrb φ ≡ ∀A. (φ A) ≤⇩A φ(A ∧ φ A)"
declare IDEMr_a_def[cond] IDEMr_b_def[cond]

text‹Relativized nIDEM variants.›
definition nIDEMr_a::"('w σ ⇒ 'w σ) ⇒ bool" (‹nIDEMra›) 
  where "nIDEMra φ ≡ ∀A. (φ A) ≤⇧A φ(A ∨ ─(φ A))"
definition nIDEMr_b::"('w σ ⇒ 'w σ) ⇒ bool" (‹nIDEMrb›) 
  where "nIDEMrb φ ≡ ∀A. φ(A ∧ ─(φ A)) ≤⇩A (φ A)"

declare nIDEMr_a_def[cond] nIDEMr_b_def[cond]


text‹Complement interrelations.›
lemma IDEMr_a_cmpl: "IDEMra φ = nIDEMra φ-" unfolding cond subset_in_def subset_out_def by (metis compl_def sfun_compl_invol svfun_compl_def)
lemma IDEMr_b_cmpl: "IDEMrb φ = nIDEMrb φ-" unfolding cond subset_in_def subset_out_def by (metis compl_def sfun_compl_invol svfun_compl_def)

text‹Dual interrelation.›
lemma IDEMr_dual: "IDEMra φ = IDEMrb φd" unfolding cond subset_in_def subset_out_def op_dual_def by (metis (mono_tags, opaque_lifting) BA_dn compl_def diff_char1 diff_char2 impl_char setequ_ext)
lemma nIDEMr_dual: "nIDEMra φ = nIDEMrb φd" by (metis IDEMr_dual IDEMr_a_cmpl IDEMr_b_cmpl dual_compl_char1 dual_compl_char2 sfun_compl_invol)

text‹Fixed-point interrelations.›
lemma nIDEMr_a_fpc: "nIDEMra φ = nIDEMra φfp-" proof -
  have "∀A. (λp. A p ∨ ¬φ A p) = (λp. A p ∨ φ A p = A p)" by blast
  thus ?thesis unfolding cond subset_out_def ofp_fixpoint_compl_def conn order by simp
qed
lemma IDEMr_a_fp: "IDEMra φ = nIDEMra φfp" by (metis IDEMr_a_cmpl nIDEMr_a_fpc ofp_invol)
lemma IDEMr_a_fpc: "IDEMra φ = IDEMra φfp-" by (metis IDEMr_a_cmpl nIDEMr_a_fpc ofp_comm_compl)
lemma IDEMr_b_fp: "IDEMrb φ = IDEMrb φfp" by (metis IDEMr_a_fpc IDEMr_dual dual_compl_char1 dual_invol ofp_comm_compl ofp_comm_dc2)
lemma IDEMr_b_fpc: "IDEMrb φ = nIDEMrb φfp-" using IDEMr_b_fp IDEMr_b_cmpl by blast


text‹The original border condition B1' (by Zarycki) is equivalent to the conjuntion of nMULTr and CNTR.›
abbreviation "B1' φ ≡ ∀A B. φ(A ∧ B) = (A ∧ φ B) ∨ (φ A ∧ B)" 

lemma "B1' φ = (nMULTr φ ∧ CNTR φ)" proof -
  have l2ra: "B1' φ ⟶ nMULTr φ" unfolding cond by (smt (z3) join_def meet_def setequ_ext setequ_in_def)
  have l2rb: "B1' φ ⟶ CNTR φ" unfolding cond by (metis L2 L4 L5 L7 L9 setequ_ext)
  have r2l: "(nMULTr φ ∧ CNTR φ) ⟶ B1' φ" unfolding cond by (smt (z3) L10 join_def meet_def setequ_def setequ_in_char)
  from l2ra l2rb r2l show ?thesis by blast
qed

text‹Modulo conditions nMULTr and CNTR the border condition B4 is equivalent to nIDEMr-b.›
abbreviation "B4 φ ≡ ∀A. φ(─φ(─A)) ≤ A"

lemma "nMULTr φ ⟹ CNTR φ ⟹ B4 φ = nIDEMrb φ" proof -
  assume a1: "nMULTr φ" and a2: "CNTR φ"
  have l2r: "nMULTrb φ ⟹ B4 φ ⟶ nIDEMrb φ" unfolding cond subset_in_char subset_def by (metis BA_deMorgan1 BA_dn compl_def meet_def setequ_ext)
  have r2l: "nMULTra φ ⟹ CNTR φ ⟹ nIDEMrb φ ⟶ B4 φ" unfolding cond by (smt (verit) compl_def join_def meet_def subset_def subset_in_def)
  from l2r r2l show ?thesis using a1 a2 nMULTr_char by blast
qed

end