1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
From Corelib Require Import ssreflect ssrfun.
From HB Require Import structures.
HB.mixin Record AddComoid_of_TYPE A := {
zero : A;
add : A -> A -> A;
addrA : associative add;
addrC : commutative add;
add0r : left_id zero add;
}.
HB.structure Definition AddComoid := { A of AddComoid_of_TYPE A }.
(* Begin change *)
HB.mixin Record AddAG_of_AddComoid A of AddComoid A := {
opp : A -> A;
addNr : left_inverse zero opp add;
}.
HB.factory Record AddAG_of_TYPE A := {
zero : A;
add : A -> A -> A;
opp : A -> A;
addrA : associative add;
addrC : commutative add;
add0r : left_id zero add;
addNr : left_inverse zero opp add;
}.
HB.builders Context A (a : AddAG_of_TYPE A).
HB.instance
Definition to_AddComoid_of_TYPE :=
AddComoid_of_TYPE.Build A zero add addrA addrC add0r.
HB.instance
Definition to_AddAG_of_AddComoid :=
AddAG_of_AddComoid.Build A _ addNr.
HB.end.
HB.structure Definition AddAG := { A of AddAG_of_TYPE A }.
HB.mixin Record Ring_of_AddAG A of AddAG A := {
one : A;
mul : A -> A -> A;
mulrA : associative mul;
mul1r : left_id one mul;
mulr1 : right_id one mul;
mulrDl : left_distributive mul add;
mulrDr : right_distributive mul add;
}.
HB.factory Record Ring_of_AddComoid A of AddComoid A := {
opp : A -> A;
one : A;
mul : A -> A -> A;
addNr : left_inverse zero opp add;
mulrA : associative mul;
mul1r : left_id one mul;
mulr1 : right_id one mul;
mulrDl : left_distributive mul add;
mulrDr : right_distributive mul add;
}.
HB.builders Context A (a : Ring_of_AddComoid A).
HB.instance
Definition to_AddAG_of_AddComoid := AddAG_of_AddComoid.Build A _ addNr.
HB.instance
Definition to_Ring_of_AddAG := Ring_of_AddAG.Build A
_ _ mulrA mul1r mulr1 mulrDl mulrDr.
HB.end.
(* End change *)
HB.factory Record Ring_of_TYPE A := {
zero : A;
one : A;
add : A -> A -> A;
opp : A -> A;
mul : A -> A -> A;
addrA : associative add;
addrC : commutative add;
add0r : left_id zero add;
addNr : left_inverse zero opp add;
mulrA : associative mul;
mul1r : left_id one mul;
mulr1 : right_id one mul;
mulrDl : left_distributive mul add;
mulrDr : right_distributive mul add;
}.
HB.builders Context A (a : Ring_of_TYPE A).
HB.instance
Definition to_AddComoid_of_TYPE := AddComoid_of_TYPE.Build A
zero add addrA addrC add0r.
HB.instance
Definition to_Ring_of_AddComoid := Ring_of_AddComoid.Build A
_ _ _ addNr mulrA mul1r mulr1 mulrDl mulrDr.
HB.end.
HB.structure Definition Ring := { A of Ring_of_TYPE A }.
(* Notations *)
Declare Scope hb_scope.
Delimit Scope hb_scope with G.
Local Open Scope hb_scope.
Notation "0" := zero : hb_scope.
Notation "1" := one : hb_scope.
Infix "+" := (@add _) : hb_scope.
Notation "- x" := (@opp _ x) : hb_scope.
Infix "*" := (@mul _) : hb_scope.
Notation "x - y" := (x + - y) : hb_scope.
(* Theory *)
Section Theory.
Variable R : Ring.type.
Implicit Type (x : R).
Lemma addr0 : right_id (@zero R) add.
Proof. by move=> x; rewrite addrC add0r. Qed.
Lemma addrN : right_inverse (@zero R) opp add.
Proof. by move=> x; rewrite addrC addNr. Qed.
Lemma subrr x : x - x = 0.
Proof. by rewrite addrN. Qed.
Lemma addrNK x y : x + y - y = x.
Proof. by rewrite -addrA subrr addr0. Qed.
End Theory.
HB.mixin Record LModule_of_AG (R : Ring.type) (M : Type) of AddAG M := {
scale : Ring.sort R -> M -> M; (* TODO: insert coercions automatically *)
scaleDl : forall v, {morph scale^~ v: a b / a + b};
scaleDr : right_distributive scale add;
scaleA : forall a b v, scale a (scale b v) = scale (a * b) v;
scale1r : forall m, scale 1 m = m;
}.
HB.structure Definition LModule (R : Ring.type) :=
{ M of LModule_of_AG R M & }.
Infix "*:" := (@scale _ _) (at level 30) : hb_scope.
Definition regular (R : Type) := R.
HB.instance Definition regular_AG (R : AddAG.type) :=
AddAG_of_TYPE.Build (regular (AddAG.sort R)) zero add opp addrA addrC add0r addNr.
HB.instance Definition regular_LModule (R : Ring.type) :=
LModule_of_AG.Build R (regular (Ring.sort R)) mul
(fun _ _ _ => mulrDl _ _ _) mulrDr mulrA mul1r.
From Corelib Require Import BinNums IntDef.
Axiom Z_add_assoc : forall x y z, Z.add x (Z.add y z) = Z.add (Z.add x y) z.
Axiom Z_add_comm : forall x y, Z.add x y = Z.add y x.
Axiom Z_add_0_l : forall x, Z.add Z0 x = x.
Axiom Z_add_0_r : forall x, Z.add x Z0 = x.
Axiom Z_add_opp_diag_l : forall x, Z.add (Z.opp x) x = Z0.
Axiom Z_mul_add_distr_l :
forall x y z, Z.mul x (Z.add y z) = Z.add (Z.mul x y) (Z.mul x z).
Axiom Z_mul_add_distr_r :
forall x y z, Z.mul (Z.add x y) z = Z.add (Z.mul x z) (Z.mul y z).
Axiom Z_mul_assoc : forall x y z, Z.mul x (Z.mul y z) = Z.mul (Z.mul x y) z.
Axiom Z_mul_1_l : forall x, Z.mul (Zpos xH) x = x.
Axiom Z_mul_1_r : forall x, Z.mul x (Zpos xH) = x.
HB.instance Definition Z_ring_axioms :=
Ring_of_TYPE.Build Z Z0 (Zpos xH) Z.add Z.opp Z.mul
Z_add_assoc Z_add_comm Z_add_0_l Z_add_opp_diag_l
Z_mul_assoc Z_mul_1_l Z_mul_1_r
Z_mul_add_distr_r Z_mul_add_distr_l.
Lemma test (m : Z) (n : regular Z) : m *: n = m * n.
Proof. by []. Qed.
|