(***************************************************************************)
(* Formalization of the Chou, Gao and Zhang's decision procedure.          *)
(* Julien Narboux (Julien@narboux.fr)                                      *)
(* LIX/INRIA FUTURS 2004-2006                                              *)
(* University of Strasbourg 2008                                           *)
(***************************************************************************)
Require Export Bool Peano_dec Eqdep_dec.
Require Export ZArithRing Field.
(* We define our own field *)
Parameter F : Set.
Parameter F0 : F.
Parameter F1 : F.
Parameter Fplus : F -> F -> F.
Parameter Fmult : F -> F -> F.
Parameter Fopp : F -> F.
Parameter Finv : F -> F.
Definition Feq (x y : F) : bool := false.
Definition Fminus (r1 r2 : F) : F := Fplus r1 (Fopp r2).
Definition Fdiv (r1 r2 : F) : F := Fmult r1 (Finv r2).
(***************)
(* Notations  *)
(***************)
Declare Scope F_scope.
Delimit Scope F_scope with F.
Infix "+" := Fplus : F_scope.
Infix "-" := Fminus : F_scope.
Infix "*" := Fmult : F_scope.
Infix "/" := Fdiv : F_scope.
Notation "- x" := (Fopp x) : F_scope.
Notation "0" := F0 : F_scope.
Notation "1" := F1 : F_scope.
Notation "2" := (1 + 1)%F : F_scope.
Notation "/ x" := (Finv x) : F_scope.
(*Distfix 30 "/ _" Finv : F_scope V8only.*)
(* Notation "x <> y" := ~(eqT F x y) (at level 5) : F_scope. *)
Open Scope F_scope.
(***********)
(* Axioms *)
(***********)
(*********************************************************)
(*      Addition                                                          *)
(*********************************************************)
Hint Resolve Fplus_sym: field_hints.
Hint Resolve Fplus_assoc: field_hints.
Hint Resolve Fplus_Fopp_r: field_hints.
Hint Resolve Fplus_Ol: field_hints.
(***********************************************************)
(*       Multiplication                                    *)
(***********************************************************)
Hint Resolve Fmult_sym: field_hints.
Hint Resolve Fmult_assoc: field_hints.
Hint Resolve Finv_l: field_hints.
Hint Resolve Fmult_1l: field_hints.
Hint Resolve F1_neq_F0: field_hints.
(*********************************************************)
(*      Distributivity                                   *)
(*********************************************************)
Axiom
Fmult_Fplus_distr : forall r1 r2 r3 : F, r1 * (r2 + r3) = r1 * r2 + r1 * r3.
Hint Resolve Fmult_Fplus_distr: field_hints.

Lemma Fmult_Fplus_distr_r : forall r2 r3 r1 : F, (r2 + r3) * r1 = r2 * r1 + r3 * r1.