foam.is · core

Foam.Concentration

import Foam.Expectation
import Foam.Fold
import Foam.Amplitude
import Foam.Continuum

namespace Foam

def nearBalance (b n : Nat) (w : List Bool) : Bool :=
  Bool.and (Nat.ble (b * n) (n + 2 * (b * freq w true)))
    (Nat.ble (2 * (b * freq w true)) (n + b * n))

def dev (n : Nat) (w : List Bool) : Int :=
  2 * Int.ofNat (freq w true) - Int.ofNat n

def sqDev (n : Nat) (w : List Bool) : Int := dev n w * dev n w

def sumOver (f : List Bool → Int) : List (List Bool) → Int
  | [] => 0
  | w :: B => f w + sumOver f B

theorem dev_read (n : Nat) (w : List Bool) :
    dev n w = Int.subNatNat (2 * freq w true) n := by
  show 2 * Int.ofNat (freq w true) - Int.ofNat n = _
  rw [Int.sub_eq_add_neg,
      show (2 : Int) * Int.ofNat (freq w true) = Int.ofNat (2 * freq w true)
        from rfl,
      FInt.ofNat_add_neg_ofNat]

theorem dev_true (n : Nat) (w : List Bool) :
    dev (n + 1) (true :: w) = dev n w + 1 := by
  rw [dev_read, dev_read]
  show Int.subNatNat (2 * (1 + freq w true)) (n + 1)
      = Int.subNatNat (2 * freq w true) n + 1
  rw [Nat.left_distrib, show (2 : Nat) * 1 = 2 from rfl,
      Nat.add_comm 2 (2 * freq w true)]
  show Int.subNatNat ((2 * freq w true + 1) + 1) (n + 1) = _
  rw [FInt.subNatNat_succ_succ, FInt.subNatNat_succ_left]

theorem dev_false (n : Nat) (w : List Bool) :
    dev (n + 1) (false :: w) = dev n w - 1 := by
  rw [dev_read, dev_read]
  show Int.subNatNat (2 * (0 + freq w true)) (n + 1)
      = Int.subNatNat (2 * freq w true) n - 1
  rw [nothing_added, Int.sub_eq_add_neg,
      ← FInt.subNatNat_succ_right (2 * freq w true) n,
      FInt.add_assoc, FInt.add_right_neg, Int.add_zero]

theorem pair_of_squares (d : Int) :
    (d + 1) * (d + 1) + (d - 1) * (d - 1) = (d * d + d * d) + 2 := by
  rw [Int.sub_eq_add_neg, sq_add d 1, sq_add d (-1),
      neg_mul_neg_self 1, FInt.mul_neg, FInt.mul_one, FInt.mul_one,
      swap_mid (d * d + 1) (d + d) (d * d + 1) (-d + -d),
      swap_mid d d (-d) (-d), FInt.add_right_neg d, FInt.zero_add,
      Int.add_zero, swap_mid (d * d) 1 (d * d) 1]
  rfl

theorem sumOver_append (f : List Bool → Int) :
    ∀ X Y : List (List Bool), sumOver f (X ++ Y) = sumOver f X + sumOver f Y
  | [], Y => (FInt.zero_add (sumOver f Y)).symm
  | w :: X, Y => by
      show f w + sumOver f (X ++ Y) = (f w + sumOver f X) + sumOver f Y
      rw [sumOver_append f X Y, FInt.add_assoc]

theorem sumOver_map (f : List Bool → Int) (g : List Bool → List Bool) :
    ∀ B : List (List Bool), sumOver f (B.map g) = sumOver (fun w => f (g w)) B
  | [] => rfl
  | w :: B => congrArg (f (g w) + ·) (sumOver_map f g B)

theorem sumOver_add (f g : List Bool → Int) :
    ∀ B : List (List Bool),
      sumOver (fun w => f w + g w) B = sumOver f B + sumOver g B
  | [] => rfl
  | w :: B => by
      show (f w + g w) + sumOver (fun w => f w + g w) B
          = (f w + sumOver f B) + (g w + sumOver g B)
      rw [sumOver_add f g B, swap_mid]

