Lemma: nat-id-fun-example
n:ℕ(∃m:ℕ [(m n ∈ ℕ)])

Lemma: nat-id-fun-ext
n:ℕ(∃m:ℕ [(m n ∈ ℕ)])

Definition: sbcode
sbcode(m;n)==r if (m) < (n)  then [0 sbcode(m;n m)]  else if (n) < (m)  then [1 sbcode(m n;n)]  else []

Lemma: sbcode_wf
[m,n:ℕ+].  (sbcode(m;n) ∈ ℕList)

Definition: sbcode_aux
sbcode_aux(L;m;n)
==r if (m) < (n)
       then eval n' in
            sbcode_aux([0 L];m;n')
       else if (n) < (m)  then eval m' in sbcode_aux([1 L];m';n)  else L

Lemma: sbcode-mul
[m,n,k:ℕ+].  (sbcode(k m;k n) sbcode(m;n))

Definition: sbdecode
sbdecode(L) ==  reduce(λx,p. let m,n in if x=0 then <m, n> else <n, n>;<1, 1>;L)

Lemma: sbdecode_wf
[L:ℕList]. (sbdecode(L) ∈ ℕ+ × ℕ+)

Lemma: sbdecode-code
[m,n:ℕ+].  (sbdecode(sbcode(m;n)) ~ <m ÷ gcd(m;n), n ÷ gcd(m;n)>)

Lemma: sbcode-decode
[L:ℕList]. (let m,n sbdecode(L) in sbcode(m;n) L)

