Comment: int_2_summary
Defines mod, floor, max and min functions over the 
integers.
Lemmas concern basic properties of arithmetic functions over integers,
and induction principles. 
Comment: int_2_intro
Contains definitions for integer functions such
as mod, floor, max and min. 
Gives many standard lemmas for standard arithmetic
functions over the integers, involving both
equalities and inequalities. 
At end, are some induction lemmas for 
various subsets of the integers.  ⋅
Lemma: int_trichot
∀i,j:ℤ.  (i < j ∨ (i = j ∈ ℤ) ∨ (i > j))
Lemma: injection_le
∀[k,m:ℕ].  k ≤ m supposing ∃f:ℕk ⟶ ℕm. Inj(ℕk;ℕm;f)
Lemma: disjoint_increasing_onto
∀[m,n,k:ℕ]. ∀[f:ℕn ⟶ ℕm]. ∀[g:ℕk ⟶ ℕm].
  (m = (n + k) ∈ ℕ) supposing 
     ((∀j1:ℕn. ∀j2:ℕk.  (¬((f j1) = (g j2) ∈ ℤ))) and 
     (∀i:ℕm. ((∃j:ℕn. (i = (f j) ∈ ℤ)) ∨ (∃j:ℕk. (i = (g j) ∈ ℤ)))) and 
     increasing(g;k) and 
     increasing(f;n))
Lemma: modulus_base_neg
∀[m:ℕ+]. ∀[a:{-m..0-}].  (a mod m ~ m + a)
Lemma: eq_to_le
∀[i,j:ℤ].  i ≤ j supposing i = j ∈ ℤ
Lemma: lt_to_le
∀[i,j:ℤ].  uiff(i < j;(i + 1) ≤ j)
Lemma: le_to_lt_weaken
∀[i,j:ℤ].  i ≤ j supposing i < j
Lemma: lt_to_le_rw
∀[i,j:ℤ].  {uiff(i < j;(i + 1) ≤ j)}
Lemma: le_to_lt
∀[i,j:ℤ].  uiff(i ≤ j;i < j + 1)
Lemma: le_to_lt_rw
∀[i,j:ℤ].  {uiff(i ≤ j;i < j + 1)}
Definition: rounding-div
[b ÷ m] ==
  eval n = m in
  eval a = b in
    let q,r = divrem(a; n) 
    in eval r2 = 2 * r in
       if (r2) < (n)  then if (-n) < (r2)  then q  else (q - 1)  else (q + 1)
