Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(************************************************************************)
(*         *   The Coq Proof Assistant / The Coq Development Team       *)
(*  v      *   INRIA, CNRS and contributors - Copyright 1999-2018       *)
(* <O___,, *       (see CREDITS file for the list of authors)           *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
Square Root Function
Require Import NZAxioms NZMulOrder.
Interface of a sqrt function, then its specification on naturals
Module Type Sqrt (Import A : Typ).
 Parameter Inline sqrt : t -> t.
End Sqrt.

Module Type SqrtNotation (A : Typ)(Import B : Sqrt A).
 Notation "√ x" := (sqrt x) (at level 6).
End SqrtNotation.

Module Type Sqrt' (A : Typ) := Sqrt A <+ SqrtNotation A.

Module Type NZSqrtSpec (Import A : NZOrdAxiomsSig')(Import B : Sqrt' A).
 Axiom sqrt_spec : forall a, 0<=a -> √a * √a <= a < S (√a) * S (√a).
 Axiom sqrt_neg : forall a, a<0 -> √a == 0.
End NZSqrtSpec.

Module Type NZSqrt (A : NZOrdAxiomsSig) := Sqrt A <+ NZSqrtSpec A.
Module Type NZSqrt' (A : NZOrdAxiomsSig) := Sqrt' A <+ NZSqrtSpec A.
Derived properties of power
Module Type NZSqrtProp
 (Import A : NZOrdAxiomsSig')
 (Import B : NZSqrt' A)
 (Import C : NZMulOrderProp A).

Local Notation "a ²" := (a*a) (at level 5, no associativity, format "a ²").
First, sqrt is non-negative

forall b : t, b² < (S b)² -> 0 <= b

forall b : t, b² < (S b)² -> 0 <= b
b:t
LT:b² < (S b)²

0 <= b
b:t
LT:b² < (S b)²
Hb:b < 0

0 <= b
b:t
LT:b² < (S b)²
Hb:b < 0

False
b:t
LT:b² < (S b)²
Hb:b < 0

(S b)² < b²
b:t
LT:b² < (S b)²
Hb:b < 0
H:(S b)² < b²
False
b:t
LT:b² < (S b)²
Hb:b < 0

(S b)² < b²
b:t
LT:b² < (S b)²
Hb:b < 0

b * S b + S b < b² + 0
b:t
LT:b² < (S b)²
Hb:b < 0

b * S b < b²
b:t
LT:b² < (S b)²
Hb:b < 0
S b <= 0
b:t
LT:b² < (S b)²
Hb:b < 0

b * S b < b²
b:t
LT:b² < (S b)²
Hb:b < 0

b < S b
apply lt_succ_diag_r.
b:t
LT:b² < (S b)²
Hb:b < 0

S b <= 0
now apply le_succ_l.
b:t
LT:b² < (S b)²
Hb:b < 0
H:(S b)² < b²

False
order. Qed.

forall a : t, 0 <= √ a

forall a : t, 0 <= √ a
a:t

0 <= √ a
a:t
Ha:a < 0

0 <= √ a
a:t
Ha:0 <= a
0 <= √ a
a:t
Ha:a < 0

0 <= √ a
now rewrite (sqrt_neg _ Ha).
a:t
Ha:0 <= a

0 <= √ a
a:t
Ha:0 <= a

(√ a)² < (S √ a)²
a:t
Ha:0 <= a
H:(√ a)² <= a
H0:a < (S √ a)²

(√ a)² < (S √ a)²
order. Qed.
The spec of sqrt indeed determines it

forall a b : t, b² <= a < (S b)² -> √ a == b

forall a b : t, b² <= a < (S b)² -> √ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²

b <= √ a
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a
√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²

b <= √ a
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²

0 <= S √ a
now apply lt_le_incl, lt_succ_r.
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a

√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a

√ a <= b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a
H0:√ a <= b
√ a == b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a

√ a <= b
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a

0 <= S b
now apply lt_le_incl, lt_succ_r.
a, b:t
LEb:b² <= a
LTb:a < (S b)²
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
LEa:(√ a)² <= a
LTa:a < (S √ a)²
H:b <= √ a
H0:√ a <= b

√ a == b
order. Qed.
Hence sqrt is a morphism

Proper (eq ==> eq) sqrt

Proper (eq ==> eq) sqrt
x, x':t
Hx:x == x'

√ x == √ x'
x, x':t
Hx:x == x'
H:x < 0

√ x == √ x'
x, x':t
Hx:x == x'
H:0 <= x
√ x == √ x'
x, x':t
Hx:x == x'
H:x < 0

√ x == √ x'
x, x':t
Hx:x == x'
H:x < 0

0 == 0
x, x':t
Hx:x == x'
H:x < 0
x' < 0
x, x':t
Hx:x == x'
H:x < 0

0 == 0
reflexivity.
x, x':t
Hx:x == x'
H:x < 0

x' < 0
now rewrite <- Hx.
x, x':t
Hx:x == x'
H:0 <= x

√ x == √ x'
x, x':t
Hx:x == x'
H:0 <= x

(√ x')² <= x < (S √ x')²
x, x':t
Hx:x == x'
H:0 <= x'

(√ x')² <= x' < (S √ x')²
now apply sqrt_spec. Qed.
An alternate specification

forall a : t, 0 <= a -> exists r : t, a == (√ a)² + r /\ 0 <= r <= 2 * √ a

forall a : t, 0 <= a -> exists r : t, a == (√ a)² + r /\ 0 <= r <= 2 * √ a
a:t
Ha:0 <= a

exists r : t, a == (√ a)² + r /\ 0 <= r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²

exists r : t, a == (√ a)² + r /\ 0 <= r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

exists r0 : t, a == (√ a)² + r0 /\ 0 <= r0 <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a == (√ a)² + r /\ 0 <= r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a == (√ a)² + r
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r
0 <= r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a == (√ a)² + r
now rewrite add_comm.
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

0 <= r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

0 <= r
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r
r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

0 <= r
trivial.
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

r <= 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

r + (√ a)² <= 2 * √ a + (√ a)²
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a <= (√ a)² + 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a < (S √ a)² -> a <= (√ a)² + 2 * √ a
a:t
Ha:0 <= a
LE:(√ a)² <= a
LT:a < (S √ a)²
r:t
Hr:a == r + (√ a)²
Hr':0 <= r

a < S ((√ a)² + √ a + √ a) -> a <= (√ a)² + (√ a + √ a)
now rewrite lt_succ_r, add_assoc. Qed.

forall a b c : t, 0 <= c <= 2 * b -> a == b² + c -> √ a == b

forall a b c : t, 0 <= c <= 2 * b -> a == b² + c -> √ a == b
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

√ a == b
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² <= a < (S b)²
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² <= b² + c < (S b)²
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² <= b² + c
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c
b² + c < (S b)²
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² <= b² + c
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² + 0 <= b² + c
now apply add_le_mono_l.
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² + c < (S b)²
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² + c < S (b² + b + b)
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² + c <= b² + b + b
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

b² + c <= b² + (b + b)
a, b, c:t
Hc:0 <= c
H:c <= 2 * b
EQ:a == b² + c

c <= b + b
generalize H; now nzsimpl'. Qed.
Sqrt is exact on squares

forall a : t, 0 <= a -> √ a² == a

forall a : t, 0 <= a -> √ a² == a
a:t
Ha:0 <= a

√ a² == a
a:t
Ha:0 <= a

0 <= 0 <= 2 * a
a:t
Ha:0 <= a
a² == a² + 0
a:t
Ha:0 <= a

0 <= 0 <= 2 * a
a:t
Ha:0 <= a

0 <= 0
a:t
Ha:0 <= a
0 <= 2 * a
a:t
Ha:0 <= a

0 <= 0
order.
a:t
Ha:0 <= a

0 <= 2 * a
apply mul_nonneg_nonneg; order'.
a:t
Ha:0 <= a

a² == a² + 0
now nzsimpl. Qed.
Sqrt and predecessors of squares

forall a : t, 0 < a -> √ (P a²) == P a

forall a : t, 0 < a -> √ (P a²) == P a
a:t
Ha:0 < a

√ (P a²) == P a
a:t
Ha:0 < a

(P a)² <= P a² < (S (P a))²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² <= P a² < (S (P a))²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² <= P a² < a²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² <= P a²
a:t
Ha:0 < a
EQ:S (P a) == a
P a² < a²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² <= P a²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² < S (P a²)
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² < a²
a:t
Ha:0 < a
EQ:S (P a) == a
0 < a²
a:t
Ha:0 < a
EQ:S (P a) == a

(P a)² < a²
a:t
Ha:0 < a
EQ:S (P a) == a
H:0 <= P a

(P a)² < a²
a:t
Ha:0 < a
EQ:S (P a) == a
H:0 <= P a
H0:P a < a

(P a)² < a²
apply mul_lt_mono_nonneg; trivial.
a:t
Ha:0 < a
EQ:S (P a) == a

0 < a²
now apply mul_pos_pos.
a:t
Ha:0 < a
EQ:S (P a) == a

P a² < a²
a:t
Ha:0 < a
EQ:S (P a) == a

S (P a²) <= a²
a:t
Ha:0 < a
EQ:S (P a) == a

a² <= a²
a:t
Ha:0 < a
EQ:S (P a) == a
0 < a²
a:t
Ha:0 < a
EQ:S (P a) == a

a² <= a²
reflexivity.
a:t
Ha:0 < a
EQ:S (P a) == a

0 < a²
now apply mul_pos_pos. Qed.
Sqrt is a monotone function (but not a strict one)

forall a b : t, a <= b -> √ a <= √ b

forall a b : t, a <= b -> √ a <= √ b
a, b:t
Hab:a <= b

√ a <= √ b
a, b:t
Hab:a <= b
Ha:a < 0

√ a <= √ b
a, b:t
Hab:a <= b
Ha:0 <= a
√ a <= √ b
a, b:t
Hab:a <= b
Ha:a < 0

√ a <= √ b
a, b:t
Hab:a <= b
Ha:a < 0

0 <= √ b
apply sqrt_nonneg.
a, b:t
Hab:a <= b
Ha:0 <= a

√ a <= √ b
a, b:t
Hab:a <= b
Ha:0 <= a
Hb:0 <= b

√ a <= √ b
a, b:t
Hab:a <= b
Ha:0 <= a
Hb:0 <= b
LE:(√ a)² <= a

√ a <= √ b
a, b:t
Hab:a <= b
Ha:0 <= a
Hb:0 <= b
LE:(√ a)² <= a
LT:b < (S √ b)²

√ a <= √ b
a, b:t
Hab:a <= b
Ha:0 <= a
Hb:0 <= b
LE:(√ a)² <= a
LT:b < (S √ b)²

√ a < S √ b
a, b:t
Hab:a <= b
Ha:0 <= a
Hb:0 <= b
LE:(√ a)² <= a
LT:b < (S √ b)²

0 <= S √ b
now apply lt_le_incl, lt_succ_r, sqrt_nonneg. Qed.
No reverse result for <=, consider for instance √2 <= √1

forall a b : t, √ a < √ b -> a < b

forall a b : t, √ a < √ b -> a < b
a, b:t
H:√ a < √ b

a < b
a, b:t
H:√ a < √ b
Hb:b < 0

a < b
a, b:t
H:√ a < √ b
Hb:0 <= b
a < b
a, b:t
H:√ a < √ b
Hb:b < 0

a < b
rewrite (sqrt_neg b Hb) in H; generalize (sqrt_nonneg a); order.
a, b:t
H:√ a < √ b
Hb:0 <= b

a < b
a, b:t
H:√ a < √ b
Hb:0 <= b
Ha:0 <= a

a < b
a, b:t
H:√ a < √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²

a < b
a, b:t
H:√ a < √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

a < b
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

a < b
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

(S √ a)² <= (√ b)²
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b
H0:(S √ a)² <= (√ b)²
a < b
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

(S √ a)² <= (√ b)²
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

0 <= S √ a
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b
0 <= S √ a
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

0 <= S √ a
now apply lt_le_incl, lt_succ_r, sqrt_nonneg.
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b

0 <= S √ a
now apply lt_le_incl, lt_succ_r, sqrt_nonneg.
a, b:t
H:S √ a <= √ b
Hb:0 <= b
Ha:0 <= a
LT:a < (S √ a)²
LE:(√ b)² <= b
H0:(S √ a)² <= (√ b)²

a < b
order. Qed.
When left side is a square, we have an equivalence for <=

forall a b : t, 0 <= a -> 0 <= b -> b² <= a <-> b <= √ a

forall a b : t, 0 <= a -> 0 <= b -> b² <= a <-> b <= √ a
a, b:t
Ha:0 <= a
Hb:0 <= b

b² <= a <-> b <= √ a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² <= a

b <= √ a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b <= √ a
b² <= a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² <= a

b <= √ a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² <= a

√ b² <= √ a
now apply sqrt_le_mono.
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b <= √ a

b² <= a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b <= √ a
LE:(√ a)² <= a
LT:a < (S √ a)²

b² <= a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b <= √ a
LE:(√ a)² <= a
LT:a < (S √ a)²

b² <= (√ a)²
now apply mul_le_mono_nonneg. Qed.
When right side is a square, we have an equivalence for <

forall a b : t, 0 <= a -> 0 <= b -> a < b² <-> √ a < b

forall a b : t, 0 <= a -> 0 <= b -> a < b² <-> √ a < b
a, b:t
Ha:0 <= a
Hb:0 <= b

a < b² <-> √ a < b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a < b²

√ a < b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:√ a < b
a < b²
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a < b²

√ a < b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a < b²
LE:(√ a)² <= a

√ a < b
apply square_lt_simpl_nonneg; try order.
a, b:t
Ha:0 <= a
Hb:0 <= b
H:√ a < b

a < b²
a, b:t
Ha:0 <= a
Hb:0 <= b
H:√ a < √ b²

a < b²
now apply sqrt_lt_cancel. Qed.
Sqrt and basic constants

0 == 0

0 == 0

0² == 0
now apply sqrt_square. Qed.

1 == 1

1 == 1

1² == 1

0 <= 1
order'. Qed.

2 == 1

2 == 1

0 <= 1 <= 2 * 1

2 == 1² + 1

0 <= 1 <= 2 * 1
nzsimpl; split; order'.

2 == 1² + 1
now nzsimpl'. Qed.

forall a : t, 0 < √ a <-> 0 < a

forall a : t, 0 < √ a <-> 0 < a
a:t

0 < √ a <-> 0 < a
a:t
Ha:0 < √ a

0 < a
a:t
Ha:0 < a
0 < √ a
a:t
Ha:0 < √ a

0 < a
a:t
Ha:0 < √ a

0 < √ a
now rewrite sqrt_0.
a:t
Ha:0 < a

0 < √ a
a:t
Ha:0 < a

1 <= √ a
a:t
Ha:0 < a

1 <= a
now rewrite one_succ, le_succ_l. Qed.

forall a : t, 1 < a -> √ a < a

forall a : t, 1 < a -> √ a < a
a:t
Ha:1 < a

√ a < a
a:t
Ha:1 < a

a < a²
a:t
Ha:1 < a

a * 1 < a²
rewrite <- mul_lt_mono_pos_l; order'. Qed.

forall a : t, 0 <= a -> √ a <= a

forall a : t, 0 <= a -> √ a <= a
a:t
Ha:0 <= a

√ a <= a
a:t
Ha:0 <= a
H:a <= 0

√ a <= a
a:t
Ha:0 <= a
H:0 < a
√ a <= a
a:t
Ha:0 <= a
H:a <= 0

√ a <= a
a:t
Ha:0 <= a
H:a <= 0

0 <= 0
now rewrite sqrt_0.
a:t
Ha:0 <= a
H:0 < a

√ a <= a
a:t
Ha:0 <= a
H:0 < a
H':a <= 1

√ a <= a
a:t
Ha:0 <= a
H:0 < a
H':1 < a
√ a <= a
a:t
Ha:0 <= a
H:0 < a
H':a <= 1

√ a <= a
a:t
Ha:0 <= a
H:1 <= a
H':a <= 1

√ a <= a
a:t
Ha:0 <= a
H:1 <= a
H':a <= 1

1 <= 1
now rewrite sqrt_1.
a:t
Ha:0 <= a
H:0 < a
H':1 < a

√ a <= a
now apply lt_le_incl, sqrt_lt_lin. Qed.
Sqrt and multiplication.
Due to rounding error, we don't have the usual √(a*b) = √a*√b but only lower and upper bounds.

forall a b : t, √ a * √ b <= √ (a * b)

forall a b : t, √ a * √ b <= √ (a * b)
a, b:t

√ a * √ b <= √ (a * b)
a, b:t
Ha:a < 0

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
√ a * √ b <= √ (a * b)
a, b:t
Ha:a < 0

√ a * √ b <= √ (a * b)
a, b:t
Ha:a < 0

0 * √ b <= √ (a * b)
a, b:t
Ha:a < 0

0 <= √ (a * b)
apply sqrt_nonneg.
a, b:t
Ha:0 <= a

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:b < 0

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:0 <= b
√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:b < 0

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:b < 0

√ a * 0 <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:b < 0

0 <= √ (a * b)
apply sqrt_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

√ a * √ b <= √ (a * b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a * √ b)² <= a * b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² * (√ b)² <= a * b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² <= a
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
(√ b)² <= b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² <= a
now apply sqrt_spec.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ b)² <= b
now apply sqrt_spec. Qed.

forall a b : t, 0 <= a -> 0 <= b -> √ (a * b) < S √ a * S √ b

forall a b : t, 0 <= a -> 0 <= b -> √ (a * b) < S √ a * S √ b
a, b:t
Ha:0 <= a
Hb:0 <= b

√ (a * b) < S √ a * S √ b
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= a * b
a, b:t
Ha:0 <= a
Hb:0 <= b
0 <= S √ a * S √ b
a, b:t
Ha:0 <= a
Hb:0 <= b
a * b < (S √ a * S √ b)²
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= a * b
now apply mul_nonneg_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= S √ a * S √ b
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= S √ a
a, b:t
Ha:0 <= a
Hb:0 <= b
0 <= S √ b
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= S √ a
now apply lt_le_incl, lt_succ_r, sqrt_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= S √ b
now apply lt_le_incl, lt_succ_r, sqrt_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

a * b < (S √ a * S √ b)²
a, b:t
Ha:0 <= a
Hb:0 <= b

a * b < (S √ a)² * (S √ b)²
apply mul_lt_mono_nonneg; trivial; now apply sqrt_spec. Qed.
And we can't find better approximations in general.
Sqrt and successor :

forall a : t, 0 <= a -> √ (S a) <= S √ a

forall a : t, 0 <= a -> √ (S a) <= S √ a
a:t
Ha:0 <= a

√ (S a) <= S √ a
a:t
Ha:0 <= a

√ (S a) < S (S √ a)
a:t
Ha:0 <= a

0 <= S a
a:t
Ha:0 <= a
0 <= S (S √ a)
a:t
Ha:0 <= a
S a < (S (S √ a))²
a:t
Ha:0 <= a

0 <= S a
now apply le_le_succ_r.
a:t
Ha:0 <= a

0 <= S (S √ a)
apply le_le_succ_r, le_le_succ_r, sqrt_nonneg.
a:t
Ha:0 <= a

S a < (S (S √ a))²
a:t
Ha:0 <= a

S a < (1 + S √ a)²
a:t
Ha:0 <= a

S a < 1² + (S √ a)²
a:t
Ha:0 <= a
1² + (S √ a)² <= (1 + S √ a)²
a:t
Ha:0 <= a

S a < 1² + (S √ a)²
a:t
Ha:0 <= a

a < (S √ a)²
now apply sqrt_spec.
a:t
Ha:0 <= a

1² + (S √ a)² <= (1 + S √ a)²
a:t
Ha:0 <= a

0 <= 1
a:t
Ha:0 <= a
0 <= S √ a
a:t
Ha:0 <= a

0 <= 1
order'.
a:t
Ha:0 <= a

0 <= S √ a
apply le_le_succ_r, sqrt_nonneg. Qed.

forall a : t, 0 <= a -> √ (S a) == S √ a \/ √ (S a) == √ a

forall a : t, 0 <= a -> √ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a

√ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a
H:√ (S a) <= √ a

√ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a
H:√ a < √ (S a)
√ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a
H:√ (S a) <= √ a

√ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a
H:√ (S a) <= √ a

√ (S a) == √ a
generalize (sqrt_le_mono _ _ (le_succ_diag_r a)); order.
a:t
Ha:0 <= a
H:√ a < √ (S a)

√ (S a) == S √ a \/ √ (S a) == √ a
a:t
Ha:0 <= a
H:√ a < √ (S a)

√ (S a) == S √ a
a:t
Ha:0 <= a
H:S √ a <= √ (S a)

√ (S a) == S √ a
generalize (sqrt_succ_le a Ha); order. Qed.

forall a : t, 0 <= a -> √ (S a) == S √ a <-> (exists b : t, 0 < b /\ S a == b²)

forall a : t, 0 <= a -> √ (S a) == S √ a <-> (exists b : t, 0 < b /\ S a == b²)
a:t
Ha:0 <= a

√ (S a) == S √ a <-> (exists b : t, 0 < b /\ S a == b²)
a:t
Ha:0 <= a

√ (S a) == S √ a -> exists b : t, 0 < b /\ S a == b²
a:t
Ha:0 <= a
(exists b : t, 0 < b /\ S a == b²) -> √ (S a) == S √ a
a:t
Ha:0 <= a

√ (S a) == S √ a -> exists b : t, 0 < b /\ S a == b²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

exists b : t, 0 < b /\ S a == b²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

0 < S √ a /\ S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

0 < S √ a
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a
S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

0 < S √ a
apply lt_succ_r, sqrt_nonneg.
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

a < (S √ a)² -> S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a

S a <= (S √ a)² -> S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a
Ha':0 <= S a

S a <= (S √ a)² -> S a == (S √ a)²
a:t
Ha:0 <= a
EQ:√ (S a) == S √ a
Ha':0 <= S a

(√ (S a))² <= S a -> S a <= (S √ a)² -> S a == (S √ a)²
rewrite EQ; order.
a:t
Ha:0 <= a

(exists b : t, 0 < b /\ S a == b²) -> √ (S a) == S √ a
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

√ (S a) == S √ a
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

√ b² == S √ a
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

b == S √ a
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

S √ a == b
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

S √ a == S (P b)
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

√ a == P b
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == S (P b²)

√ a == P b
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²
0 < b²
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == S (P b²)

√ a == P b
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:a == P b²

√ a == P b
now rewrite H, sqrt_pred_square.
a:t
Ha:0 <= a
b:t
Hb:0 < b
H:S a == b²

0 < b²
now apply mul_pos_pos. Qed.
Sqrt and addition

forall a b : t, √ (a + b) <= √ a + √ b

forall a b : t, √ (a + b) <= √ a + √ b

forall a b : t, a < 0 -> √ (a + b) <= √ a + √ b
AUX:forall a b : t, a < 0 -> √ (a + b) <= √ a + √ b
forall a b : t, √ (a + b) <= √ a + √ b

forall a b : t, a < 0 -> √ (a + b) <= √ a + √ b
a, b:t
Ha:a < 0

√ (a + b) <= √ a + √ b
a, b:t
Ha:a < 0

√ (a + b) <= 0 + √ b
a, b:t
Ha:a < 0

√ (a + b) <= √ b
a, b:t
Ha:a < 0

a + b <= b
a, b:t
Ha:a < 0

a + b <= 0 + b
apply add_le_mono_r; order.
AUX:forall a b : t, a < 0 -> √ (a + b) <= √ a + √ b

forall a b : t, √ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:a < 0

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:a < 0

√ (a + b) <= √ a + √ b
now apply AUX.
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:b < 0

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:b < 0

√ (a + b) <= √ a + √ b
rewrite (add_comm a), (add_comm (√a)); now apply AUX.
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

√ (a + b) <= √ a + √ b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

√ (a + b) < S (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= a + b
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
0 <= S (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
a + b < (S (√ a + √ b))²
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= a + b
now apply add_nonneg_nonneg.
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= S (√ a + √ b)
now apply lt_le_incl, lt_succ_r, add_nonneg_nonneg.
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

a + b < (S (√ a + √ b))²
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
LTa:a < (S √ a)²

a + b < (S (√ a + √ b))²
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
LTa:a < (S √ a)²
LTb:b < (S √ b)²

a + b < (S (√ a + √ b))²
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

a < (S √ a)² -> b < (S √ b)² -> a + b < (S (√ a + √ b))²
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

a < S ((√ a)² + √ a + √ a) -> b < S ((√ b)² + √ b + √ b) -> a + b < S ((√ a + √ b)² + (√ a + √ b) + (√ a + √ b))
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

a <= (√ a)² + √ a + √ a -> b <= (√ b)² + √ b + √ b -> a + b <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
LTa:a <= (√ a)² + √ a + √ a
LTb:b <= (√ b)² + √ b + √ b

a + b <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
LTa:a <= (√ a)² + √ a + √ a
LTb:b <= (√ b)² + √ b + √ b
H:a + b <= (√ a)² + √ a + √ a + ((√ b)² + √ b + √ b)

a + b <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
LTa:a <= (√ a)² + √ a + √ a
LTb:b <= (√ b)² + √ b + √ b
H:a + b <= (√ a)² + √ a + √ a + ((√ b)² + √ b + √ b)

(√ a)² + √ a + √ a + ((√ b)² + √ b + √ b) <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + √ a + √ a + ((√ b)² + √ b + √ b) <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ a + √ a) + ((√ b)² + √ b + √ b) <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ a + √ a) + ((√ b)² + (√ b + √ b)) <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ b)² + (√ a + √ a + (√ b + √ b)) <= (√ a + √ b)² + (√ a + √ b) + (√ a + √ b)
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ b)² + (√ a + √ a + (√ b + √ b)) <= (√ a + √ b)² + (√ a + √ b + (√ a + √ b))
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ b)² + (√ a + √ a + (√ b + √ b)) <= (√ a + √ b)² + (√ a + √ a + (√ b + √ b))
AUX:forall a0 b0 : t, a0 < 0 -> √ (a0 + b0) <= √ a0 + √ b0
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ b)² <= (√ a + √ b)²
now apply add_square_le. Qed.
convexity inequality for sqrt: sqrt of middle is above middle of square roots.

