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