Lemma: rounding-div_wf
∀[a:ℤ]. ∀[n:ℕ+].  ([a ÷ n] ∈ ℤ)
Lemma: rounding-div-property
∀[a:ℤ]. ∀[n:ℕ+].  ((2 * |(n * [a ÷ n]) - a|) ≤ n)
Lemma: minus_minus_cancel
∀[a:ℤ]. ((--a) = a ∈ ℤ)
Lemma: mul_ident
∀[i:ℤ]. (i = (i * 1) ∈ ℤ)
Lemma: mul_com
∀[a,b:ℤ].  ((a * b) = (b * a) ∈ ℤ)
Lemma: minus_thru_mul
∀[a,b:ℤ].  ((-(a * b)) = ((-a) * b) ∈ ℤ)
Lemma: equal-iff-diff-zero
∀x,y:ℤ.  uiff(x = y ∈ ℤ;(x - y) = 0 ∈ ℤ)
Lemma: equal-iff-diff-zero2
∀x,y:ℤ.  uiff(x = y ∈ ℤ;(y - x) = 0 ∈ ℤ)
Lemma: right_mul_preserves_le
∀[a,b:ℤ]. ∀[n:ℕ].  (a * n) ≤ (b * n) supposing a ≤ b
Comment: mul_fun_comment
This is only for first quadrant. Should we have variants for
each quadrant, or insist that all multiplications be
normalized to first quadrant before using this lemma?
⋅
Lemma: multiply_functionality_wrt_le
∀[i1,i2:ℕ]. ∀[j1,j2:ℤ].  ((i1 * i2) ≤ (j1 * j2)) supposing ((i2 ≤ j2) and (i1 ≤ j1))
Lemma: mul_functionality_wrt_eq
∀[i1,i2,j1,j2:ℤ].  ((i1 * i2) = (j1 * j2) ∈ ℤ) supposing ((i2 = j2 ∈ ℤ) and (i1 = j1 ∈ ℤ))
Lemma: mul_nat_plus
∀[a,b:ℕ+].  (a * b ∈ ℕ+)
Lemma: absval_nat_plus
∀[x:ℤ]. |x| ∈ ℕ+ supposing ¬(x = 0 ∈ ℤ)
Lemma: pos_mul_arg_bounds
∀a,b:ℤ.  ((a * b) > 0 
⇐⇒ ((a > 0) ∧ (b > 0)) ∨ (a < 0 ∧ b < 0))
Lemma: neg_mul_arg_bounds
∀a,b:ℤ.  (a * b < 0 
⇐⇒ (a < 0 ∧ (b > 0)) ∨ ((a > 0) ∧ b < 0))
Lemma: mul-non-neg1
∀[x,y:ℤ].  (0 ≤ (x * y)) supposing ((0 ≤ y) and (0 ≤ x))
Lemma: multiply_nat_plus
∀[i,j:ℕ+].  (i * j ∈ ℕ+)
Comment: quasi_lin_com
======================
QUASI-LINEAR FUNCTIONS
======================
Lemma: fun_exp-mul
∀[T:Type]. ∀[f:T ⟶ T]. ∀[n,m:ℕ]. ∀[x:T].  ((f^n * m x) = (λx.(f^m x)^n x) ∈ T)
Lemma: int-triangle-inequality
∀[a,b:ℤ].  (|a + b| ≤ (|a| + |b|))
Lemma: int-triangle-inequality2
∀[a,b:ℤ].  (|a - b| ≤ (|a| + |b|))
Definition: pm_equal
i = ± j ==  (i = j ∈ ℤ) ∨ (i = (-j) ∈ ℤ)
Lemma: pm_equal_wf
∀[a,b:ℤ].  (a = ± b ∈ ℙ)
Lemma: absval_eq
∀x,y:ℤ.  (|x| = |y| ∈ ℤ 
⇐⇒ x = ± y)
Lemma: absval-sqequal-imax
∀[a:Top]. (imax(a;-a) ~ |a|)
Lemma: absval-as-imax
∀[a:ℤ]. (imax(a;-a) = |a| ∈ ℤ)
Lemma: mul-imax
∀[n:ℕ]. ∀[a,b:ℤ].  ((n * imax(a;b)) = imax(n * a;n * b) ∈ ℤ)
Lemma: absval-imax-difference
∀[a,b,c,d:ℤ].  (|imax(a;b) - imax(c;d)| ≤ imax(|a - c|;|b - d|))
Lemma: le-iff-imax
∀[a,b:ℤ].  uiff(a ≤ b;imax(a;b) = b ∈ ℤ)
Lemma: comb_for_imax_wf
λa,b,z. imax(a;b) ∈ a:ℤ ⟶ b:ℤ ⟶ (↓True) ⟶ ℤ
Lemma: imax_nat_plus
∀[a:ℤ]. ∀[b:ℕ+].  (imax(a;b) ∈ ℕ+)
Lemma: imax-wf-partial-nat
∀[x,y:partial(ℕ)].  (imax(x;y) ∈ partial(ℕ))
Definition: imin
imin(a;b) ==  eval a = a in eval b = b in   if a ≤z b then a else b fi 
Lemma: imin_wf
∀[a,b:ℤ].  (imin(a;b) ∈ ℤ)
Lemma: imin_unfold
∀[a,b:ℤ].  (imin(a;b) = if a ≤z b then a else b fi  ∈ ℤ)
Lemma: mul-imin
∀[n:ℕ]. ∀[a,b:ℤ].  ((n * imin(a;b)) = imin(n * a;n * b) ∈ ℤ)
Lemma: absval-imin-difference
∀[a,b,c,d:ℤ].  (|imin(a;b) - imin(c;d)| ≤ imax(|a - c|;|b - d|))
Lemma: absval-diff-symmetry
∀[x,y:ℤ].  (|x - y| ~ |y - x|)
Lemma: absval-diff-product-bound
∀u,v,x,y:ℕ.  ((|u - v| * |x - y|) ≤ |(imax(u;v) * imax(x;y)) - imin(u;v) * imin(x;y)|)
Lemma: absval-diff-product-bound2
∀u,v,x,y:ℤ.  (|(u * v) - x * y| ≤ ((|u| * |v - y|) + (|y| * |u - x|)))
Lemma: le-iff-imin
∀[a,b:ℤ].  uiff(a ≤ b;imin(a;b) = a ∈ ℤ)
Lemma: imin_nat
∀[a,b:ℕ].  (imin(a;b) ∈ ℕ)
Lemma: imin_nat_plus
∀[a,b:ℕ+].  (imin(a;b) ∈ ℕ+)
Lemma: comb_for_imin_wf
λa,b,z. imin(a;b) ∈ a:ℤ ⟶ b:ℤ ⟶ (↓True) ⟶ ℤ
Lemma: minus_imax
∀[a,b:ℤ].  ((-imax(a;b)) = imin(-a;-b) ∈ ℤ)
Lemma: minus_imin
∀[a,b:ℤ].  ((-imin(a;b)) = imax(-a;-b) ∈ ℤ)
Lemma: imax_lb
∀[a,b,c:ℤ].  uiff(imax(a;b) ≤ c;{(a ≤ c) ∧ (b ≤ c)})
Lemma: imax_ub
∀a,b,c:ℤ.  (a ≤ imax(b;c) 
⇐⇒ (a ≤ b) ∨ (a ≤ c))
Lemma: imax-idempotent
∀[x:ℤ]. (imax(x;x) ~ x)
Lemma: imax-left
∀[a,b:ℤ].  uiff(imax(a;b) = a ∈ ℤ;b ≤ a)
Lemma: imax-right
∀[a,b:ℤ].  uiff(imax(a;b) = b ∈ ℤ;a ≤ b)
Lemma: imax_strict_ub
∀a,b,c:ℤ.  (a < imax(b;c) 
⇐⇒ a < b ∨ a < c)
Lemma: imax_strict_lb
∀[a,b,c:ℤ].  uiff(imax(a;b) < c;a < c ∧ b < c)
Lemma: imax_add_r
∀[a,b,c:ℤ].  ((imax(a;b) + c) = imax(a + c;b + c) ∈ ℤ)
Lemma: imax_assoc
∀[a,b,c:ℤ].  (imax(a;imax(b;c)) = imax(imax(a;b);c) ∈ ℤ)
Lemma: imax_com
∀[a,b:ℤ].  (imax(a;b) = imax(b;a) ∈ ℤ)
Lemma: imin_assoc
∀[a,b,c:ℤ].  (imin(a;imin(b;c)) = imin(imin(a;b);c) ∈ ℤ)
Lemma: imin_com
∀[a,b:ℤ].  (imin(a;b) = imin(b;a) ∈ ℤ)
Lemma: imin-imax-absorption
∀[x,y:ℤ].  (imin(x;imax(x;y)) = x ∈ ℤ)
Lemma: imax-imin-absorption
∀[x,y:ℤ].  (imax(x;imin(x;y)) = x ∈ ℤ)
Lemma: imin-imax-distributive
∀[x,y,z:ℤ].  (imin(imax(x;y);imax(x;z)) = imax(x;imin(y;z)) ∈ ℤ)
Lemma: imax-imin-distributive
∀[x,y,z:ℤ].  (imax(imin(x;y);imin(x;z)) = imin(x;imax(y;z)) ∈ ℤ)
Lemma: imin_add_r
∀[a,b,c:ℤ].  ((imin(a;b) + c) = imin(a + c;b + c) ∈ ℤ)
Lemma: imin_lb
∀a,b,c:ℤ.  (imin(a;b) ≤ c 
⇐⇒ (a ≤ c) ∨ (b ≤ c))
Lemma: imin_ub
∀[a,b,c:ℤ].  uiff(a ≤ imin(b;c);{(a ≤ b) ∧ (a ≤ c)})
Definition: ndiff
a -- b ==  imax(a - b;0)
Lemma: ndiff_wf
∀[a,b:ℤ].  (a -- b ∈ ℤ)
Lemma: comb_for_ndiff_wf
λa,b,z. (a -- b) ∈ a:ℤ ⟶ b:ℤ ⟶ (↓True) ⟶ ℤ
Lemma: ndiff_id_r
∀[a:ℕ]. ((a -- 0) = a ∈ ℤ)
Lemma: ndiff_ann_l
∀[a:ℕ]. ((0 -- a) = 0 ∈ ℤ)
Lemma: ndiff_inv
∀[a:ℕ]. ∀[b:ℤ].  (((a + b) -- b) = a ∈ ℤ)
Lemma: ndiff_ndiff
∀[a,b:ℤ]. ∀[c:ℕ].  (((a -- b) -- c) = (a -- (b + c)) ∈ ℤ)
Lemma: ndiff_ndiff_eq_imin
∀[a,b:ℕ].  ((a -- (a -- b)) = imin(a;b) ∈ ℤ)
Lemma: ndiff_add_eq_imax
∀[a,b:ℤ].  (((a -- b) + b) = imax(a;b) ∈ ℤ)
Lemma: ndiff_zero
∀[a,b:ℤ].  uiff((a -- b) = 0 ∈ ℤ;a ≤ b)
Comment: div_rem_com
================================
DIVISION AND REMAINDER FUNCTIONS
================================
Lemma: div_rem_sum2
∀[a:ℤ]. ∀[n:ℤ-o].  (n * (a ÷ n) ~ a - a rem n)
Lemma: remainder_wf
∀[a:ℕ]. ∀[n:ℕ+].  (a rem n ∈ ℕ)
Lemma: comb_for_remainder_wf
λa,n,z. (a rem n) ∈ a:ℕ ⟶ n:ℕ+ ⟶ (↓True) ⟶ ℕ
Lemma: rem_sym_1
∀[a:ℤ]. ∀[n:ℤ-o].  ((-(a rem n)) = (-a rem n) ∈ ℤ)
Lemma: rem_sym_1a
∀[a:ℤ]. ∀[n:ℤ-o].  ((a rem n) = (-(-a rem n)) ∈ ℤ)
Lemma: rem_sym_2
∀[a:ℤ]. ∀[n:ℤ-o].  ((a rem n) = (a rem -n) ∈ ℤ)
Lemma: omega-dark-shadow
∀a,b:ℕ+. ∀c,d:ℤ.  ((((a - 1) * (b - 1)) ≤ ((a * d) - b * c)) 
⇒ (∃x:ℤ. ((c ≤ (a * x)) ∧ ((b * x) ≤ d))))
Lemma: omega-shadow-exact1
∀b:ℕ+. ∀c,d:ℤ.  (∃x:ℤ. ((c ≤ x) ∧ ((b * x) ≤ d)) 
⇐⇒ (b * c) ≤ d)
Lemma: omega-shadow-exact2
∀a:ℕ+. ∀c,d:ℤ.  (∃x:ℤ. ((c ≤ (a * x)) ∧ (x ≤ d)) 
⇐⇒ c ≤ (a * d))
Lemma: rem_mag_bound
∀[a:ℤ]. ∀[n:ℤ-o].  |a rem n| < |n|
Lemma: square_non_neg
∀x:ℤ. (0 ≤ (x * x))
Lemma: absval_square
∀[x:ℤ]. (|x * x| = (x * x) ∈ ℤ)
Lemma: absval_squared
∀[x:ℤ]. ((|x| * |x|) = (x * x) ∈ ℤ)
Lemma: zero-rem
∀[m:ℤ-o]. (0 rem m ~ 0)
Lemma: one-rem
∀[m:ℤ]. 1 rem m ~ 1 supposing 1 < m
Lemma: divide_wf
∀[a:ℕ]. ∀[n:ℕ+].  (a ÷ n ∈ ℕ)
Definition: div_nrel
Div(a;n;q) ==  n * q ≤ a < n * (q + 1)
Lemma: div_nrel_wf
∀[a:ℕ]. ∀[n:ℕ+]. ∀[q:ℕ].  (Div(a;n;q) ∈ ℙ)
Lemma: div_fun_sat_div_nrel
∀[a:ℕ]. ∀[n:ℕ+].  Div(a;n;a ÷ n)
Lemma: div_elim
∀a:ℕ. ∀n:ℕ+.  ∃q:ℕ. (Div(a;n;q) ∧ ((a ÷ n) = q ∈ ℤ))
Lemma: div_unique
∀[a:ℕ]. ∀[n:ℕ+]. ∀[p,q:ℕ].  (p = q ∈ ℤ) supposing (Div(a;n;q) and Div(a;n;p))
Lemma: div_unique2
∀[a:ℕ]. ∀[n:ℕ+]. ∀[p:ℕ].  uiff((a ÷ n) = p ∈ ℤ;Div(a;n;p))
Lemma: div-cancel
∀[x:ℤ]. ∀[y:ℤ-o].  ((x * y) ÷ y ~ x)
Lemma: div-self
∀[y:ℤ-o]. (y ÷ y ~ 1)
Lemma: div-cancel2
∀[x:ℤ]. ∀[y:ℤ-o].  ((y * x) ÷ y ~ x)
Lemma: div-cancel3
∀[x:ℕ]. ∀[y:ℕ+]. ∀[z:ℕy].  (((y * x) + z) ÷ y ~ x)
Lemma: div_mul_cancel
∀[a:ℕ]. ∀[b:ℕ+].  (((a * b) ÷ b) = a ∈ ℤ)
Lemma: div_mul_add_cancel
∀[a:ℕ]. ∀[b:ℕ+]. ∀[r:ℕb].  ((((a * b) + r) ÷ b) = a ∈ ℤ)
Lemma: div_lbound_1
∀[a:ℕ]. ∀[n:ℕ+]. ∀[k:ℕ].  uiff(k ≤ (a ÷ n);(k * n) ≤ a)
Lemma: div_preserves_le
∀[a,b:ℤ]. ∀[n:ℕ+].  ((a ≤ b) 
⇒ ((a ÷ n) ≤ (b ÷ n)))
Lemma: div_div_nat
∀[a:ℕ]. ∀[n,m:ℕ+].  (a ÷ n ÷ m ~ a ÷ n * m)
Lemma: div_div
∀[a:ℤ]. ∀[n,m:ℤ-o].  (a ÷ n ÷ m ~ a ÷ n * m)
Lemma: div_div_commutes
∀[a:ℤ]. ∀[n,m:ℤ-o].  (a ÷ n ÷ m ~ a ÷ m ÷ n)
Lemma: div-mul-cancel
∀[a:ℤ]. ∀[n,m:ℤ-o].  ((a * n) ÷ m * n ~ a ÷ m)
Lemma: div-mul-cancel2
∀[a:ℤ]. ∀[n,m:ℤ-o].  ((n * a) ÷ n * m ~ a ÷ m)
Lemma: mul-div-bounds
∀[a,b:ℤ]. ∀[m:ℤ-o].  (|(a * (b ÷ m)) - b * (a ÷ m)| ≤ (|a| + |b|))
Lemma: rem-mul
∀[a:ℤ]. ∀[n,m:ℤ-o].  ((a * n rem m * n) = ((a rem m) * n) ∈ ℤ)
Lemma: implies-equal-div
∀[a,c:ℤ]. ∀[b,d:ℤ-o].  (a ÷ b) = (c ÷ d) ∈ ℤ supposing (d * a) = (b * c) ∈ ℤ
Lemma: div_one
∀[x:ℤ]. (x ÷ 1 ~ x)
Lemma: div_minus_one
∀[x:ℤ]. (x ÷ -1 ~ -x)
Lemma: implies-equal-div2
∀[a,c:ℤ]. ∀[b:ℤ-o].  (a ÷ b) = c ∈ ℤ supposing a = (b * c) ∈ ℤ
Definition: rem_nrel
Rem(a;n;r) ==  ∃q:ℕ. (Div(a;n;q) ∧ (((q * n) + r) = a ∈ ℤ))
Lemma: rem_nrel_wf
∀[a:ℕ]. ∀[n:ℕ+]. ∀[r:ℕ].  (Rem(a;n;r) ∈ ℙ)
Lemma: rem_fun_sat_rem_nrel
∀a:ℕ. ∀n:ℕ+.  Rem(a;n;a rem n)
Lemma: div_base_case
∀[a:ℕ]. ∀[n:ℕ+].  (a ÷ n) = 0 ∈ ℤ supposing a < n
Lemma: div_rec_case
∀[a:ℕ]. ∀[n:ℕ+].  (a ÷ n) = (((a - n) ÷ n) + 1) ∈ ℤ supposing a ≥ n 
Lemma: rem_base_case
∀[a:ℕ]. ∀[n:ℕ+].  (a rem n) = a ∈ ℤ supposing a < n
Lemma: rem_gen_base_case
∀[a:ℤ]. ∀[n:ℤ-o].  (a rem n) = a ∈ ℤ supposing |a| < |n|
Lemma: rem_rec_case
∀[a:ℕ]. ∀[n:ℕ+].  (a rem n) = (a - n rem n) ∈ ℤ supposing a ≥ n 
Lemma: rem_invariant
∀[a,b:ℕ]. ∀[n:ℕ+].  ((a + (b * n) rem n) = (a rem n) ∈ ℤ)
Lemma: rem_addition
∀[i,j:ℕ]. ∀[n:ℕ+].  (((i rem n) + (j rem n) rem n) = (i + j rem n) ∈ ℤ)
Lemma: rem_add1
∀[i:ℕ]. ∀[n:ℕ+].  ((i + 1 rem n) = if (i rem n =z n - 1) then 0 else (i rem n) + 1 fi  ∈ ℤ)
Lemma: rem_rem_to_rem
∀[a:ℕ]. ∀[n:ℕ+].  ((a rem n rem n) = (a rem n) ∈ ℤ)
Lemma: rem_base_case_z
∀[a:ℤ]. ∀[b:ℤ-o].  (a rem b) = a ∈ ℤ supposing |a| < |b|
Lemma: rem_eq_args
∀[a:ℕ+]. ((a rem a) = 0 ∈ ℤ)
Lemma: rem_eq_args_z
∀[a:ℤ]. ∀[b:ℤ-o].  (a rem b) = 0 ∈ ℤ supposing |a| = |b| ∈ ℤ
Lemma: fun_exp-rem
∀[T:Type]. ∀[f:T ⟶ T]. ∀[x:T]. ∀[n:ℕ+].  ∀[k:ℕ]. ((f^k x) = (f^k rem n x) ∈ T) supposing (f^n x) = x ∈ T
Lemma: int_mag_well_founded
WellFnd{i}(ℤ;x,y.|x| < |y|)
Lemma: int_upper_well_founded
∀n:ℤ. WellFnd{i}({n...};x,y.x < y)
Lemma: int_upper_uwell_founded
∀n:ℤ. uWellFnd({n...};x,y.x < y)
Lemma: int_upper_ind
∀i:ℤ. ∀[E:{i...} ⟶ ℙ{u}]. (E[i] 
⇒ (∀k:{i + 1...}. (E[k - 1] 
⇒ E[k])) 
⇒ {∀k:{i...}. E[k]})
Lemma: int_upper_ind_uniform
∀i:ℤ. ∀[E:{i...} ⟶ ℙ{u}]. ((∀[k:{i...}]. ((∀[j:{i..k-}]. E[j]) 
⇒ E[k])) 
⇒ {∀[k:{i...}]. E[k]})
Lemma: int_seg_well_founded_up
∀i:ℤ. ∀j:{i...}.  WellFnd{i}({i..j-};x,y.x < y)
Lemma: int_seg_ind
∀i:ℤ. ∀j:{i + 1...}.  ∀[E:{i..j-} ⟶ ℙ{u}]. (E[i] 
⇒ (∀k:{i + 1..j-}. (E[k - 1] 
⇒ E[k])) 
⇒ {∀k:{i..j-}. E[k]})
Lemma: int_seg_well_founded_down
∀i:ℤ. ∀j:{i...}.  WellFnd{i}({i..j-};x,y.x > y)
Definition: int_seg_decide_all
int_seg_decide_all(d;i;j) ==
  fix((λG,x. if j ≤z x then inl ⋅ else case d x of inl(z) => G (x + 1) | inr(z) => inr ⋅  fi )) i