Lemma: sbdecode_wf_gcd
[L:ℕList]. (sbdecode(L) ∈ {p:ℕ+ × ℕ+let m,n in gcd(m;n) 1 ∈ ℤ)

Lemma: sb-equipollent
List {p:ℕ+ × ℕ+let m,n in gcd(m;n) 1 ∈ ℤ

Definition: mtge1
mtge1(a;b;c;d) ==  (c ≤a ∧b d <b) ∨b(c <a ∧b d ≤b)

Lemma: mtge1_wf
[a,b,c,d:ℤ].  (mtge1(a;b;c;d) ∈ 𝔹)

Definition: sbhomout
sbhomout(a;b;c;d;L)
==r if Ax then sbcode(a b;c d) otherwise let h,t 
                                                 in if mtge1(a;b;c;d)
                                                      then eval a' in
                                                           eval b' in
                                                             [1 sbhomout(a';b';c;d;L)]
                                                    if mtge1(c;d;a;b)
                                                      then eval c' in
                                                           eval d' in
                                                             [0 sbhomout(a;b;c';d';L)]
                                                    else let h,t 
                                                         in if h=0
                                                            then eval a' in
                                                                 eval c' in
                                                                   sbhomout(a';b;c';d;t)
                                                            else eval b' in
                                                                 eval d' in
                                                                   sbhomout(a;b';c;d';t)
                                                    fi 

Lemma: sbhomout_wf
[a,b,c,d:ℕ].  (0 <  0 <  (∀[L:ℕList]. (sbhomout(a;b;c;d;L) ∈ ℕList)))

Lemma: sbhomout-correct
[a,b,c,d:ℕ].
  (0 < b
   0 < d
   (∀[L:ℕList]
        (sbhomout(a;b;c;d;L) let m,n sbdecode(L) in sbcode((a m) (b n);(c m) (d n)) ∈ (ℕList))))

Lemma: test-sq-lift3
[x:Top]. (if (x) < (0)  then 1  else (1 1) if (x) < (0)  then 2  else 3)

Lemma: coprime-equiv-unique
[p,q,a,b:ℤ].
  ({(p a ∈ ℤ) ∧ (q b ∈ ℤ)}) supposing 
     ((q < ⇐⇒ b < 0) and 
     (p < ⇐⇒ a < 0) and 
     ((p b) (a q) ∈ ℤand 
     CoPrime(a,b) and 
     CoPrime(p,q))

Lemma: coprime-equiv-unique-pair
[p:ℤ]. ∀[q:ℤ-o]. ∀[a,b:ℤ].
  (<p, q> = <a, b> ∈ (ℤ × ℤ-o)) supposing 
     ((q < ⇐⇒ b < 0) and 
     (p < ⇐⇒ a < 0) and 
     ((p b) (a q) ∈ ℤand 
     CoPrime(a,b) and 
     CoPrime(p,q))

Definition: qeq
qeq(r;s) ==
  let r' ⟵ r
  in let s' ⟵ s
     in if isint(r')
     then if isint(s') then (r' =z s') else let i,j s' in (r' =z i) fi 
     else let p,q r' 
          in if isint(s') then (p =z s' q) else let i,j s' in (p =z q) fi 
     fi 

Lemma: qeq_wf
[r,s:ℤ ⋃ (ℤ × ℤ-o)].  (qeq(r;s) ∈ 𝔹)

Lemma: qeq_refl
[r:ℤ ⋃ (ℤ × ℤ-o)]. qeq(r;r) tt

Lemma: qeq-refl
Refl(ℤ ⋃ (ℤ × ℤ-o);r,s.qeq(r;s) tt)

Lemma: qeq-sym
Sym(ℤ ⋃ (ℤ × ℤ-o);r,s.qeq(r;s) tt)

Lemma: qeq-functionality
[r,s,x:ℤ ⋃ (ℤ × ℤ-o)].  qeq(r;x) qeq(s;x) supposing qeq(r;s) tt

Lemma: qeq-trans
Trans(ℤ ⋃ (ℤ × ℤ-o);r,s.qeq(r;s) tt)

Lemma: qeq-equiv
EquivRel(ℤ ⋃ (ℤ × ℤ-o);r,s.qeq(r;s) tt)

Definition: rationals
ℚ ==  r,s:ℤ ⋃ (ℤ × ℤ-o)//qeq(r;s) tt

Lemma: rationals_wf
ℚ ∈ Type

Lemma: int-rational
[n:ℤ]. (n ∈ ℚ)

Lemma: int-subtype-rationals
ℤ ⊆r ℚ

Lemma: int_inc_rationals
ℤ ⊆r ℚ

Lemma: int_inc
ℤ ⊆r ℚ

Lemma: int_seg_inc
[i,j:ℤ].  ({i..j-} ⊆r ℚ)

Lemma: qeq-wf
[r,s:ℚ].  (qeq(r;s) ∈ 𝔹)

Lemma: int-equal-in-rationals
[x,y:ℤ].  uiff(x y ∈ ℚ;x y ∈ ℤ)

Lemma: rational-form-has-value
[r:ℤ ⋃ (ℤ × ℤ-o)]. has-valueall(r)

Lemma: rationals-valueall-type
valueall-type(ℚ)

Lemma: rationals-value-type
value-type(ℚ)

Lemma: rational-has-value
[r:ℚ]. has-valueall(r)

Lemma: rational-has-value2
[r:ℚ]. (r)↓

Definition: proportional-round
proportional-round(r;k;l) ==  let r' ⟵ in if isint(r') then (r' k) ÷ else let p,q r' in (p k) ÷ fi 

Lemma: proportional-round_wf
[r:ℚ]. ∀[k:ℤ]. ∀[l:ℤ-o].  (proportional-round(r;k;l) ∈ ℤ)

Definition: rounded-numerator
rounded-numerator(r;k) ==  let r' ⟵ in if isint(r') then r' else let p,q r' in (p k) ÷ fi 

Lemma: rounded-numerator_wf
[r:ℚ]. ∀[k:ℕ+].  (rounded-numerator(r;k) ∈ ℤ)

Definition: qadd
==
  let r' ⟵ r
  in let s' ⟵ s
     in if isint(r')
     then if isint(s') then r' s' else let i,j s' in <(r' j) i, j> fi 
     else let p,q r' 
          in if isint(s') then <(s' q), q> else let i,j s' in <(p j) (i q), j> fi 
     fi 

Lemma: qadd_wf
[r,s:ℚ].  (r s ∈ ℚ)

Lemma: qadd-add
[x,y:ℤ].  (x y)

Definition: qmul
==
  let r' ⟵ r
  in let s' ⟵ s
     in if isint(r')
     then if isint(s') then r' s' else let i,j s' in <r' i, j> fi 
     else let p,q r' 
          in if isint(s') then <s', q> else let i,j s' in <i, j> fi 
     fi 

Lemma: qmul_wf
[r,s:ℚ].  (r s ∈ ℚ)

Lemma: qmul-mul
[x,y:ℤ].  (x y)

Lemma: qminus-minus
[x:ℤ]. (-(x) -x)

Definition: mk-rational
mk-rational(a;b) ==  <a, b>

Lemma: mk-rational_wf
[a:ℤ]. ∀[b:ℤ-o].  (mk-rational(a;b) ∈ ℚ)

Definition: qround
qround(r;k) ==  mk-rational(rounded-numerator(r;2 k);2 k)

Lemma: qround_wf
[r:ℚ]. ∀[k:ℕ+].  (qround(r;k) ∈ ℚ)

Definition: qinv
1/r ==  let r' ⟵ in if isint(r') then <1, r'> else let p,q r' in <q, p> fi 

Lemma: qinv-wf
[r:ℤ ⋃ (ℤ × ℤ-o)]. 1/r ∈ ℤ ⋃ (ℤ × ℤ-osupposing ¬↑qeq(r;0)

Lemma: qinv_wf
[r:ℚ]. 1/r ∈ ℚ supposing ¬↑qeq(r;0)

Definition: qpositive
qpositive(r) ==
  let r' ⟵ r
  in if isint(r') then 0 <r' else let p,q r' in (0 <p ∧b 0 <q) ∨b(p <0 ∧b q <0) fi 

Lemma: qpositive_wf
[r:ℚ]. (qpositive(r) ∈ 𝔹)

Definition: qrep
qrep(r) ==
  let r' ⟵ r
  in if isint(r')
  then <r', 1>
  else let p,q r' 
       in let g,a,b gcd_reduce(p;q) in 
          if 0 ≤then <a, b> else <-a, -b> fi 
  fi 

Lemma: qrep_wf
[r:ℚ]. (qrep(r) ∈ ℤ × ℕ+)

Lemma: qrep-denom
[r:ℚ]. (qrep(r) ∈ ℤ × ℕ+)

Lemma: qeq_wf2
[r,s:ℚ].  (qeq(r;s) ∈ 𝔹)

Lemma: assert-qeq
[r,s:ℚ].  uiff(↑qeq(r;s);r s ∈ ℚ)

Definition: qdeq
qdeq() ==  λa,b. qeq(a;b)

Lemma: qdeq_wf
qdeq() ∈ EqDecider(ℚ)

Lemma: int-eq-in-rationals
[x,y:ℤ].  uiff(x y ∈ ℚ;x y ∈ ℤ)

Definition: qdiv
(r/s) ==  1/s

Lemma: qdiv_wf
[r,s:ℚ].  (r/s) ∈ ℚ supposing ¬(s 0 ∈ ℚ)

Lemma: mk-rational-qdiv
[a,b:ℤ].  (mk-rational(a;b) (a/b))

Lemma: qround-eq
[r:ℚ]. ∀[k:ℕ+].  (qround(r;k) (rounded-numerator(r;2 k)/2 k) ∈ ℚ)

Definition: qsub
==  -(s)

Lemma: qsub_wf
[r,s:ℚ].  (r s ∈ ℚ)

Lemma: qeq-qrep
[r:ℚ]. qeq(r;qrep(r)) tt

Lemma: equals-qrep
[r:ℚ]. (qrep(r) r ∈ ℚ)

Lemma: qpositive-elim
[r:ℚ]. (qpositive(r) if isint(r) then 0 <else let p,q in (0 <p ∧b 0 <q) ∨b(p <0 ∧b q <0) fi )

Lemma: qinv-elim
[r:ℚ]. (1/r if isint(r) then <1, r> else let p,q in <q, p> fi )

Lemma: qadd-elim
[r,s:ℚ].
  (r if isint(r)
  then if isint(s) then else let i,j in <(r j) i, j> fi 
  else let p,q 
       in if isint(s) then <(s q), q> else let i,j in <(p j) (i q), j> fi 
  fi )

Lemma: qmul-elim
[r,s:ℚ].
  (r if isint(r)
  then if isint(s) then else let i,j in <i, j> fi 
  else let p,q 
       in if isint(s) then <s, q> else let i,j in <i, j> fi 
  fi )

Lemma: qdiv-int-elim
[p:ℤ]. ∀[q:ℤ-o].  ((p/q) ~ <p, q>)

Lemma: qeq-elim
[r,s:ℚ].
  (qeq(r;s) if isint(r)
  then if isint(s) then (r =z s) else let i,j in (r =z i) fi 
  else let p,q 
       in if isint(s) then (p =z q) else let i,j in (p =z q) fi 
  fi )

Lemma: q-elim
r:ℚ. ∃p:ℤ. ∃q:ℕ+((¬(q 0 ∈ ℚ)) c∧ (r (p/q) ∈ ℚ))

Lemma: better-q-elim
r:ℚ. ∃p:ℤ. ∃q:ℕ+((¬(q 0 ∈ ℚ)) c∧ (r (p/q) ∈ ℚ))

Lemma: qrep-coprime
[r:ℚ]. (|gcd(fst(qrep(r));snd(qrep(r)))| 1 ∈ ℤ)

Definition: is-qrep
is-qrep(p) ==  let a,b in eval better-gcd(a;b) in (g =z 1) ∨b(g =z -1)

Lemma: is-qrep_wf
p:ℤ × ℕ+(is-qrep(p) ∈ 𝔹)

Lemma: assert-is-qrep
p:ℤ × ℕ+(↑is-qrep(p) ⇐⇒ ∃q:ℚ(qrep(q) p ∈ (ℤ × ℕ+)))

Lemma: equipollent-rationals
ℚ {p:ℤ × ℕ+| ↑is-qrep(p)} 

Lemma: equipollent-rationals-ext
ℚ {p:ℤ × ℕ+| ↑is-qrep(p)} 

Lemma: equipollent-nat-rationals
(our proof is constructive so we can compute the listing of rationals
       see first-25-rationals)⋅

ℕ ~ ℚ

Lemma: equipollent-nat-rationals-ext
ℕ ~ ℚ

Definition: nth-rational
nth-rational(n) ==  (fst(TERMOF{equipollent-nat-rationals-ext:o, 1:l})) n

Lemma: nth-rational_wf
[n:ℕ]. (nth-rational(n) ∈ ℚ)

Lemma: first-25-rationals
map(λn.nth-rational(n);upto(25))
[0;
   -1;
   1;
   (-1/2);
   -2;
   (1/2);
   (-1/3);
   2;
   (1/3);
   (-1/4);
   -3;
   (-2/3);
   (1/4);
   (-1/5);
   3;
   (-3/2);
   (2/3);
   (1/5);
   (-1/6);
   -4;
   (3/2);
   (-2/5);
   (1/6);
   (-1/7);
   4]
∈ (ℚ List)

Definition: q_le
q_le(r;s) ==  let r' ⟵ in let s' ⟵ in qpositive(s' r') ∨bqeq(r';s')

Lemma: q_le_wf
[r,s:ℚ].  (q_le(r;s) ∈ 𝔹)

Lemma: q_le-elim
[r,s:ℚ].  (q_le(r;s) qpositive(s -(r)) ∨bqeq(r;s))

Lemma: qmul_ident
[r:ℚ]. ((1 r) r ∈ ℚ)

Lemma: qmul_com
[r,s:ℚ].  ((r s) (s r) ∈ ℚ)

Lemma: qmul_assoc
[r,s,t:ℚ].  (((r s) t) (r t) ∈ ℚ)

Lemma: qmul_inv
[r:ℚ]. (r 1/r) 1 ∈ ℚ supposing ¬(r 0 ∈ ℚ)

Lemma: qmul_inv_l
[r:ℚ]. (1/r r) 1 ∈ ℚ supposing ¬(r 0 ∈ ℚ)

Lemma: qadd_ident
[r:ℚ]. ((0 r) r ∈ ℚ)

Lemma: qadd_com
[r,s:ℚ].  ((r s) (s r) ∈ ℚ)

Lemma: qadd_assoc
[r,s,t:ℚ].  (((r s) t) (r t) ∈ ℚ)

Lemma: qadd_minus
[r:ℚ]. ((r -(r)) 0 ∈ ℚ)

Lemma: qmul_positive
[r,s:ℚ].  (↑qpositive(r s)) supposing ((↑qpositive(s)) and (↑qpositive(r)))

Lemma: qadd_positive
[r,s:ℚ].  (↑qpositive(r s)) supposing ((↑qpositive(s)) and (↑qpositive(r)))

Lemma: qminus_positive
[r:ℚ]. ¬↑qpositive(-(r)) supposing ↑qpositive(r)

Lemma: q_trichotomy
r:ℚ((↑qpositive(r)) ∨ (r 0 ∈ ℚ) ∨ (↑qpositive(-(r))))

Lemma: q_distrib
[r,s,t:ℚ].  (((r s) t) ((r t) (s t)) ∈ ℚ)

Definition: qadd_grp
<ℚ+> ==  <ℚ, λx,y. qeq(x;y), λx,y. q_le(x;y), λx,y. (x y), 0, λx.-(x)>

Lemma: qadd_grp_wf
<ℚ+> ∈ AbGrp

Lemma: mon_assoc_q
[a,b,c:ℚ].  ((a c) ((a b) c) ∈ ℚ)

Lemma: mon_ident_q
[a:ℚ]. (((a 0) a ∈ ℚ) ∧ ((0 a) a ∈ ℚ))

Lemma: qinverse_q
[a:ℚ]. (((a -(a)) 0 ∈ ℚ) ∧ ((-(a) a) 0 ∈ ℚ))

Lemma: qinv_thru_op_q
[a,b:ℚ].  (-(a b) (-(b) -(a)) ∈ ℚ)

Lemma: qinv_inv_q
[a:ℚ]. (-(-(a)) a ∈ ℚ)

Lemma: qinv_id_q
-(0) 0 ∈ ℚ

Lemma: qinv_assoc_q
[a,b:ℚ].  (((a -(a) b) b ∈ ℚ) ∧ ((-(a) b) b ∈ ℚ))

Lemma: qadd_inv_assoc_q
[a,b:ℚ].  (((a -(a) b) b ∈ ℚ) ∧ ((-(a) b) b ∈ ℚ))

Lemma: qadd_comm_q
[a,b:ℚ].  ((a b) (b a) ∈ ℚ)

Lemma: qadd_ac_1_q
[a,b,c:ℚ].  ((a c) (b c) ∈ ℚ)

Lemma: qadd_grp_wf2
<ℚ+> ∈ OGrp

Definition: qless
r < ==  r < s

Definition: qle
r ≤ ==  r ≤ s

Lemma: qle_iff_lt_or_eq_qorder
a,b:ℚ.  (a ≤ ⇐⇒ a < b ∨ (a b ∈ ℚ))

Lemma: qless_is_sp_of_leq_a_qorder
[a,b:ℚ].  uiff(a < b;(a ≤ b) ∧ (b ≤ a)))

Lemma: qless_trans_qorder
[a,b,c:ℚ].  (a < c) supposing (b < and a < b)

Lemma: qless_irreflexivity_qorder
[a:ℚ]. False supposing a < a

Lemma: qless_transitivity_2_qorder
[a,b,c:ℚ].  (a < c) supposing ((b ≤ c) and a < b)

Lemma: qless_transitivity_1_qorder
[a,b,c:ℚ].  (a < c) supposing (b < and (a ≤ b))

Lemma: qle_weakening_eq_qorder
[a,b:ℚ].  a ≤ supposing b ∈ ℚ

Lemma: qle_weakening_lt_qorder
[a,b:ℚ].  a ≤ supposing a < b

Lemma: qle_transitivity_qorder
[a,b,c:ℚ].  (a ≤ c) supposing ((b ≤ c) and (a ≤ b))

Lemma: qle_antisymmetry_qorder
[a,b:ℚ].  (a b ∈ ℚsupposing ((b ≤ a) and (a ≤ b))

Lemma: qless_complement_qorder
[a,b:ℚ].  uiff(¬b < a;a ≤ b)

Lemma: qle_complement_qorder
[a,b:ℚ].  uiff(¬(a ≤ b);b < a)

Lemma: qless_trichot_qorder
a,b:ℚ.  (a < b ∨ (a b ∈ ℚ) ∨ b < a)

Lemma: grp_op_preserves_le_qorder
[x,y,z:ℚ].  (x y) ≤ (x z) supposing y ≤ z

Lemma: grp_op_preserves_lt_qorder
[u,v,w:ℚ].  v < supposing v < w

Lemma: qless_irreflexivity
[a:ℚ]. False supposing a < a

Lemma: qle_antisymmetry
[a,b:ℚ].  (a b ∈ ℚsupposing ((b ≤ a) and (a ≤ b))

Definition: qmax
qmax(x;y) ==  if q_le(x;y) then else fi 

Lemma: qmax_wf
[x,y:ℚ].  (qmax(x;y) ∈ ℚ)

Definition: qmax-list
qmax-list(L) ==  combine-list(x,y.qmax(x;y);L)

Lemma: qmax-list_wf
[L:ℚ List]. qmax-list(L) ∈ ℚ supposing 0 < ||L||

Lemma: qmax-list-member
L:ℚ List. (qmax-list(L) ∈ L) supposing 0 < ||L||

Definition: qmin
qmin(x;y) ==  if q_le(x;y) then else fi 

Lemma: qmin_wf
[x,y:ℚ].  (qmin(x;y) ∈ ℚ)

Definition: qmin-list
qmin-list(L) ==  combine-list(x,y.qmin(x;y);L)

Lemma: qmin-list_wf
[L:ℚ List]. qmin-list(L) ∈ ℚ supposing 0 < ||L||

Lemma: qmin-list-member
L:ℚ List. (qmin-list(L) ∈ L) supposing 0 < ||L||

Definition: qrng
<ℚ+*> ==
  <ℚ, λx,y. qeq(x;y), λx,y. q_le(x;y), λx,y. (x y), 0, λx.-(x), λx,y. (x y), 1, λx,y. if qeq(y;0) then inr ⋅  else i\000Cnl (x/y) fi >

Lemma: qrng_wf
<ℚ+*> ∈ CRng

Lemma: qmul_over_plus_qrng
[a,b,c:ℚ].  (((a (b c)) ((a b) (a c)) ∈ ℚ) ∧ (((b c) a) ((b a) (c a)) ∈ ℚ))

Lemma: qmul_over_minus_qrng
[a,b:ℚ].  (((-(a) b) -(a b) ∈ ℚ) ∧ ((a -(b)) -(a b) ∈ ℚ))

Lemma: qmul_zero_qrng
[a:ℚ]. (((0 a) 0 ∈ ℚ) ∧ ((a 0) 0 ∈ ℚ))

Lemma: qmul_assoc_qrng
[a,b,c:ℚ].  ((a c) ((a b) c) ∈ ℚ)

Lemma: qmul_one_qrng
[a:ℚ]. (((a 1) a ∈ ℚ) ∧ ((1 a) a ∈ ℚ))

Lemma: qmul_comm_qrng
[a,b:ℚ].  ((a b) (b a) ∈ ℚ)

Lemma: qmul_ac_1_qrng
[a,b,c:ℚ].  ((a c) (b c) ∈ ℚ)

Lemma: qdiv-self
[r:ℚ]. (r/r) 1 ∈ ℚ supposing ¬(r 0 ∈ ℚ)

Lemma: qmul-ident-div
[r,s:ℚ].  ((r/r) s) s ∈ ℚ supposing ¬(r 0 ∈ ℚ)

Lemma: qmul-zero-div
[a:ℚ]. ∀[b:ℤ-o].  (((0/b) a) 0 ∈ ℚ)

Lemma: qmul-qdiv-cancel
[a,b:ℚ].  (a (b/a)) b ∈ ℚ supposing ¬(a 0 ∈ ℚ)

Lemma: qmul-qdiv-cancel2
[a,b:ℚ].  ((b/a) a) b ∈ ℚ supposing ¬(a 0 ∈ ℚ)

Lemma: qmul-qdiv-cancel3
[a,b,c:ℚ].  (a (b/a) c) (b c) ∈ ℚ supposing ¬(a 0 ∈ ℚ)

Lemma: qmul-qdiv-cancel4
[a,b,c:ℚ].  ((b/a) c) (b c) ∈ ℚ supposing ¬(a 0 ∈ ℚ)

Lemma: qmul-preserves-eq
[a,b,c:ℚ].  uiff(a b ∈ ℚ;(c a) (c b) ∈ ℚsupposing ¬(c 0 ∈ ℚ)

Lemma: qmul-qdiv-cancel5
[a,b,c:ℚ].  ((a (b/a c)) (b/c) ∈ ℚsupposing ((¬(c 0 ∈ ℚ)) and (a 0 ∈ ℚ)))

Lemma: qmul-qdiv-cancel6
[a,b,c:ℚ].  (((b/c a) a) (b/c) ∈ ℚsupposing ((¬(c 0 ∈ ℚ)) and (a 0 ∈ ℚ)))

Lemma: qdiv-one
[q:ℚ]. ((q/1) q ∈ ℚ)

Lemma: test-q-norm-conv
[a,b,c:ℚ].  (((a b) (c b)) (((a c) (b c)) (b b) (a b)) ∈ ℚ)

Lemma: qmul-not-zero
[a,b:ℚ].  uiff(¬((a b) 0 ∈ ℚ);(¬(a 0 ∈ ℚ)) ∧ (b 0 ∈ ℚ)))

Definition: qabs
|r| ==  let r' ⟵ in if qpositive(r') then r' else -(r') fi 

Lemma: qabs_wf
[r:ℚ]. (|r| ∈ ℚ)

Lemma: qabs-abs
[x:ℤ]. (|x| |x|)

Lemma: qpositive-qabs
[r:ℚ]. ↑qpositive(|r|) supposing ¬(r 0 ∈ ℚ)

Lemma: qabs-zero
[r:ℚ]. uiff(r 0 ∈ ℚ;|r| 0 ∈ ℚ)

Lemma: qabs-squared
[r:ℚ]. ((|r| |r|) (r r) ∈ ℚ)

Lemma: qminus-qsub
[r,s:ℚ].  (-(s r) (r s) ∈ ℚ)

Lemma: qsub-zero
[r:ℚ]. ((r 0) r ∈ ℚ)

Lemma: qsub-sub
[a,b:ℤ].  (a b)

Lemma: qless_wf
[r,s:ℚ].  (r < s ∈ ℙ)

Lemma: qless_witness
[r,s:ℚ].  (r <  (Ax ∈ r < s))

Lemma: qless_transitivity
[a,b,c:ℚ].  (a < c) supposing (b < and a < b)

Lemma: qless-int
[x,y:ℤ].  uiff(x < y;x < y)

Lemma: qle_wf
[r,s:ℚ].  (r ≤ s ∈ ℙ)

Lemma: qle_witness
[r,s:ℚ].  ((r ≤ s)  (Ax ∈ r ≤ s))

Lemma: sq_stable_qle
[r,s:ℚ].  SqStable(r ≤ s)

Lemma: qle-int
[x,y:ℤ].  uiff(x ≤ y;x ≤ y)

Definition: qge
a ≥ ==  b ≤ a

Lemma: qge_wf
[a,b:ℚ].  (a ≥ b ∈ ℙ)

Definition: qgt
a > ==  b < a

Lemma: qgt_wf
[a,b:ℚ].  (a > b ∈ ℙ)

Lemma: qle-iff
a,b:ℚ.  uiff(a ≤ b;a < b ∨ (a b ∈ ℚ))

Lemma: decidable__equal_rationals
r,s:ℚ.  Dec(r s ∈ ℚ)

Lemma: assert-qpositive
[r:ℚ]. uiff(↑qpositive(r);0 < r)

Lemma: qadd_preserves_qless
[a,b,c:ℚ].  {uiff(a < b;c a < b)}

Lemma: qmul-positive
a,b:ℚ.  ((0 < a ∧ 0 < b) ∨ (0 < -(a) ∧ 0 < -(b)) ⇐⇒ 0 < b)

Lemma: qminus-positive
[r:ℚ]. uiff(0 < -(r);r < 0)

Lemma: qmax-imax
[x,y:ℤ].  (qmax(x;y) imax(x;y))

Lemma: zero-qle-qabs
[r:ℚ]. (0 ≤ |r|)

Lemma: qabs-qle-zero
[r:ℚ]. uiff(|r| ≤ 0;r 0 ∈ ℚ)

Lemma: qabs-of-nonneg
[q:ℚ]. |q| q ∈ ℚ supposing 0 ≤ q

Lemma: qabs-of-positive
[q:ℚ]. |q| supposing 0 < q

Lemma: qabs-of-non-positive
[q:ℚ]. |q| -(q) supposing q ≤ 0

Lemma: qabs-difference-zero
[r,s:ℚ].  uiff(|r s| ≤ 0;r s ∈ ℚ)

Lemma: qabs-positive
[r:ℚ]. 0 < |r| supposing ¬(r 0 ∈ ℚ)

Lemma: qabs-positive-iff
[r:ℚ]. uiff(¬(r 0 ∈ ℚ);0 < |r|)

Lemma: qabs-qmul
[r,s:ℚ].  (|r s| (|r| |s|) ∈ ℚ)

Lemma: qabs-qminus
[r:ℚ]. (|r| |-(r)| ∈ ℚ)

Lemma: qabs-qmul-case1
[r,s,a:ℚ].  (|(r a) a| (|r s| |a|) ∈ ℚ)

Lemma: qabs-qmul-case2
[r,s,a:ℚ].  (|(a r) s| (|r s| |a|) ∈ ℚ)

Lemma: decidable__qle
a,b:ℚ.  Dec(a ≤ b)

Lemma: decidable__qless
a,b:ℚ.  Dec(a < b)

Lemma: qless-witness
[a,b:ℚ].  ⋅ ∈ a < supposing a < b

Lemma: qabs-neg
[r:ℚ]. (|-(r)| |r| ∈ ℚ)

Lemma: rational_set_blt
[r,s:ℚ].
  (r <b if isint(r)
  then if isint(s) then r <else let i,j in if 0 <then r <else i <fi  fi 
  else let p,q 
       in if isint(s)
          then if 0 <then p <else s <fi 
          else let i,j 
               in if 0 <then p <else i <fi 
          fi 
  fi )

Definition: q_less
q_less(r;s) ==
  if isint(r)
  then if isint(s) then r <else let i,j in if 0 <then r <else i <fi  fi 
  else let p,q 
       in if isint(s)
          then if 0 <then p <else s <fi 
          else let i,j 
               in if 0 <then p <else i <fi 
          fi 
  fi 

Lemma: q_less_wf
[a,b:ℚ].  (q_less(a;b) ∈ 𝔹)

Lemma: assert-q_less
[a,b:ℚ].  (↑q_less(a;b) a < b)

Lemma: assert-q_less-eq
[a,b:ℚ].  ((↑q_less(a;b)) a < b ∈ ℙ)

Lemma: assert-q_le
[a,b:ℚ].  (↑q_le(a;b) a ≤ b)

Lemma: assert-q_le-eq
[a,b:ℚ].  ((↑q_le(a;b)) (a ≤ b) ∈ ℙ)

Lemma: qmax_ub
a,b,c:ℚ.  (a ≤ qmax(b;c) ⇐⇒ (a ≤ b) ∨ (a ≤ c))

Lemma: qmin_ub
[a,b,c:ℚ].  uiff(a ≤ qmin(b;c);(a ≤ b) ∧ (a ≤ c))

Lemma: qmax_strict_ub
a,b,c:ℚ.  (a < qmax(b;c) ⇐⇒ a < b ∨ a < c)

Lemma: qmin_strict_ub
[a,b,c:ℚ].  uiff(a < qmin(b;c);a < b ∧ a < c)

Lemma: qmax_lb
[a,b,c:ℚ].  uiff(qmax(b;c) ≤ a;(b ≤ a) ∧ (c ≤ a))

Lemma: qmin_lb
a,b,c:ℚ.  (qmin(b;c) ≤ ⇐⇒ (b ≤ a) ∨ (c ≤ a))

Lemma: qmin-assoc
Assoc(ℚx,y. qmin(x;y))

Lemma: qmax-assoc
[x,y,z:ℚ].  (qmax(qmax(x;y);z) qmax(x;qmax(y;z)) ∈ ℚ)

Lemma: qmax_strict_lb
[a,b,c:ℚ].  uiff(qmax(b;c) < a;b < a ∧ c < a)

Lemma: qmin_strict_lb
a,b,c:ℚ.  (qmin(b;c) < ⇐⇒ b < a ∨ c < a)

Lemma: qmin-list-bounds
L:ℚ List
  (0 < ||L||
   (∀x:ℚ
        ((x ≤ qmin-list(L) ⇐⇒ (∀y∈L.x ≤ y))
        ∧ (qmin-list(L) ≤ ⇐⇒ (∃y∈L. y ≤ x))
        ∧ (x < qmin-list(L) ⇐⇒ (∀y∈L.x < y))
        ∧ (qmin-list(L) < ⇐⇒ (∃y∈L. y < x)))))

Lemma: qmax-list-bounds
L:ℚ List
  (0 < ||L||
   (∀x:ℚ
        ((qmax-list(L) ≤ ⇐⇒ (∀y∈L.y ≤ x))
        ∧ (x ≤ qmax-list(L) ⇐⇒ (∃y∈L. x ≤ y))
        ∧ (qmax-list(L) < ⇐⇒ (∀y∈L.y < x))
        ∧ (x < qmax-list(L) ⇐⇒ (∃y∈L. x < y)))))

Lemma: qmax-list-unique
[L:ℚ List]. ∀[a:ℚ].  uiff(qmax-list(L) a ∈ ℚ;(∀b∈L.b ≤ a)) supposing (a ∈ L)

Lemma: qmin-list-unique
[L:ℚ List]. ∀[a:ℚ].  uiff(qmin-list(L) a ∈ ℚ;(∀b∈L.a ≤ b)) supposing (a ∈ L)

Lemma: qmul-zero
a,b:ℚ.  ((a b) 0 ∈ ℚ ⇐⇒ (a 0 ∈ ℚ) ∨ (b 0 ∈ ℚ))

Lemma: qmul-non-neg
a,b:ℚ.  ((a 0 ∈ ℚ) ∨ (b 0 ∈ ℚ) ∨ (0 < a ∧ 0 < b) ∨ (0 < -(a) ∧ 0 < -(b)) ⇐⇒ 0 ≤ (a b))

Lemma: non-neg-qmul
[a,b:ℚ].  (0 ≤ (a b)) supposing ((0 ≤ b) and (0 ≤ a))

Lemma: q-square-non-neg
[q:ℚ]. (0 ≤ (q q))

Lemma: q-square-positive
[q:ℚ]. 0 < supposing ¬(q 0 ∈ ℚ)

Lemma: qadd_preserves_qle
[a,b,c:ℚ].  {uiff(a ≤ b;(c a) ≤ (c b))}

Lemma: qadd_preserves_eq
[a,b,c:ℚ].  uiff(a b ∈ ℚ;(c a) (c b) ∈ ℚ)

Lemma: qmul_preserves_qless
[a,b,c:ℚ].  uiff(a < b;c a < b) supposing 0 < c

Lemma: qmul_preserves_qle
[a,b,c:ℚ].  uiff(a ≤ b;(c a) ≤ (c b)) supposing 0 < c

Lemma: qmul_preserves_qle2
[a,b,c:ℚ].  ((c a) ≤ (c b)) supposing ((a ≤ b) and (0 ≤ c))

Lemma: qmul_reverses_qle
[a,b,c:ℚ].  uiff(a ≤ b;(c b) ≤ (c a)) supposing c < 0

Lemma: qmul_reverses_qless
[a,b,c:ℚ].  uiff(a < b;c b < a) supposing c < 0

Lemma: qmul_reverses_qle2
[a,b,c:ℚ].  uiff(a ≤ b;(b c) ≤ (a c)) supposing c < 0

Lemma: test33
[a,b,c:ℚ].  (b c < c) supposing (c < and a < b)

Lemma: qadd_functionality_wrt_qle
[a,b,c,d:ℚ].  ((a c) ≤ (b d)) supposing ((c ≤ d) and (a ≤ b))

Lemma: qadd_functionality_wrt_qless
[a,b,c,d:ℚ].  (a c < d) supposing ((c ≤ d) and a < b)

Lemma: qadd_functionality_wrt_qless_2
[a,b,c,d:ℚ].  (a c < d) supposing (c < and (a ≤ b))

Lemma: qadd_functionality_wrt_qless_3
[a,b,c,d:ℚ].  (a c < d) supposing (c < and a < b)

Lemma: qle_functionality_wrt_implies
[a,b,c,d:ℚ].  ({a ≤ supposing b ≤ c}) supposing ((c ≤ d) and (b ≥ a))

Lemma: qless_functionality_wrt_implies_1
[a,b,c,d:ℚ].  ({a < supposing b < c}) supposing ((c ≤ d) and (b ≥ a))

Lemma: qadd-qmax
[a,b,c:ℚ].  ((a qmax(b;c)) qmax(a b;a c) ∈ ℚ)

Lemma: qadd-qmin
[a,b,c:ℚ].  ((a qmin(b;c)) qmin(a b;a c) ∈ ℚ)

Lemma: qmul_functionality_wrt_qle
[a,b,c,d:ℚ].  ((a c) ≤ (b d)) supposing ((c ≤ d) and (a ≤ b) and (0 ≤ c) and (0 ≤ a))

Lemma: qmul_functionality_wrt_qless1
[a,b,c,d:ℚ].  (a c < d) supposing (c < and (a ≤ b) and (0 ≤ d) and 0 < a)

Lemma: qmul_functionality_wrt_qless2
[a,b,c,d:ℚ].  (a c < d) supposing ((c ≤ d) and a < and (0 ≤ b) and 0 < c)

Lemma: qmul-positive2
a,b:ℚ.  ((0 < a ∧ 0 < b) ∨ (a < 0 ∧ b < 0) ⇐⇒ 0 < b)

Lemma: qmul-negative
a,b:ℚ.  ((a < 0 ∧ 0 < b) ∨ (0 < a ∧ b < 0) ⇐⇒ b < 0)

Lemma: qmul-qdiv
[a,b,c,d:ℚ].  (((a/c) (b/d)) (a b/c d) ∈ ℚsupposing ((¬(d 0 ∈ ℚ)) and (c 0 ∈ ℚ)))

Lemma: qdiv-qminus
[x,y:ℚ].  (x/-(y)) (-(x)/y) ∈ ℚ supposing ¬(y 0 ∈ ℚ)

Lemma: qabs-qinv
[s:{s:ℚ| ¬(s 0 ∈ ℚ)} ]. (|1/s| 1/|s| ∈ ℚ)

Lemma: qabs-qdiv
[r:ℚ]. ∀[s:{s:ℚ| ¬(s 0 ∈ ℚ)} ].  (|(r/s)| (|r|/|s|) ∈ ℚ)

Lemma: qabs-nonneg
[r:ℚ]. (0 ≤ |r|)

Lemma: qless-minus
[a,b:ℚ].  uiff(a < b;-(b) < -(a))

Lemma: qle-minus
[a,b:ℚ].  uiff(a ≤ b;-(b) ≤ -(a))

Lemma: qle_connex
a,b:ℚ.  ((a ≤ b) ∨ (b ≤ a))

Lemma: qmax-symmetry
[x,y:ℚ].  (qmax(x;y) qmax(y;x) ∈ ℚ)

Lemma: qmin-symmetry
[x,y:ℚ].  (qmin(x;y) qmin(y;x) ∈ ℚ)

Lemma: qmax-idempotent
[q:ℚ]. (qmax(q;q) q ∈ ℚ)

Lemma: qmin-idempotent
[q:ℚ]. (qmin(q;q) q ∈ ℚ)

Lemma: not-qle
[q,r:ℚ].  ((¬(q ≤ r))  r < q)

Lemma: qmax-eq-iff
[q,r,s:ℚ].  uiff(qmax(q;r) s ∈ ℚ;((r ≤ q)  (s q ∈ ℚ)) ∧ ((q ≤ r)  (s r ∈ ℚ)))

Lemma: qmax-eq-iff-cases
q,r,s:ℚ.  uiff(qmax(q;r) s ∈ ℚ;((r ≤ q) ∧ (s q ∈ ℚ)) ∨ ((q ≤ r) ∧ (s r ∈ ℚ)))

Lemma: qmax-eq-iff-1
[q,r:ℚ].  uiff(qmax(q;r) q ∈ ℚ;r ≤ q)

Lemma: qmax-eq-iff-2
[q,r:ℚ].  uiff(qmax(q;r) r ∈ ℚ;q ≤ r)

Lemma: qmin-eq-iff
[q,r,s:ℚ].  uiff(qmin(q;r) s ∈ ℚ;((r ≤ q)  (s r ∈ ℚ)) ∧ ((q ≤ r)  (s q ∈ ℚ)))

Lemma: qmin-eq-iff-cases
q,r,s:ℚ.  uiff(qmin(q;r) s ∈ ℚ;((q ≤ r) ∧ (s q ∈ ℚ)) ∨ ((r ≤ q) ∧ (s r ∈ ℚ)))

Lemma: qmin-eq-iff-1
[q,r:ℚ].  uiff(qmin(q;r) q ∈ ℚ;q ≤ r)

Lemma: qmin-eq-iff-2
[q,r:ℚ].  uiff(qmin(q;r) r ∈ ℚ;r ≤ q)

Lemma: qabs-difference-symmetry
[x,y:ℚ].  (|x y| |y x| ∈ ℚ)

Lemma: qabs-difference-qmax
[a,b,c,d:ℚ].  (|qmax(a;b) qmax(c;d)| ≤ qmax(|a c|;|b d|))

Lemma: qabs-as-qmax
[q:ℚ]. (|q| qmax(q;-(q)) ∈ ℚ)

Lemma: qle-qabs
[q:ℚ]. (q ≤ |q|)

Lemma: qabs-non-zero
[q:ℚ]. uiff(0 < |q|;¬(q 0 ∈ ℚ))

Lemma: rounded-numerator-property
[k:ℕ+]. ∀[r:ℚ].  |(k r) rounded-numerator(r;k)| < 1

Lemma: proportional-round-property
[k,l:ℕ+]. ∀[r:ℚ].  |(k r) proportional-round(r;k;l)| < l

Lemma: qround-property
[k:ℕ+]. ∀[r:ℚ].  |r qround(r;k)| < (1/2 k)

Lemma: qmin-as-qmax
[x,y:ℚ].  (qmin(x;y) -(qmax(-(x);-(y))) ∈ ℚ)

Lemma: qinv-positive
[v:ℚ]. 0 < (1/v) supposing 0 < v

Lemma: qinv-nonneg
[v:ℚ]. 0 ≤ (1/v) supposing 0 < v

Lemma: qinv-negative
[v:ℚ]. (1/v) < supposing v < 0

Lemma: qneginv-positive
[v:ℚ]. 0 < (-1/v) supposing v < 0

Lemma: qinv-zero
[c:ℚ]. ¬(1/c 0 ∈ ℚsupposing ¬(c 0 ∈ ℚ)

Lemma: qdiv-qdiv
[a,b,c:ℚ].  ((a/(b/c)) (a c/b) ∈ ℚsupposing ((¬(c 0 ∈ ℚ)) and (b 0 ∈ ℚ)))

Lemma: qdiv_functionality_wrt_qle
[a,b,c,d:ℚ].  ((a/c) ≤ (b/d)) supposing ((c ≥ d) and (a ≤ b) and 0 < and (0 ≤ a))

Lemma: qdiv_functionality_wrt_qless
[a,b,c,d:ℚ].  ((a/c) < (b/d)) supposing ((c ≥ d) and a < and 0 < and (0 ≤ a))

Lemma: qdiv_functionality_wrt_qless2
[a,b,c,d:ℚ].  ((a/c) < (b/d)) supposing (d < and (a ≤ b) and 0 < and 0 < a)

Lemma: q-ineq-test
[a,b,c:ℚ].  (False) supposing (0 < and ((b ((1/3) c)) ≤ a) and ((a c) ≤ b))

Lemma: qadd-non-neg
[a,b:ℚ].  (0 ≤ (a b)) supposing ((0 ≤ b) and (0 ≤ a))

Lemma: qdiv-non-neg
a,b:ℚ.  (0 < b ∧ (0 ≤ a)) ∨ (b < 0 ∧ (a ≤ 0)) ⇐⇒ 0 ≤ (a/b) supposing ¬(b 0 ∈ ℚ)

Lemma: qdiv-non-neg1
[a,b:ℚ].  0 ≤ (a/b) supposing 0 < b ∧ (0 ≤ a)

Definition: qdist
qdist(r;s) ==  |r s|

Lemma: qdist_wf
[r,s:ℚ].  (qdist(r;s) ∈ ℚ)

Definition: qbetween
a ≤ b ≤ ==  (a ≤ b) ∧ (b ≤ c)

Lemma: qbetween_wf
[a,b,c:ℚ].  (a ≤ b ≤ c ∈ ℙ)

Definition: q-between
a < b < ==  a < b ∧ b < c

Lemma: q-between_wf
[a,b,c:ℚ].  (a < b < c ∈ ℙ)

Lemma: q-between-overlap
a,b,c,d,q:ℚ.
  (∃x,y:ℚ(x < q < y ∧ (∀q':ℚa < q' < b ∧ c < q' < supposing x < q' < y))) supposing (c < q < and a < q < b)

Lemma: qle-normalize
[a,b:ℚ].  uiff(a ≤ b;0 ≤ (b a))

Lemma: qle_reflexivity
[a:ℚ]. (a ≤ a)

Lemma: qbetween-qdist
[a,b,r,s:ℚ].  (qdist(a;b) ≤ (s r)) supposing (r ≤ b ≤ and r ≤ a ≤ s)

Definition: qavg
qavg(a;b) ==  (a b/2)

Lemma: qavg_wf
[a,b:ℚ].  (qavg(a;b) ∈ ℚ)

Lemma: qavg-same
[a:ℚ]. (qavg(a;a) a ∈ ℚ)

Lemma: qavg-eq-iff-1
[a,b:ℚ].  uiff(a qavg(a;b) ∈ ℚ;a b ∈ ℚ)

Lemma: qavg-eq-iff-2
[a,b:ℚ].  uiff(qavg(a;b) a ∈ ℚ;a b ∈ ℚ)

Lemma: qavg-eq-iff-3
[a,b:ℚ].  uiff(qavg(b;a) a ∈ ℚ;a b ∈ ℚ)

Lemma: qavg-eq-iff-4
[a,b:ℚ].  uiff(a qavg(b;a) ∈ ℚ;a b ∈ ℚ)

Lemma: qavg-eq-iff-5
[a,b,c:ℚ].  uiff(qavg(b;a) qavg(a;c) ∈ ℚ;b c ∈ ℚ)

Lemma: qavg-eq-iff-6
[a,b,c:ℚ].  uiff(qavg(a;b) qavg(c;a) ∈ ℚ;b c ∈ ℚ)

Lemma: qavg-eq-iff-7
[a,b,c:ℚ].  uiff(qavg(a;b) qavg(a;c) ∈ ℚ;b c ∈ ℚ)

Lemma: qavg-eq-iff-8
[a,b,c:ℚ].  uiff(qavg(b;a) qavg(c;a) ∈ ℚ;b c ∈ ℚ)

Lemma: qle-qavg-iff-1
[a,b:ℚ].  uiff(a ≤ qavg(a;b);a ≤ b)

Lemma: qless-qavg-iff-1
[a,b:ℚ].  uiff(a < qavg(a;b);a < b)

Lemma: qle-qavg-iff-4
[a,b:ℚ].  uiff(a ≤ qavg(b;a);a ≤ b)

Lemma: qle-qavg-iff-2
[a,b,c:ℚ].  uiff(qavg(a;b) ≤ qavg(a;c);b ≤ c)

Lemma: qle-qavg-iff-3
[a,b,c:ℚ].  uiff(qavg(b;a) ≤ qavg(c;a);b ≤ c)

Lemma: qle-qavg-iff-5
[a,b,c:ℚ].  uiff(qavg(b;a) ≤ qavg(a;c);b ≤ c)

Lemma: qle-qavg-iff-6
[a,b,c:ℚ].  uiff(qavg(a;b) ≤ qavg(c;a);b ≤ c)

Lemma: qavg-qle-iff-1
[a,b:ℚ].  uiff(qavg(a;b) ≤ b;a ≤ b)

Lemma: qavg-qless-iff-1
[a,b:ℚ].  uiff(qavg(a;b) < b;a < b)

Lemma: qavg-qle-iff-2
[a,b:ℚ].  uiff(qavg(b;a) ≤ b;a ≤ b)

Lemma: qavg-between
[a,b:ℚ].  a < qavg(a;b) < supposing a < b

Lemma: qle-mk-rational
[a,c:ℤ]. ∀[b,d:ℕ+].  uiff(mk-rational(a;b) ≤ mk-rational(c;d);(a d) ≤ (b c))

Lemma: qless-mk-rational
[a,c:ℤ]. ∀[b,d:ℕ+].  uiff(mk-rational(a;b) < mk-rational(c;d);a d < c)

Definition: rational-interval
Interval ==  ℚ × ℚ

Lemma: rational-interval_wf
Interval ∈ Type

Definition: rat-sub-interval
rat-sub-interval(I;J) ==  let a,b in let c,d in ((c ≤ a) ∧ (b ≤ d)) ∧ (c <  a < b)

Lemma: rat-sub-interval_wf
[I,J:ℚInterval].  (rat-sub-interval(I;J) ∈ ℙ)

Definition: ri-deq
ri-deq() ==  product-deq(ℚ;ℚ;qdeq();qdeq())

Lemma: ri-deq_wf
ri-deq() ∈ EqDecider(ℚInterval)

Lemma: decidable__equal_rational-interval
I,J:ℚInterval.  Dec(I J ∈ ℚInterval)

Definition: rat-point-interval
[a] ==  <a, a>

Lemma: rat-point-interval_wf
[a:ℚ]. ([a] ∈ ℚInterval)

Definition: rat-interval-face
I ≤ ==  let c,d in (I [c] ∈ ℚInterval) ∨ (I [d] ∈ ℚInterval) ∨ (I J ∈ ℚInterval)

Lemma: rat-interval-face_wf
[I,J:ℚInterval].  (I ≤ J ∈ ℙ)

Lemma: decidable__rat-interval-face
I,J:ℚInterval.  Dec(I ≤ J)

Lemma: rat-interval-face-self
I:ℚInterval. I ≤ I

Definition: inhabited-rat-interval
Inhabited(I) ==  let a,b in q_le(a;b)

Lemma: inhabited-rat-interval_wf
[I:ℚInterval]. (Inhabited(I) ∈ 𝔹)

Lemma: assert-inhabited-rat-interval
[I:ℚInterval]. uiff(↑Inhabited(I);(fst(I)) ≤ (snd(I)))

Lemma: inhabited-rat-point-interval
[a:ℚ]. (Inhabited([a]) tt)

Definition: rat-interval-dimension
dim(I) ==  let a,b in if q_less(a;b) then else fi 

Lemma: rat-interval-dimension_wf
[I:ℚInterval]. (dim(I) ∈ ℕ2)

Lemma: rat-interval-dimension-single
[a:ℚ]. (dim([a]) 0)

Lemma: rat-interval-face-dimension
J:ℚInterval. ((↑Inhabited(J))  (∀I:ℚInterval. (I ≤  ((I J ∈ ℚInterval) ∨ (dim(I) (dim(J) 1) ∈ ℤ)))))

Definition: rat-interval-intersection
I ⋂ ==  let a,b in let c,d in <qmax(a;c), qmin(b;d)>

Lemma: rat-interval-intersection_wf
[I,J:ℚInterval].  (I ⋂ J ∈ ℚInterval)

Lemma: rat-interval-intersection-symm
[I,J:ℚInterval].  (I ⋂ J ⋂ I ∈ ℚInterval)

Lemma: rat-interval-intersection-idemp
[I:ℚInterval]. (I ⋂ I ∈ ℚInterval)

Definition: rational-cube
Cube(k) ==  ℕk ⟶ ℚInterval

Lemma: rational-cube_wf
[k:ℕ]. (ℚCube(k) ∈ Type)

Definition: rat-sub-cube
rat-sub-cube(k;a;b) ==  ∀i:ℕk. rat-sub-interval(a i;b i)

Lemma: rat-sub-cube_wf
[k:ℕ]. ∀[a,b:ℚCube(k)].  (rat-sub-cube(k;a;b) ∈ ℙ)

Lemma: rat-sub-cube_transitivity
[k:ℕ]. ∀a,b,c:ℚCube(k).  (rat-sub-cube(k;a;b)  rat-sub-cube(k;b;c)  rat-sub-cube(k;a;c))

Definition: rc-deq
rc-deq(k) ==  finite-fun-deq(k;ri-deq())

Lemma: rc-deq_wf
[k:ℕ]. (rc-deq(k) ∈ EqDecider(ℚCube(k)))

Lemma: decidable__equal_rc
k:ℕ. ∀x,y:ℚCube(k).  Dec(x y ∈ ℚCube(k))

Definition: rceq
rceq(k;a;b) ==  rc-deq(k) b

Lemma: rceq_wf
[k:ℕ]. ∀[a,b:ℚCube(k)].  (rceq(k;a;b) ∈ 𝔹)

Lemma: assert-rceq
[k:ℕ]. ∀[a,b:ℚCube(k)].  uiff(↑rceq(k;a;b);a b ∈ ℚCube(k))

Definition: rat-cube-face
c ≤ ==  ∀i:ℕk. i ≤ i

Lemma: rat-cube-face_wf
[k:ℕ]. ∀[c,d:ℚCube(k)].  (c ≤ d ∈ ℙ)

Lemma: rat-cube-face-self
[k:ℕ]. ∀c:ℚCube(k). c ≤ c

Lemma: decidable__rat-cube-face
k:ℕ. ∀c,d:ℚCube(k).  Dec(c ≤ d)

Definition: rat-cube-face-decider
rat-cube-face-decider(k;c;d) ==
  eval in
  case int_seg_decide(λk.let a,J1 
                         in let x,x1 
                            in if qeq(a;x)
                                 then if qeq(x1;J1)
                                      then ifunion(qeq(J1;x); ifunion(qeq(x1;a); inr %.Ax) ))
                                      else ifunion(qeq(J1;x); if qeq(x1;a) then inr %.Ax)  else inl %.Ax) fi )
                                      fi 
                               if qeq(J1;x) then if qeq(x1;J1) then inr %.Ax)  else inl %.Ax) fi 
                               else inl %.Ax)
                               fi ;0;x)
   of inl(%6) =>
   inr let k,%7 %6 
       in λ%8.Ax 
   inr(%7) =>
   inl k.let a,J1 
           in let x,x1 
              in if qeq(a;x)
                   then if qeq(x1;J1)
                        then if qeq(J1;x) then if qeq(x1;a) then inl Ax else inr (inl Ax)  fi 
                             if qeq(x1;a) then inl Ax
                             else inr inr Ax  
                             fi 
                        else ifunion(qeq(J1;x); if qeq(x1;a) then inl Ax else Ax fi )
                        fi 
                 if qeq(J1;x) then if qeq(x1;J1) then inr (inl Ax)  else Ax fi 
                 else Ax
                 fi )

Lemma: decidable__rat-cube-face-ext
k:ℕ. ∀c,d:ℚCube(k).  Dec(c ≤ d)

Lemma: rat-cube-face-decider_wf
k:ℕ. ∀c,d:ℚCube(k).  (rat-cube-face-decider(k;c;d) ∈ Dec(c ≤ d))

Definition: is-rat-cube-face
is-rat-cube-face(k;c;d) ==  isl(rat-cube-face-decider(k;c;d))

Lemma: is-rat-cube-face_wf
k:ℕ. ∀c,d:ℚCube(k).  (is-rat-cube-face(k;c;d) ∈ 𝔹)

Lemma: assert-is-rat-cube-face
k:ℕ. ∀c,d:ℚCube(k).  uiff(↑is-rat-cube-face(k;c;d);c ≤ d)

Definition: is-half-interval
is-half-interval(I;J) ==  let a,b in let c,d in (qeq(a;c) ∧b qeq(b;qavg(c;d))) ∨b(qeq(a;qavg(c;d)) ∧b qeq(b;d))

Lemma: is-half-interval_wf
[I,J:ℚInterval].  (is-half-interval(I;J) ∈ 𝔹)

Lemma: is-half-interval-sub-interval
I,J:ℚInterval.  (rat-sub-interval(I;J)) supposing ((↑is-half-interval(I;J)) and (↑Inhabited(J)))

Lemma: half-point-interval
[I:ℚInterval]. ∀[a:ℚ].  [a] ∈ ℚInterval supposing ↑is-half-interval(I;[a])

Definition: is-half-cube
is-half-cube(k;h;c) ==  bdd-all(k;i.is-half-interval(h i;c i))

Lemma: is-half-cube_wf
[k:ℕ]. ∀[h,c:ℚCube(k)].  (is-half-cube(k;h;c) ∈ 𝔹)

Lemma: assert-is-half-cube
[k:ℕ]. ∀[h,c:ℚCube(k)].  uiff(↑is-half-cube(k;h;c);∀i:ℕk. (↑is-half-interval(h i;c i)))

Definition: rat-cube-intersection
c ⋂ ==  λi.c i ⋂ i

Lemma: rat-cube-intersection_wf
[k:ℕ]. ∀[c,d:ℚCube(k)].  (c ⋂ d ∈ ℚCube(k))

Lemma: rat-cube-intersection-symm
[k:ℕ]. ∀[c,d:ℚCube(k)].  (c ⋂ d ⋂ c ∈ ℚCube(k))

Lemma: rat-cube-intersection-idemp
[k:ℕ]. ∀[c:ℚCube(k)].  (c ⋂ c ∈ ℚCube(k))

Definition: rat-point-in-cube
rat-point-in-cube(k;x;c) ==  ∀i:ℕk. (((fst((c i))) ≤ (x i)) ∧ ((x i) ≤ (snd((c i)))))

Lemma: rat-point-in-cube_wf
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[c:ℚCube(k)].  (rat-point-in-cube(k;x;c) ∈ ℙ)

Lemma: rat-point-in-intersection
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[c,d:ℚCube(k)].
  uiff(rat-point-in-cube(k;x;c ⋂ d);rat-point-in-cube(k;x;c) ∧ rat-point-in-cube(k;x;d))

Lemma: rat-point-in-half-cube
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[c,d:ℚCube(k)].
  (rat-point-in-cube(k;x;c)) supposing (rat-point-in-cube(k;x;d) and (↑is-half-cube(k;d;c)))

Definition: inhabited-rat-cube
Inhabited(c) ==  bdd-all(k;i.Inhabited(c i))

Lemma: inhabited-rat-cube_wf
[k:ℕ]. ∀[c:ℚCube(k)].  (Inhabited(c) ∈ 𝔹)

Lemma: assert-inhabited-rat-cube
[k:ℕ]. ∀[c:ℚCube(k)].  uiff(↑Inhabited(c);∀i:ℕk. (↑Inhabited(c i)))

Lemma: inhabited-rat-cube-iff-point
[k:ℕ]. ∀c:ℚCube(k). uiff(↑Inhabited(c);∃x:ℕk ⟶ ℚrat-point-in-cube(k;x;c))

Lemma: is-half-cube-sub-cube
[k:ℕ]. ∀h,c:ℚCube(k).  (rat-sub-cube(k;h;c)) supposing ((↑is-half-cube(k;h;c)) and (↑Inhabited(c)))

Lemma: rat-point-in-face
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[c,d:ℚCube(k)].
  (rat-point-in-cube(k;x;c)) supposing (rat-point-in-cube(k;x;d) and d ≤ and (↑Inhabited(c)))

Lemma: inhabited-rat-cube-face
[k:ℕ]. ∀[c:ℚCube(k)].  ((↑Inhabited(c))  (∀f:ℚCube(k). (f ≤  (↑Inhabited(f)))))

Definition: rat-point-in-cube-interior
rat-point-in-cube-interior(k;x;a) ==
  ∀i:ℕk
    ((((fst((a i))) ≤ (x i)) ∧ ((x i) ≤ (snd((a i)))))
    ∧ (fst((a i)) < snd((a i))  (fst((a i)) < i ∧ i < snd((a i)))))

Lemma: rat-point-in-cube-interior_wf
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[a:ℚCube(k)].  (rat-point-in-cube-interior(k;x;a) ∈ ℙ)

Lemma: center-point-in-cube-interior
[k:ℕ]. ∀[a:ℚCube(k)].  rat-point-in-cube-interior(k;λj.qavg(fst((a j));snd((a j)));a) supposing ↑Inhabited(a)

Lemma: rat-point-in-cube-interior-not-in-face
[k:ℕ]. ∀[x:ℕk ⟶ ℚ]. ∀[a:ℚCube(k)].
  ∀f:ℚCube(k). (f ≤  rat-point-in-cube(k;x;f)  (f a ∈ ℚCube(k))) supposing rat-point-in-cube-interior(k;x;a)

Definition: has-interior-point
has-interior-point(k;c;a) ==  ∃x:ℕk ⟶ ℚ(rat-point-in-cube(k;x;c) ∧ rat-point-in-cube-interior(k;x;a))

Lemma: has-interior-point_wf
[k:ℕ]. ∀[c,a:ℚCube(k)].  (has-interior-point(k;c;a) ∈ ℙ)

Definition: rat-cube-dimension
dim(c) ==  if Inhabited(c) then Σ(dim(c i) i < k) else -1 fi 

Lemma: rat-cube-dimension_wf
[k:ℕ]. ∀[c:ℚCube(k)].  (dim(c) ∈ {-1..k 1-})

Lemma: rat-cube-dimension-0
[k:ℕ]. ∀[c:ℚCube(k)].  uiff(dim(c) 0 ∈ ℤ;(↑Inhabited(c)) ∧ (∀i:ℕk. (dim(c i) 0 ∈ ℤ)))

Lemma: rat-cube-dimension-1
k:ℕ. ∀c:ℚCube(k).
  uiff(dim(c) 1 ∈ ℤ;(↑Inhabited(c)) ∧ (∃i:ℕk. ((dim(c i) 1 ∈ ℤ) ∧ (∀j:ℕk. ((¬(j i ∈ ℤ))  (dim(c j) 0 ∈ ℤ))))))

Lemma: rat-cube-dimension-zero
[k:ℕ]. ∀[c:ℚCube(k)].  uiff(dim(c) 0 ∈ ℤ;∀i:ℕk. ((fst((c i))) (snd((c i))) ∈ ℚ))

Lemma: rat-cube-dimension-one
k:ℕ. ∀c:ℚCube(k).
  (dim(c) 1 ∈ ℤ ⇐⇒ ∃i:ℕk. (fst((c i)) < snd((c i)) ∧ (∀j:ℕk. ((¬(j i ∈ ℤ))  ((fst((c j))) (snd((c j))) ∈ ℚ)))))

Lemma: positive-rat-cube-dimension
k:ℕ. ∀c:ℚCube(k).  (0 < dim(c)  (∃i:ℕk. (dim(c i) 1 ∈ ℤ)))

Lemma: rat-cube-face-dimension-equal
[k:ℕ]. ∀[c:ℚCube(k)].  ∀f:ℚCube(k). (f c ∈ ℚCube(k)) supposing ((dim(f) dim(c) ∈ ℤand f ≤ c) supposing ↑Inhabited\000C(c)

Lemma: half-cubes-listable
k:ℕ. ∀c:{c:ℚCube(k)| ↑Inhabited(c)} .
  (∃L:ℚCube(k) List [(no_repeats(ℚCube(k);L) ∧ (∀h:ℚCube(k). ((h ∈ L) ⇐⇒ ↑is-half-cube(k;h;c))))])

Definition: half-cubes
half-cubes(k) ==
  primrec(k;λc.<λx.x, Ax>i,x,c. if dim(c ((i 1) 1))=1
                                  then let v1,v2 ((i 1) 1) 
                                       in if q_less(v1;v2)
                                          then map(λh,i@0. if i@0 <(i 1) then i@0 else <v1, qavg(v1;v2)> fi ;x\000C c)
                                               map(λh,i@0. if i@0 <(i 1) then i@0 else <qavg(v1;v2), v2> fi \000C;x c)
                                          else Ax
                                          fi 
                                  else map(λh,i@0. if i@0 <(i 1) then i@0 else i@0 fi ;x c))

Lemma: half-cubes-listable-ext
k:ℕ. ∀c:{c:ℚCube(k)| ↑Inhabited(c)} .
  (∃L:ℚCube(k) List [(no_repeats(ℚCube(k);L) ∧ (∀h:ℚCube(k). ((h ∈ L) ⇐⇒ ↑is-half-cube(k;h;c))))])

Lemma: half-cubes_wf
[k:ℕ]
  (half-cubes(k) ∈ c:{c:ℚCube(k)| ↑Inhabited(c)}  ⟶ {L:ℚCube(k) List| 
                                   no_repeats(ℚCube(k);L) ∧ (∀h:ℚCube(k). ((h ∈ L) ⇐⇒ ↑is-half-cube(k;h;c)))} )

Definition: half-cubes-of
half-cubes-of(k;c) ==  half-cubes(k) c

Lemma: half-cubes-of_wf
[k:ℕ]. ∀[c:{c:ℚCube(k)| ↑Inhabited(c)} ].
  (half-cubes-of(k;c) ∈ {L:ℚCube(k) List| no_repeats(ℚCube(k);L) ∧ (∀h:ℚCube(k). ((h ∈ L) ⇐⇒ ↑is-half-cube(k;h;c)))} )

Lemma: half-cube-dimension
[k:ℕ]. ∀[c:{c:ℚCube(k)| ↑Inhabited(c)} ]. ∀[h:ℚCube(k)].  ((↑is-half-cube(k;h;c))  (dim(h) dim(c) ∈ ℤ))

Lemma: has-interior-point-implies
[k:ℕ]. ∀[c,a:ℚCube(k)].
  (has-interior-point(k;c;a)  dim(c) < dim(a)  (∀d:ℚCube(k). ((↑is-half-cube(k;c;d))  d ≤ a))))

Definition: immediate-rc-face
immediate-rc-face(k;f;c) ==  f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ)

Lemma: immediate-rc-face_wf
[k:ℕ]. ∀[f,c:ℚCube(k)].  (immediate-rc-face(k;f;c) ∈ ℙ)

Lemma: immediate-rc-face-implies
k:ℕ. ∀f,c:ℚCube(k).
  (0 < dim(c)
   immediate-rc-face(k;f;c)
   (∃i:ℕk
       ((dim(c i) 1 ∈ ℤ)
       ∧ (∀j:ℕk. ((¬(j i ∈ ℤ))  ((f j) (c j) ∈ ℚInterval)))
       ∧ (((f i) [fst((c i))] ∈ ℚInterval) ∨ ((f i) [snd((c i))] ∈ ℚInterval)))))

Lemma: compatible-rat-intervals-iff
I,J:ℚInterval.
  ((↑Inhabited(I))
   (↑Inhabited(J))
   (↑Inhabited(I ⋂ J))
   (I ⋂ J ≤ I ∧ I ⋂ J ≤ ⇐⇒ (I J ∈ ℚInterval) ∨ ((snd(I)) (fst(J)) ∈ ℚ) ∨ ((snd(J)) (fst(I)) ∈ ℚ)))

Definition: compatible-rat-cubes
Compatible(c;d) ==  (↑Inhabited(c ⋂ d))  (c ⋂ d ≤ c ∧ c ⋂ d ≤ d)

Lemma: compatible-rat-cubes_wf
[k:ℕ]. ∀[c,d:ℚCube(k)].  (Compatible(c;d) ∈ ℙ)

Lemma: compatible-rat-cubes-symm
[k:ℕ]. ∀[c,d:ℚCube(k)].  (Compatible(c;d)  Compatible(d;c))

Lemma: compatible-rat-cubes-refl
[k:ℕ]. ∀[c:ℚCube(k)].  ∀d:ℚCube(k). ((c d ∈ ℚCube(k))  Compatible(d;c))

Lemma: faces-of-compatible-rat-cubes
k:ℕ. ∀f,g,c,d:ℚCube(k).  ((↑Inhabited(c))  (↑Inhabited(d))  f ≤  g ≤  Compatible(c;d)  Compatible(f;g))

Lemma: decidable__compatible-rat-cubes
k:ℕ. ∀c,d:ℚCube(k).  Dec(Compatible(c;d))

Lemma: sq_stable__compatible-rat-cubes
k:ℕ. ∀c,d:ℚCube(k).  SqStable(Compatible(c;d))

Lemma: inhabited-half-cube
k:ℕ. ∀a,b:ℚCube(k).  ((↑is-half-cube(k;a;b))  (↑Inhabited(a) ⇐⇒ ↑Inhabited(b)))

Lemma: inhabited-intersection-half-cubes
k:ℕ. ∀a,b,c,d:ℚCube(k).
  ((↑is-half-cube(k;c;a))  (↑is-half-cube(k;d;b))  (↑Inhabited(c ⋂ d))  (↑Inhabited(a ⋂ b)))

Lemma: common-face-inhabited-intersection
k:ℕ. ∀a,b,b':ℚCube(k).  ((↑Inhabited(b'))  (↑Inhabited(b))  (a ≤ b ∧ a ≤ b')  (↑Inhabited(b ⋂ b')))

Lemma: face-of-intersection
k:ℕ. ∀a,b,b':ℚCube(k).  ((↑Inhabited(b'))  (↑Inhabited(b))  (a ≤ b ∧ a ≤ b')  a ≤ b ⋂ b')

