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 ≤ 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 a)

Lemma: eq_to_le
[i,j:ℤ].  i ≤ supposing j ∈ ℤ

Lemma: lt_to_le
[i,j:ℤ].  uiff(i < j;(i 1) ≤ j)

Lemma: le_to_lt_weaken
[i,j:ℤ].  i ≤ 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 < 1)

Lemma: le_to_lt_rw
[i,j:ℤ].  {uiff(i ≤ j;i < 1)}

Definition: rounding-div
[b ÷ m] ==
  eval in
  eval in
    let q,r divrem(a; n) 
    in eval r2 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) > ⇐⇒ ((a > 0) ∧ (b > 0)) ∨ (a < 0 ∧ b < 0))

Lemma: neg_mul_arg_bounds
a,b:ℤ.  (a b < ⇐⇒ (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 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) ∈ ℤ)

Lemma: pm_equal_wf
[a,b:ℤ].  (a = ± b ∈ ℙ)

Lemma: absval_eq
x,y:ℤ.  (|x| |y| ∈ ℤ ⇐⇒ = ± 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 in eval in   if a ≤then else fi 

Lemma: imin_wf
[a,b:ℤ].  (imin(a;b) ∈ ℤ)

Lemma: imin_unfold
[a,b:ℤ].  (imin(a;b) if a ≤then else 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) 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) ≤ ⇐⇒ (a ≤ c) ∨ (b ≤ c))

Lemma: imin_ub
[a,b,c:ℤ].  uiff(a ≤ imin(b;c);{(a ≤ b) ∧ (a ≤ c)})

Definition: ndiff
-- ==  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) 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) 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 0)

Lemma: one-rem
[m:ℤ]. rem supposing 1 < m

Lemma: divide_wf
[a:ℕ]. ∀[n:ℕ+].  (a ÷ n ∈ ℕ)

Definition: div_nrel
Div(a;n;q) ==  q ≤ a < (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) ÷ x)

Lemma: div-self
[y:ℤ-o]. (y ÷ 1)

Lemma: div-cancel2
[x:ℤ]. ∀[y:ℤ-o].  ((y x) ÷ x)

Lemma: div-cancel3
[x:ℕ]. ∀[y:ℕ+]. ∀[z:ℕy].  (((y x) z) ÷ 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 ÷ a ÷ m)

Lemma: div_div
[a:ℤ]. ∀[n,m:ℤ-o].  (a ÷ n ÷ a ÷ m)

Lemma: div_div_commutes
[a:ℤ]. ∀[n,m:ℤ-o].  (a ÷ n ÷ a ÷ m ÷ n)

Lemma: div-mul-cancel
[a:ℤ]. ∀[n,m:ℤ-o].  ((a n) ÷ a ÷ m)

Lemma: div-mul-cancel2
[a:ℤ]. ∀[n,m:ℤ-o].  ((n a) ÷ a ÷ m)

Lemma: mul-div-bounds
[a,b:ℤ]. ∀[m:ℤ-o].  (|(a (b ÷ m)) (a ÷ m)| ≤ (|a| |b|))

Lemma: rem-mul
[a:ℤ]. ∀[n,m:ℤ-o].  ((a rem 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 ÷ x)

Lemma: div_minus_one
[x:ℤ]. (x ÷ -1 -x)

Lemma: implies-equal-div2
[a,c:ℤ]. ∀[b:ℤ-o].  (a ÷ b) c ∈ ℤ supposing (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 ≥ 

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 rem n) ∈ ℤ supposing a ≥ 

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 rem n) ∈ ℤ)

Lemma: rem_add1
[i:ℕ]. ∀[n:ℕ+].  ((i rem n) if (i rem =z 1) then else (i rem n) fi  ∈ ℤ)

Lemma: rem_rem_to_rem
[a:ℕ]. ∀[n:ℕ+].  ((a rem 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 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 ≤then inl ⋅ else case of inl(z) => (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 then else eval ((b a) ÷ 2) in if 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 then <n, m> else eval step' step in eval 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') ∧ n' tt}  × {x':ℤ
                                  ((n' n ∈ ℤ) ∧ (x' x ∈ ℤ))
                                  ∨ (((n ≤ x') ∧ x' ff) ∧ ((n' (n step) ∈ ℤ) ∨ ((n step) ≤ x')))}  
  supposing ∃m:{n...}. ∀k:{m...}. tt

Definition: find-xover-val
find-xover-val(test;f;m;n;step) ==
  eval in
  if test then <v, n, m> else eval step' step in eval 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 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 then else exact-xover(f;a)

Lemma: exact-xover_wf
[n:ℤ]. ∀[f:{n...} ⟶ 𝔹].
  exact-xover(f;n) ∈ {x:ℤ(n ≤ x) ∧ ff ∧ (x 1) tt}  
  supposing (∃m:{n...}. ((∀k:{n..m-}. ff) ∧ (∀k:{m...}. tt))) ∧ 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') ∧ n' tt}  supposing ∃m:{n...}. ∀k:{m...}. 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 tt}  
    supposing ∃m:{n...}. ∀k:{m...}. test (f k) tt 
  supposing value-type(T)