Lemma: fan_theorem
∀[X:n:ℕ ⟶ (ℕn ⟶ 𝔹) ⟶ ℙ]
  (∀n:ℕ. ∀s:ℕn ⟶ 𝔹.  Dec(X[n;s])) 
⇒ (∃k:ℕ. ∀f:ℕ ⟶ 𝔹. ∃n:ℕk. X[n;f]) supposing ∀f:ℕ ⟶ 𝔹. (↓∃n:ℕ. X[n;f])
Lemma: fan_theorem-ext
∀[X:n:ℕ ⟶ (ℕn ⟶ 𝔹) ⟶ ℙ]
  (∀n:ℕ. ∀s:ℕn ⟶ 𝔹.  Dec(X[n;s])) 
⇒ (∃k:ℕ. ∀f:ℕ ⟶ 𝔹. ∃n:ℕk. X[n;f]) supposing ∀f:ℕ ⟶ 𝔹. (↓∃n:ℕ. X[n;f])
Lemma: injection-is-surjection
∀n:ℕ. ∀f:ℕn ⟶ ℕn.  Surj(ℕn;ℕn;f) supposing Inj(ℕn;ℕn;f)
Lemma: not-inject
∀[T:Type]. ((∀x,y:T.  Dec(x = y ∈ T)) 
⇒ (∀n:ℕ. ∀f:ℕn ⟶ T.  ∃i:ℕn. ∃j:ℕi. ((f i) = (f j) ∈ T) supposing ¬Inj(ℕn;T;f)))
Lemma: divide-and-conquer
∀[Q:a:ℤ ⟶ {a...} ⟶ ℙ]
  ∀s:{2...}
    ((∀a:ℤ. ∀b:{a..a + s-}.  Q[a;b])
    
⇒ (∀a,b,c:ℤ.  (Q[a;c] 
⇒ Q[a;b]) ∨ (Q[c;b] 
⇒ Q[a;b]) supposing a < c ∧ c < b)
    
⇒ (∀a:ℤ. ∀b:{a...}.  Q[a;b]))
Lemma: divide-and-conquer-ext
∀[Q:a:ℤ ⟶ {a...} ⟶ ℙ]
  ∀s:{2...}
    ((∀a:ℤ. ∀b:{a..a + s-}.  Q[a;b])
    
⇒ (∀a,b,c:ℤ.  (Q[a;c] 
⇒ Q[a;b]) ∨ (Q[c;b] 
⇒ Q[a;b]) supposing a < c ∧ c < b)
    
⇒ (∀a:ℤ. ∀b:{a...}.  Q[a;b]))
Lemma: div-search-lemma
∀a:ℤ. ∀b:{a + 1...}. ∀f:ℤ ⟶ 𝔹.
  ∃x:{a..b-} [((∀y:{a..x + 1-}. (¬↑(f y))) ∧ (∀z:{x + 1..b + 1-}. (↑(f z))))] 
  supposing ∃x:{a..b-} [((∀y:{a..x + 1-}. (¬↑(f y))) ∧ (∀z:{x + 1..b + 1-}. (↑(f z))))]
