(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* constr:(false) | _ => constr:(true) end. Ltac Int63cst t := match eval lazy delta [add] in (t + 1)%int63 with | add _ _ => constr:(NotConstant) | _ => constr:(t) end. (** The generic ring structure inferred from the Cyclic structure *) Module Int63ring := CyclicRing Int63Cyclic. (** Unlike in the generic [CyclicRing], we can use Leibniz here. *) Lemma Int63_canonic : forall x y, to_Z x = to_Z y -> x = y. Proof to_Z_inj. Lemma ring_theory_switch_eq : forall A (R R':A->A->Prop) zero one add mul sub opp, (forall x y : A, R x y -> R' x y) -> ring_theory zero one add mul sub opp R -> ring_theory zero one add mul sub opp R'. Proof. intros A R R' zero one add mul sub opp Impl Ring. constructor; intros; apply Impl; apply Ring. Qed. Lemma Int63Ring : ring_theory 0 1 add mul sub opp Logic.eq. Proof. exact (ring_theory_switch_eq _ _ _ _ _ _ _ _ _ Int63_canonic Int63ring.CyclicRing). Qed. Lemma eq31_correct : forall x y, eqb x y = true -> x=y. Proof. now apply eqb_spec. Qed. Add Ring Int63Ring : Int63Ring (decidable eq31_correct, constants [Int63cst]). Section TestRing. Let test : forall x y, 1 + x*y + x*x + 1 = 1*1 + 1 + y*x + 1*x*x. intros. ring. Qed. End TestRing.