Theory Mono_Atomic

section ‹Mono-Atomic Elements›

theory Mono_Atomic

imports Stone_Relation_Algebras.Relation_Algebras

begin

text ‹
This theory defines mono-atomic elements in a bounded semilattice and shows that they correspond to join-irreducible elements under the divisibility axioms A1--A17 of \cite{Cegielski1989}.
In the model of natural numbers both types of elements correspond to prime powers.
›

subsection ‹Mono-atomic›

context order_bot
begin

text ‹
Divisibility axioms A1 (reflexivity), A2 (antisymmetry), A3 (transitivity) and A6 (least element) are the axioms of class order_bot›, so not mentioned explicitly.
›

text ‹
An atom› in a partial order is an element that is strictly above only the least element bot›.
›

definition "atom a                        a  bot  (x . x  a  x = bot  x = a)"
abbreviation "atom_below a x              atom a  a  x"

text ‹
A mono-atomic element has exactly one atom below it.
›

definition "mono_atomic x                 (∃!a . atom_below a x)"
definition "mono_atomic_with x a          atom_below a x  (b . atom_below b x  b = a)"
abbreviation "mono_atomic_below x y       mono_atomic x  x  y"
abbreviation "mono_atomic_above x y       mono_atomic x  y  x"
definition "mono_atomic_above_or_bot x y  x = bot  mono_atomic_above x y"

text ‹
Divisibility axiom A11 (atomicity) states that every element except bot› is above some atom.
›

abbreviation A11_atomic            :: "'a  bool" where "A11_atomic _             (x . x  bot  (a . atom_below a x))"

lemma mono_atomic_above:
  "mono_atomic x  (a . mono_atomic_with x a)"
  by (metis mono_atomic_with_def mono_atomic_def)

text ‹
Among others, the following divisibility axioms are considered in \cite{Cegielski1989}.
In the model of natural numbers,
\begin{itemize}
\item A7 (pre-f-decomposability) expresses that every number $x$ is the least upper bound of the prime powers below $x$;
\item A8 (fibered) expresses that the prime powers can be partitioned into chains;
\item A9 (f-decomposability) expresses that for every number $x$ above an atom $a$ there is a maximal prime power of $a$ below $x$;
\item A14 (truncability) express that the prime powers contained in a number $y$ can be restricted to those whose atoms are not below a number $x$.
\end{itemize}
Their definitions are based on join-irreducible elements and given in class bounded_semilattice_sup_bot› below.
Here we introduce corresponding axioms B7, B8, B9 and B14 based on mono-atomic elements.
›

abbreviation B7_pre_f_decomposable :: "'a  bool" where "B7_pre_f_decomposable _  (x y . (z . mono_atomic_below z x  z  y)  x  y)"
abbreviation B8_fibered            :: "'a  bool" where "B8_fibered _             (x y z . mono_atomic x  mono_atomic y  mono_atomic z  ((x  z  y  z)  (z  x  z  y))  x  y  y  x)"
abbreviation B9_f_decomposable     :: "'a  bool" where "B9_f_decomposable _      (x a . atom a  (z . mono_atomic_above_or_bot z a  z  x  (w . mono_atomic_above_or_bot w a  w  x  w  z)))"

text ‹
Function mval› returns the value whose existence is asserted by axiom B9.
›

definition "mval a x  SOME z . mono_atomic_above_or_bot z a  z  x  (w . mono_atomic_above_or_bot w a  w  x  w  z)"

lemma mval_char:
  assumes "B9_f_decomposable _"
      and "atom a"
    shows "mono_atomic_above_or_bot (mval a x) a  mval a x  x  (w . mono_atomic_above_or_bot w a  w  x  w  mval a x)"
proof -
  obtain z where "mono_atomic_above_or_bot z a  z  x  (w . mono_atomic_above_or_bot w a  w  x  w  z)"
    using assms by blast
  thus ?thesis
    using mval_def someI by simp
qed

lemma mval_unique:
  assumes "B9_f_decomposable _"
      and "atom a"
      and "mono_atomic_above_or_bot z a  z  x  (w . mono_atomic_above_or_bot w a  w  x  w  z)"
    shows "z = mval a x"
  by (simp add: assms dual_order.antisym mval_char)