Lemma: div-search-lemma-ext
∀a:ℤ. ∀b:{a + 1...}. ∀f:ℤ ⟶ 𝔹.
  ∃x:{a..b-} [((∀y:{a..x + 1-}. (¬↑(f y))) ∧ (∀z:{x + 1..b + 1-}. (↑(f z))))] 
  supposing ∃x:{a..b-} [((∀y:{a..x + 1-}. (¬↑(f y))) ∧ (∀z:{x + 1..b + 1-}. (↑(f z))))]
Definition: binary-search
binary-search(f;a;b)
==r if b=a + 1 then a else eval c = a + ((b - a) ÷ 2) in if f c then binary-search(f;a;c) else binary-search(f;c;b) fi 
Lemma: binary-search_wf
∀a:ℤ. ∀b:{a + 1...}. ∀f:{a..b + 1-} ⟶ 𝔹.
  binary-search(f;a;b) ∈ {x:{a..b-}| (¬↑(f x)) ∧ (↑(f (x + 1)))}  
  supposing ↓∃x:{a..b-}. ((∀y:{a..x + 1-}. (¬↑(f y))) ∧ (∀z:{x + 1..b + 1-}. (↑(f z))))
Definition: find-xover
find-xover(f;m;n;step)
==r if f n then <n, m> else eval step' = 2 * step in eval k = n + step in   find-xover(f;n;k;step') fi 
Lemma: find-xover_wf
∀[x:ℤ]. ∀[n:{x...}]. ∀[step:ℕ+]. ∀[f:{x...} ⟶ 𝔹].
  find-xover(f;x;n;step) ∈ n':{n':ℤ| (n ≤ n') ∧ f n' = tt}  × {x':ℤ| 
                                  ((n' = n ∈ ℤ) ∧ (x' = x ∈ ℤ))
                                  ∨ (((n ≤ x') ∧ f x' = ff) ∧ ((n' = (n + step) ∈ ℤ) ∨ ((n + step) ≤ x')))}  
  supposing ∃m:{n...}. ∀k:{m...}. f k = tt
Definition: find-xover-val
find-xover-val(test;f;m;n;step) ==
  eval v = f n in
  if test v then <v, n, m> else eval step' = 2 * step in eval k = n + step in   find-xover-val(test;f;n;k;step') fi 