forall a b : t, 0 <= a -> 0 <= b -> √ a + √ b <= √ (2 * (a + b))

forall a b : t, 0 <= a -> 0 <= b -> √ a + √ b <= √ (2 * (a + b))
a, b:t
Ha:0 <= a
Hb:0 <= b

√ a + √ b <= √ (2 * (a + b))
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a

√ a + √ b <= √ (2 * (a + b))
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

√ a + √ b <= √ (2 * (a + b))
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
0 <= √ a + √ b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
(√ a + √ b)² <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
0 <= a + b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2
order'.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= a + b
now apply add_nonneg_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= √ a + √ b
now apply add_nonneg_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a + √ b)² <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a + √ b)² <= 2 * ((√ a)² + (√ b)²)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
2 * ((√ a)² + (√ b)²) <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a + √ b)² <= 2 * ((√ a)² + (√ b)²)
now apply square_add_le.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

2 * ((√ a)² + (√ b)²) <= 2 * (a + b)
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b
(√ a)² + (√ b)² <= a + b
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

0 <= 2
order'.
a, b:t
Ha:0 <= a
Hb:0 <= b
Ha':0 <= √ a
Hb':0 <= √ b

(√ a)² + (√ b)² <= a + b
apply add_le_mono; now apply sqrt_spec. Qed. End NZSqrtProp. Module Type NZSqrtUpProp (Import A : NZDecOrdAxiomsSig') (Import B : NZSqrt' A) (Import C : NZMulOrderProp A) (Import D : NZSqrtProp A B C).