theorem sumOver_congr {f g : List Bool → Int} (h : ∀ w, f w = g w) :
    ∀ B : List (List Bool), sumOver f B = sumOver g B
  | [] => rfl
  | w :: B => by
      show f w + sumOver f B = g w + sumOver g B
      rw [h w, sumOver_congr h B]

theorem sumOver_const (c : Int) :
    ∀ B : List (List Bool), sumOver (fun _ => c) B = Int.ofNat B.length * c
  | [] => (FInt.zero_mul c).symm
  | w :: B => by
      show c + sumOver (fun _ => c) B = Int.ofNat (B.length + 1) * c
      rw [sumOver_const c B,
          show Int.ofNat (B.length + 1) = Int.ofNat B.length + 1 from rfl,
          FInt.add_mul, FInt.one_mul, int_add_comm c]

theorem len_append {A : Type} :
    ∀ X Y : List A, (X ++ Y).length = X.length + Y.length
  | [], Y => (nothing_added Y.length).symm
  | _ :: X, Y => by
      show (X ++ Y).length + 1 = (X.length + 1) + Y.length
      rw [len_append X Y, succ_adds]

theorem len_map {A B : Type} (g : A → B) :
    ∀ X : List A, (X.map g).length = X.length
  | [] => rfl
  | _ :: X => congrArg (· + 1) (len_map g X)

theorem the_book_has_two_to_the_n :
    ∀ n : Nat, (book n).length = 2 ^ n
  | 0 => rfl
  | n + 1 => by
      show ((book n).map (true :: ·) ++ (book n).map (false :: ·)).length
          = 2 ^ (n + 1)
      rw [len_append, len_map, len_map, the_book_has_two_to_the_n n,
          show (2 : Nat) ^ (n + 1) = 2 ^ n * 2 from rfl,
          show (2 : Nat) ^ n * 2 = 2 ^ n * 1 + 2 ^ n from rfl,
          Nat.mul_one]

theorem sqDev_true (n : Nat) (w : List Bool) :
    sqDev (n + 1) (true :: w) = (dev n w + 1) * (dev n w + 1) := by
  show dev (n + 1) (true :: w) * dev (n + 1) (true :: w) = _
  rw [dev_true]

theorem sqDev_false (n : Nat) (w : List Bool) :
    sqDev (n + 1) (false :: w) = (dev n w - 1) * (dev n w - 1) := by
  show dev (n + 1) (false :: w) * dev (n + 1) (false :: w) = _
  rw [dev_false]

theorem pair_sq_sqDev (n : Nat) (w : List Bool) :
    (dev n w + 1) * (dev n w + 1) + (dev n w - 1) * (dev n w - 1)
      = (sqDev n w + sqDev n w) + 2 :=
  pair_of_squares (dev n w)

theorem succ_mul' (a b : Nat) : (a + 1) * b = a * b + b := Nat.succ_mul a b

theorem nat_mul_two (a : Nat) : a * 2 = a + a := by
  show a * 1 + a = a + a
  rw [Nat.mul_one]