Lemma: find-xover-val_wf
∀[T:Type]
  ∀[test:T ⟶ 𝔹]. ∀[x:ℤ]. ∀[n:{x...}]. ∀[step:ℕ+]. ∀[f:{x...} ⟶ T].
    find-xover-val(test;f;x;n;step) ∈ v:T
    × n':{n':ℤ| (n ≤ n') ∧ (v = (f n') ∈ T) ∧ test v = tt} 
    × {x':ℤ| 
       ((n' = n ∈ ℤ) ∧ (x' = x ∈ ℤ)) ∨ (((n ≤ x') ∧ test (f x') = ff) ∧ ((n' = (n + step) ∈ ℤ) ∨ ((n + step) ≤ x')))}  
    supposing ∃m:{n...}. ∀k:{m...}. test (f k) = tt 
  supposing value-type(T)
Definition: exact-xover
exact-xover(f;n)==r let a,b = find-xover(f;n;n;1) in if b=a + 1 then a else exact-xover(f;a)
Lemma: exact-xover_wf
∀[n:ℤ]. ∀[f:{n...} ⟶ 𝔹].
  exact-xover(f;n) ∈ {x:ℤ| (n ≤ x) ∧ f x = ff ∧ f (x + 1) = tt}  
  supposing (∃m:{n...}. ((∀k:{n..m-}. f k = ff) ∧ (∀k:{m...}. f k = tt))) ∧ f n = ff