lemma atom_below_mval:
  assumes "B9_f_decomposable _"
      and "atom a"
      and "a  x"
    shows "a  mval a x"
proof -
  have "mono_atomic_above_or_bot a a"
    using assms(2) atom_def mono_atomic_above_or_bot_def mono_atomic_def by auto
  thus ?thesis
    by (simp add: assms mval_char)
qed

abbreviation B14_truncability      :: "'a  bool" where "B14_truncability _       (x y .  z . a . atom a  (if a  x then mval a z = bot else mval a z = mval a y))"

text ‹
Function mtrunc› returns the value whose existence is asserted by axiom B14.
›

definition "mtrunc x y  SOME z . a . atom a  (if a  x then mval a z = bot else mval a z = mval a y)"

lemma mtrunc_char:
  assumes "B14_truncability _"
    shows "a . atom a  (if a  x then mval a (mtrunc x y) = bot else mval a (mtrunc x y) = mval a y)"
proof -
  obtain z where "a . atom a  (if a  x then mval a z = bot else mval a z = mval a y)"
    using assms by blast
  thus ?thesis
    by (smt mtrunc_def someI)
qed

lemma mtrunc_char_1:
  assumes "B14_truncability _"
      and "atom a"
      and "a  x"
    shows "mval a (mtrunc x y) = bot"
  by (simp add: assms mtrunc_char)

lemma mtrunc_char_2:
  assumes "B14_truncability _"
      and "atom a"
      and "¬ a  x"
    shows "mval a (mtrunc x y) = mval a y"
  by (simp add: assms mtrunc_char)

lemma mtrunc_unique:
  assumes "B14_truncability _"
      and "a . atom a  (if a  x then mval a z = bot else mval a z = mval a y)"
      and "atom a"
    shows "mval a z = mval a (mtrunc x y)"
  by (smt (z3) assms mtrunc_char)

lemma lesseq_iff_mval_below:
  assumes "B7_pre_f_decomposable _"
      and "B9_f_decomposable _"
      and "atom a"
    shows "x  y  (a . atom a  mval a x  y)"
proof (rule iffI)
  assume 1: "x  y"
  show "a . atom a  mval a x  y"
  proof (rule allI, rule impI)
    fix a
    assume "atom a"
    thus "mval a x  y"
      using 1 assms(2) dual_order.trans mval_char by blast
  qed
next
  assume 2: "a . atom a  mval a x  y"
  have "z . mono_atomic_below z x  z  y"
  proof (rule allI, rule impI)
    fix z
    assume 3: "mono_atomic_below z x"
    from this obtain a where 4: "atom_below a z"
      using mono_atomic_def by blast
    hence "z  mval a x"
      using 3 assms(2) mono_atomic_above_or_bot_def mval_char by auto
    thus "z  y"
      using 2 4 by auto
  qed
  thus "x  y"
    using assms(1) by blast
qed

end

subsection ‹Join-irreducible›

context bounded_semilattice_sup_bot
begin

text ‹
Divisibility axioms A1 (reflexivity), A2 (antisymmetry), A3 (transitivity), A5 (least upper bound) and A6 (least element) are the axioms of class bounded_semilattice_sup_bot›, so not mentioned explicitly.
›

text ‹
A join-irreducible element cannot be expressed as the join of two incomparable elements.
›

definition "join_irreducible x                 x  bot  (y z . x = y  z  x = y  x = z)"
abbreviation "join_irreducible_below x y       join_irreducible x  x  y"
abbreviation "join_irreducible_above x y       join_irreducible x  y  x"
definition "join_irreducible_above_or_bot x y  x = bot  join_irreducible_above x y"

text ‹
Divisibility axioms A7, A8 and A9 based on join-irreducible elements are introduced here; axiom A14 is not needed for this development.
›

abbreviation A7_pre_f_decomposable :: "'a  bool" where "A7_pre_f_decomposable _  (x y . (z . join_irreducible_below z x  z  y)  x  y)"
abbreviation A8_fibered            :: "'a  bool" where "A8_fibered _             (x y z . join_irreducible x  join_irreducible y  join_irreducible z  ((x  z  y  z)  (z  x  z  y))  x  y  y  x)"
abbreviation A9_f_decomposable     :: "'a  bool" where "A9_f_decomposable _      (x a . atom a  (z . join_irreducible_above_or_bot z a  z  x  (w . join_irreducible_above_or_bot w a  w  x  w  z)))"