Lemma: compatible-half-cubes
k:ℕ. ∀a,b,c,d:ℚCube(k).  ((↑is-half-cube(k;c;a))  (↑is-half-cube(k;d;b))  Compatible(a;b)  Compatible(c;d))

Lemma: same-half-cube-of-compatible
k:ℕ. ∀a,b,c:ℚCube(k).
  ((↑Inhabited(c))  (↑is-half-cube(k;c;a))  (↑is-half-cube(k;c;b))  Compatible(a;b)  (a b ∈ ℚCube(k)))

Lemma: compatible-cubes-with-interior-point
k:ℕ. ∀a,b:ℚCube(k).
  (a ≤ b) supposing ((∃x:ℕk ⟶ ℚ(rat-point-in-cube-interior(k;x;a) ∧ rat-point-in-cube(k;x;b))) and Compatible(a;b))

Lemma: compatible-same-dim-cubes-with-interior-point
[k:ℕ]. ∀[a,b:ℚCube(k)].
  (a b ∈ ℚCube(k)) supposing 
     ((∃x:ℕk ⟶ ℚ(rat-point-in-cube-interior(k;x;a) ∧ rat-point-in-cube(k;x;b))) and 
     Compatible(a;b) and 
     (dim(a) dim(b) ∈ ℤ))