Definition: find-ge
find-ge(f;n) ==  fst(find-xover(f;n;n;1))
Lemma: find-ge_wf
∀[n:ℤ]. ∀[f:{n...} ⟶ 𝔹].  find-ge(f;n) ∈ {n':ℤ| (n ≤ n') ∧ f n' = tt}  supposing ∃m:{n...}. ∀k:{m...}. f k = tt
Definition: find-ge-val
find-ge-val(test;f;n) ==  let v,n,m = find-xover-val(test;f;n;n;1) in <v, n>
Lemma: find-ge-val_wf
∀[T:Type]
  ∀[test:T ⟶ 𝔹]. ∀[n:ℤ]. ∀[f:{n...} ⟶ T].
    find-ge-val(test;f;n) ∈ v:T × {n':ℤ| (n ≤ n') ∧ (v = (f n') ∈ T) ∧ test v = tt}  
    supposing ∃m:{n...}. ∀k:{m...}. test (f k) = tt 
  supposing value-type(T)
Definition: mu-ge
mu-ge(f;n)==r if f n then n else eval m = n + 1 in mu-ge(f;m) fi 
Lemma: mu-ge_wf2
∀[n:ℤ]. ∀[f:{n...} ⟶ (Top + Top)].  mu-ge(f;n) ∈ {n...} supposing ∃m:{n...}. (↑isl(f m))
Lemma: mu-ge_wf
∀[n:ℤ]. ∀[f:{n...} ⟶ 𝔹].  mu-ge(f;n) ∈ {n...} supposing ∃m:{n...}. (↑(f m))
Lemma: mu-ge-property
∀[n:ℤ]. ∀[f:{n...} ⟶ 𝔹].  {(↑(f mu-ge(f;n))) ∧ (∀[i:{n..mu-ge(f;n)-}]. (¬↑(f i)))} supposing ∃m:{n...}. (↑(f m))
Lemma: sq_stable__ex_int_upper_ap
∀n:ℤ. ∀f:{n...} ⟶ 𝔹.  SqStable(∃m:{n...}. (↑(f m)))
Lemma: mu-ge-property2
∀n:ℤ
  ∀[P:{n...} ⟶ ℙ]
    ∀d:∀n:{n...}. Dec(P[n]). {P[mu-ge(d;n)] ∧ (∀[i:{n..mu-ge(d;n)-}]. (¬P[i]))} supposing ∃m:{n...}. P[m]
Lemma: mu-ge-bound
∀[n,m:ℤ]. ∀[f:{n..m-} ⟶ 𝔹].  mu-ge(f;n) ∈ {n..m-} supposing ∃k:{n..m-}. (↑(f k))
Lemma: mu-ge-bound-property
∀n,m:ℤ. ∀f:{n..m-} ⟶ 𝔹.  ((∃m:{n..m-}. (↑(f m))) 
⇒ {(↑(f mu-ge(f;n))) ∧ (∀[i:{n..mu-ge(f;n)-}]. (¬↑(f i)))})
Lemma: sq_stable__ex_int_seg_ap
∀n,m:ℤ. ∀f:{n..m-} ⟶ 𝔹.  SqStable(∃k:{n..m-}. (↑(f k)))
Lemma: sq_stable__ex_int_upper
∀n:ℤ. ∀[P:{n...} ⟶ ℙ]. ((∀m:{n...}. Dec(P[m])) 
⇒ SqStable(∃m:{n...}. P[m]))
Lemma: sq_stable__ex_nat
∀[P:ℕ ⟶ ℙ]. ((∀m:ℕ. Dec(P[m])) 
⇒ SqStable(∃m:ℕ. P[m]))
Lemma: sq_stable__ex_nat_plus
∀[P:ℕ+ ⟶ ℙ]. ((∀m:ℕ+. Dec(P[m])) 
⇒ SqStable(∃m:ℕ+. P[m]))
Definition: mu
mu(f) ==  mu-ge(f;0)
Lemma: mu_wf
∀[f:ℕ ⟶ 𝔹]. mu(f) ∈ ℕ supposing ∃n:ℕ. (↑(f n))
Lemma: mu-wf2
∀[P:ℕ ⟶ ℙ]. ∀[d:∀n:ℕ. Dec(P[n])].  mu(d) ∈ ℕ supposing ∃n:ℕ. P[n]
Lemma: mu-unroll
∀[f:Top]. (mu(f) ~ if f 0 then 0 else mu(λi.(f (i + 1))) + 1 fi )
Lemma: mu-property
∀[f:ℕ ⟶ 𝔹]. {(↑(f mu(f))) ∧ (∀[i:ℕ]. ¬↑(f i) supposing i < mu(f))} supposing ∃n:ℕ. (↑(f n))
Lemma: mu-property2
∀[P:ℕ ⟶ ℙ]. ∀d:∀n:ℕ. Dec(P[n]). {P[mu(d)] ∧ (∀i:ℕ. ¬P[i] supposing i < mu(d))} supposing ∃n:ℕ. P[n]
Lemma: mu-bound
∀[b:ℕ]. ∀[f:ℕb ⟶ 𝔹].  mu(f) ∈ ℕb supposing ∃n:ℕb. (↑(f n))
Lemma: mu-bound-property
∀[b:ℕ]. ∀[f:ℕb ⟶ 𝔹].  {(↑(f mu(f))) ∧ (∀[i:ℕb]. ¬↑(f i) supposing i < mu(f))} supposing ∃n:ℕb. (↑(f n))
Lemma: mu-bound-property+
∀[b:ℕ]. ∀[f:ℕb ⟶ 𝔹].  {(mu(f) ∈ ℕb) ∧ (↑(f mu(f))) ∧ (∀[i:ℕb]. ¬↑(f i) supposing i < mu(f))} supposing ∃n:ℕb. (↑(f n))
Lemma: mu-bound-unique
∀[b:ℕ]. ∀[f:ℕb ⟶ 𝔹]. ∀[x:ℕb].  mu(f) = x ∈ ℤ supposing (↑(f x)) ∧ (∀y:ℕb. ((↑(f y)) 
⇒ (y = x ∈ ℤ)))
Lemma: mu-unique
∀[f:ℕ ⟶ 𝔹]. ∀[x:ℕ].  mu(f) = x ∈ ℤ supposing (↑(f x)) ∧ (∀y:ℕx. (¬↑(f y)))
Definition: mu-dec
mu-dec(d;a) ==  mu(λk.isl(d a k))
Lemma: mu-dec_wf
∀[A:Type]. ∀[P:A ⟶ ℕ ⟶ ℙ]. ∀[d:a:A ⟶ k:ℕ ⟶ Dec(P[a;k])]. ∀[a:A].  mu-dec(d;a) ∈ ℕ supposing ↓∃k:ℕ. P[a;k]
Lemma: mu-dec-in-bar-nat
∀[A:Type]. ∀[P:A ⟶ ℕ ⟶ ℙ]. ∀[d:a:A ⟶ k:ℕ ⟶ Dec(P[a;k])]. ∀[a:A].  (mu-dec(d;a) ∈ partial(ℕ))
Lemma: mu-dec-property
∀[A:Type]. ∀[P:A ⟶ ℕ ⟶ ℙ].
  ∀d:a:A ⟶ k:ℕ ⟶ Dec(P[a;k]). ∀a:A.  ((↓∃k:ℕ. P[a;k]) 
⇒ {P[a;mu-dec(d;a)] ∧ (∀i:ℕmu-dec(d;a). (¬P[a;i]))})
Lemma: qsquash_ex
∀P:ℕ ⟶ ℙ. ((∀n:ℕ. Dec(P[n])) 
⇒ ⇃∃n:ℕ. P[n] 
⇒ (∃n:ℕ. P[n]))
Definition: funinv
inv(f) ==  λx.mu(λn.(f n =z x))
Lemma: funinv_wf
∀[n,m:ℕ]. ∀[f:{f:ℕn ⟶ ℕm| Surj(ℕn;ℕm;f)} ].  (inv(f) ∈ {g:ℕm ⟶ ℕn| Inj(ℕm;ℕn;g) ∧ (∀x:ℕm. ((f (g x)) = x ∈ ℤ))} )
Lemma: funinv_wf2
∀[n:ℕ]. ∀[f:{f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} ].  (inv(f) ∈ {f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} )
Lemma: funinv-property
∀[n:ℕ]. ∀[f:{f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} ]. ∀[x:ℕn].  (((f (inv(f) x)) = x ∈ ℤ) ∧ ((inv(f) (f x)) = x ∈ ℕn))
Lemma: funinv-compose
∀[n:ℕ]. ∀[f,g:{f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} ].  (inv(f o g) = (inv(g) o inv(f)) ∈ {f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} )
Lemma: funinv-funinv
∀[n:ℕ]. ∀[f:{f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} ].  (inv(inv(f)) = f ∈ {f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} )
Lemma: funinv-unique
∀[n:ℕ]. ∀[f:{f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)} ]. ∀[g:ℕn ⟶ ℕn].
  inv(f) = g ∈ {f:ℕn ⟶ ℕn| Inj(ℕn;ℕn;f)}  supposing (f o g) = (λx.x) ∈ (ℕn ⟶ ℕn)
Definition: sum_aux
sum_aux(k;v;i;x.f[x])==r if (i) < (k)  then eval v' = f[i] + v in eval i' = i + 1 in   sum_aux(k;v';i';x.f[x])  else v
Lemma: sum_aux_wf
∀[v,i,k:ℤ]. ∀[f:{i..k-} ⟶ ℤ].  sum_aux(k;v;i;x.f[x]) ∈ ℤ supposing i ≤ k
Lemma: sum_aux-as-primrec
∀[v,i,k:ℤ]. ∀[f:{i..k-} ⟶ ℤ].  sum_aux(k;v;i;x.f[x]) ~ primrec(k - i;v;λj,x. (x + f[i + j])) supposing i ≤ k
Definition: sum
Σ(f[x] | x < k) ==  sum_aux(k;0;0;x.f[x])
Lemma: sum_wf
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  (Σ(f[x] | x < n) ∈ ℤ)
Lemma: sum-as-primrec
∀[k:ℕ]. ∀[f:ℕk ⟶ ℤ].  (Σ(f[x] | x < k) ~ primrec(k;0;λj,x. (x + f[j])))
Lemma: sum1
∀[f:ℕ1 ⟶ ℤ]. (Σ(f[x] | x < 1) ~ f[0])
Lemma: sum-unroll-1
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  (Σ(f[x] | x < n) ~ if (n =z 0) then 0 else Σ(f[x] | x < n - 1) + f[n - 1] fi )
Lemma: sum-has-value
∀[n,f:Base].  {(n ∈ ℤ) ∧ (f ∈ ℕn ⟶ ℤ)} supposing (Σ(f[x] | x < n))↓
Lemma: sum-unroll
∀[n,f:Top].  (Σ(f[x] | x < n) ~ if (0) < (n)  then Σ(f[x] | x < n - 1) + f[n - 1]  else 0)
Lemma: non_neg_sum
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  0 ≤ Σ(f[x] | x < n) supposing ∀x:ℕn. (0 ≤ f[x])
Lemma: sum-nat
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ].  (Σ(f[x] | x < n) ∈ ℕ)
Lemma: sum_linear
∀[n:ℕ]. ∀[f,g:ℕn ⟶ ℤ].  ((Σ(f[x] | x < n) + Σ(g[x] | x < n)) = Σ(f[x] + g[x] | x < n) ∈ ℤ)
Lemma: sum_scalar_mult
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[a:ℤ].  ((a * Σ(f[x] | x < n)) = Σ(a * f[x] | x < n) ∈ ℤ)
Lemma: sum_constant
∀[n:ℕ]. ∀[a:ℤ].  (Σ(a | x < n) = (a * n) ∈ ℤ)
Lemma: sum_functionality
∀[n:ℕ]. ∀[f,g:ℕn ⟶ ℤ].  Σ(f[x] | x < n) = Σ(g[x] | x < n) ∈ ℤ supposing ∀i:ℕn. (f[i] = g[i] ∈ ℤ)
Lemma: sum-is-zero
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  Σ(f[x] | x < n) = 0 ∈ ℤ supposing ∀i:ℕn. (f[i] = 0 ∈ ℤ)
Lemma: sum_difference
∀[n:ℕ]. ∀[f,g:ℕn ⟶ ℤ]. ∀[d:ℤ].  Σ(f[x] | x < n) = (Σ(g[x] | x < n) + d) ∈ ℤ supposing Σ(f[x] - g[x] | x < n) = d ∈ ℤ
Lemma: sum_le
∀[k:ℕ]. ∀[f,g:ℕk ⟶ ℤ].  Σ(f[x] | x < k) ≤ Σ(g[x] | x < k) supposing ∀x:ℕk. (f[x] ≤ g[x])
Lemma: sum_bound
∀[k,b:ℕ]. ∀[f:ℕk ⟶ ℤ].  Σ(f[x] | x < k) ≤ (b * k) supposing ∀x:ℕk. (f[x] ≤ b)
Lemma: sum_lower_bound
∀[k,b:ℕ]. ∀[f:ℕk ⟶ ℤ].  (b * k) ≤ Σ(f[x] | x < k) supposing ∀x:ℕk. (b ≤ f[x])
Lemma: sum-ite
∀[k:ℕ]. ∀[f,g:ℕk ⟶ ℤ]. ∀[p:ℕk ⟶ 𝔹].
  (Σ(if p[i] then f[i] + g[i] else f[i] fi  | i < k) = (Σ(f[i] | i < k) + Σ(if p[i] then g[i] else 0 fi  | i < k)) ∈ ℤ)