sqrt_up : a square root that rounds up instead of down

Local Notation "a ²" := (a*a) (at level 5, no associativity, format "a ²").
For once, we define instead of axiomatizing, thanks to sqrt
Definition sqrt_up a :=
 match compare 0 a with
  | Lt => S √(P a)
  | _ => 0
 end.

Local Notation "√° a" := (sqrt_up a) (at level 6, no associativity).


forall a : t, a <= 0 -> √° a == 0

forall a : t, a <= 0 -> √° a == 0
a:t
Ha:a <= 0

√° a == 0
a:t
Ha:a <= 0

match compare 0 a with | Lt => S √ (P a) | _ => 0 end == 0
case compare_spec; try order. Qed.

forall a : t, 0 < a -> √° a == S √ (P a)

forall a : t, 0 < a -> √° a == S √ (P a)
a:t
Ha:0 < a

√° a == S √ (P a)
a:t
Ha:0 < a

match compare 0 a with | Lt => S √ (P a) | _ => 0 end == S √ (P a)
case compare_spec; try order. Qed.

forall a : t, 0 < a -> (P √° a)² < a <= (√° a)²

forall a : t, 0 < a -> (P √° a)² < a <= (√° a)²
a:t
Ha:0 < a

(P √° a)² < a <= (√° a)²
a:t
Ha:0 < a

