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 *)
(** The spec of sqrt indeed determines it *)
(** Hence sqrt is a morphism *)
Instance sqrt_wd : Proper (eq==>eq) sqrt.
(** An alternate specification *)
(** Sqrt is exact on squares *)
(** Sqrt and predecessors of squares *)
(** Sqrt is a monotone function (but not a strict one) *)
(** No reverse result for <=, consider for instance √2 <= √1 *)
(** When left side is a square, we have an equivalence for <= *)
(** When right side is a square, we have an equivalence for < *)
(** Sqrt and basic constants *)
(** Sqrt and multiplication. *)
(** Due to rounding error, we don't have the usual √(a*b) = √a*√b but only lower and upper bounds. *)
(** And we can't find better approximations in general. - The lower bound is exact for squares - Concerning the upper bound, for any c>0, take a=b=c²-1, then √(a*b) = c² -1 while S √a = S √b = c *)
(** Sqrt and successor : - the sqrt function climbs by at most 1 at a time - otherwise it stays at the same value - the +1 steps occur for squares *)

Lemma sqrt_succ_or : forall a, 0<=a -> √(S a) == S (√a) \/ √(S a) == √a.