Lemma: sum_arith1
∀[n:ℕ]. ∀[a,b:ℤ].  ((Σ(a + (b * i) | i < n) * 2) = (n * (a + a + (b * (n - 1)))) ∈ ℤ)
Lemma: sum_arith
∀[n:ℕ]. ∀[a,b:ℤ].  (Σ(a + (b * i) | i < n) = ((n * (a + a + (b * (n - 1)))) ÷ 2) ∈ ℤ)
Lemma: sum-partial-nat
∀[n:ℕ]. ∀[f:ℕn ⟶ partial(ℕ)].  (Σ(f[x] | x < n) ∈ partial(ℕ))
Lemma: sum-partial-has-value
∀[n:ℕ]. ∀[f:ℕn ⟶ partial(ℕ)].  ∀i:ℕn. (f[i])↓ supposing (Σ(f[x] | x < n))↓
Lemma: isolate_summand
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕn].  (Σ(f[x] | x < n) = (f[m] + Σ(if (x =z m) then 0 else f[x] fi  | x < n)) ∈ ℤ)
Lemma: isolate_summand2
∀m:ℕ. ∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  Σ(f[x] | x < n) = (f[m] + Σ(if (x =z m) then 0 else f[x] fi  | x < n)) ∈ ℤ supposing m < n
Lemma: sum-nat-less
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ]. ∀[b:ℤ].  {∀x:ℕn. (f[x] ≤ (b - 1))} supposing Σ(f[x] | x < n) < b
Lemma: sum-nat-le
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ]. ∀[b:ℤ].  {∀x:ℕn. (f[x] ≤ b)} supposing Σ(f[x] | x < n) ≤ b
Lemma: sum-nat-le-simple
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ].  ∀x:ℕn. (f[x] ≤ Σ(f[x] | x < n))
Lemma: empty_support
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  Σ(f[x] | x < n) = 0 ∈ ℤ supposing ∀x:ℕn. (f[x] = 0 ∈ ℤ)
Lemma: singleton_support_sum
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕn].  Σ(f[x] | x < n) = f[m] ∈ ℤ supposing ∀x:ℕn. ((¬(x = m ∈ ℤ)) 
⇒ (f[x] = 0 ∈ ℤ))
Lemma: sum_split
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕn + 1].  (Σ(f[x] | x < n) = (Σ(f[x] | x < m) + Σ(f[x + m] | x < n - m)) ∈ ℤ)
Lemma: sum_split+
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕn + 1].
  ((Σ(f[x] | x < n) = (Σ(f[x] | x < m) + Σ(f[x + m] | x < n - m)) ∈ ℤ)
  ∧ (Σ(f[x] | x < m) ∈ ℤ)
  ∧ (Σ(f[x + m] | x < n - m) ∈ ℤ))