Lemma: half-cube-of-face
k:ℕ. ∀a,b,c,d,e:ℚCube(k).
  (Compatible(a;e)
   b ≤ e
   d ≤ c
   (b ≤ a) supposing ((↑Inhabited(e)) and (↑Inhabited(a)) and (↑is-half-cube(k;c;a)) and (↑is-half-cube(k;d;b))))

Lemma: face-of-half-cube
k:ℕ. ∀a,b,c:ℚCube(k).  (b ≤  (↑is-half-cube(k;a;b))  (∃!d:ℚCube(k). ((↑is-half-cube(k;d;c)) ∧ a ≤ d)))

Lemma: extend-half-cube-face
k:ℕ. ∀a,b,c:ℚCube(k).
  (0 < dim(c)
   a ≤ b
   (↑is-half-cube(k;b;c))
   (dim(a) (dim(b) 1) ∈ ℤ)
   (((∃!d:ℚCube(k). ((↑is-half-cube(k;a;d)) ∧ d ≤ c))
     ∧ (∀b':ℚCube(k). ((↑is-half-cube(k;b';c))  a ≤ b'  (b' b ∈ ℚCube(k)))))
     ∨ ((∃!b':ℚCube(k). (a ≤ b' ∧ (↑is-half-cube(k;b';c)) ∧ (b' b ∈ ℚCube(k))))) ∧ has-interior-point(k;a;c))))

