(* This example checks the efficiency of the abstract machine used by ring *)
(* Expected time < 1.00s *)
Definition Zadd x y :=
match x with
| 0%Z => y
| Zpos x' =>
match y with
| 0%Z => x
| Zpos y' => Zpos (x' + y')
| Zneg y' =>
match (x' ?= y')%positive with
| Eq => 0%Z
| Lt => Zneg (y' - x')
| Gt => Zpos (x' - y')
end
end
| Zneg x' =>
match y with
| 0%Z => x
| Zpos y' =>
match (x' ?= y')%positive with
| Eq => 0%Z
| Lt => Zpos (y' - x')
| Gt => Zneg (x' - y')
end
| Zneg y' => Zneg (x' + y')
end
end.

Lemma Zth : ring_theory Z0 (Zpos xH) Zadd Z.mul Z.sub Z.opp (@eq Z).