Lemma: sum_split_first
∀[n:ℕ+]. ∀[f:ℕn ⟶ ℤ].  (Σ(f[x] | x < n) = (f[0] + Σ(f[x + 1] | x < n - 1)) ∈ ℤ)
Lemma: sum_split1
∀[n:ℕ+]. ∀[f:ℕn ⟶ ℤ].  (Σ(f[x] | x < n) = (Σ(f[x] | x < n - 1) + f[n - 1]) ∈ ℤ)
Lemma: summand-le-sum
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  ∀[i:ℕn]. (f[i] ≤ Σ(f[x] | x < n)) supposing ∀x:ℕn. (0 ≤ f[x])
Lemma: sum_functionality_wrt_sqequal
∀[n:ℕ]. ∀[f,g:Base].  Σ(f[x] | x < n) ~ Σ(g[x] | x < n) supposing ∀i:ℕn. (f[i] ~ g[i])
Lemma: sum-of-consecutive-squares
∀[n:ℕ]. ((6 * Σ(i * i | i < n)) = ((n - 1) * n * ((2 * n) - 1)) ∈ ℤ)
Lemma: sum-consecutive-squares
∀[n:ℕ]. (Σ(i * i | i < n) = (((n - 1) * n * ((2 * n) - 1)) ÷ 6) ∈ ℤ)
Lemma: sum-of-consecutive-cubes
∀[n:ℕ]. ((4 * Σ((i * i) * i | i < n)) = (((n - 1) * (n - 1)) * n * n) ∈ ℤ)
Lemma: sum-consecutive-cubes
∀[n:ℕ]. (Σ((i * i) * i | i < n) = ((((n - 1) * (n - 1)) * n * n) ÷ 4) ∈ ℤ)
Lemma: absval_sum
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  (|Σ(f[x] | x < n)| ≤ Σ(|f[x]| | x < n))
Definition: int-prod
Π(f[x] | x < k) ==  primrec(k;1;λx,n. (n * f[x]))
Lemma: int-prod_wf
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  (Π(f[x] | x < n) ∈ ℤ)
Lemma: int-prod_wf_nat
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ].  (Π(f[x] | x < n) ∈ ℕ)
Lemma: int-prod_wf_nat_plus
∀[n:ℕ]. ∀[f:ℕn ⟶ ℕ+].  (Π(f[x] | x < n) ∈ ℕ+)
Lemma: int-prod_wf_absval_1
∀[n:ℕ]. ∀[f:ℕn ⟶ {s:ℤ| |s| = 1 ∈ ℤ} ].  (Π(f[x] | x < n) ∈ {s:ℤ| |s| = 1 ∈ ℤ} )
Lemma: int_prod0_lemma
∀f:Top. (Π(f[x] | x < 0) ~ 1)
Lemma: int-prod-unroll-hi
∀[n:ℕ]. ∀[f:Top].  (Π(f[x] | x < n) ~ if (n =z 0) then 1 else Π(f[x] | x < n - 1) * f[n - 1] fi )
Lemma: int-prod-single
∀[f:Top]. (Π(f[x] | x < 1) ~ 1 * f[0])
Lemma: int-prod-split
∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕn + 1].  (Π(f[x] | x < n) = (Π(f[x] | x < m) * Π(f[x + m] | x < n - m)) ∈ ℤ)
Lemma: int-prod-split2
∀[n:ℕ]. ∀[m:ℕn + 1]. ∀[f:ℕn ⟶ ℤ].  (Π(f[x] | x < n) = (Π(f[x] | x < m) * Π(f[x + m] | x < n - m)) ∈ ℤ)
Lemma: int-prod-isolate
∀[n:ℕ]. ∀[m:ℕn]. ∀[f:ℕn ⟶ ℤ].  (Π(f[x] | x < n) = (Π(if (x =z m) then 1 else f[x] fi  | x < n) * f[m]) ∈ ℤ)
Lemma: int-prod-1
∀[n:ℕ]. (Π(1 | x < n) = 1 ∈ ℤ)
Lemma: int-prod-factor
∀[n:ℕ]. ∀[f,g:ℕn ⟶ ℤ].  (Π(f[x] * g[x] | x < n) = (Π(f[x] | x < n) * Π(g[x] | x < n)) ∈ ℤ)
Lemma: mul-nat
∀[x,y:ℕ].  (x * y ∈ ℕ)
Definition: exp
i^n ==  primrec(n;1;λx,y. (i * y))
Lemma: exp_wf
∀[n:ℕ]. ∀[i:ℕ+].  (i^n ∈ ℕ+)
Lemma: exp_wf2
∀[n:ℕ]. ∀[i:ℤ].  (i^n ∈ ℤ)
Lemma: exp_wf3
∀[v:ℤ-o]. ∀[n:ℕ].  (v^n ∈ ℤ-o)
Lemma: exp_wf4
∀[n,v:ℕ].  (v^n ∈ ℕ)
Lemma: exp_wf_nat_plus
∀[n:ℕ]. ∀[v:ℕ+].  (v^n ∈ ℕ+)
Lemma: exp0_lemma
∀i:Top. (i^0 ~ 1)
Lemma: exp_add
∀[n,m:ℕ]. ∀[i:ℤ].  (i^(n + m) = (i^n * i^m) ∈ ℤ)
Lemma: exp1
∀[i:ℤ]. (i^1 = i ∈ ℤ)
Lemma: exp_step
∀[n:ℕ+]. ∀[i:ℤ].  (i^n ~ i * i^(n - 1))
Lemma: exp2
∀[i:ℤ]. (i^2 = (i * i) ∈ ℤ)
Lemma: exp-ge-1
∀[b:{2...}]. ∀[j:ℕ+].  1 < b^j
Lemma: exp-increasing
∀[b:{2...}]. ∀[i:ℕ].  ∀j:ℕ. b^i < b^j supposing i < j
Lemma: exp-nondecreasing
∀[b:{2...}]. ∀[i:ℕ].  ∀j:ℕ. b^i ≤ b^j supposing i ≤ j
Lemma: absval_div_nat
∀[n:ℕ+]. ∀[i:ℤ].  (|i| ÷ n ~ |i ÷ n|)
Lemma: absval_div_decreases
∀[n:{2...}]. ∀[i:ℤ-o].  |i ÷ n| < |i|
Lemma: div_is_zero
∀[n:{2...}]. ∀[i:ℤ].  i ÷ n ~ 0 supposing |i| < n
Lemma: div_absval_bound
∀[M:ℕ+]. ∀[z:ℤ]. ∀[n:ℕ].  |z ÷ M| ≤ n supposing |z| ≤ (n * M)
Lemma: absval-squeeze
∀[a,b,c,d:ℤ].  |b - c| ≤ (d - a) supposing ((a ≤ b) ∧ (b ≤ d)) ∧ (a ≤ c) ∧ (c ≤ d)
Lemma: biject-int-nat
∃f:ℤ ⟶ ℕ. Bij(ℤ;ℕ;f)
Definition: mccarthy91
mccarthy91(x) ==  if (100) < (x)  then x - 10  else eval y = x + 11 in eval z = mccarthy91(y) in   mccarthy91(z)
Lemma: mccarthy91_wf1
∀x:ℤ. (mccarthy91(x) ∈ {m:ℤ| m = if x ≤z 101 then 91 else x - 10 fi  ∈ ℤ} )
Lemma: mccarthy91_wf
∀x:ℤ. (mccarthy91(x) ∈ {91...})
Lemma: mccarthy91-sqeq
∀x:Top. (mccarthy91(x) ~ if (x) < (102)  then 91  else (x - 10))
Lemma: mccarthy91-eq-91
∀x:ℤ. (mccarthy91(x) = if (x) < (102)  then 91  else (x - 10) ∈ ℤ)
Definition: test-mutual-corec
test-mutual-corec() ==
  mutual-corec(X.λi.if (i =z 0) then Unit + (X 0 × ((X 1) List)) else Unit + (X 1 × ((X 0) List)) fi )
Lemma: test-mutual-corec_wf
test-mutual-corec() ∈ ℕ2 ⟶ Type
Lemma: test-mutual-corec-ext
test-mutual-corec() ≡ λi.if (i =z 0)
                         then Unit + (test-mutual-corec() 0 × ((test-mutual-corec() 1) List))
                         else Unit + (test-mutual-corec() 1 × ((test-mutual-corec() 0) List))
                         fi 
Definition: test-mutual-corec-size
test-mutual-corec-size(i;x) ==
  fix((λf,i,x. if (i =z 0)
              then case x of inl(_) => 0 | inr(p) => let a,L = p in 1 + (f 0 a) + Σ(f 1 L[i] | i < ||L||)
              else case x of inl(_) => 0 | inr(p) => let a,L = p in 1 + (f 1 a) + Σ(f 0 L[i] | i < ||L||)
              fi )) 
  i 
  x
Lemma: test-mutual-corec-size_wf
∀[i:ℕ2]. ∀[x:test-mutual-corec() i].  (test-mutual-corec-size(i;x) ∈ partial(ℕ))
Home
Index