lemma atom_join_irreducible:
  assumes "atom a"
    shows "join_irreducible a"
  by (metis assms join_irreducible_def atom_def sup.cobounded1 sup_bot_left)

lemma mono_atomic_with_downclosed:
  assumes "A11_atomic _"
      and "mono_atomic_with x a"
      and "y  bot"
      and "y  x"
    shows "mono_atomic_with y a"
  using assms mono_atomic_with_def[of y a] mono_atomic_with_def[of x a] order_lesseq_imp[of y] by blast

subsection ‹Equivalence›

text ‹
The following result shows that under divisibility axioms A1--A3, A5--A9 and A11, join-irreducible elements coincide with mono-atomic elements.
›

lemma join_irreducible_iff_mono_atomic:
  assumes "A7_pre_f_decomposable _"
      and "A8_fibered _"
      and "A9_f_decomposable _"
      and "A11_atomic _"
    shows "join_irreducible x  mono_atomic x"
proof (rule iffI)
  assume 1: "join_irreducible x"
  from this obtain a where 2: "atom_below a x"
    using assms(4) join_irreducible_def by blast
  have "b . atom_below b x  b = a"
  proof (rule allI, rule impI)
    fix b
    assume 3: "atom_below b x"
    hence "join_irreducible a  join_irreducible b"
      using 2 atom_join_irreducible by auto
    hence "a  b  b  a"
      using 1 2 3 assms(2) by blast
    thus "b = a"
      using 2 3 atom_def by auto
  qed
  thus "mono_atomic x"
    using 2 mono_atomic_def by auto
next
  assume "mono_atomic x"
  from this obtain a where 4: "mono_atomic_with x a"
    using mono_atomic_above by blast
  hence 5: "x  bot"
    using atom_def le_bot mono_atomic_with_def by blast
  have "y z . x = y  z  x = y  x = z"
  proof (intro allI, rule impI)
    fix y z
    assume 6: "x = y  z"
    show "x = y  x = z"
    proof (cases "y = bot  z = bot")
      case True
      thus "x = y  x = z"
        using 6 by auto
    next
      case False
      hence 7: "mono_atomic_with y a  mono_atomic_with z a"
        using 4 6 assms(4) sup.cobounded1 sup.cobounded2 mono_atomic_with_downclosed by blast
      from this obtain u where 8: "join_irreducible_above_or_bot u a  u  y  (w . join_irreducible_above_or_bot w a  w  y  w  u)"
        using assms(3) mono_atomic_with_def by blast
      from 7 obtain v where 9: "join_irreducible_above_or_bot v a  v  z  (w . join_irreducible_above_or_bot w a  w  z  w  v)"
        using assms(3) mono_atomic_with_def by blast
      have "join_irreducible a"
        using 4 atom_join_irreducible mono_atomic_with_def by blast
      hence 10: "u  v  v  u"
        using 8 9 assms(2) join_irreducible_above_or_bot_def by auto
      have 11: "u  v  y  z"
      proof -
        assume 12: "u  v"
        have "w . join_irreducible_below w y  w  z"
        proof (rule allI, rule impI)
          fix w
          assume 13: "join_irreducible_below w y"
          hence "mono_atomic_with w a"
            using 7 by (metis assms(4) join_irreducible_def mono_atomic_with_downclosed)
          hence "w  u"
            using 8 13 by (simp add: join_irreducible_above_or_bot_def mono_atomic_with_def)
          thus "w  z"
            using 9 12 by force
        qed
        thus "y  z"
          using assms(1) by blast
      qed
      have "v  u  z  y"
      proof -
        assume 14: "v  u"
        have "w . join_irreducible_below w z  w  y"
        proof (rule allI, rule impI)
          fix w
          assume 15: "join_irreducible_below w z"
          hence "mono_atomic_with w a"
            using 7 by (metis assms(4) join_irreducible_def mono_atomic_with_downclosed)
          hence "w  v"
            using 9 15 by (simp add: join_irreducible_above_or_bot_def mono_atomic_with_def)
          thus "w  y"
            using 8 14 by force
        qed
        thus "z  y"
          using assms(1) by blast
      qed
      thus ?thesis
        using 6 10 11 sup.order_iff sup_monoid.add_commute by force
    qed
  qed
  thus "join_irreducible x"
    using 5 join_irreducible_def by blast