Definition: rational-cube-complex
n-dim-complex ==  {L:ℚCube(k) List| no_repeats(ℚCube(k);L) ∧ (∀c,d∈L.  Compatible(c;d)) ∧ (∀c∈L.dim(c) n ∈ ℤ)} 

Lemma: rational-cube-complex_wf
[k,n:ℕ].  (n-dim-complex ∈ Type)

Lemma: member-rat-cube-complex-inhabited
[k:ℕ]. ∀[c:ℚCube(k)].  ↑Inhabited(c) supposing ∃n:ℕ. ∃K:n-dim-complex. (c ∈ K)

Definition: rat-cube-sub-complex
rat-cube-sub-complex(P;L) ==  filter(P;L)

Lemma: rat-cube-sub-complex_wf
[k,n:ℕ]. ∀[K:n-dim-complex]. ∀[P:{x:ℚCube(k)| (x ∈ K)}  ⟶ 𝔹].  (rat-cube-sub-complex(P;K) ∈ n-dim-complex)

Definition: lower-rc-face
lower-rc-face(c;j) ==  λi.if (i =z j) then [fst((c i))] else fi 

Lemma: lower-rc-face_wf
[k:ℕ]. ∀[c:ℚCube(k)]. ∀[j:ℕk].  (lower-rc-face(c;j) ∈ ℚCube(k))

Lemma: lower-rc-face-is-face
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.  lower-rc-face(c;j) ≤ c

Lemma: inhabited-lower-rc-face
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.  ((↑Inhabited(c j))  Inhabited(lower-rc-face(c;j)) Inhabited(c))

Lemma: lower-rc-face-dimension
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.
  ((↑Inhabited(c))  (dim(lower-rc-face(c;j)) if (dim(c j) =z 0) then dim(c) else dim(c) fi  ∈ ℤ))

Definition: upper-rc-face
upper-rc-face(c;j) ==  λi.if (i =z j) then [snd((c i))] else fi 

Lemma: upper-rc-face_wf
[k:ℕ]. ∀[c:ℚCube(k)]. ∀[j:ℕk].  (upper-rc-face(c;j) ∈ ℚCube(k))

Lemma: upper-rc-face-is-face
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.  upper-rc-face(c;j) ≤ c

Lemma: inhabited-upper-rc-face
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.  ((↑Inhabited(c j))  Inhabited(upper-rc-face(c;j)) Inhabited(c))

Lemma: upper-rc-face-dimension
k:ℕ. ∀c:ℚCube(k). ∀j:ℕk.
  ((↑Inhabited(c))  (dim(upper-rc-face(c;j)) if (dim(c j) =z 0) then dim(c) else dim(c) fi  ∈ ℤ))

Lemma: positive-rat-cube-immediate-face
k:ℕ. ∀c:ℚCube(k).  (0 < dim(c)  (∃f:ℚCube(k). immediate-rc-face(k;f;c)))

Definition: rat-cube-faces
rat-cube-faces(k;c) ==  concat(mapfilter(λj.[lower-rc-face(c;j); upper-rc-face(c;j)];λj.(dim(c j) =z 1);upto(k)))

Lemma: rat-cube-faces_wf
[k:ℕ]. ∀[c:ℚCube(k)].  rat-cube-faces(k;c) ∈ {f:ℚCube(k)| f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ)}  List supposing ↑Inhabit\000Ced(c)

Lemma: implies-member-rat-cube-faces
k:ℕ. ∀c:ℚCube(k).
  ∀f:{f:ℚCube(k)| f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ)} (f ∈ rat-cube-faces(k;c)) supposing ↑Inhabited(c)

Lemma: member-rat-cube-faces
k:ℕ. ∀c:ℚCube(k).
  ∀f:ℚCube(k). ((f ∈ rat-cube-faces(k;c)) ⇐⇒ f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ)) supposing ↑Inhabited(c)

Lemma: length-rat-cube-faces
k:ℕ. ∀c:ℚCube(k).  ((↑Inhabited(c))  (||rat-cube-faces(k;c)|| (2 dim(c)) ∈ ℤ))

Lemma: no_repeats-rat-cube-faces
k:ℕ. ∀c:ℚCube(k).  no_repeats(ℚCube(k);rat-cube-faces(k;c))

Definition: face-complex
face-complex(k;L) ==  remove-repeats(rc-deq(k);concat(map(λc.if Inhabited(c) then rat-cube-faces(k;c) else [] fi ;L)))

Lemma: member-face-complex
k:ℕ. ∀K:ℚCube(k) List. ∀f:ℚCube(k).
  ((f ∈ face-complex(k;K)) ⇐⇒ ∃c:ℚCube(k). ((c ∈ K) ∧ (↑Inhabited(c)) ∧ (f ∈ rat-cube-faces(k;c))))

Lemma: face-complex_wf
[k:ℕ]. ∀[n:ℕ+]. ∀[K:n-dim-complex].  (face-complex(k;K) ∈ 1-dim-complex)

Definition: in-complex-boundary
in-complex-boundary(k;f;K) ==  isOdd(||filter(λc.is-rat-cube-face(k;f;c);K)||)

Lemma: in-complex-boundary_wf
[k:ℕ]. ∀[f:ℚCube(k)]. ∀[K:ℚCube(k) List].  (in-complex-boundary(k;f;K) ∈ 𝔹)

Definition: rat-complex-boundary
(K) ==  rat-cube-sub-complex(λf.in-complex-boundary(k;f;K);face-complex(k;K))

Lemma: boundary-of-0-dim-is-nil
[k:ℕ]. ∀[K:ℚCube(k) List].  ∂(K) [] supposing (∀c∈K.dim(c) 0 ∈ ℤ)

Lemma: rat-complex-boundary_wf
[k,n:ℕ]. ∀[K:n-dim-complex].  (∂(K) ∈ 1-dim-complex)

Lemma: rat-complex-boundary-0-dim
[k:ℕ]. ∀[K:0-dim-complex].  (∂(K) [])

Definition: singleton-complex
singleton-complex(c) ==  [c]

Lemma: singleton-complex_wf
[k,n:ℕ]. ∀[c:{c:ℚCube(k)| dim(c) n ∈ ℤ].  (singleton-complex(c) ∈ n-dim-complex)

Lemma: boundary-singleton-complex
[k,n:ℕ]. ∀[c:{c:ℚCube(k)| dim(c) n ∈ ℤ].  (∂(singleton-complex(c)) remove-repeats(rc-deq(k);rat-cube-faces(k;c)))

Lemma: member-rat-complex-boundary
k:ℕ. ∀K:ℚCube(k) List. ∀f:ℚCube(k).
  ((f ∈ ∂(K))
  ⇐⇒ (∃c:ℚCube(k). ((c ∈ K) ∧ (↑Inhabited(c)) ∧ f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ))) ∧ (↑in-complex-boundary(k;f;K)))

Lemma: member-rat-complex-boundary-n
n,k:ℕ. ∀K:n-dim-complex. ∀f:ℚCube(k).  ((f ∈ ∂(K)) ⇐⇒ (↑in-complex-boundary(k;f;K)) ∧ (dim(f) (n 1) ∈ ℤ))

Lemma: rat-complex-boundary-remove1
k,n:ℕ. ∀K:n-dim-complex. ∀c:ℚCube(k).
  ((c ∈ K)
   (∀f:ℚCube(k)
        ((f ∈ ∂(rat-cube-sub-complex(λa.(¬brceq(k;a;c));K)))
        ⇐⇒ ((f ∈ ∂(K)) ∧ f ≤ c)) ∨ ((¬(f ∈ ∂(K))) ∧ f ≤ c ∧ (dim(f) (dim(c) 1) ∈ ℤ)))))

Lemma: length-rat-complex-boundary-even
k,n:ℕ. ∀K:n-dim-complex.  (↑isEven(||∂(K)||))

Lemma: face-of-face-pairity
k:ℕ. ∀a,b,c:ℚCube(k).
  (1 < dim(c)
   immediate-rc-face(k;a;b)
   immediate-rc-face(k;b;c)
   (∃!b':ℚCube(k). (immediate-rc-face(k;a;b') ∧ immediate-rc-face(k;b';c) ∧ (b' b ∈ ℚCube(k))))))

Lemma: rat-complex-boundary-boundary
[k,n:ℕ]. ∀[K:n-dim-complex].  (∂(∂(K)) [])

Definition: rat-complex-subdiv
(K)' ==  concat(map(λc.half-cubes-of(k;c);K))