(√ (P a))² < a <= (S √ (P a))²
a:t
Ha:0 < a
Ha':S (P a) == a

(√ (P a))² < a <= (S √ (P a))²
a:t
Ha:0 < a
Ha':S (P a) == a

(√ (P a))² < S (P a) <= (S √ (P a))²
a:t
Ha:0 < a
Ha':S (P a) == a

(√ (P a))² <= P a < (S √ (P a))²
a:t
Ha:0 < a
Ha':S (P a) == a

0 <= P a
now rewrite <- lt_succ_r, Ha'. Qed.
First, sqrt_up is non-negative

forall a : t, 0 <= √° a

forall a : t, 0 <= √° a
a:t

0 <= √° a
a:t
Ha:a <= 0

0 <= √° a
a:t
Ha:0 < a
0 <= √° a
a:t
Ha:a <= 0

0 <= √° a
now rewrite sqrt_up_eqn0.
a:t
Ha:0 < a

0 <= √° a
a:t
Ha:0 < a

0 <= S √ (P a)
apply le_le_succ_r, sqrt_nonneg. Qed.
sqrt_up is a morphism

Proper (eq ==> eq) sqrt_up

Proper (eq ==> eq) sqrt_up

Proper (eq ==> eq ==> Logic.eq) compare
H:Proper (eq ==> eq ==> Logic.eq) compare
Proper (eq ==> eq) sqrt_up

