Theory BL_Chains

section‹BL-chains›

text‹BL-chains generate the variety of BL-algebras, the algebraic counterpart
 of the Basic Fuzzy Logic (see cite"HAJEK1998"). As mentioned in the abstract, this formalization
 is based on the proof for BL-chains found in cite"BUSANICHE2005". We define @{text "BL-chain"} and
 @{text "bounded tower of irreducible hoops"} and formalize the main result on that paper (Theorem 3.4).›

theory BL_Chains
  imports Totally_Ordered_Hoops 

begin

subsection‹Definitions›

locale bl_chain = totally_ordered_hoop + 
  fixes zeroA :: "'a" ("0A")
  assumes zero_closed: "0A  A"
  assumes zero_first: "x  A  0A A x"

locale bounded_tower_of_irr_hoops = tower_of_irr_hoops +
  fixes zeroI ("0I") 
  fixes zeroS ("0S")
  assumes I_zero_closed : "0I  I"
  and zero_first: "i  I  0I I i"
  and first_zero_closed: "0S  UNI 0I"
  and first_bounded: "x  UNI 0I  IMP 0I 0S x = 1S"
begin

abbreviation (uni_zero)
  uni_zero :: "'b set"  ("𝔸0I")
  where "𝔸0I  UNI 0I"

abbreviation (imp_zero)
  imp_zero :: "['b, 'b]  'b"  ("((_)/ 0I / (_))" [61,61] 60)
  where "x 0I y  IMP 0I x y"

end

context bl_chain
begin

subsection‹First element of @{term I}

definition zeroI :: "'a set" ("0I")
  where "0I = π 0A"

lemma I_zero_closed: "0I  I"
  using index_set_def zeroI_def zero_closed by auto

lemma I_has_first_element:
  assumes "i  I" "i  0I"
  shows "0I <I i"
proof -
  have "x A y" if "i <I 0I" "x  i" "y  0I" for x y
    using I_zero_closed assms(1) index_order_strict_def that by fastforce
  then
  have "x A 0A" if "i <I 0I" "x  i" for x
    using classes_not_empty zeroI_def zero_closed that by simp
  moreover
  have "0A A x" if "x  i" for x
    using assms(1) that in_mono indexes_subsets zero_first by meson
  ultimately
  have "x = 0A" if "i <I 0I" "x  i" for x
    using assms(1) indexes_subsets ord_antisymm zero_closed that by blast
  moreover
  have "0A  0I"
    using classes_not_empty zeroI_def zero_closed by simp
  ultimately
  have "i  0I  " if "i <I 0I"
    using assms(1) indexes_not_empty that by force
  moreover
  have "i <I 0I  0I <I i"
    using I_zero_closed assms trichotomy by auto
  ultimately
  show ?thesis
    using I_zero_closed assms(1) indexes_disjoint by auto
qed

subsection‹Main result for BL-chains›

definition zeroS :: "'a" ("0S")
  where "0S = 0A"

abbreviation (uniA_zero)
  uniA_zero :: "'a set" ("(𝔸0I)")
  where "𝔸0I  UNIA 0I"

abbreviation (impA_zero_xy)
  impA_zero_xy :: "['a, 'a]  'a"  ("((_)/ 0I / (_))" [61, 61] 60)
  where "x 0I y  IMPA 0I x y"

lemma tower_is_bounded:
  shows "bounded_tower_of_irr_hoops I (≤I) (<I) UNIA MULA IMPA 1S 0I 0S"
proof
  show "0I  I"
    using I_zero_closed by simp
next
  show "0I I i" if "i  I" for i
    using I_has_first_element index_ord_reflex index_order_strict_def that by blast
next
  show "0S  𝔸0I"
    using classes_not_empty universes_def zeroI_def zeroS_def zero_closed by simp
next
  show "0S 0I x = 1S" if "x  𝔸0I" for x
    using I_zero_closed universes_subsets hoop_order_def imp_map_def sum_one_def
          zeroS_def zero_first that
    by simp
qed

lemma ordinal_sum_is_bl_totally_ordered:
  shows "bl_chain A_SUM.sum_univ A_SUM.sum_mult A_SUM.sum_imp 1S 0S"
proof
  show "A_SUM.hoop_order x y  A_SUM.hoop_order y x"
    if "x  A_SUM.sum_univ" "y  A_SUM.sum_univ" for x y
    using ordinal_sum_is_totally_ordered_hoop totally_ordered_hoop.total_order that
    by meson
next
  show "0S  A_SUM.sum_univ"
    using zeroS_def zero_closed by simp
next
  show "A_SUM.hoop_order 0S x" if "x  A_SUM.sum_univ" for x
    using A_SUM.hoop_order_def eq_imp hoop_order_def sum_one_def zeroS_def zero_closed
          zero_first that
    by simp
