(** Truncation *)

Record shr_record := { shr_m : Z ; shr_r : bool ; shr_s : bool }.(** Truncation *)

Record shr_record := { shr_m : Z ; shr_r : bool ; shr_s : bool }.(** Truncation *)

Record shr_record := { shr_m : Z ; shr_r : bool ; shr_s : bool }.(** Truncation *)

Record shr_record := { shr_m : Z ; shr_r : bool ; shr_s : bool }.Definition shr_1 mrs :=
  let '(Build_shr_record m r s) := mrs in
  let s := orb r s in
  match m with
  | Z0 => Build_shr_record Z0 false s
  | Zpos xH => Build_shr_record Z0 true s
  | Zpos (xO p) => Build_shr_record (Zpos p) false s
  | Zpos (xI p) => Build_shr_record (Zpos p) true s
  | Zneg xH => Build_shr_record Z0 true s
  | Zneg (xO p) => Build_shr_record (Zneg p) false s
  | Zneg (xI p) => Build_shr_record (Zneg p) true s
  end.Definition loc_of_shr_record mrs :=
  match mrs with
  | Build_shr_record _ false false => loc_Exact
  | Build_shr_record _ false true => loc_Inexact Lt
  | Build_shr_record _ true false => loc_Inexact Eq
  | Build_shr_record _ true true => loc_Inexact Gt
  end.Definition shr_record_of_loc m l :=
  match l with
  | loc_Exact => Build_shr_record m false false
  | loc_Inexact Lt => Build_shr_record m false true
  | loc_Inexact Eq => Build_shr_record m true false
  | loc_Inexact Gt => Build_shr_record m true true
  end.

(* Specifications: *)
Theorem shr_m_shr_record_of_loc : forall m l, shr_m (shr_record_of_loc m l) = m.
Theorem loc_of_shr_record_of_loc : forall m l, loc_of_shr_record (shr_record_of_loc m l) = l.
Theorem shr_m_shr_record_of_loc : forall m l, shr_m (shr_record_of_loc m l) = m.
Theorem loc_of_shr_record_of_loc : forall m l, loc_of_shr_record (shr_record_of_loc m l) = l.