Proper (eq ==> eq ==> Logic.eq) compare
x, x':t
Hx:x == x'
y, y':t
Hy:y == y'

compare x y = compare x' y'
do 2 case compare_spec; trivial; order.
H:Proper (eq ==> eq ==> Logic.eq) compare

Proper (eq ==> eq) sqrt_up
intros x x' Hx; unfold sqrt_up; rewrite Hx; case compare; now rewrite ?Hx. Qed.
The spec of sqrt_up indeed determines it

forall a b : t, 0 < b -> (P b)² < a <= b² -> √° a == b

forall a b : t, 0 < b -> (P b)² < a <= b² -> √° a == b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²

√° a == b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a

√° a == b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a

S √ (P a) == b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

S √ (P a) == b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

S √ (P a) == S (P b)
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

√ (P a) == P b
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

(P b)² <= P a < (S (P b))²
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

(P b)² < S (P a) <= b²
a, b:t
Hb:0 < b
LEb:(P b)² < a
LTb:a <= b²
Ha:0 < a
Hb':S (P b) == b

(P b)² < a <= b²
now split. Qed.
sqrt_up is exact on squares

forall a : t, 0 <= a -> √° a² == a

forall a : t, 0 <= a -> √° a² == a
a:t
Ha:0 <= a

√° a² == a
a:t
Ha:0 < a

√° a² == a
a:t
Ha:0 == a
√° a² == a
a:t
Ha:0 < a

√° a² == a
a:t
Ha:0 < a

S √ (P a²) == a
a:t
Ha:0 < a

S (P a) == a
apply (lt_succ_pred 0); trivial.
a:t
Ha:0 == a

√° a² == a
a:t
Ha:0 == a

a² <= 0
a:t
Ha:0 == a

0² <= 0
now nzsimpl. Qed.
sqrt_up and successors of squares

forall a : t, 0 <= a -> √° (S a²) == S a

forall a : t, 0 <= a -> √° (S a²) == S a
a:t
Ha:0 <= a

√° (S a²) == S a
a:t
Ha:0 <= a

S √ (P (S a²)) == S a
now rewrite pred_succ, sqrt_square. Qed.
Basic constants

√° 0 == 0

√° 0 == 0

√° 0² == 0
now apply sqrt_up_square. Qed.

√° 1 == 1

√° 1 == 1

√° 1² == 1

0 <= 1
order'. Qed.

√° 2 == 2

√° 2 == 2

S √ (P 2) == 2
now rewrite two_succ, pred_succ, sqrt_1. Qed.
Links between sqrt and sqrt_up

forall a : t, √ a <= √° a

forall a : t, √ a <= √° a
a:t

√ a <= √° a
a:t

√ a <= match compare 0 a with | Lt => S √ (P a) | _ => 0 end
a:t
H:0 == a

√ a <= 0
a:t
H:0 < a
√ a <= S √ (P a)
a:t
H:a < 0
√ a <= 0
a:t
H:0 == a

√ a <= 0
a:t
H:0 == a

0 <= 0
order.
a:t
H:0 < a

√ a <= S √ (P a)
a:t
H:0 < a

√ (S (P a)) <= S √ (P a)
a:t
H:0 < a

0 <= P a
a:t
H:0 < a

0 < S (P a)
now rewrite (lt_succ_pred 0 a H).
a:t
H:a < 0

√ a <= 0
now rewrite sqrt_neg. Qed.

forall a : t, √° a <= S √ a

forall a : t, √° a <= S √ a
a:t

√° a <= S √ a
a:t

match compare 0 a with | Lt => S √ (P a) | _ => 0 end <= S √ a
a:t
H:0 < a

S √ (P a) <= S √ a
a:t
H:0 < a

√ (P a) <= √ a
a:t
H:0 < a

P a <= a
a:t
H:0 < a

P a <= S (P a)
apply le_succ_diag_r. Qed.

forall a : t, 0 <= a -> (√ a)² <= a <= (√° a)²

forall a : t, 0 <= a -> (√ a)² <= a <= (√° a)²
a:t
H:0 <= a

(√ a)² <= a <= (√° a)²
a:t
H:0 <= a

(√ a)² <= a
a:t
H:0 <= a
a <= (√° a)²
a:t
H:0 <= a

(√ a)² <= a
now apply sqrt_spec.
a:t
H:0 <= a

a <= (√° a)²
a:t
H:0 < a

a <= (√° a)²
a:t
H:0 == a
a <= (√° a)²
a:t
H:0 < a

a <= (√° a)²
now apply sqrt_up_spec.
a:t
H:0 == a

a <= (√° a)²
now rewrite <-H, sqrt_up_0, mul_0_l. Qed.

forall a : t, 0 <= a -> √ a == √° a <-> (exists b : t, 0 <= b /\ a == b²)

