Library ConCaT.CATEGORY_THEORY.FUNCTOR.Functor



Require Export Setoid_dup1.
Require Export Hom_Equality.

Set Implicit Arguments.
Unset Strict Implicit.


Section funct_def.

Variable C D : Category.

 Section funct_laws.

 Variables (FOb : C -> D)
   (FMap : forall a b : C, Map (a --> b) (FOb a --> FOb b)).

 Definition Fcomp_law :=
   forall (a b c : C) (f : a --> b) (g : b --> c),
   FMap a c (f o g) =_S FMap a b f o FMap b c g.

 Definition Fid_law := forall a : C, FMap a a (Id a) =_S Id (FOb a).

 End funct_laws.

Structure Functor : Type :=
  {FOb :> C -> D;
   FMap : forall a b : C, Map (a --> b) (FOb a --> FOb b);
   Prf_Fcomp_law : Fcomp_law FMap;
   Prf_Fid_law : Fid_law FMap}.

Definition FMor (F : Functor) (a b : C) (f : a --> b) := FMap F a b f.


Lemma FPres :
 forall (F : Functor) (a b : C) (f g : a --> b),
 f =_S g -> FMor F f =_S FMor F g.
Proof.
intros F a b; exact (Pres (FMap F a b)).
Qed.

Lemma FComp :
 forall (F : Functor) (a b c : C) (f : a --> b) (g : b --> c),
 FMor F (f o g) =_S FMor F f o FMor F g.
Proof.
exact Prf_Fcomp_law.
Qed.

Lemma FComp1 :
 forall (F : Functor) (a b c : C) (f : a --> b) (g : b --> c),
 FMor F f o FMor F g =_S FMor F (f o g).
Proof.
intros; apply Sym; apply (Prf_Fcomp_law F f g).
Qed.

Lemma FId : forall (F : Functor) (a : C), FMor F (Id a) =_S Id (FOb F a).
Proof.
exact Prf_Fid_law.
Qed.

Lemma FId1 : forall (F : Functor) (a : C), Id (FOb F a) =_S FMor F (Id a).
Proof.
intros; apply Sym; apply (Prf_Fid_law F a).
Qed.


End funct_def.


Section funct_setoid.

Variable C D : Category.

Definition Equal_Functor (F G : Functor C D) :=
  forall (a b : C) (f : a --> b), FMor F f =_H FMor G f.

Lemma Equal_Functor_equiv : Equivalence Equal_Functor.
Proof.
apply Build_Equivalence; unfold Equal_Functor in |- *.
auto.
apply Build_Partial_equivalence.
unfold Transitive in |- *; intros F G H Ass1 Ass2 a b f.
apply Equal_hom_trans with (G a) (G b) (FMor G f); auto.
auto.
Qed.

Canonical Structure Functor_setoid := Build_Setoid' Equal_Functor_equiv.

End funct_setoid.

Infix "=_F" := Equal_Functor (at level 70).


Section Comp_F.

Variables (C D E : Category) (G : Functor C D) (H : Functor D E).

Definition Comp_FOb (a : C) := H (G a).

 Section comp_functor_map.

 Variable a b : C.

 Definition Comp_FMor (f : a --> b) := FMor H (FMor G f).

 Lemma Comp_FMap_law : Map_law Comp_FMor.
 Proof.
 unfold Map_law, Comp_FMor, FMor in |- *; intros f g eqfg.
 apply Pres1; apply Pres1; assumption.
 Qed.

 Definition Comp_FMap :=
   Build_Map (B:=Comp_FOb a --> Comp_FOb b) Comp_FMap_law.

 End comp_functor_map.

Lemma Comp_Functor_comp_law : Fcomp_law Comp_FMap.
Proof.
unfold Fcomp_law, Comp_FOb, Comp_FMap, Comp_FMor in |- *.
simpl in |- *; intros a b c f g.
apply Trans with (FMor H (FMor G f o FMor G g)).
apply FPres; apply FComp.
apply FComp.
Qed.

Lemma Comp_Functor_id_law : Fid_law Comp_FMap.
Proof.
unfold Fid_law, Comp_FOb, Comp_FMap, Comp_FMor in |- *.
simpl in |- *; intro a.
apply Trans with (FMor H (Id (G a))).
apply FPres; apply FId.
apply FId.
Qed.

Canonical Structure Comp_Functor :=
  Build_Functor Comp_Functor_comp_law Comp_Functor_id_law.

End Comp_F.

Infix "o_F" := Comp_Functor (at level 20, right associativity).