Module module

Require Export monoid.
Require Export group.
Require Export ring.

Require cool.

Implicit Arguments On.

Modules

Module Module.

Module r := Ring.

Export Misc.

Section Module.

Variable R : r.Ring.

Record Module_Data : Type := {
  module_carrier :> Type;
  add : module_carrier->module_carrier->module_carrier;
  zero : module_carrier;
  opp : module_carrier->module_carrier;
  mul : R->module_carrier->module_carrier
 }.

Implicits zero [1].

Record Module_Theory [A:Module_Data] : Prop := {
  assoc : (x,y,z:A) (add x (add y z))==(add (add x y) z);
  commut : (x,y:A) (add x y)==(add y x);
  zero_sx : (x:A) (add zero x)==x;
  opp_sx : (x:A) (add (opp x) x)==x;
  mul_assoc : (x,y:R; z:A) (mul x (mul y z))==(mul (r.mul x y) z);
  one_sx : (x:A) (mul r.one x)==x;
  distrib_dx : (x:R; y,z:A) (mul x (add y z))==(add (mul x y) (mul x z));
  distrib_sx : (x,y:R; z:A) (mul (r.add x y) z)==(add (mul x z) (mul y z))
 }.

Record Module : Type := {
  module_data :> Module_Data;
  module_theory :> (Module_Theory module_data)
 }.
Definition Obj : Type := Module.
Coercion Module_of_Obj [x:Obj] : Module := x.

Record Morph_Theory [A,B:Obj; f:A->B] : Prop := {
  morph_add : (x,y:A) (f (add x y))==(add (f x) (f y));
  morph_opp : (x:A) (f (opp x))==(opp (f x));
  morph_mul : (x:R; y:A) (f (mul x y))==(mul x (f y))
 }.

Record Module_Morph [A,B:Obj] : Type := {
  morph_data :> A->B;
  morph_theory :> (Morph_Theory morph_data)
 }.

Definition Morph := Module_Morph.

Lemma morph_extens : (A,B:Module; f,g:(Morph A B))
 ((x:A)(f x)==(g x)) -> f==g.
Proof.
  NewDestruct f; NewDestruct g; Simpl; Intros.
  Assert U : morph_data0 == morph_data1.
  Apply nondep_extensionality; Assumption.
  NewDestruct U.
  Assert U : morph_theory0 == morph_theory1.
  Apply proof_irrelevance.
  NewDestruct U.
  Reflexivity.
Qed.

Section morph_comp.

Variable A,B,C:Obj.

Variable f:(Morph B C); g:(Morph A B).

Local h [x:A] : C := (f (g x)).

Remark h_th : (Morph_Theory h).
Proof.
  Unfold h; Split; Intros.
  Rewrite (morph_add g).
  Rewrite (morph_add f).
  Reflexivity.
  Rewrite (morph_opp g).
  Rewrite (morph_opp f).
  Reflexivity.
  Rewrite (morph_mul g).
  Rewrite (morph_mul f).
  Reflexivity.
Qed.

Definition morph_comp : (Morph A C).
Proof.
  Split with h;
  Apply h_th.
Defined.

End morph_comp.

Definition morph_id [A:Obj] : (Morph A A).
Proof.
  Intros.
  Split with [x:A]x.
  Abstract Split; Auto.
Defined.

Implicits morph_id [1].

Lemma morph_comp_assoc : (A,B,C,D:Obj)
 (h:(Morph C D); g:(Morph B C); f:(Morph A B))
 (morph_comp h (morph_comp g f))==(morph_comp (morph_comp h g) f).
Proof.
  Intros; Apply morph_extens; Trivial.
Qed.

Lemma morph_id_sx : (A,B:Obj; f:(Morph A B))
 (morph_comp morph_id f)==f.
Proof.
  Intros; Apply morph_extens; Trivial.
Qed.

Lemma morph_id_dx : (A,B:Obj; f:(Morph A B))
 (morph_comp f morph_id)==f.
Proof.
  Intros; Apply morph_extens; Trivial.
Qed.

End Module.

End Module.

Category of modules

Signature for a module with a single ring

Module Type Coeff_Sig.

Parameter R : Ring.Obj.

End Coeff_Sig.

Modules over a ring as a Coq functor

Module Module_Cat [r:Coeff_Sig] <: Cat_Sig.

Definition Obj : Type := (Module.Obj r.R).

Definition Morph [A,B:Obj] : Type := (Module.Morph A B).

Section morph_comp.
  Variable A,B,C:Obj.
  Variable f:(Morph B C); g:(Morph A B).

  Definition morph_comp : (Morph A C) :=
   (Module.morph_comp f g).
End morph_comp.

Definition morph_id [A:Obj] : (Morph A A) :=
  (!Module.morph_id r.R A).

Implicits morph_id [1].

Lemma morph_comp_assoc : (A,B,C,D:Obj)
 (h:(Morph C D); g:(Morph B C); f:(Morph A B))
 (morph_comp h (morph_comp g f))==(morph_comp (morph_comp h g) f).
Proof.
  Unfold Obj Morph morph_comp morph_id.
  Apply !Module.morph_comp_assoc.
Qed.

Lemma morph_id_sx : (A,B:Obj; f:(Morph A B))
 (morph_comp morph_id f)==f.
Proof.
  Unfold Obj Morph morph_comp morph_id.
  Apply !Module.morph_id_sx.
Qed.

Lemma morph_id_dx : (A,B:Obj; f:(Morph A B))
 (morph_comp f morph_id)==f.
Proof.
  Unfold Obj Morph morph_comp morph_id.
  Apply !Module.morph_id_dx.
Qed.

End Module_Cat.


Index
This page has been generated by coqdoc