forall a : t, 0 <= a -> √ a == √° a <-> (exists b : t, 0 <= b /\ a == b²)
a:t
Ha:0 <= a

√ a == √° a <-> (exists b : t, 0 <= b /\ a == b²)
a:t
Ha:0 <= a

√ a == √° a -> exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 <= a
(exists b : t, 0 <= b /\ a == b²) -> √ a == √° a
a:t
Ha:0 <= a

√ a == √° a -> exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 <= a
H:√ a == √° a

exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 <= a
H:√ a == √° a

0 <= √ a /\ a == (√ a)²
a:t
Ha:0 <= a
H:√ a == √° a

0 <= √ a
a:t
Ha:0 <= a
H:√ a == √° a
a == (√ a)²
a:t
Ha:0 <= a
H:√ a == √° a

0 <= √ a
apply sqrt_nonneg.
a:t
Ha:0 <= a
H:√ a == √° a

a == (√ a)²
a:t
Ha:0 <= a
H:√ a == √° a

(√ a)² <= a <= (√° a)² -> a == (√ a)²
a:t
Ha:0 <= a
H:√ a == √° a

(√ a)² <= a <= (√ a)² -> a == (√ a)²
destruct 1; order.
a:t
Ha:0 <= a

(exists b : t, 0 <= b /\ a == b²) -> √ a == √° a
a:t
Ha:0 <= a
b:t
Hb:0 <= b
Hb':a == b²

√ a == √° a
a:t
Ha:0 <= a
b:t
Hb:0 <= b
Hb':a == b²

√ b² == √° b²
now rewrite sqrt_square, sqrt_up_square. Qed.
sqrt_up is a monotone function (but not a strict one)

forall a b : t, a <= b -> √° a <= √° b

forall a b : t, a <= b -> √° a <= √° b
a, b:t
H:a <= b

√° a <= √° b
a, b:t
H:a <= b
Ha:a <= 0

√° a <= √° b
a, b:t
H:a <= b
Ha:0 < a
√° a <= √° b
a, b:t
H:a <= b
Ha:a <= 0

√° a <= √° b
a, b:t
H:a <= b
Ha:a <= 0

0 <= √° b
apply sqrt_up_nonneg.
a, b:t
H:a <= b
Ha:0 < a

√° a <= √° b
a, b:t
H:a <= b
Ha:0 < a

S √ (P a) <= S √ (P b)
a, b:t
H:a <= b
Ha:0 < a

√ (P a) <= √ (P b)
a, b:t
H:a <= b
Ha:0 < a

S (P a) <= S (P b)
rewrite 2 (lt_succ_pred 0); order. Qed.
No reverse result for <=, consider for instance √°3 <= √°2

forall a b : t, √° a < √° b -> a < b

forall a b : t, √° a < √° b -> a < b
a, b:t
H:√° a < √° b

a < b
a, b:t
H:√° a < √° b
Hb:b <= 0

a < b
a, b:t
H:√° a < √° b
Hb:0 < b
a < b
a, b:t
H:√° a < √° b
Hb:b <= 0

a < b
rewrite (sqrt_up_eqn0 _ Hb) in H; generalize (sqrt_up_nonneg a); order.
a, b:t
H:√° a < √° b
Hb:0 < b

a < b
a, b:t
H:√° a < √° b
Hb:0 < b
Ha:0 < a

a < b
a, b:t
H:√° a < √° b
Hb:0 < b
Ha:0 < a

P a < P b
a, b:t
H:√° a < √° b
Hb:0 < b
Ha:0 < a

S √ (P a) < S √ (P b)
now rewrite <- 2 sqrt_up_eqn. Qed.
When left side is a square, we have an equivalence for <

forall a b : t, 0 <= a -> 0 <= b -> b² < a <-> b < √° a

forall a b : t, 0 <= a -> 0 <= b -> b² < a <-> b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b

b² < a <-> b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a

b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b < √° a
b² < a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a

b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a

0 < a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a
LE:(P √° a)² < a
LT:a <= (√° a)²
b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a

0 < a
apply le_lt_trans with b²; trivial using square_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a
LE:(P √° a)² < a
LT:a <= (√° a)²

b < √° a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b² < a
LE:(P √° a)² < a
LT:a <= (√° a)²

0 <= √° a
apply sqrt_up_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b < √° a

b² < a
a, b:t
Ha:0 <= a
Hb:0 <= b
H:b < √° a

√° b² < √° a
now rewrite sqrt_up_square. Qed.
When right side is a square, we have an equivalence for <=

forall a b : t, 0 <= a -> 0 <= b -> a <= b² <-> √° a <= b

forall a b : t, 0 <= a -> 0 <= b -> a <= b² <-> √° a <= b
a, b:t
Ha:0 <= a
Hb:0 <= b

a <= b² <-> √° a <= b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a <= b²

√° a <= b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:√° a <= b
a <= b²
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a <= b²

√° a <= b
a, b:t
Ha:0 <= a
Hb:0 <= b
H:a <= b²

√° a <= √° b²
now apply sqrt_up_le_mono.
a, b:t
Ha:0 <= a
Hb:0 <= b
H:√° a <= b

a <= b²
a, b:t
Ha:0 <= a
Hb:0 <= b
H:(√° a)² <= b²

a <= b²
a, b:t
Ha:0 <= a
Hb:0 <= b
H:(√° a)² <= b²

a <= (√° a)²
now apply sqrt_sqrt_up_spec. Qed.

forall a : t, 0 < √° a <-> 0 < a

forall a : t, 0 < √° a <-> 0 < a
a:t

0 < √° a <-> 0 < a
a:t
Ha:0 < √° a

0 < a
a:t
Ha:0 < a
0 < √° a
a:t
Ha:0 < √° a

0 < a
a:t
Ha:0 < √° a

√° 0 < √° a
now rewrite sqrt_up_0.
a:t
Ha:0 < a

0 < √° a
a:t
Ha:0 < a

√° 1 <= √° a
a:t
Ha:0 < a

1 <= a
now rewrite one_succ, le_succ_l. Qed.

forall a : t, 2 < a -> √° a < a

forall a : t, 2 < a -> √° a < a
a:t
Ha:2 < a

√° a < a
a:t
Ha:2 < a

S √ (P a) < a
a:t
Ha:2 < a
Ha':S (P a) == a

S √ (P a) < a
a:t
Ha:2 < a
Ha':S (P a) == a

S √ (P a) < S (P a)
a:t
Ha:2 < a
Ha':S (P a) == a

√ (P a) < P a
a:t
Ha:2 < a
Ha':S (P a) == a

1 < P a
a:t
Ha:2 < a
Ha':S (P a) == a

S 1 < S (P a)
now rewrite Ha', <- two_succ. Qed.

forall a : t, 0 <= a -> √° a <= a

forall a : t, 0 <= a -> √° a <= a
a:t
Ha:0 <= a

√° a <= a
a:t
Ha:0 < a

√° a <= a
a:t
Ha:0 == a
√° a <= a
a:t
Ha:0 < a

√° a <= a
a:t
Ha:0 < a

S √ (P a) <= a
a:t
Ha:0 < a