qed

theorem bl_chain_is_equal_to_ordinal_sum_of_bounded_tower_of_irr_hoops:
  shows eq_universe: "A = A_SUM.sum_univ"
  and eq_mult: "x  A  y  A  x *A y = A_SUM.sum_mult x y"
  and eq_imp: "x  A  y  A  x A y = A_SUM.sum_imp x y"
  and eq_zero: "0A = 0S"
  and eq_one: "1A = 1S"
proof
  show "A  A_SUM.sum_univ"
    by auto
next
  show "A_SUM.sum_univ  A"
    by auto
next
  show "x *A y = A_SUM.sum_mult x y" if "x  A" "y  A" for x y
    using eq_mult that by blast
next
  show "x A y = A_SUM.sum_imp x y" if "x  A" "y  A" for x y
    using eq_imp that by blast
next
  show "0A = 0S"
    using zeroS_def by simp
next
  show "1A = 1S"
    using sum_one_def by simp
qed

end

subsection‹Converse of main result for BL-chains›

context bounded_tower_of_irr_hoops
begin

text‹We show that the converse of the main result holds if @{term "0S  1S"}. If @{term "0S = 1S"}
then the converse may not be true. For example, take a trivial hoop @{text A} and an arbitrary
not bounded Wajsberg hoop @{text B} such that @{text "A ∩ B = {1}"}. The ordinal sum of both hoops is equal to
@{text B} and therefore not bounded.›

proposition ordinal_sum_of_bounded_tower_of_irr_hoops_is_bl_chain:
  assumes "0S  1S" 
  shows "bl_chain S (*S) (→S) 1S 0S"
proof
  show "hoop_order a b  hoop_order b a" if "a  S" "b  S" for a b
  proof -
    from that
    consider (1) "a  S-{1S}" "b  S-{1S}" "floor a = floor b"
      | (2) "a  S-{1S}" "b  S-{1S}" "floor a <I floor b  floor b <I floor a"
      | (3) "a = 1S  b = 1S"
      using floor.cases floor_prop trichotomy by metis
    then
    show ?thesis
    proof(cases)
      case 1
      then
      have "a  𝔸floor a  b  𝔸floor a"
        using "1" floor_prop by metis
      moreover
      have "totally_ordered_hoop (𝔸floor a) (*floor a) (floor a) 1S"
        using "1"(1) family_of_irr_hoops totally_ordered_irreducible_hoop.axioms(1)
              floor_prop
        by meson
      ultimately
      have "a floor a b = 1S  b floor a a = 1S"
        using hoop.hoop_order_def totally_ordered_hoop.total_order
              totally_ordered_hoop_def
        by meson
      moreover
      have "a S b = a floor a b  b S a = b floor a a"
        using "1" by auto
      ultimately
      show ?thesis
        using hoop_order_def by force
    next
      case 2
      then
      show ?thesis
        using sum_imp.simps(2) hoop_order_def by blast
    next
      case 3
      then
      show ?thesis
        using that ord_top by auto
    qed
  qed
next
  show "0S  S"
    using first_zero_closed I_zero_closed sum_subsets by auto
next
  show "hoop_order 0S a" if "a  S" for a 
  proof -
    have zero_dom: "0S  𝔸0I  0S  S-{1S}"
      using I_zero_closed sum_subsets assms first_zero_closed by blast
    moreover
    have "floor 0S I floor x" if "0S  S-{1S}" "x  S-{1S}" for x
      using I_zero_closed floor_prop floor_unique that(2) zero_dom zero_first
      by metis
    ultimately
    have "floor 0S I floor x" if "x  S-{1S}" for x
      using that by blast
    then
    consider (1) "0S  S-{1S}" "a  S-{1S}" "floor 0S = floor a"
      | (2) "0S  S-{1S}" "a  S-{1S}" "floor 0S <I floor a"
      | (3) "a = 1S"
      using a  S floor.cases floor_prop strict_order_equiv_not_converse 
            trichotomy zero_dom
      by metis
    then
    show "hoop_order 0S a"
    proof(cases)
      case 1
      then
      have "0S  𝔸0I  a  𝔸0I"
        using I_zero_closed first_zero_closed floor_prop floor_unique by metis
      then
      have "0S S a = 0S 0I a  0S 0I a = 1S"
        using "1" I_zero_closed sum_imp.simps(1) first_bounded floor_prop floor_unique
        by metis
      then
      show ?thesis
        using hoop_order_def by blast
    next
      case 2
      then
      show ?thesis
        using sum_imp.simps(2,5) hoop_order_def by meson
    next
      case 3
      then
      show ?thesis
        using ord_top zero_dom by auto
    qed
  qed
qed

end

end