Lemma: member-rat-complex-subdiv
k:ℕ. ∀K:{c:ℚCube(k)| ↑Inhabited(c)}  List. ∀c:ℚCube(k).
  ((c ∈ (K)') ⇐⇒ ∃a:ℚCube(k). ((a ∈ K) ∧ (↑is-half-cube(k;c;a))))

Lemma: rat-complex-subdiv_wf
[k,n:ℕ]. ∀[K:n-dim-complex].  ((K)' ∈ n-dim-complex)

Lemma: member-rat-complex-subdiv2
k,n:ℕ. ∀K:n-dim-complex. ∀c:ℚCube(k).  ((c ∈ (K)') ⇐⇒ ∃a:ℚCube(k). ((a ∈ K) ∧ (↑is-half-cube(k;c;a))))

Lemma: member-rat-complex-subdiv-sub-cube
k,n:ℕ. ∀K:n-dim-complex. ∀c:ℚCube(k).  ((c ∈ (K)')  (∃a:ℚCube(k). ((a ∈ K) ∧ rat-sub-cube(k;c;a))))

Lemma: rat-complex-subdiv-non-nil
[k,n:ℕ]. ∀[K:n-dim-complex].  0 < ||(K)'|| supposing 0 < ||K||

Lemma: equal-rat-cube-complexes
k:ℕ
  ∀[n:ℕ]
    ∀K,L:n-dim-complex.
      uiff(permutation(ℚCube(k);K;L);∀c:{c:ℚCube(k)| (↑Inhabited(c)) ∧ (dim(c) n ∈ ℤ)} ((c ∈ K) ⇐⇒ (c ∈ L)))

Lemma: rat-complex-boundary-subdiv
k,n:ℕ. ∀K:n-dim-complex.  permutation(ℚCube(k);∂((K)');(∂(K))')

Definition: rat-complex-iter-subdiv
K'^(n) ==  primrec(n;K;λi,c. (c)')

Lemma: rat-complex-iter-subdiv_wf
[k,n:ℕ]. ∀[K:n-dim-complex]. ∀[j:ℕ].  (K'^(j) ∈ n-dim-complex)

Lemma: rat-complex-boundary-iter-subdiv
k,n,j:ℕ. ∀K:n-dim-complex.  permutation(ℚCube(k);∂(K'^(j));∂(K)'^(j))

Lemma: member-iter-subdiv-sub-cube
k,n,j:ℕ. ∀K:n-dim-complex. ∀c:ℚCube(k).  ((c ∈ K'^(j))  (∃a:ℚCube(k). ((a ∈ K) ∧ rat-sub-cube(k;c;a))))

Definition: qsum
Σa ≤ j < b. E[j] ==  Σ(<ℚ+*>a ≤ j < b. E[j]

Lemma: qsum_wf
[a,b:ℤ]. ∀[E:{a..b-} ⟶ ℚ].  a ≤ j < b. E[j] ∈ ℚ)

Lemma: qsum_unroll
[a,b:ℤ]. ∀[E:{a..b-} ⟶ ℚ].  a ≤ j < b. E[j] if a <then Σa ≤ j < 1. E[j] E[b 1] else fi )

Definition: q-rng-nexp
q-rng-nexp(r;n) ==  r ↑<ℚ+*> n

Lemma: q-rng-nexp_wf
[r:ℚ]. ∀[n:ℕ].  (q-rng-nexp(r;n) ∈ ℚ)

Definition: qexp
r ↑ ==  eval in let a,b qrep(r) in mk-rational(a^n;b^n)

Lemma: qexp_wf
[r:ℚ]. ∀[n:ℕ].  (r ↑ n ∈ ℚ)

Lemma: qexp-eq-q-rng-nexp
[n:ℕ]. ∀[r:ℚ].  (r ↑ q-rng-nexp(r;n) ∈ ℚ)

Lemma: exp_zero_q
[e:ℚ]. (e ↑ 1 ∈ ℚ)

Lemma: exp_unroll_q
[n:ℕ+]. ∀[e:ℚ].  (e ↑ (e ↑ e) ∈ ℚ)

Lemma: qexp_step
[n:ℕ]. ∀[e:ℚ].  (e ↑ (e ↑ e) ∈ ℚ)

Lemma: sum_unroll_base_q
[i,j:ℤ].  ∀[E:{i..j-} ⟶ ℚ]. i ≤ k < j. E[k] 0 ∈ ℚsupposing j ∈ ℤ

Lemma: sum_unroll_hi_q
[i,j:ℤ].  ∀[E:{i..j-} ⟶ ℚ]. i ≤ k < j. E[k] i ≤ k < 1. E[k] E[j 1]) ∈ ℚsupposing i < j

Lemma: sum_unroll_unit_q
[i,j:ℤ].  ∀[E:{i..j-} ⟶ ℚ]. i ≤ k < j. E[k] E[i] ∈ ℚsupposing (i 1) j ∈ ℤ

Lemma: sum_unroll_lo_q
[i,j:ℤ].  ∀[E:{i..j-} ⟶ ℚ]. i ≤ k < j. E[k] (E[i] + Σ1 ≤ k < j. E[k]) ∈ ℚsupposing i < j

Lemma: sum_shift_q
[a,b:ℤ].  ∀[E:{a..b-} ⟶ ℚ]. ∀[k:ℤ].  a ≤ j < b. E[j] = Σk ≤ j < k. E[j k] ∈ ℚsupposing a ≤ b

Lemma: sum_split_q
[a,b,c:ℤ].
  (∀[E:{a..c-} ⟶ ℚ]. a ≤ j < c. E[j] a ≤ j < b. E[j] + Σb ≤ j < c. E[j]) ∈ ℚ)) supposing ((b ≤ c) and (a ≤ b))

Lemma: sum_plus_q
[a,b:ℤ].  ∀[E,F:{a..b-} ⟶ ℚ].  a ≤ i < b. E[i] F[i] a ≤ i < b. E[i] + Σa ≤ i < b. F[i]) ∈ ℚsupposing a ≤ b

Lemma: prod_sum_l_q
[a,b:ℤ].  ∀[E:{a..b-} ⟶ ℚ]. ∀[u:ℚ].  ((u * Σa ≤ j < b. E[j]) = Σa ≤ j < b. E[j] ∈ ℚsupposing a ≤ b

Lemma: prod_sum_r_q
[a,b:ℤ].  ∀[E:{a..b-} ⟶ ℚ]. ∀[u:ℚ].  ((Σa ≤ j < b. E[j] u) = Σa ≤ j < b. E[j] u ∈ ℚsupposing a ≤ b

Lemma: binomial_q
[a,b:ℚ]. ∀[n:ℕ].  (a b ↑ = Σ0 ≤ i < 1. choose(n;i) ⋅<ℚ+*> (a ↑ b ↑ i) ∈ ℚ)

Lemma: sum_of_geometric_prog_q
[a:ℚ]. ∀[n:ℕ].  (((1 -(a)) * Σ0 ≤ i < n. a ↑ i) (1 -(a ↑ n)) ∈ ℚ)

Lemma: qsum-int
[i,j:ℤ]. ∀[X:{i..j-} ⟶ ℤ].  i ≤ x < j. X[x] ∈ ℤ)

Lemma: qsum-qle
[a,b:ℤ]. ∀[E,F:{a..b-} ⟶ ℚ].  Σa ≤ j < b. E[j] ≤ Σa ≤ j < b. F[j] supposing ∀j:ℤ((a ≤ j)  j <  (E[j] ≤ F[j]))

Definition: delta
delta(i;j) ==  if (i =z j) then else fi 

Lemma: delta_wf
[i,j:ℤ].  (delta(i;j) ∈ ℕ2)

Lemma: qsum-delta
[a,b:ℤ]. ∀[E:{a..b-} ⟶ ℚ]. ∀[i:ℤ].  a ≤ j < b. E[j] delta(i;j) if a ≤i ∧b i <then E[i] else fi  ∈ ℚ)

Lemma: summand-qle-sum
[a,b:ℤ]. ∀[E:{a..b-} ⟶ ℚ].  ∀[i:{a..b-}]. (E[i] ≤ Σa ≤ j < b. E[j]) supposing ∀j:{a..b-}. (0 ≤ E[j])

Lemma: qexp-zero
[r:ℚ]. (r ↑ 1 ∈ ℚ)

Lemma: qexp-exp
[n:ℕ]. ∀[x:ℤ].  (x ↑ x^n ∈ ℚ)

Lemma: qexp-sign
n:ℕ. ∀r:ℚ.
  ((0 < r ↑ ⇐⇒ (n 0 ∈ ℤ) ∨ 0 < r ∨ (r < 0 ∧ (↑isEven(n))))
  ∧ (r ↑ n < ⇐⇒ r < 0 ∧ (↑isOdd(n)))
  ∧ (r ↑ 0 ∈ ℚ ⇐⇒ (r 0 ∈ ℚ) ∧ (n 0 ∈ ℤ))))

Lemma: qexp-positive
[n:ℕ]. ∀[r:ℚ].  0 < r ↑ supposing 0 < r

Lemma: qexp-positive-iff
n:ℕ. ∀r:ℚ.  (0 < r ↑ ⇐⇒ (n 0 ∈ ℤ) ∨ 0 < r ∨ (r < 0 ∧ (↑isEven(n))))

Lemma: qexp-non-zero
[n:ℕ]. ∀[r:ℚ].  ¬(r ↑ 0 ∈ ℚsupposing ¬(r 0 ∈ ℚ)

Lemma: qexp-nonneg
[n:ℕ]. ∀[r:ℚ].  0 ≤ r ↑ supposing 0 ≤ r

Lemma: qexp-one
[n:ℕ]. (1 ↑ 1 ∈ ℚ)

Lemma: qexp-minus-one
[n:ℕ]. (-1 ↑ if (n rem =z 0) then else -1 fi  ∈ ℚ)

Lemma: qexp1
[q:ℚ]. (q ↑ q ∈ ℚ)

Lemma: qexp2
[q:ℚ]. (q ↑ (q q) ∈ ℚ)

Lemma: qexp_preserves_qle
[a,b:ℚ].  (∀[n:ℕ]. (a ↑ n ≤ b ↑ n)) supposing ((a ≤ b) and (0 ≤ a))

Lemma: qexp_preserves_qless
[a,b:ℚ].  (∀[n:ℕ]. a ↑ n < b ↑ supposing 0 < n) supposing (a < and (0 ≤ a))

Lemma: qexp-qmul
[a,b:ℚ]. ∀[n:ℕ].  (a b ↑ (a ↑ b ↑ n) ∈ ℚ)

Lemma: qexp-add
[m,n:ℕ]. ∀[b:ℚ].  (b ↑ (b ↑ b ↑ m) ∈ ℚ)

Lemma: qexp-mul
[m,n:ℕ]. ∀[b:ℚ].  (b ↑ b ↑ n ↑ m ∈ ℚ)

Lemma: qexp-qdiv
[a,b:ℚ].  ∀[n:ℕ]. ((a/b) ↑ (a ↑ n/b ↑ n) ∈ ℚsupposing ¬(b 0 ∈ ℚ)

Lemma: qexp-qabs
[a:ℚ]. ∀[n:ℕ].  (|a| ↑ |a ↑ n| ∈ ℚ)

Lemma: qexp-le-one
[a:ℚ]. ∀[n:ℕ]. (a ↑ n ≤ 1) supposing (0 ≤ a) ∧ (a ≤ 1)

Lemma: qexp-convex
a,b:ℚ.  ((0 ≤ b)  (b ≤ a)  (∀n:ℕ+(a b ↑ n ≤ (a ↑ b ↑ n))))

Lemma: qexp-qminus
n:ℕ. ∀a:ℚ.  (-(a) ↑ if isEven(n) then a ↑ else -(a ↑ n) fi  ∈ ℚ)

Lemma: qexp-convex2
a,b:ℚ.  (((0 ≤ a) ∧ (0 ≤ b))  (∀n:ℕ+(|a b| ↑ n ≤ |a ↑ b ↑ n|)))

Lemma: qexp-convex3
a,b:ℚ.  ((((0 ≤ a) ∧ (0 ≤ b)) ∨ ((a ≤ 0) ∧ (b ≤ 0)))  (∀n:ℕ+(|a b| ↑ n ≤ |a ↑ b ↑ n|)))

Lemma: qexp-greater-one
e:{e:ℚ0 < e} . ∀r:{r:ℚe < r} . ∀n:ℕ.  (n e) < r ↑ supposing 1 ≤ n

Lemma: qsum-const
[n:ℕ]. ∀[q:ℚ].  0 ≤ i < n. (n q) ∈ ℚ)

Lemma: qsum-const2
[a,b:ℤ]. ∀[q:ℚ].  a ≤ i < b. (if a ≤then else fi  q) ∈ ℚ)

Lemma: qsum-linearity1
[a,b:ℤ]. ∀[q:ℚ]. ∀[X:{a..b-} ⟶ ℚ].  a ≤ i < b. X[i] (q * Σa ≤ i < b. X[i]) ∈ ℚ)

Lemma: qsum-linearity2
[a,b:ℤ]. ∀[X,Y:{a..b-} ⟶ ℚ].  a ≤ i < b. X[i] Y[i] a ≤ i < b. X[i] + Σa ≤ i < b. Y[i]) ∈ ℚ)

Lemma: qsum_product
[a,b,c,d:ℤ]. ∀[x:{a..b 1-} ⟶ ℚ]. ∀[y:{c..d 1-} ⟶ ℚ].
  ((Σa ≤ i < b. x[i] * Σc ≤ j < d. y[j]) = Σa ≤ i < b. Σc ≤ j < d. x[i] y[j] ∈ ℚ)

Lemma: qsum_functionality_wrt_qle
[n,m:ℤ]. ∀[x,y:{n..m 1-} ⟶ ℚ].
  Σn ≤ k < m. x[k] ≤ Σn ≤ k < m. y[k] supposing ∀k:ℤ((n ≤ k)  (k ≤ m)  (x[k] ≤ y[k]))

Lemma: q-geometric-series
[a:ℚ]. ∀[n:ℕ].  0 ≤ i < n. a ↑ if qeq(a;1) then else (1 a ↑ n/1 a) fi  ∈ ℚ)

Lemma: qsum-reciprocal-squares
[J:ℕ+]. 1 ≤ n < 1. (1/n n) ≤ (2 (1/J)))

Lemma: qsum-reciprocal-squares-bound
[J:ℕ]. Σ1 ≤ n < J. (1/n n) < 2

Lemma: q-Cauchy-Schwarz
[n:ℕ]. ∀[x,y:ℕ1 ⟶ ℚ].
  ((Σ0 ≤ i < n. x[i] y[i] * Σ0 ≤ i < n. x[i] y[i]) ≤ 0 ≤ i < n. x[i] x[i] * Σ0 ≤ i < n. y[i] y[i]))

Lemma: qexp-difference-factor
[a,b:ℚ].  ∀n:ℕ((a ↑ b ↑ n) ((a b) * Σ0 ≤ i < n. a ↑ b ↑ 1) ∈ ℚ)

Lemma: q-archimedean
a:ℚ. ∃n:ℕ((-(n) ≤ a) ∧ (a ≤ n))

Lemma: q-archimedean-ext
a:ℚ. ∃n:ℕ((-(n) ≤ a) ∧ (a ≤ n))

Lemma: small-reciprocal-proof
e:ℚ. ∃m:ℕ+(1/m) < supposing 0 < e

Lemma: reciprocal-qle-proof
e:ℚ. ∃m:ℕ+((1/m) ≤ e) supposing 0 < e

Lemma: small-reciprocal
e:ℚ. ∃m:ℕ+(1/m) < supposing 0 < e

Lemma: reciprocal-qle
e:ℚ. ∃m:ℕ+((1/m) ≤ e) supposing 0 < e

Definition: reciprocal_qle
reciprocal_qle(e) ==  fst((TERMOF{reciprocal-qle:o, 1:l} e))

Lemma: reciprocal_qle_wf
e:{q:ℚ0 < q} (reciprocal_qle(e) ∈ {n:ℕ+(1/n) ≤ e} )

Definition: small_reciprocal
small_reciprocal(e) ==  fst((TERMOF{small-reciprocal:o, 1:l} e))

Lemma: small_reciprocal_wf
e:{q:ℚ0 < q} (small_reciprocal(e) ∈ {n:ℕ+(1/n) < e} )

Definition: qexpfact
qexpfact(n;x;p;b) ==
  fix((λqexpfact,n,p,b. if q_less(p;b)
                       then n
                       else eval n' in
                            eval p' in
                            eval b' n' in
                              qexpfact n' p' b'
                       fi )) 
  
  
  b