Definition: mu-ge
mu-ge(f;n)==r if then else eval 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 then else mu(λi.(f (i 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) ∈ ℕ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 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 =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 g) (inv(g) 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 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] in eval i' 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 else Σ(f[x] x < 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 < 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 fi  i < k)) ∈ ℤ)

Lemma: sum_arith1
[n:ℕ]. ∀[a,b:ℤ].  ((Σ(a (b i) i < n) 2) (n (a (b (n 1)))) ∈ ℤ)

Lemma: sum_arith
[n:ℕ]. ∀[a,b:ℤ].  (a (b i) i < n) ((n (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 else f[x] fi  x < n)) ∈ ℤ)

Lemma: isolate_summand2
m:ℕ. ∀[n:ℕ]. ∀[f:ℕn ⟶ ℤ].  Σ(f[x] x < n) (f[m] + Σ(if (x =z m) then 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:ℕ1].  (f[x] x < n) (f[x] x < m) + Σ(f[x m] x < m)) ∈ ℤ)

Lemma: sum_split+
[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕ1].
  ((Σ(f[x] x < n) (f[x] x < m) + Σ(f[x m] x < m)) ∈ ℤ)
  ∧ (f[x] x < m) ∈ ℤ)
  ∧ (f[x m] x < m) ∈ ℤ))

Lemma: sum_split_first
[n:ℕ+]. ∀[f:ℕn ⟶ ℤ].  (f[x] x < n) (f[0] + Σ(f[x 1] x < 1)) ∈ ℤ)

Lemma: sum_split1
[n:ℕ+]. ∀[f:ℕn ⟶ ℤ].  (f[x] x < n) (f[x] x < 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 < n)) ((n 1) ((2 n) 1)) ∈ ℤ)

Lemma: sum-consecutive-squares
[n:ℕ]. (i i < n) (((n 1) ((2 n) 1)) ÷ 6) ∈ ℤ)

Lemma: sum-of-consecutive-cubes
[n:ℕ]. ((4 * Σ((i i) i < n)) (((n 1) (n 1)) n) ∈ ℤ)

Lemma: sum-consecutive-cubes
[n:ℕ]. ((i i) i < n) ((((n 1) (n 1)) 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 else Π(f[x] x < 1) f[n 1] fi )

Lemma: int-prod-single
[f:Top]. (f[x] x < 1) f[0])

Lemma: int-prod-split
[n:ℕ]. ∀[f:ℕn ⟶ ℤ]. ∀[m:ℕ1].  (f[x] x < n) (f[x] x < m) * Π(f[x m] x < m)) ∈ ℤ)

Lemma: int-prod-split2
[n:ℕ]. ∀[m:ℕ1]. ∀[f:ℕn ⟶ ℤ].  (f[x] x < n) (f[x] x < m) * Π(f[x m] x < m)) ∈ ℤ)

Lemma: int-prod-isolate
[n:ℕ]. ∀[m:ℕn]. ∀[f:ℕn ⟶ ℤ].  (f[x] x < n) (if (x =z m) then 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^(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| ÷ |i ÷ n|)

Lemma: absval_div_decreases
[n:{2...}]. ∀[i:ℤ-o].  |i ÷ n| < |i|

Lemma: div_is_zero
[n:{2...}]. ∀[i:ℤ].  i ÷ supposing |i| < n

Lemma: div_absval_bound
[M:ℕ+]. ∀[z:ℤ]. ∀[n:ℕ].  |z ÷ M| ≤ 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 10  else eval 11 in eval mccarthy91(y) in   mccarthy91(z)

Lemma: mccarthy91_wf1
x:ℤ(mccarthy91(x) ∈ {m:ℤif x ≤101 then 91 else 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 of inl(_) => inr(p) => let a,L in (f a) + Σ(f L[i] i < ||L||)
              else case of inl(_) => inr(p) => let a,L in (f a) + Σ(f L[i] i < ||L||)
              fi )) 
  
  x

Lemma: test-mutual-corec-size_wf
[i:ℕ2]. ∀[x:test-mutual-corec() i].  (test-mutual-corec-size(i;x) ∈ partial(ℕ))



Home Index