√ (P a) < a
a:t
Ha:0 < a

√ (P a) <= P a
a:t
Ha:0 < a
P a < a
a:t
Ha:0 < a

√ (P a) <= P a
a:t
Ha:0 < a

0 <= P a
now rewrite <- lt_succ_r, (lt_succ_pred 0).
a:t
Ha:0 < a

P a < a
a:t
Ha:0 < a

P a < S (P a)
apply lt_succ_diag_r.
a:t
Ha:0 == a

√° a <= a
now rewrite <- Ha, sqrt_up_0. Qed.
sqrt_up and multiplication.
Due to rounding error, we don't have the usual √(a×b) = a*√b but only lower and upper bounds.

forall a b : t, 0 <= a -> 0 <= b -> √° (a * b) <= √° a * √° b

forall a b : t, 0 <= a -> 0 <= b -> √° (a * b) <= √° a * √° b
a, b:t
Ha:0 <= a
Hb:0 <= b

√° (a * b) <= √° a * √° b
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= a * b
a, b:t
Ha:0 <= a
Hb:0 <= b
0 <= √° a * √° b
a, b:t
Ha:0 <= a
Hb:0 <= b
a * b <= (√° a * √° b)²
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= a * b
now apply mul_nonneg_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

0 <= √° a * √° b
apply mul_nonneg_nonneg; apply sqrt_up_nonneg.
a, b:t
Ha:0 <= a
Hb:0 <= b

a * b <= (√° a * √° b)²
a, b:t
Ha:0 <= a
Hb:0 <= b

a * b <= (√° a)² * (√° b)²
apply mul_le_mono_nonneg; trivial; now apply sqrt_sqrt_up_spec. Qed.

forall a b : t, 0 < a -> 0 < b -> P √° a * P √° b < √° (a * b)

forall a b : t, 0 < a -> 0 < b -> P √° a * P √° b < √° (a * b)
a, b:t
Ha:0 < a
Hb:0 < b

P √° a * P √° b < √° (a * b)
a, b:t
Ha:0 < a
Hb:0 < b

0 <= a * b
a, b:t
Ha:0 < a
Hb:0 < b
0 <= P √° a * P √° b
a, b:t
Ha:0 < a
Hb:0 < b
(P √° a * P √° b)² < a * b
a, b:t
Ha:0 < a
Hb:0 < b

0 <= a * b
apply mul_nonneg_nonneg; order.
a, b:t
Ha:0 < a
Hb:0 < b

0 <= P √° a * P √° b
a, b:t
Ha:0 < a
Hb:0 < b

0 < S (P √° a)
a, b:t
Ha:0 < a
Hb:0 < b
0 < S (P √° b)
a, b:t
Ha:0 < a
Hb:0 < b

0 < S (P √° a)
rewrite (lt_succ_pred 0); now rewrite sqrt_up_pos.
a, b:t
Ha:0 < a
Hb:0 < b

0 < S (P √° b)
rewrite (lt_succ_pred 0); now rewrite sqrt_up_pos.
a, b:t
Ha:0 < a
Hb:0 < b

(P √° a * P √° b)² < a * b
a, b:t
Ha:0 < a
Hb:0 < b

(P √° a)² * (P √° b)² < a * b
apply mul_lt_mono_nonneg; trivial using square_nonneg; now apply sqrt_up_spec. Qed.
And we can't find better approximations in general.
sqrt_up and successor :

forall a : t, 0 <= a -> √° (S a) <= S √° a

forall a : t, 0 <= a -> √° (S a) <= S √° a
a:t
Ha:0 <= a

√° (S a) <= S √° a
a:t
Ha:0 <= a

0 <= S a
a:t
Ha:0 <= a
0 <= S √° a
a:t
Ha:0 <= a
S a <= (S √° a)²
a:t
Ha:0 <= a

0 <= S a
now apply le_le_succ_r.
a:t
Ha:0 <= a

0 <= S √° a
apply le_le_succ_r, sqrt_up_nonneg.
a:t
Ha:0 <= a

S a <= (S √° a)²
a:t
Ha:0 <= a

S a <= (1 + √° a)²
a:t
Ha:0 <= a

S a <= 1² + (√° a)²
a:t
Ha:0 <= a
1² + (√° a)² <= (1 + √° a)²
a:t
Ha:0 <= a

S a <= 1² + (√° a)²
a:t
Ha:0 <= a

a <= (√° a)²
now apply sqrt_sqrt_up_spec.
a:t
Ha:0 <= a

1² + (√° a)² <= (1 + √° a)²
a:t
Ha:0 <= a

0 <= 1
a:t
Ha:0 <= a
0 <= √° a
a:t
Ha:0 <= a

0 <= 1
order'.
a:t
Ha:0 <= a

0 <= √° a
apply sqrt_up_nonneg. Qed.

forall a : t, 0 <= a -> √° (S a) == S √° a \/ √° (S a) == √° a

forall a : t, 0 <= a -> √° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a

√° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a
H:√° (S a) <= √° a

√° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a
H:√° a < √° (S a)
√° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a
H:√° (S a) <= √° a

√° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a
H:√° (S a) <= √° a

√° (S a) == √° a
generalize (sqrt_up_le_mono _ _ (le_succ_diag_r a)); order.
a:t
Ha:0 <= a
H:√° a < √° (S a)

√° (S a) == S √° a \/ √° (S a) == √° a
a:t
Ha:0 <= a
H:√° a < √° (S a)

√° (S a) == S √° a
a:t
Ha:0 <= a
H:S √° a <= √° (S a)

√° (S a) == S √° a
generalize (sqrt_up_succ_le a Ha); order. Qed.

forall a : t, 0 <= a -> √° (S a) == S √° a <-> (exists b : t, 0 <= b /\ a == b²)

forall a : t, 0 <= a -> √° (S a) == S √° a <-> (exists b : t, 0 <= b /\ a == b²)
a:t
Ha:0 <= a

√° (S a) == S √° a <-> (exists b : t, 0 <= b /\ a == b²)
a:t
Ha:0 <= a

√° (S a) == S √° a -> exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 <= a
(exists b : t, 0 <= b /\ a == b²) -> √° (S a) == S √° a
a:t
Ha:0 <= a

√° (S a) == S √° a -> exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 <= a
EQ:√° (S a) == S √° a

exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 == a
EQ:√° (S a) == S √° a
exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

0 <= √° a /\ a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

0 <= √° a
a:t
Ha:0 < a
EQ:√° (S a) == S √° a
a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

0 <= √° a
apply sqrt_up_nonneg.
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a

a <= (√° a)² -> a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a
Ha':0 < S a

a <= (√° a)² -> a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a
Ha':0 < S a

(P √° (S a))² < S a -> a <= (√° a)² -> a == (√° a)²
a:t
Ha:0 < a
EQ:√° (S a) == S √° a
Ha':0 < S a

(√° a)² <= a -> a <= (√° a)² -> a == (√° a)²
order.
a:t
Ha:0 == a
EQ:√° (S a) == S √° a

exists b : t, 0 <= b /\ a == b²
a:t
Ha:0 == a
EQ:√° (S a) == S √° a