Lemma: qexpfact_wf
[n:ℕ]. ∀[x:{q:ℚ0 ≤ q} ]. ∀[p:ℚ]. ∀[b:{b:ℤ(n)! ∈ ℤ].  (qexpfact(n;x;p;b) ∈ {n...})

Lemma: qexpfact-property
[n:ℕ]. ∀[x:{q:ℚ0 ≤ q} ]. ∀[p:ℚ]. ∀[b:{b:ℤ(n)! ∈ ℤ].  x ↑ qexpfact(n;x;p;b) n < (qexpfact(n;x;p;b))!

Lemma: factorial-greater-qexp
x:{q:ℚ0 ≤ q} . ∀p:ℚ.  ∃n:ℕx ↑ n < (n)!

Lemma: qlog-bound
e:{e:ℚ0 < e} . ∀q:{q:ℚ(e ≤ q) ∧ q < 1} .  ∃N:ℕ+q ↑ N < e

Lemma: qlog-lemma
e:{e:ℚ0 < e} . ∀q:{q:ℚ(e ≤ q) ∧ q < 1} .  {nr:ℕ × ℚlet n,r nr in (r q ↑ n ∈ ℚ) ∧ (e ≤ r) ∧ r < e} 

Lemma: qlog-lemma-ext
e:{e:ℚ0 < e} . ∀q:{q:ℚ(e ≤ q) ∧ q < 1} .  {nr:ℕ × ℚlet n,r nr in (r q ↑ n ∈ ℚ) ∧ (e ≤ r) ∧ r < e} 

Lemma: qlog-exists
e:{e:ℚ0 < e} . ∀q:{q:ℚ(0 ≤ q) ∧ q < 1} .  {n:ℕ+((e ≤ 1)  (e ≤ q ↑ 1)) ∧ q ↑ n < e} 

Lemma: qlog-ext
e:{e:ℚ0 < e} . ∀q:{q:ℚ(0 ≤ q) ∧ q < 1} .  {n:ℕ+((e ≤ 1)  (e ≤ q ↑ 1)) ∧ q ↑ n < e} 

Definition: qlog
qlog(q;e) ==  TERMOF{qlog-ext:o, 1:l} q

Definition: qlog-type
qlog-type(q;e) ==  {n:ℕ+((e ≤ 1)  (e ≤ q ↑ 1)) ∧ q ↑ n < e} 

Lemma: qlog-type_wf
[q,e:ℚ].  (qlog-type(q;e) ∈ Type)

Lemma: qlog_wf
e:{e:ℚ0 < e} . ∀q:{q:ℚ(0 ≤ q) ∧ q < 1} .  (qlog(q;e) ∈ qlog-type(q;e))

Lemma: qsum-non-neg
[j:ℕ]. ∀[f:ℕj ⟶ ℚ].  0 ≤ Σ0 ≤ n < j. f[n] supposing ∀n:ℕj. (0 ≤ f[n])

Lemma: qsum-non-neg2
[i,j:ℤ]. ∀[f:{i..j-} ⟶ ℚ].  0 ≤ Σi ≤ n < j. f[n] supposing ∀n:{i..j-}. (0 ≤ f[n])

Lemma: qsum-subsequence-qle
[f:ℕ ⟶ ℚ]
  ∀[k:ℕ]. ∀[g:ℕ1 ⟶ ℕ].  Σ0 ≤ i < k. f[g i] ≤ Σ0 ≤ i < k. f[i] supposing ∀n:ℕ1. ∀i:ℕn.  i < 
  supposing ∀n:ℕ(0 ≤ f[n])

Lemma: q-not-limit-zero-diverges
f:ℕ ⟶ ℚ
  (∃q:ℚ(0 < q ∧ (∀n:ℕ. ∃m:ℕ((n ≤ m) ∧ (q ≤ f[m])))))  (∀B:ℚ. ∃n:ℕ(B ≤ Σ0 ≤ i < n. f[i])) 
  supposing ∀n:ℕ(0 ≤ f[n])

Lemma: q-not-limit-zero-diverges-2
f:ℕ+ ⟶ ℚ
  (∃q:ℚ(0 < q ∧ (∀n:ℕ. ∃m:ℕ(n < m ∧ (q ≤ f[m])))))  (∀B:ℚ. ∃n:ℕ(B ≤ Σ1 ≤ i < n. f[i])) 
  supposing ∀n:ℕ+(0 ≤ f[n])

Lemma: q-geometric-series-converges
a:{a:ℚ|a| < 1} . ∀e:{e:ℚ0 < e ∧ (e ≤ 1)} .  ∃n:ℕ. ∀m:ℕ((n ≤ m)  0 ≤ i < m. a ↑ (1/1 a)| < e)

Lemma: q-min-exists
as:ℚ List. ∃a:ℚ((a ∈ as) supposing ¬↑null(as) ∧ (∀a'∈as.a ≤ a'))

Lemma: q-max-exists
as:ℚ List. ∃a:ℚ((a ∈ as) supposing ¬↑null(as) ∧ (∀a'∈as.a' ≤ a))

Definition: q-linear
q-linear(k;i.X[i];y) ==  X[0] + Σ0 ≤ j < k. X[j 1] y[j]

Lemma: q-linear_wf
[k:ℕ]. ∀[X:ℕ ⟶ ℚ]. ∀[y:ℚ List].  q-linear(k;j.X[j];y) ∈ ℚ supposing k ≤ ||y||

Lemma: q-linear-base
[X:ℕ ⟶ ℚ]. ∀[y:ℚ List].  (q-linear(0;j.X[j];y) X[0] ∈ ℚ)

Lemma: q-linear-unroll
[k:ℕ+]. ∀[X:ℕ ⟶ ℚ]. ∀[y:ℚ List].
  q-linear(k;j.X[j];y) (q-linear(k 1;j.X[j];y) (X[k] y[k 1])) ∈ ℚ supposing k ≤ ||y||

Lemma: q-linear-sum
[X,Y:ℕ ⟶ ℚ]. ∀[k:ℕ]. ∀[y:ℚ List].
  q-linear(k;j.X[j] Y[j];y) (q-linear(k;j.X[j];y) q-linear(k;j.Y[j];y)) ∈ ℚ supposing k ≤ ||y||

Lemma: q-linear-times
[X:ℕ ⟶ ℚ]. ∀[a:ℚ]. ∀[k:ℕ]. ∀[y:ℚ List].  q-linear(k;j.a X[j];y) (a q-linear(k;j.X[j];y)) ∈ ℚ supposing k ≤ ||y||

Lemma: q-linear-equal
[k:ℕ]. ∀[X:ℕ ⟶ ℚ]. ∀[y,z:ℚ List].
  (q-linear(k;j.X[j];y) q-linear(k;j.X[j];z) ∈ ℚsupposing 
     ((∀i:ℕk. (y[i] z[i] ∈ ℚ)) and 
     (k ≤ ||z||) and 
     (k ≤ ||y||))

Definition: q-rel
q-rel(r;x) ==  if (r =z 0) then x ∈ ℚ if (r =z 1) then 0 ≤ else 0 < fi 

Lemma: q-rel_wf
[r:ℤ]. ∀[x:ℚ].  (q-rel(r;x) ∈ ℙ)

Definition: q-rel-decider
q-rel-decider(r;x) ==
  if ((r =z 0) ∧b qeq(0;x)) ∨b((r =z 1) ∧b (qeq(0;x) ∨bqpositive(x))) ∨b(((¬b(r =z 0)) ∧b b(r =z 1))) ∧b qpositive(x))
  then inl ⋅
  else inr x.⋅
  fi 

Lemma: q-rel-decider_wf
r:ℤ. ∀x:ℚ.  (q-rel-decider(r;x) ∈ Dec(q-rel(r;x)))

Lemma: decidable__q-rel
r:ℤ. ∀x:ℚ.  Dec(q-rel(r;x))

Definition: q-rel-lub
q-rel-lub(r1;r2) ==  if (r1 =z 0) then r2 if (r2 =z 0) then r1 if (r1 =z 1) ∧b (r2 =z 1) then else fi 

Lemma: q-rel-lub_wf
[r1,r2:ℤ].  (q-rel-lub(r1;r2) ∈ ℤ)

Lemma: q-constraint-times
[x:ℕ ⟶ ℚ]. ∀[r:ℤ]. ∀[a:ℚ]. ∀[k:ℕ]. ∀[y:ℚ List].
  (q-rel(r;q-linear(k;j.a (x j);y))) supposing 
     (q-rel(r;q-linear(k;j.x j;y)) and 
     ((r 0 ∈ ℤ) ∨ 0 < a ∨ ((0 ≤ a) ∧ (r 1 ∈ ℤ))) and 
     (k ≤ ||y||))

Lemma: q-constraint-sum
[x,x':ℕ ⟶ ℚ]. ∀[r1,r2:ℤ]. ∀[k:ℕ]. ∀[y:ℚ List].
  (q-rel(q-rel-lub(r1;r2);q-linear(k;j.(x j) (x' j);y))) supposing 
     (q-rel(r2;q-linear(k;j.x' j;y)) and 
     q-rel(r1;q-linear(k;j.x j;y)) and 
     (k ≤ ||y||))

Lemma: q-constraint-zero
[x:ℕ ⟶ ℚ]. ∀[r:ℤ]. ∀[k:ℕ+]. ∀[y:ℚ List].
  (uiff(q-rel(r;q-linear(k;j.x j;y));q-rel(r;q-linear(k 1;j.x j;y)))) supposing (((x k) 0 ∈ ℚand (k ≤ ||y||))

Lemma: q-constraint-positive
[x:ℕ ⟶ ℚ]. ∀[r:ℤ]. ∀[k:ℕ+]. ∀[y:ℚ List].
  (uiff(q-rel(r;q-linear(k;j.x j;y));q-rel(r;y[k 1] ((1/x k) q-linear(k 1;j.x j;y))))) supposing 
     (0 < and 
     (k ≤ ||y||))

Lemma: q-constraint-negative
[x:ℕ ⟶ ℚ]. ∀[r:ℤ]. ∀[k:ℕ+]. ∀[y:ℚ List].
  (uiff(q-rel(r;q-linear(k;j.x j;y));q-rel(r;-(y[k 1]) ((-1/x k) q-linear(k 1;j.x j;y))))) supposing 
     (x k < and 
     (k ≤ ||y||))

Definition: q-constraints
q-constraints(k;A;y) ==  (||y|| k ∈ ℤc∧ (∀xr∈A.q-rel(snd(xr);q-linear(k;j.(fst(xr)) j;y)))

Lemma: q-constraints_wf
[A:(ℕ ⟶ ℚ × ℤList]. ∀[k:ℕ]. ∀[y:ℚ List].  (q-constraints(k;A;y) ∈ ℙ)

Lemma: product-map
[A,B,C:Type].
  ∀as:A List. ∀bs:B List. ∀F:A ⟶ B ⟶ C.  ∃cs:C List. ∀c:C. ((c ∈ cs) ⇐⇒ (∃a∈as. (∃b∈bs. (F b) ∈ C)))

Lemma: average-qbetween
[a,b:ℚ].  a ≤ (a b/2) ≤ supposing a ≤ b

Lemma: average-q-between
[a,b:ℚ].  a < (a b/2) < supposing a < b

Definition: qdot
qdot(as;bs) ==  Σ0 ≤ i < dimension(as). as[i] bs[i]

Definition: qv-dim
dimension(as) ==  ||as||

Lemma: qv-dim_wf
[as:Top List]. (dimension(as) ∈ ℕ)

Lemma: qdot_wf
[as,bs:ℚ List].  qdot(as;bs) ∈ ℚ supposing dimension(as) dimension(bs) ∈ ℤ

Definition: qv-add
qv-add(as;bs) ==  fix((λqv-add,as,bs. if null(as) then as else [hd(as) hd(bs) (qv-add tl(as) tl(bs))] fi )) as bs

Lemma: qv-add_wf
[as,bs:ℚ List].  qv-add(as;bs) ∈ ℚ List supposing dimension(as) dimension(bs) ∈ ℤ

Lemma: select-qv-add
[as,bs:Top List].  ∀[i:ℕdimension(as)]. (qv-add(as;bs)[i] as[i] bs[i]) supposing dimension(as) dimension(bs) ∈ ℤ

Lemma: dim-qv-add
[as,bs:Top List].  dimension(qv-add(as;bs)) dimension(as) supposing dimension(as) dimension(bs) ∈ ℤ

Definition: qv-mul
qv-mul(r;bs) ==  map(λb.(r b);bs)

Lemma: qv-mul_wf
[r:ℚ]. ∀[bs:ℚ List].  (qv-mul(r;bs) ∈ ℚ List)

Lemma: select-qv-mul
[as:Top List]. ∀[r:Top]. ∀[i:ℕdimension(as)].  (qv-mul(r;as)[i] as[i])

Lemma: dim-qv-mul
[as:Top List]. ∀[r:Top].  (dimension(qv-mul(r;as)) dimension(as))

Lemma: qdot-linear
[as,bs,cs:ℚ List].
  qdot(as;qv-add(bs;cs)) (qdot(as;bs) qdot(as;cs)) ∈ ℚ 
  supposing (dimension(as) dimension(bs) ∈ ℤ) ∧ (dimension(as) dimension(cs) ∈ ℤ)

Lemma: qdot-linear2
[as,bs:ℚ List]. ∀[r:ℚ].  qdot(as;qv-mul(r;bs)) (r qdot(as;bs)) ∈ ℚ supposing dimension(as) dimension(bs) ∈ ℤ

Definition: qv-convex
qv-convex(p.S[p]) ==
  ∀p,q:ℚ List.
    ((dimension(p) dimension(q) ∈ ℤ)
     S[p]
     S[q]
     (∀t:ℚ((0 ≤ t)  (t ≤ 1)  S[qv-add(qv-mul(t;p);qv-mul(1 t;q))])))

Lemma: qv-convex_wf
[S:(ℚ List) ⟶ ℙ]. (qv-convex(p.S[p]) ∈ ℙ)

Lemma: qv-convex-and
[S1,S2:(ℚ List) ⟶ ℙ].  (qv-convex(p.S1[p])  qv-convex(p.S2[p])  qv-convex(p.S1[p] ∧ S2[p]))

Lemma: qv-convex-all
[T:Type]. ∀[S:T ⟶ (ℚ List) ⟶ ℙ].  ((∀x:T. qv-convex(p.S[x;p]))  qv-convex(p.∀x:T. S[x;p]))

Lemma: qv-convex-upper-half
[r:ℚ]. ∀[v:ℚ List].  qv-convex(p.(dimension(p) dimension(v) ∈ ℤ) ∧ (r ≤ qdot(v;p)))

Lemma: qv-convex-lower-half
[r:ℚ]. ∀[v:ℚ List].  qv-convex(p.(dimension(p) dimension(v) ∈ ℤ) ∧ (qdot(v;p) ≤ r))

Definition: qvn
^n ==  {v:ℚ List| dimension(v) n ∈ ℤ

Lemma: qvn_wf
[n:ℕ]. (ℚ^n ∈ Type)

Definition: q-linear-form
q-linear-form(n) ==  ℚ^n × ℚ

Lemma: q-linear-form_wf
[n:ℕ]. (q-linear-form(n) ∈ Type)

Definition: qv-lower
qv-lower(lf;p) ==  let v,r lf in qdot(v;p) ≤ r

Lemma: qv-lower_wf
[n:ℕ]. ∀[lf:q-linear-form(n)]. ∀[p:ℚ^n].  (qv-lower(lf;p) ∈ ℙ)

Definition: qv-constrained
qv-constrained(S;p) ==  (∀lf∈S.qv-lower(lf;p))

Lemma: qv-constrained_wf
[n:ℕ]. ∀[S:q-linear-form(n) List]. ∀[p:ℚ^n].  (qv-constrained(S;p) ∈ ℙ)

Definition: qlf-val
qlf-val(lf;p) ==  let v,r lf in qdot(v;p) r

Lemma: qlf-val_wf
[n:ℕ]. ∀[lf:q-linear-form(n)]. ∀[p:ℚ^n].  (qlf-val(lf;p) ∈ ℚ)

Definition: qlfs-min-val
qlfs-min-val(lfs;p) ==  qmin-list(map(λlf.qlf-val(lf;p);lfs))

Lemma: qlfs-min-val_wf
[n:ℕ]. ∀[lfs:q-linear-form(n) List]. ∀[p:ℚ^n].  qlfs-min-val(lfs;p) ∈ ℚ supposing 0 < ||lfs||

Definition: qlfs-max-val
qlfs-max-val(lfs;p) ==  qmax-list(map(λlf.qlf-val(lf;p);lfs))

Lemma: qlfs-max-val_wf
[n:ℕ]. ∀[lfs:q-linear-form(n) List]. ∀[p:ℚ^n].  qlfs-max-val(lfs;p) ∈ ℚ supposing 0 < ||lfs||

Definition: qv-constrained-no-sup
qv-constrained-no-sup(n;S;lfs) ==
  (∃p:ℚ^n. qv-constrained(S;p))
  ∧ (∀p:ℚ^n. (qv-constrained(S;p)  (∃q:ℚ^n. (qv-constrained(S;q) ∧ qlfs-min-val(lfs;p) < qlfs-min-val(lfs;q)))))

Lemma: qv-constrained-no-sup_wf
[n:ℕ]. ∀[S,lfs:q-linear-form(n) List].  qv-constrained-no-sup(n;S;lfs) ∈ ℙ supposing 0 < ||lfs||

Definition: qv-constrained-no-inf
qv-constrained-no-inf(n;S;lfs) ==
  (∃p:ℚ^n. qv-constrained(S;p))
  ∧ (∀p:ℚ^n. (qv-constrained(S;p)  (∃q:ℚ^n. (qv-constrained(S;q) ∧ qlfs-max-val(lfs;q) < qlfs-max-val(lfs;p)))))

Lemma: qv-constrained-no-inf_wf
[n:ℕ]. ∀[S,lfs:q-linear-form(n) List].  qv-constrained-no-inf(n;S;lfs) ∈ ℙ supposing 0 < ||lfs||

Definition: qv-constrained-sup
qv-constrained-sup(n;S;lfs;p;r) ==
  qv-constrained(S;p)
  ∧ (qlfs-min-val(lfs;p) r ∈ ℚ)
  ∧ (∀q:ℚ^n. (qv-constrained(S;q)  (qlfs-min-val(lfs;q) ≤ qlfs-min-val(lfs;p))))

Lemma: qv-constrained-sup_wf
[n:ℕ]. ∀[S,lfs:q-linear-form(n) List]. ∀[p:ℚ^n]. ∀[r:ℚ].  qv-constrained-sup(n;S;lfs;p;r) ∈ ℙ supposing 0 < ||lfs||

Definition: qv-constrained-inf
qv-constrained-inf(n;S;lfs;p;r) ==
  qv-constrained(S;p)
  ∧ (qlfs-max-val(lfs;p) r ∈ ℚ)
  ∧ (∀q:ℚ^n. (qv-constrained(S;q)  (qlfs-max-val(lfs;p) ≤ qlfs-max-val(lfs;q))))

Lemma: qv-constrained-inf_wf
[n:ℕ]. ∀[S,lfs:q-linear-form(n) List]. ∀[p:ℚ^n]. ∀[r:ℚ].  qv-constrained-inf(n;S;lfs;p;r) ∈ ℙ supposing 0 < ||lfs||

Definition: select?
as[i]?a ==  if i <||as|| then as[i] else fi 

Lemma: select?_wf
[A:Type]. ∀[as:A List]. ∀[a:A]. ∀[i:ℕ].  (as[i]?a ∈ A)

Definition: normalize-constraint
normalize-constraint(k;p) ==  let f,r in eval in let as ⟵ map(f;upto(k)) in <λn.as[n]?f n, r>

Lemma: normalize-constraint_wf
[k:ℕ]. ∀[A:ℕ ⟶ ℚ × ℤ].  (normalize-constraint(k;A) ∈ ℕ ⟶ ℚ × ℤ)

Lemma: normalize-constraint-eq
[k:ℕ]. ∀[A:ℕ ⟶ ℚ × ℤ].  (normalize-constraint(k;A) A ∈ (ℕ ⟶ ℚ × ℤ))

Definition: normalize-constraints
normalize-constraints(k;A) ==  let A' ⟵ map(λp.normalize-constraint(k;p);A) in A'

Lemma: normalize-constraints_wf
[k:ℕ]. ∀[A:(ℕ ⟶ ℚ × ℤList].  (normalize-constraints(k;A) ∈ (ℕ ⟶ ℚ × ℤList)

Lemma: normalize-constraints-eq
[k:ℕ]. ∀[A:(ℕ ⟶ ℚ × ℤList].  (normalize-constraints(k;A) A ∈ ((ℕ ⟶ ℚ × ℤList))

Lemma: test-recursion-extract
k:ℕ. ∀f:ℕ ⟶ ℚ.  ((∃n:ℕk. ((f n) 0 ∈ ℚ)) ∨ True)

Lemma: decidable__q-constraints
k:ℕ. ∀A:(ℕ ⟶ ℚ × ℤList.  Dec(∃y:ℚ List [q-constraints(k;A;y)])

Definition: q-constraints-decider
q-constraints-decider ==
  λk.letrec rec(k)=λA.eval evalall(A) in
                      if if k=0 then inl Ax else (inr x.Ax) )
                      then λA.if l-all-decider() xr.q-rel-decider(let x,y xr in y;let x,y xr in 0))
                              then inl []
                              else inr %6.Ax) 
                              fi 
                      else λA.case l-exists-decider() evalall(A) 
                                   xr.case if let x,y xr in y=0 then inl Ax else (inr x.Ax) )
                                         of inl(%2) =>
                                         case if if qeq(let x,y xr in k;0) then inl Ax else inr x.Ax)  fi 
                                              then inr %.Ax) 
                                              else inl %.Ax)
                                              fi 
                                          of inl(%3) =>
                                          inl <%2, %3>
                                          inr(%4) =>
                                          inr %.let %5,%6 
                                                  in Ax) 
                                         inr(%3) =>
                                         inr %.let %4,%5 
                                                 in Ax) )
                               of inl(%@0) =>
                               let xr,%10 let i,%1 %@0 
                                            in <evalall(A)[i], <i, Ax, Ax>%1> 
                               in let x1,x2 xr 
                                  in let %11,%13,%14 %10 in 
                                     case rec (k 1) 
                                          map(λxr.let x,r xr 
                                                  in <λj.((x j) -((x k/x1 k) (x1 j))), r>;evalall(A))
                                      of inl(%15) =>
                                      inl (%15 [q-linear(k 1;j.(-1/x1 k) (x1 j);%15)])
                                      inr(%16) =>
                                      inr %.Ax) 
                               inr(%8) =>
                               case rec (k 1) 
                                    eval A' evalall(map(λp.let f,r 
                                                             in eval in
                                                                eval as evalall(map(f;[0, k))) in
                                                                  <λn.if if (n) < (||as||)  then inl Ax  else (inr Ax )
                                                                      then as[n]
                                                                      else n
                                                                      fi 
                                                                  r
                                                                  >;filter(λa.qeq(let x,y in k;0);evalall(A))
                                                          concat(map(λa.map(λb.<λj.(((let x,y in k)
                                                                                     (let x,y in j))
                                                                                     -((let x,y in k)
                                                                                       (let x,y in j)))
                                                                                 q-rel-lub(let x,y 
                                                                                             in y;let x,y 
                                                                                                  in y)
                                                                                 >;filter(λc.q_less(let x,y 
                                                                                                    in 
                                                                                                    k;0);evalall(A)));
                                                                       filter(λb.q_less(0;let x,y in k);
                                                                              evalall(A)))))) in
                                    A'
                                of inl(%) =>
                                inl case l-exists-decider() evalall(A) 
                                         a.if qpositive((let x,y in k) -(0))
                                             then inl Ax
                                             else inr x.Ax) 
                                             fi )
                                 of inl(%@0) =>
                                 case l-exists-decider() evalall(A) 
                                      a.if qpositive(0 -(let x,y in k)) then inl Ax else inr x.Ax)  fi )
                                  of inl(%17) =>
                                  let b,%28,%30,%31 let a,%25,%26 if if if map(λc.(-((1/let x,y in k))
                                                                                      q-linear(k 1;j.let x,y 
                                                                                                         in 
                                                                                                         j;%));
                                                                                   filter(λc.q_less(let x,y 
                                                                                                    in 
                                                                                                    k;0);
                                                                                          evalall(A))) Ax then inl Ax
                                                                            otherwise inr Ax 
                                                                         then inl Ax
                                                                         else inr Ax 
                                                                         fi 
                                  then <0, Ax, λi.Ax>
                                  else let u,v map(λc.(-((1/let x,y in k))
                                                        q-linear(k 1;j.let x,y in j;%));
                                                     filter(λc.q_less(let x,y in k;0);evalall(A))) 
                                       in <accumulate (with value and list item y):
                                            if eval r' evalall(x) in
                                               eval s' evalall(y) in
                                                 qpositive(s' -(r')) ∨bqeq(r';s')
                                            then x
                                            else y
                                            fi 
                                           over list:
                                             tl([u v])
                                           with starting value:
                                            hd([u v]))
                                          if if if [u v] Ax then inl Ax otherwise inr Ax 
                                               then inl Ax
                                               else inr Ax 
                                               fi 
                                          then Ax
                                          else let u,v [u v] 
                                               in rec-case(v) of
                                                  [] => λ-any.<0, Ax, Ax>
                                                  a::L =>
                                                   r.λu@0.if if eval r' evalall(u@0) in
                                                                eval s' evalall(a) in
                                                                  qpositive(s' -(r')) ∨bqeq(r';s')
                                                               then inl Ax
                                                             if if eval r' evalall(u@0) in
                                                                   eval s' evalall(a) in
                                                                     qpositive(s' -(r')) ∨bqeq(r';s')
                                                                then inl Ax
                                                                else inr Ax 
                                                                fi 
                                                               then Ax
                                                             else inr Ax 
                                                             fi 
                                                          then case case case let i,%2,%3 u@0 in 
                                                                              if case if i=0 then inl Ax else (inr Ax )
                                                                                  of inl(x) =>
                                                                                  inl x
                                                                                  inr(x) =>
                                                                                  inr x.Ax) 
                                                                              then λ%,%4. (inl Ax)
                                                                              else λ%,%6. (inr <1, Ax, Ax> )
                                                                              fi  
                                                                              Ax 
                                                                              Ax
                                                                          of inl(%9) =>
                                                                          inl Ax
                                                                          inr(%10) =>
                                                                          inr inr %10  
                                                                     of inl(-any) =>
                                                                     inl Ax
                                                                     inr(-any) =>
                                                                     inr case -any
                                                                      of inl(%1) =>
                                                                      <0, Ax, Ax>
                                                                      inr(%2) =>
                                                                      let i,%4,%5 %2 in 
                                                                      <1, Ax, Ax> 
                                                                of inl(%1) =>
                                                                <0, Ax, Ax>
                                                                inr(%2) =>
                                                                let i,%4,%5 %2 in 
                                                                <1, Ax, Ax>
                                                          else let i,%4,%5 in 
                                                               <1, Ax, Ax>
                                                          fi  
                                                  u
                                          fi 
                                          let %7,%8 =
                                             primrec(||[u v]|| 1;λn.Ax;
                                                     λi,x,n. if if n=(i 1) then inl Ax else (inr x.Ax) )
                                                            then λL,%7,a. if if if Ax then inl Ax otherwise inr Ax 
                                                                             then inl Ax
                                                                             else inr Ax 
                                                                             fi 
                                                                         then Ax
                                                                         else let u,v 
                                                                              in if null(v)
                                                                                 then <λ-any,i. -any, λ-any.(-any 0)>
                                                                                 else let %18,%19 =
                                                                                       let %23,%24 =
                                                                                        let %22,%23 =
                                                                                         ||v|| 
                                                                                         case case if if (||v||) < (...)
                                                                                                         then inl Ax
                                                                                                         else (inr ... )
                                                                                                   then inr %.Ax) 
                                                                                                   else inl %.Ax)
                                                                                                   fi 
                                                                                               of inl(%2) =>
                                                                                               inl <%2, Ax, Ax>
                                                                                               inr(%3) =>
                                                                                               inr %.let %4,%5 
                                                                                                       in Ax) 
                                                                                          of inl(%13) =>
                                                                                          %13
                                                                                          inr(%14) =>
                                                                                          Ax 
                                                                                         
                                                                                        in <λ%26.<let %27,%28 %26 
                                                                                                  in %27
                                                                                                 let %27,%28 %26 
                                                                                                   in %28
                                                                                                 >
                                                                                           , λ%26.<let %27,%28 %26 
                                                                                                   in %27
                                                                                                  let %27,%28 %26 
                                                                                                    in %28
                                                                                                  >
                                                                                           > 
                                                                                       in <λ%24...., ...> 
                                                                                      in ...
                                                                                 fi 
                                                                         fi 
                                                            else ...
                                                            fi 
                                             ... 
                                             ... 
                                             ... 
                                             ... 
                                            in ...>
                                  fi  in 
                                  ... 
                                  in ...  
                                  inr(%18) =>
                                  ...
                                 inr(%17) =>
                                 ...
                                inr(%16) =>
                                ...
                      fi  
                      ... in
      rec(...)

