(** [sqrt_up] is a morphism *)
(** The spec of [sqrt_up] indeed determines it *)

(* Specifications: *)
Lemma sqrt_up_unique : forall a b, 0<b -> (P b)² < a <= b² -> √°a == b.
(** [sqrt_up] is exact on squares *)
Lemma sqrt_up_square : forall a, 0<=a -> √°(a²) == a.
(** [sqrt_up] and successors of squares *)
Lemma sqrt_up_succ_square : forall a, 0<=a -> √°(S a²) == S a.
(** Basic constants *)
Lemma sqrt_up_0 : √°0 == 0.
Lemma sqrt_up_1 : √°1 == 1.
Lemma sqrt_up_2 : √°2 == 2.
(**  Links between sqrt and [sqrt_up] *)
Lemma le_sqrt_sqrt_up : forall a, √a <= √°a.
Lemma le_sqrt_up_succ_sqrt : forall a, √°a <= S (√a).
Lemma sqrt_sqrt_up_spec : forall a, 0<=a -> (√a)² <= a <= (√°a)².
Lemma sqrt_sqrt_up_exact :
forall a, 0<=a -> (√a == √°a <-> exists b, 0<=b /\ a == b²).