0 <= 0 /\ a == 0²
a:t
Ha:0 == a
EQ:√° (S a) == S √° a

0 <= 0 /\ a == 0
now split.
a:t
Ha:0 <= a

(exists b : t, 0 <= b /\ a == b²) -> √° (S a) == S √° a
a:t
Ha:0 <= a
b:t
Hb:0 <= b
H:a == b²

√° (S a) == S √° a
now rewrite H, sqrt_up_succ_square, sqrt_up_square. Qed.
sqrt_up and addition

forall a b : t, √° (a + b) <= √° a + √° b

forall a b : t, √° (a + b) <= √° a + √° b

forall a b : t, a <= 0 -> √° (a + b) <= √° a + √° b
AUX:forall a b : t, a <= 0 -> √° (a + b) <= √° a + √° b
forall a b : t, √° (a + b) <= √° a + √° b

forall a b : t, a <= 0 -> √° (a + b) <= √° a + √° b
a, b:t
Ha:a <= 0

√° (a + b) <= √° a + √° b
a, b:t
Ha:a <= 0

√° (a + b) <= 0 + √° b
a, b:t
Ha:a <= 0

√° (a + b) <= √° b
a, b:t
Ha:a <= 0

a + b <= b
a, b:t
Ha:a <= 0

a + b <= 0 + b
apply add_le_mono_r; order.
AUX:forall a b : t, a <= 0 -> √° (a + b) <= √° a + √° b

forall a b : t, √° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t

√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:a <= 0

√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:a <= 0

√° (a + b) <= √° a + √° b
now apply AUX.
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a

√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:b <= 0

√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b
√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:b <= 0

√° (a + b) <= √° a + √° b
rewrite (add_comm a), (add_comm (√°a)); now apply AUX.
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√° (a + b) <= √° a + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

S √ (P (a + b)) <= S √ (P a) + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b
0 < a + b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

S √ (P (a + b)) <= S √ (P a) + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

S √ (P (a + b)) <= S (√ (P a) + √° b)
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P (a + b)) <= √ (P a) + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P (a + b)) <= √ (P a) + √ b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b
√ (P a) + √ b <= √ (P a) + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P (a + b)) <= √ (P a) + √ b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P (S (P a) + b)) <= √ (P a) + √ b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P a + b) <= √ (P a) + √ b
apply sqrt_add_le.
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ (P a) + √ b <= √ (P a) + √° b
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

√ b <= √° b
apply le_sqrt_sqrt_up.
AUX:forall a0 b0 : t, a0 <= 0 -> √° (a0 + b0) <= √° a0 + √° b0
a, b:t
Ha:0 < a
Hb:0 < b

0 < a + b
now apply add_pos_pos. Qed.
Convexity-like inequality for sqrt_up: sqrt_up of middle is above middle of square roots. We cannot say more, for instance take a=b=2, then 2+2 <= S 3

forall a b : t, 0 <= a -> 0 <= b -> √° a + √° b <= S √° (2 * (a + b))

forall a b : t, 0 <= a -> 0 <= b -> √° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 <= a
Hb:0 <= b

√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 < b

√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 == b
√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 == a
Hb:0 <= b
√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 < b

√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 < b

S √ (P a) + S √ (P b) <= S (S √ (P (2 * (a + b))))
a, b:t
Ha:0 < a
Hb:0 < b
0 < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b

S √ (P a) + S √ (P b) <= S (S √ (P (2 * (a + b))))
a, b:t
Ha:0 < a
Hb:0 < b

S (S (√ (P a) + √ (P b))) <= S (S √ (P (2 * (a + b))))
a, b:t
Ha:0 < a
Hb:0 < b

√ (P a) + √ (P b) <= √ (P (2 * (a + b)))
a, b:t
Ha:0 < a
Hb:0 < b

0 <= P a
a, b:t
Ha:0 < a
Hb:0 < b
0 <= P b
a, b:t
Ha:0 < a
Hb:0 < b
√ (2 * (P a + P b)) <= √ (P (2 * (a + b)))
a, b:t
Ha:0 < a
Hb:0 < b

0 <= P a
a, b:t
Ha:0 < a
Hb:0 < b

0 < S (P a)
now rewrite (lt_succ_pred 0 a Ha).
a, b:t
Ha:0 < a
Hb:0 < b

0 <= P b
a, b:t
Ha:0 < a
Hb:0 < b

0 < S (P b)
now rewrite (lt_succ_pred 0 b Hb).
a, b:t
Ha:0 < a
Hb:0 < b

√ (2 * (P a + P b)) <= √ (P (2 * (a + b)))
a, b:t
Ha:0 < a
Hb:0 < b

2 * (P a + P b) <= P (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 < b

2 * (P a + P b) < S (P (2 * (a + b)))
a, b:t
Ha:0 < a
Hb:0 < b

2 * (P a + P b) < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b
0 < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b

2 * (P a + P b) < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
a, b:t
Ha:0 < a
Hb:0 < b
P a + P b < a + b
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
order'.
a, b:t
Ha:0 < a
Hb:0 < b

P a + P b < a + b
a, b:t
Ha:0 < a
Hb:0 < b

P a < a
a, b:t
Ha:0 < a
Hb:0 < b
P b < b
a, b:t
Ha:0 < a
Hb:0 < b

P a < a
a, b:t
Ha:0 < a
Hb:0 < b

S (P a) <= a
now rewrite (lt_succ_pred 0).
a, b:t
Ha:0 < a
Hb:0 < b

P b < b
a, b:t
Ha:0 < a
Hb:0 < b

S (P b) <= b
now rewrite (lt_succ_pred 0).
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
a, b:t
Ha:0 < a
Hb:0 < b
0 < a + b
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
order'.
a, b:t
Ha:0 < a
Hb:0 < b

0 < a + b
now apply add_pos_pos.
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2 * (a + b)
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
a, b:t
Ha:0 < a
Hb:0 < b
0 < a + b
a, b:t
Ha:0 < a
Hb:0 < b

0 < 2
order'.
a, b:t
Ha:0 < a
Hb:0 < b

0 < a + b
now apply add_pos_pos.
a, b:t
Ha:0 < a
Hb:0 == b

√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 < a
Hb:0 == b

√° a + 0 <= S √° (2 * (a + 0))
a, b:t
Ha:0 < a
Hb:0 == b

√° a <= S √° (2 * a)
a, b:t
Ha:0 < a
Hb:0 == b

a <= 2 * a
a, b:t
Ha:0 < a
Hb:0 == b

1 * a <= 2 * a
apply mul_le_mono_nonneg_r; order'.
a, b:t
Ha:0 == a
Hb:0 <= b

√° a + √° b <= S √° (2 * (a + b))
a, b:t
Ha:0 == a
Hb:0 <= b

0 + √° b <= S √° (2 * (0 + b))
a, b:t
Ha:0 == a
Hb:0 <= b

√° b <= S √° (2 * b)
a, b:t
Ha:0 == a
Hb:0 <= b

b <= 2 * b
a, b:t
Ha:0 == a
Hb:0 <= b

1 * b <= 2 * b
apply mul_le_mono_nonneg_r; order'. Qed. End NZSqrtUpProp.