Lemma: decidable__q-constraints-squash
k:ℕ. ∀A:(ℕ ⟶ ℚ × ℤList.  Dec(∃y:ℚ List [q-constraints(k;A;y)])

Lemma: decidable__q-constraints-opt
k:ℕ. ∀A:(ℕ ⟶ ℚ × ℤList.  Dec(∃y:ℚ List [q-constraints(k;A;y)])

Definition: q-sat-constraints
q-sat-constraints(k;A;y) ==
  (||y|| k ∈ ℤ)
  c∧ (∀a∈A.let F,r,G in 
        if (r =z 0) then q-linear(k;j.F[j]?0;y) q-linear(k;j.G[j]?0;y) ∈ ℚ
        if (r =z 1) then q-linear(k;j.F[j]?0;y) ≤ q-linear(k;j.G[j]?0;y)
        else q-linear(k;j.F[j]?0;y) < q-linear(k;j.G[j]?0;y)
        fi )

Lemma: q-sat-constraints_wf
[k:ℕ]. ∀[A:(ℚ List × ℤ × (ℚ List)) List]. ∀[y:ℚ List].  (q-sat-constraints(k;A;y) ∈ ℙ)

Lemma: decidable__q-constraints2
k:ℕ. ∀A:(ℚ List × ℤ × (ℚ List)) List.  Dec(∃y:ℚ List [q-sat-constraints(k;A;y)])

Lemma: q-triangle-inequality
[r,s:ℚ].  (|r s| ≤ (|r| |s|))

Lemma: q-triangle-inequality2
[x,y,z:ℚ].  (|x z| ≤ (|x y| |y z|))

Lemma: q-triangle-inequality3
[x,y,a,b:ℚ].  (|x y| ≤ (a b)) supposing ((|y| ≤ b) and (|x| ≤ a))

Lemma: implies-qle
[a,b:ℚ].  a ≤ supposing ∀n:ℕ+(a ≤ (b (1/n)))

Lemma: implies-qle2
[a,b:ℚ].  a ≤ supposing ∀e:ℚ(0 <  (a ≤ (b e)))

Lemma: qabs-qsum-qle
[a,b:ℤ]. ∀[E:{a..b-} ⟶ ℚ]. ∀[x:ℚ].
  a ≤ j < b. E[j]| ≤ ((b a) x) supposing (a ≤ b) ∧ (∀j:ℤ((a ≤ j)  j <  (|E[j]| ≤ x)))

Lemma: qexp-difference-bound
[a,b:ℚ].  ∀n:ℕ+(|a ↑ b ↑ n| ≤ (|a b| qmax(|a|;|b|) ↑ 1))

Lemma: test23
[a,b,c:ℚ].  (False) supposing (0 < and ((b c) ≤ a) and ((a c) ≤ b))

Definition: test_case1
test_case1() ==  case TERMOF{decidable__q-constraints:o, 1:l} [<λj.if j <then [1; 2][j] else fi 0>of inl(y) \000C=> inl inr(x) => inr "not" 

Lemma: test_case1_wf
test_case1() ∈ ℚ List Atom

Lemma: int_nzero-rational
[z:ℤ-o]. (z 0 ∈ ℚ))

Definition: rat-int-part
rat-int-part(q) ==
  if is an integer then <q, 0>
  else let n,m 
       in eval n ÷ in
          eval rem in
            if (b =z 0) then <a, 0>
            if 0 <then if 0 ≤then <a, (b/m)> else <1, (b m/m)> fi 
            if 0 ≤then <1, (b m/m)>
            else <a, (b/m)>
            fi 

Lemma: rat-int-part_wf
q:ℤ ⋃ (ℤ × ℤ-o). (rat-int-part(q) ∈ {p:ℤ × {r:ℚ(0 ≤ r) ∧ r < 1} let x,r in (x r) ∈ ℚ)

Lemma: rat-int-part_wf2
q:ℚ(rat-int-part(q) ∈ {p:ℤ × {r:ℚ(0 ≤ r) ∧ r < 1} let x,r in (x r) ∈ ℚ)

Definition: rat-int-bound
rat-int-bound(q) ==  let n,r rat-int-part(q) in if qeq(r;0) then else fi 

Lemma: rat-int-bound_wf
[q:ℚ]. (rat-int-bound(q) ∈ {n:ℤ1 < q ∧ (q ≤ n)} )

Definition: q-floor
[r] ==  fst(rat-int-part(r))

Lemma: q-floor_wf
[r:ℚ]. ([r] ∈ ℤ)

Lemma: q-floor-property
[r:ℚ]. (([r] ≤ r) ∧ r < [r] 1)

Definition: q-ceil
q-ceil(r) ==  rat-int-bound(r)

Lemma: q-ceil_wf
[r:ℚ]. (q-ceil(r) ∈ ℤ)

Lemma: q-ceil-property
[r:ℚ]. (q-ceil(r) 1 < r ∧ (r ≤ q-ceil(r)))

Lemma: q-ceil_functionality
[a,b:ℚ].  q-ceil(a) ≤ q-ceil(b) supposing a ≤ b

Definition: qtruncate
qtruncate(q;N) ==  (q-ceil(q N)/N)

Lemma: qtruncate_wf
[q:ℚ]. ∀[N:ℕ+].  (qtruncate(q;N) ∈ ℚ)

Lemma: qtruncate-property
[q:ℚ]. ∀[N:ℕ+].  (qtruncate(q;N) (1/N) < q ∧ (q ≤ qtruncate(q;N)))

Lemma: qtruncate_functionality
[a,b:ℚ]. ∀[N:ℕ+].  qtruncate(a;N) ≤ qtruncate(b;N) supposing a ≤ b

Lemma: qroot
k:{2...}. ∀a:{a:ℚ(0 ≤ a) ∨ (↑isOdd(k))} . ∀n:ℕ+.  (∃q:ℚ [((0 ≤ ⇐⇒ 0 ≤ q) ∧ |q ↑ a| < (1/n))])

Lemma: qroot-ext
k:{2...}. ∀a:{a:ℚ(0 ≤ a) ∨ (↑isOdd(k))} . ∀n:ℕ+.  (∃q:ℚ [((0 ≤ ⇐⇒ 0 ≤ q) ∧ |q ↑ a| < (1/n))])

Definition: approx-root
k-th root(q) within 1/err ==  TERMOF{qroot-ext:o, 1:l} err

Lemma: approx-root_wf
k:{2...}. ∀a:{a:ℚ(0 ≤ a) ∨ (↑isOdd(k))} . ∀n:ℕ+.  (k-th root(a) within 1/n ∈ ℚ)

Lemma: approx-root-property
k:{2...}. ∀a:{a:ℚ(0 ≤ a) ∨ (↑isOdd(k))} . ∀n:ℕ+.
  ((0 ≤ ⇐⇒ 0 ≤ k-th root(a) within 1/n) ∧ |k-th root(a) within 1/n ↑ a| < (1/n))

Definition: nqsqrt
nqsqrt(err;q;r) ==  nqsqrt,r. eval (r (q/r)/2) in if q_less((s s) q;err) then else nqsqrt fi r

Lemma: square-between-lemma1
n:ℕ+. ∀k:ℕ1.  (∃q:ℚ [(((k/n) ≤ (q q)) ∧ q < (k 1/n) ∧ (0 ≤ q))])

Lemma: square-between-lemma2
n:ℕ+. ∀k:ℕ.  (∃q:ℚ [(((k/n) ≤ (q q)) ∧ q < (k 1/n) ∧ (0 ≤ q))])

Lemma: square-between-lemma3
a:ℕ. ∀b,n:ℕ+.  (∃q:ℚ [((a/b) (1/n) < q ∧ q < (a/b) (1/n) ∧ (0 ≤ q))])

Lemma: approximate-qsqrt
a:{a:ℚ0 ≤ a} . ∀n:ℕ+.  (∃q:ℚ [((0 ≤ q) ∧ |(q q) a| < (1/n))])

Lemma: approximate-qsqrt-ext
a:{a:ℚ0 ≤ a} . ∀n:ℕ+.  (∃q:ℚ [((0 ≤ q) ∧ |(q q) a| < (1/n))])

Lemma: square-between
a:{a:ℚ0 ≤ a} . ∀b:{b:ℚa < b} .  (∃r:ℚ [(a < r < b ∧ 0 < r)])

Definition: qsqrt
qsqrt(r;n) ==  TERMOF{approximate-qsqrt-ext:o, 1:l} n

Lemma: qsqrt_wf
[r:{r:ℚ0 ≤ r} ]. ∀[n:ℕ+].  (qsqrt(r;n) ∈ ℚ)

Lemma: qsqrt-nonneg
[r:{r:ℚ0 ≤ r} ]. ∀[n:ℕ+].  (0 ≤ qsqrt(r;n))

Lemma: qsqrt-property
[r:{r:ℚ0 ≤ r} ]. ∀[n:ℕ+].  |(qsqrt(r;n) qsqrt(r;n)) r| < (1/n)

Definition: qsqrt2
qsqrt2(r;n) ==  let e ⟵ (1/n) in nqsqrt(e;r;1)

Definition: nqsqrt3
nqsqrt3(n;q;r) ==
  eval n' 10 in
  
  nqsqrt3,r. eval (r (q/r)/2) in
               let a,b qrep(s) 
               in eval a' (a n') ÷ in
                  let x ⟵ (a'/n')
                  in if q_less((x x) q;(1/n)) then else nqsqrt3 <a', n'> fi 
  r

Definition: qsqrt-normal
qsqrt-normal(r;n) ==  let e,d TERMOF{approximate-qsqrt-ext:o, 1:l} in <(e 10 n) ÷ d, 10 n>

Definition: isqrt2
isqrt2(x) ==
  letrec sqrt(i)=if i=0 then else eval (sqrt (i ÷ 4)) in if (r (r 2)) < (i)  then 1  else in sqrt x

Definition: qsqrt-normal2
qsqrt-normal2(a;n) ==
  let v1,v2 qrep(a) 
  in eval n' 10^(log(10;v1 ÷ v2) 1) in
     <isqrt2((v1 n' n') ÷ v2), n'>

Lemma: integer-part-decomp
q:ℚ(∃p:ℤ × {r:ℚ(0 ≤ r) ∧ r < 1}  [let x,r in (x r) ∈ ℚ])

Definition: int_part_decomp
int_part_decomp(q) ==  rat-int-part(q)

Lemma: int_part_decomp_wf
[q:ℚ]. (int_part_decomp(q) ∈ {p:ℤ × ℚ(0 ≤ (snd(p))) ∧ snd(p) < 1 ∧ (q ((fst(p)) (snd(p))) ∈ ℚ)} )

Definition: integer-part
integer-part(q) ==  fst(int_part_decomp(q))

Lemma: integer-part_wf
q:ℚ(integer-part(q) ∈ ℤ)

Definition: fractional-part
fractional-part(q) ==  snd(int_part_decomp(q))

Lemma: fractional-part_wf
q:ℚ(fractional-part(q) ∈ {r:ℚ(0 ≤ r) ∧ r < 1} )

Lemma: integer-fractional-parts
q:ℚ(q (integer-part(q) fractional-part(q)) ∈ ℚ)

Lemma: rational-truncate1
q:ℚ. ∀e:{e:ℚ0 < e ∧ e < 1} .  (∃p:ℤ × ℕ+ [((|q (fst(p)/snd(p))| ≤ e) ∧ (((snd(p)) e) ≤ 2))])

Lemma: rational-truncate
q:ℚ. ∀e:{e:ℚ0 < e} .  (∃q':ℚ [(|q q'| ≤ e)])

Definition: truncate-rational
truncate-rational(q;e) ==  case q_less(e;1) of inl() => eval rat-int-bound((1/e)) in <integer-part(q b), b> inr(\000C) => integer-part(q)

Lemma: truncate-rational_wf
q:ℚ. ∀e:{e:ℚ0 < e} .  (truncate-rational(q;e) ∈ ∃q':ℚ [(|q q'| ≤ e)])

Lemma: truncate-rational-property
q:ℚ. ∀e:{e:ℚ0 < e} .  ((|q truncate-rational(q;e)| ≤ e) ∧ (|truncate-rational(q;e) q| ≤ e))

Lemma: fractional-part-rep
r:{r:ℚ(0 ≤ r) ∧ r < 1} . ∃a,b:ℕ((0 ≤ a) ∧ a < b ∧ (r (a/b) ∈ ℚ))

Lemma: egyptian-fraction
r:{r:ℚ(0 ≤ r) ∧ r < 1} (∃L:ℕ+ List [(r = Σ0 ≤ i < ||L||. (1/L[i]) ∈ ℚ)])

Lemma: egyptian-number
q:ℚ(∃p:ℤ × (ℕ+ List) [let x,L in (x + Σ0 ≤ i < ||L||. (1/L[i])) ∈ ℚ])

Definition: egyptian
egyptian(q) ==  norm-pair(λx.x;norm-list(λx.x)) (TERMOF{egyptian-number:o, 1:l} q)

Lemma: egyptian_wf
q:ℚ(egyptian(q) ∈ {p:ℤ × (ℕ+ List)| let x,L in (x + Σ0 ≤ i < ||L||. (1/L[i])) ∈ ℚ)

Lemma: int-with-rational-square-root
n:ℤ. ∀q:ℚ.  (((q q) n ∈ ℚ (∃m:ℤ((m m) n ∈ ℤ)))

Lemma: int-has-rational-square-root
n:ℤ(∃q:ℚ((q q) n ∈ ℚ⇐⇒ ∃m:ℤ((m m) n ∈ ℤ))



Home Index