theorem depth_step_arith (n : Nat) :
    (n * 2 ^ n + n * 2 ^ n) + 2 ^ n * 2 = (n + 1) * 2 ^ (n + 1) := by
  rw [nat_mul_two,
      show (2 : Nat) ^ (n + 1) = 2 ^ n * 2 from rfl, nat_mul_two,
      succ_mul', Nat.left_distrib]

theorem the_squares_pool_to_the_depth :
    ∀ n : Nat, sumOver (sqDev n) (book n) = Int.ofNat n * Int.ofNat (2 ^ n)
  | 0 => rfl
  | n + 1 => by
      show sumOver (sqDev (n + 1))
            ((book n).map (true :: ·) ++ (book n).map (false :: ·)) = _
      rw [sumOver_append, sumOver_map, sumOver_map,
          sumOver_congr (sqDev_true n) (book n),
          sumOver_congr (sqDev_false n) (book n),
          ← sumOver_add,
          sumOver_congr (fun w => pair_sq_sqDev n w) (book n),
          sumOver_add, sumOver_add,
          the_squares_pool_to_the_depth n,
          sumOver_const, the_book_has_two_to_the_n n]
      exact congrArg Int.ofNat (depth_step_arith n)

def natSqDev (n : Nat) (w : List Bool) : Nat :=
  (2 * freq w true - n) * (2 * freq w true - n)
    + (n - 2 * freq w true) * (n - 2 * freq w true)

def natSumOver (v : List Bool → Nat) : List (List Bool) → Nat
  | [] => 0
  | w :: B => v w + natSumOver v B

theorem ofNat_natSqDev (n : Nat) (w : List Bool) :
    Int.ofNat (natSqDev n w) = sqDev n w := by
  show Int.ofNat ((2 * freq w true - n) * (2 * freq w true - n)
        + (n - 2 * freq w true) * (n - 2 * freq w true))
      = dev n w * dev n w
  cases Nat.lt_or_ge (2 * freq w true) n with
  | inl hlt =>
      rw [FInt.sub_eq_zero_of_le (Nat.le_of_lt hlt), Nat.zero_mul,
          nothing_added, dev_read, FInt.subNatNat_of_lt hlt, neg_mul_neg_self]
      rfl
  | inr hge =>
      rw [FInt.sub_eq_zero_of_le hge, Nat.zero_mul, Nat.add_zero,
          dev_read, FInt.subNatNat_of_ge hge]
      rfl

theorem ofNat_natSumOver (n : Nat) :
    ∀ B : List (List Bool),
      Int.ofNat (natSumOver (natSqDev n) B) = sumOver (sqDev n) B
  | [] => rfl
  | w :: B => by
      show Int.ofNat (natSqDev n w + natSumOver (natSqDev n) B)
          = sqDev n w + sumOver (sqDev n) B
      rw [← ofNat_natSqDev n w, ← ofNat_natSumOver n B]
      rfl

theorem the_nat_squares_pool (n : Nat) :
    natSumOver (natSqDev n) (book n) = n * 2 ^ n :=
  Int.ofNat.inj ((ofNat_natSumOver n (book n)).trans
    (show sumOver (sqDev n) (book n) = Int.ofNat (n * 2 ^ n) from
      the_squares_pool_to_the_depth n))

theorem natSumOver_mul (m : Nat) (v : List Bool → Nat) :
    ∀ L : List (List Bool),
      natSumOver (fun w => m * v w) L = m * natSumOver v L
  | [] => rfl
  | w :: L => by
      show m * v w + natSumOver (fun w => m * v w) L
          = m * (v w + natSumOver v L)
      rw [natSumOver_mul m v L, Nat.left_distrib]

theorem cancel_add_left : ∀ (k : Nat) {a b : Nat}, k + a ≤ k + b → a ≤ b
  | 0, _, _, h => by rw [nothing_added, nothing_added] at h; exact h
  | k + 1, a, b, h => by
      rw [succ_adds, succ_adds] at h
      exact cancel_add_left k (succ_le_succ_inv h)

theorem cancel_add_right {a b : Nat} (k : Nat) (h : a + k ≤ b + k) : a ≤ b := by
  rw [Nat.add_comm a k, Nat.add_comm b k] at h
  exact cancel_add_left k h

theorem lt_of_ble_false : ∀ m n : Nat, Nat.ble m n = false → n < m
  | 0, _, h => nomatch h
  | m + 1, 0, _ => Nat.zero_lt_succ m
  | m + 1, n + 1, h => Nat.succ_le_succ (lt_of_ble_false m n h)

theorem and_false_split :
    ∀ x y : Bool, Bool.and x y = false → x = false ∨ y = false
  | false, _, _ => Or.inl rfl
  | true, _, h => Or.inr h

theorem two_shuffle (b k : Nat) : b * (2 * k) = 2 * (b * k) := by
  rw [← FInt.nat_mul_assoc b 2 k, Nat.mul_comm b 2, FInt.nat_mul_assoc 2 b k]

theorem sq_mul_sq (a c : Nat) : (a * a) * (c * c) = (a * c) * (a * c) := by
  rw [FInt.nat_mul_assoc a a (c * c), FInt.nat_mul_assoc a c (a * c),
      ← FInt.nat_mul_assoc c a c, Nat.mul_comm c a, FInt.nat_mul_assoc a c c]

theorem deviant_low_pays (b n k : Nat) (h : n + 2 * (b * k) < b * n) :
    (n + 1) * (n + 1)
      ≤ (b * b) * ((2 * k - n) * (2 * k - n) + (n - 2 * k) * (n - 2 * k)) := by
  have h2k : 2 * k ≤ n := by
    cases Nat.lt_or_ge n (2 * k) with
    | inl hlt =>
        have hbn : b * n ≤ 2 * (b * k) := by
          rw [← two_shuffle]
          exact Nat.mul_le_mul_left b (Nat.le_of_lt hlt)
        exact (no_number_is_below_itself _
          (le_trans h (le_trans hbn (Nat.le_add_left _ n)))).elim
    | inr hge => exact hge
  obtain ⟨d, hd⟩ := Nat.le.dest h2k
  rw [← hd] at h
  rw [Nat.left_distrib, two_shuffle,
      Nat.add_comm (2 * k + d) (2 * (b * k))] at h
  have hkey : (2 * k + d) + 1 ≤ b * d := cancel_add_left (2 * (b * k)) h
  rw [FInt.sub_eq_zero_of_le h2k, Nat.zero_mul, nothing_added, ← hd,
      FInt.add_sub_cancel_left, sq_mul_sq b d]
  exact Nat.mul_le_mul hkey hkey

theorem deviant_high_pays (b n k : Nat) (h : n + b * n < 2 * (b * k)) :
    (n + 1) * (n + 1)
      ≤ (b * b) * ((2 * k - n) * (2 * k - n) + (n - 2 * k) * (n - 2 * k)) := by
  have hn2k : n ≤ 2 * k := by
    cases Nat.lt_or_ge (2 * k) n with
    | inl hlt =>
        have hb : 2 * (b * k) ≤ b * n := by
          rw [← two_shuffle]
          exact Nat.mul_le_mul_left b (Nat.le_of_lt hlt)
        exact (no_number_is_below_itself _
          (le_trans h (le_trans hb (Nat.le_add_left _ n)))).elim
    | inr hge => exact hge
  obtain ⟨e, he⟩ := Nat.le.dest hn2k
  rw [← two_shuffle, ← he, Nat.left_distrib, Nat.add_comm n (b * n)] at h
  have hkey : n + 1 ≤ b * e := cancel_add_left (b * n) h
  rw [FInt.sub_eq_zero_of_le hn2k, Nat.zero_mul, ← he,
      FInt.add_sub_cancel_left]
  show (n + 1) * (n + 1) ≤ (b * b) * (e * e)
  rw [sq_mul_sq b e]
  exact Nat.mul_le_mul hkey hkey

theorem deviant_pays (b n : Nat) (w : List Bool)
    (h : nearBalance b n w = false) :
    (n + 1) * (n + 1) ≤ (b * b) * natSqDev n w := by
  cases and_false_split _ _ h with
  | inl hA =>
      exact deviant_low_pays b n (freq w true) (lt_of_ble_false _ _ hA)
  | inr hB =>
      exact deviant_high_pays b n (freq w true) (lt_of_ble_false _ _ hB)

theorem ne_true_of_eq_false {x : Bool} (h : x = false) : ¬ x = true :=
  fun ht => nomatch h.symm.trans ht

theorem count_pays (p : List Bool → Bool) (v : List Bool → Nat) (C : Nat)
    (hpay : ∀ w, p w = false → C ≤ v w) :
    ∀ L : List (List Bool),
      (List.filter (fun w => Bool.not (p w)) L).length * C ≤ natSumOver v L
  | [] => by
      show 0 * C ≤ 0
      rw [Nat.zero_mul]
      exact Nat.le_refl 0
  | w :: L => by
      cases hp : p w with
      | true =>
          rw [List.filter_cons_of_neg (p := fun u => Bool.not (p u)) (a := w)
                (ne_true_of_eq_false ((congrArg Bool.not hp).trans rfl))]
          exact le_trans (count_pays p v C hpay L) (Nat.le_add_left _ _)
      | false =>
          rw [List.filter_cons_of_pos (p := fun u => Bool.not (p u)) (a := w)
                ((congrArg Bool.not hp).trans rfl)]
          show ((List.filter (fun w => Bool.not (p w)) L).length + 1) * C
              ≤ v w + natSumOver v L
          rw [succ_mul', Nat.add_comm (v w) (natSumOver v L)]
          exact Nat.add_le_add (count_pays p v C hpay L) (hpay w hp)

theorem filter_partition {A : Type} (q : A → Bool) :
    ∀ L : List A,
      (List.filter q L).length
          + (List.filter (fun a => Bool.not (q a)) L).length
        = L.length
  | [] => rfl
  | a :: L => by
      cases hq : q a with
      | true =>
          rw [List.filter_cons_of_pos hq,
              List.filter_cons_of_neg (p := fun u => Bool.not (q u)) (a := a)
                (ne_true_of_eq_false ((congrArg Bool.not hq).trans rfl))]
          show ((List.filter q L).length + 1)
              + (List.filter (fun a => Bool.not (q a)) L).length
            = L.length + 1
          rw [succ_adds, filter_partition q L]
      | false =>
          rw [List.filter_cons_of_neg (ne_true_of_eq_false hq),
              List.filter_cons_of_pos (p := fun u => Bool.not (q u)) (a := a)
                ((congrArg Bool.not hq).trans rfl)]
          show ((List.filter q L).length
              + (List.filter (fun a => Bool.not (q a)) L).length) + 1
            = L.length + 1
          rw [filter_partition q L]

theorem filter_none {A : Type} (q : A → Bool) (hq : ∀ a, q a = false) :
    ∀ L : List A, List.filter q L = []
  | [] => rfl
  | a :: L => by
      rw [List.filter_cons_of_neg (ne_true_of_eq_false (hq a)),
          filter_none q hq L]

theorem nearBalance_zero (n : Nat) (w : List Bool) :
    nearBalance 0 n w = true := by
  show Bool.and (Nat.ble (0 * n) (n + 2 * (0 * freq w true)))
        (Nat.ble (2 * (0 * freq w true)) (n + 0 * n)) = true
  rw [Nat.zero_mul, Nat.zero_mul]
  rfl

theorem shuffle_cap (D C B m : Nat) :
    D * ((C * B) * m) = (B * m) * (C * D) := by
  rw [FInt.nat_mul_assoc C B m, ← FInt.nat_mul_assoc D C (B * m),
      Nat.mul_comm (D * C) (B * m), Nat.mul_comm D C]

theorem outnumbered_of_pos (b c n : Nat) (hb : 0 < b)
    (hn : (c + 1) * (b * b) ≤ n) :
    c * (List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length
      ≤ (List.filter (fun w => nearBalance b n w) (book n)).length := by
  have hcap := count_pays (nearBalance b n)
      (fun w => (b * b) * natSqDev n w) ((n + 1) * (n + 1))
      (fun w hw => deviant_pays b n w hw) (book n)
  rw [natSumOver_mul (b * b) (natSqDev n) (book n),
      the_nat_squares_pool n] at hcap
  have h1 : (c + 1) * (b * b) ≤ n + 1 := le_trans hn (Nat.le_succ n)
  have h2 := Nat.mul_le_mul_left
      ((List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length)
      (Nat.mul_le_mul_right (n + 1) h1)
  have h3 : (b * b) * (n * 2 ^ n) ≤ (b * b * (n + 1)) * 2 ^ n := by
    rw [← FInt.nat_mul_assoc (b * b) n (2 ^ n)]
    exact Nat.mul_le_mul_right (2 ^ n) (Nat.mul_le_mul_left (b * b) (Nat.le_succ n))
  have h4 : (b * b * (n + 1))
        * ((c + 1)
          * (List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length)
      ≤ (b * b * (n + 1)) * 2 ^ n := by
    rw [← shuffle_cap
          ((List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length)
          (c + 1) (b * b) (n + 1)]
    exact le_trans h2 (le_trans hcap h3)
  have h5 := Nat.le_of_mul_le_mul_left h4
      (Nat.mul_pos (Nat.mul_pos hb hb) (Nat.zero_lt_succ n))
  have hpart := filter_partition (nearBalance b n) (book n)
  rw [the_book_has_two_to_the_n n] at hpart
  rw [← hpart, succ_mul'] at h5
  exact cancel_add_right _ h5

theorem the_deviants_are_outnumbered (b c : Nat) :
    ∃ N : Nat, ∀ n : Nat, N ≤ n →
      c * (List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length
        ≤ (List.filter (fun w => nearBalance b n w) (book n)).length := by
  cases b with
  | zero =>
      refine ⟨0, fun n _ => ?_⟩
      rw [filter_none (fun w => Bool.not (nearBalance 0 n w))
            (fun w => (congrArg Bool.not (nearBalance_zero n w)).trans rfl)
            (book n)]
      exact Nat.zero_le _
  | succ s =>
      exact ⟨(c + 1) * ((s + 1) * (s + 1)), fun n hn =>
        outnumbered_of_pos (s + 1) c n (Nat.zero_lt_succ s) hn⟩

theorem fold_reads_the_sum (f : List Bool → Int) :
    ∀ (B : List (List Bool)) (z : Int),
      fold (fun acc w => acc + f w) z B = z + sumOver f B
  | [], z => (Int.add_zero z).symm
  | w :: B, z => by
      show fold (fun acc w => acc + f w) (z + f w) B
          = z + (f w + sumOver f B)
      rw [fold_reads_the_sum f B (z + f w), FInt.add_assoc]

theorem the_pooled_square_caps_the_deviants (b n : Nat) :
    (List.filter (fun w => Bool.not (nearBalance b n w)) (book n)).length
        * ((n + 1) * (n + 1))
      ≤ (b * b) * (n * 2 ^ n) := by
  have hcap := count_pays (nearBalance b n)
      (fun w => (b * b) * natSqDev n w) ((n + 1) * (n + 1))
      (fun w hw => deviant_pays b n w hw) (book n)
  rw [natSumOver_mul (b * b) (natSqDev n) (book n),
      the_nat_squares_pool n] at hcap
  exact hcap

/-- info: 'Foam.fold_reads_the_sum' does not depend on any axioms -/
#guard_msgs in #print axioms fold_reads_the_sum

/-- info: 'Foam.the_pooled_square_caps_the_deviants' does not depend on any axioms -/
#guard_msgs in #print axioms the_pooled_square_caps_the_deviants

/-- info: 'Foam.dev_read' does not depend on any axioms -/
#guard_msgs in #print axioms dev_read

/-- info: 'Foam.dev_true' does not depend on any axioms -/
#guard_msgs in #print axioms dev_true

/-- info: 'Foam.dev_false' does not depend on any axioms -/
#guard_msgs in #print axioms dev_false

/-- info: 'Foam.pair_of_squares' does not depend on any axioms -/
#guard_msgs in #print axioms pair_of_squares

/-- info: 'Foam.sumOver_append' does not depend on any axioms -/
#guard_msgs in #print axioms sumOver_append

/-- info: 'Foam.sumOver_map' does not depend on any axioms -/
#guard_msgs in #print axioms sumOver_map

/-- info: 'Foam.sumOver_add' does not depend on any axioms -/
#guard_msgs in #print axioms sumOver_add

/-- info: 'Foam.sumOver_congr' does not depend on any axioms -/
#guard_msgs in #print axioms sumOver_congr

/-- info: 'Foam.sumOver_const' does not depend on any axioms -/
#guard_msgs in #print axioms sumOver_const

/-- info: 'Foam.len_append' does not depend on any axioms -/
#guard_msgs in #print axioms len_append

/-- info: 'Foam.len_map' does not depend on any axioms -/
#guard_msgs in #print axioms len_map

/-- info: 'Foam.the_book_has_two_to_the_n' does not depend on any axioms -/
#guard_msgs in #print axioms the_book_has_two_to_the_n

/-- info: 'Foam.sqDev_true' does not depend on any axioms -/
#guard_msgs in #print axioms sqDev_true

/-- info: 'Foam.sqDev_false' does not depend on any axioms -/
#guard_msgs in #print axioms sqDev_false

/-- info: 'Foam.pair_sq_sqDev' does not depend on any axioms -/
#guard_msgs in #print axioms pair_sq_sqDev

/-- info: 'Foam.succ_mul'' does not depend on any axioms -/
#guard_msgs in #print axioms succ_mul'

/-- info: 'Foam.nat_mul_two' does not depend on any axioms -/
#guard_msgs in #print axioms nat_mul_two

/-- info: 'Foam.depth_step_arith' does not depend on any axioms -/
#guard_msgs in #print axioms depth_step_arith

/-- info: 'Foam.the_squares_pool_to_the_depth' does not depend on any axioms -/
#guard_msgs in #print axioms the_squares_pool_to_the_depth

/-- info: 'Foam.ofNat_natSqDev' does not depend on any axioms -/
#guard_msgs in #print axioms ofNat_natSqDev

/-- info: 'Foam.ofNat_natSumOver' does not depend on any axioms -/
#guard_msgs in #print axioms ofNat_natSumOver

/-- info: 'Foam.the_nat_squares_pool' does not depend on any axioms -/
#guard_msgs in #print axioms the_nat_squares_pool

/-- info: 'Foam.natSumOver_mul' does not depend on any axioms -/
#guard_msgs in #print axioms natSumOver_mul

/-- info: 'Foam.cancel_add_left' does not depend on any axioms -/
#guard_msgs in #print axioms cancel_add_left

/-- info: 'Foam.cancel_add_right' does not depend on any axioms -/
#guard_msgs in #print axioms cancel_add_right

/-- info: 'Foam.lt_of_ble_false' does not depend on any axioms -/
#guard_msgs in #print axioms lt_of_ble_false

/-- info: 'Foam.and_false_split' does not depend on any axioms -/
#guard_msgs in #print axioms and_false_split

/-- info: 'Foam.two_shuffle' does not depend on any axioms -/
#guard_msgs in #print axioms two_shuffle

/-- info: 'Foam.sq_mul_sq' does not depend on any axioms -/
#guard_msgs in #print axioms sq_mul_sq

/-- info: 'Foam.deviant_low_pays' does not depend on any axioms -/
#guard_msgs in #print axioms deviant_low_pays

/-- info: 'Foam.deviant_high_pays' does not depend on any axioms -/
#guard_msgs in #print axioms deviant_high_pays

/-- info: 'Foam.deviant_pays' does not depend on any axioms -/
#guard_msgs in #print axioms deviant_pays

/-- info: 'Foam.ne_true_of_eq_false' does not depend on any axioms -/
#guard_msgs in #print axioms ne_true_of_eq_false

/-- info: 'Foam.count_pays' does not depend on any axioms -/
#guard_msgs in #print axioms count_pays

/-- info: 'Foam.filter_partition' does not depend on any axioms -/
#guard_msgs in #print axioms filter_partition

/-- info: 'Foam.filter_none' does not depend on any axioms -/
#guard_msgs in #print axioms filter_none

/-- info: 'Foam.nearBalance_zero' does not depend on any axioms -/
#guard_msgs in #print axioms nearBalance_zero

/-- info: 'Foam.shuffle_cap' does not depend on any axioms -/
#guard_msgs in #print axioms shuffle_cap

/-- info: 'Foam.outnumbered_of_pos' does not depend on any axioms -/
#guard_msgs in #print axioms outnumbered_of_pos

/-- info: 'Foam.the_deviants_are_outnumbered' does not depend on any axioms -/
#guard_msgs in #print axioms the_deviants_are_outnumbered

end Foam