qed

text ‹
The following result shows that under divisibility axioms A1--A3, A5--A6, B7--B9, A11 and B14, join-irreducible elements coincide with mono-atomic elements.
›

lemma mono_atomic_iff_join_irreducible:
  assumes "B7_pre_f_decomposable _"
      and "B8_fibered _"
      and "B9_f_decomposable _"
      and "A11_atomic _"
      and "B14_truncability _"
    shows "mono_atomic x  join_irreducible x"
proof (rule iffI)
  assume 1: "mono_atomic x"
  from this obtain a where "mono_atomic_below a x"
    by blast
  hence 2: "x  bot"
    using atom_def bot_unique mono_atomic_def by force
  have "y z . x = y  z  x = y  x = z"
  proof (intro allI, rule impI)
    fix y z
    assume 3: "x = y  z"
    show "x = y  x = z"
    proof (cases "y = bot  z = bot")
      case True
      thus ?thesis
        using 3 by fastforce
    next
      case False
      hence "mono_atomic y  mono_atomic z"
        using 1 3 by (metis assms(4) mono_atomic_above sup.cobounded1 sup_right_divisibility mono_atomic_with_downclosed)
      hence "y  z  z  y"
        using 1 3 assms(2) by force
      thus ?thesis
        using 3 sup.order_iff sup_monoid.add_commute by force
    qed
  qed
  thus "join_irreducible x"
    using 2 join_irreducible_def by blast
next
  assume "join_irreducible x"
  from this obtain a where 4: "atom a  join_irreducible_above x a"
    using assms(4) join_irreducible_def by blast
  let ?y = "mval a x"
  let ?z = "mtrunc ?y x"
  have 5: "mval a ?z = bot"
    using 4 by (smt (z3) assms(3,5) mono_atomic_above_or_bot_def mtrunc_char mval_char)
  have 6: "mono_atomic_above_or_bot ?y a"
    using 4 assms(3) mval_char by simp
  hence "b . atom b  b  a  ¬ b  ?y"
    using 4 by (metis atom_def bot_unique mono_atomic_above_or_bot_def mono_atomic_def)
  hence 7: "b . atom b  b  a  mval b ?z = mval b x"
    by (simp add: assms(5) mtrunc_char)
  have 8: "?y  x"
    using 4 assms(3) mval_char by blast
  have "b . atom b  mval b ?z  x"
  proof (rule allI, rule impI)
    fix b
    assume 9: "atom b"
    show "mval b ?z  x"
    proof (cases "b = a")
      case True
      thus ?thesis
        using 5 by auto
    next
      case False
      thus ?thesis
        using 7 9 by (simp add:  assms(3) mval_char)
    qed
  qed
  hence 10: "?z  x"
    using 4 assms(1,3) lesseq_iff_mval_below by blast
  have "w . ?y  w  ?z  w  x  w"
  proof (rule allI, rule impI)
    fix w
    assume 11: "?y  w  ?z  w"
    have "c . atom c  mval c x  w"
    proof (rule allI, rule impI)
      fix c
      assume 12: "atom c"
      show "mval c x  w"
      proof (cases "c = a")
        case True
        thus ?thesis
          using 11 by blast
      next
        case False
        thus ?thesis
          using 7 11 12 by (smt (z3) assms(3) dual_order.trans mval_char)
      qed
    qed
    thus "x  w"
      using 4 assms(1,3) lesseq_iff_mval_below by blast
  qed
  hence 13: "x = ?y  ?z"
    using 8 10 order.ordering_axioms ordering.antisym by force
  have "x  ?z"
  proof (rule notI)
    assume "x = ?z"
    hence "?y = bot"
      using 5 by force
    hence "a = bot"
      using 4 assms(3) atom_below_mval bot_unique by fastforce
    thus False
      using 4 atom_def by blast
  qed
  hence "x = ?y"
    using 4 13 join_irreducible_def by force
  thus "mono_atomic x"
    using 4 6 join_irreducible_def mono_atomic_above_or_bot_def by auto
qed

end

end