Notation "s #1" := (fst s) (at level 9, format "s '#1'") : pair_scope.Notation "s #2" := (snd s) (at level 9, format "s '#2'") : pair_scope.Infix "=="  := Z.eq (at level 70) : ZScope.Notation "x ~= y" := (~ Z.eq x y) (at level 70) : ZScope.Notation "0" := Z.zero : ZScope.Notation "1" := Z.one : ZScope.Notation "2" := Z.two : ZScope.Infix "+" := Z.add : ZScope.Infix "-" := Z.sub : ZScope.Infix "*" := Z.mul : ZScope.Infix "<" := Z.lt : ZScope.Infix "<=" := Z.le : ZScope.Definition t := (N.t * N.t)%type.Definition zero : t := (0, 0).Definition one : t := (1,0).Definition two : t := (2,0).Definition eq (p q : t) := (p#1 + q#2 == q#1 + p#2).Definition succ (n : t) : t := (N.succ n#1, n#2).Definition pred (n : t) : t := (n#1, N.succ n#2).Definition opp (n : t) : t := (n#2, n#1).Definition add (n m : t) : t := (n#1 + m#1, n#2 + m#2).Definition sub (n m : t) : t := (n#1 + m#2, n#2 + m#1).Definition mul (n m : t) : t :=
  (n#1 * m#1 + n#2 * m#2, n#1 * m#2 + n#2 * m#1).Definition lt (n m : t) := n#1 + m#2 < m#1 + n#2.Definition le (n m : t) := n#1 + m#2 <= m#1 + n#2.Definition min (n m : t) : t := (min (n#1 + m#2) (m#1 + n#2), n#2 + m#2).Definition max (n m : t) : t := (max (n#1 + m#2) (m#1 + n#2), n#2 + m#2).Notation "- x" := (Z.opp x) : ZScope.

(* Specifications: *)
Lemma sub_add_opp : forall n m, Z.sub n m = Z.add n (Z.opp m).