(* 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).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.(***********)
(* Axioms *)
(***********)

(*********************************************************)
(*      Addition                                                          *)
(*********************************************************)

Axiom Fplus_sym : forall r1 r2 : F, r1 + r2 = r2 + r1.Axiom Fplus_assoc : forall r1 r2 r3 : F, r1 + r2 + r3 = r1 + (r2 + r3).Axiom Fplus_Fopp_r : forall r : F, r + - r = 0.Axiom Fplus_Ol : forall r : F, 0 + r = r.(***********************************************************)       
(*       Multiplication                                    *)
(***********************************************************)

Axiom Fmult_sym : forall r1 r2 : F, r1 * r2 = r2 * r1.Axiom Fmult_assoc : forall r1 r2 r3 : F, r1 * r2 * r3 = r1 * (r2 * r3).Axiom Finv_l : forall r : F, r <> 0 -> / r * r = 1.Axiom Fmult_1l : forall r : F, 1 * r = r.Axiom F1_neq_F0 : 1 <> 0.(*********************************************************)
(*      Distributivity                                   *)
(*********************************************************)

Axiom
  Fmult_Fplus_distr : forall r1 r2 r3 : F, r1 * (r2 + r3) = r1 * r2 + r1 * r3.

(* Specifications: *)
Lemma Fmult_Fplus_distr_r : forall r2 r3 r1 : F, (r2 + r3) * r1 = r2 * r1 + r3 * r1.
Lemma FRth : ring_theory 0 1 Fplus Fmult Fminus Fopp (@eq F).
Lemma Fth : field_theory 0 1 Fplus Fmult Fminus Fopp Fdiv Finv (@eq F).