Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Set Implicit Arguments.
- Ltac hypothesis := match goal with [ H : _ |- _ ] => apply H end.
- Inductive And (P Q : Type) : Type :=
- | both : P -> Q -> And P Q.
- Definition And_idem (P : Type) : P -> And P P.
- intro p; apply (both p p).
- Defined.
- Inductive Sigma (T : Type) (P : T -> Type) : Type :=
- | witness : forall t : T, P t -> Sigma P.
- Definition Relation (T : Type) := T -> T -> Type.
- Record Equivalence {T : Type} (R : Relation T)
- := { equivalence_reflexivity : forall x, R x x
- ; equivalence_symmetry : forall x y, R x y -> R y x
- ; equivalence_transitivity : forall x y z, R x y -> R y z -> R x z
- }.
- Record Category (Ob : Type) (Hom : Ob -> Ob -> Type)
- (Hom_eq : forall X Y, Relation (Hom X Y))
- := { identity : forall X, Hom X X
- ; compose : forall X Y Z, Hom X Y -> Hom Y Z -> Hom X Z
- ; compose_respectful_left : forall X Y Z (f f' : Hom X Y) (g : Hom Y Z),
- Hom_eq _ _ f f' -> Hom_eq _ _ (compose f g) (compose f' g)
- ; compose_respectful_right : forall X Y Z (f : Hom X Y) (g g' : Hom Y Z),
- Hom_eq _ _ g g' -> Hom_eq _ _ (compose f g) (compose f g')
- ; hom_equivalence : forall X Y, Equivalence (Hom_eq X Y)
- ; category_left_identity : forall X Y (f : Hom X Y),
- Hom_eq _ _ (compose (identity _) f) f
- ; category_right_identity : forall X Y (f : Hom X Y),
- Hom_eq _ _ (compose f (identity _)) f
- ; category_associativity : forall X Y Z W (f : Hom X Y) (g : Hom Y Z) (h : Hom Z W),
- Hom_eq _ _ (compose f (compose g h))
- (compose (compose f g) h)
- }.
- Notation "f '[' C ']' g" := (compose C _ _ _ f g) (at level 20).
- Notation "'1_' C" := (identity C _) (at level 20).
- Ltac refl :=
- eapply equivalence_reflexivity;
- [apply hom_equivalence;assumption].
- Ltac symm :=
- eapply equivalence_symmetry;
- [apply hom_equivalence;assumption|idtac].
- Ltac trans :=
- eapply equivalence_transitivity;
- [apply hom_equivalence;assumption|idtac|idtac].
- Section Isomorphism.
- Context {C_Ob C_Hom C_Hom_eq} (C : @Category C_Ob C_Hom C_Hom_eq).
- Definition Isomorphism (X Y : C_Ob) :=
- @Sigma (And (C_Hom X Y) (C_Hom Y X))
- (fun fg =>
- match fg with
- | both f g =>
- And (C_Hom_eq (compose C _ _ _ g f) (identity C _))
- (C_Hom_eq (compose C _ _ _ f g) (identity C _))
- end).
- Definition isomorphism_to (X Y : C_Ob) (i : Isomorphism X Y) : C_Hom X Y.
- destruct i as [[to from] _]; apply to.
- Defined.
- Definition isomorphism_from (X Y : C_Ob) (i : Isomorphism X Y) : C_Hom Y X.
- destruct i as [[to from] _]; apply from.
- Defined.
- Theorem Isomorphism_Equivalence : Equivalence Isomorphism.
- apply Build_Equivalence.
- Lemma Isomorphism_Identity : forall x : C_Ob, Isomorphism x x.
- intro x; apply (witness _ (both (identity C x) (identity C x))).
- apply And_idem.
- apply category_left_identity.
- Defined.
- apply Isomorphism_Identity.
- intros x y [[I J] [i j]].
- apply (witness _ (both J I)).
- apply (both j i).
- Lemma Isomorphism_Compose : forall x y z : C_Ob, Isomorphism x y -> Isomorphism y z -> Isomorphism x z.
- intros x y z [[I J] [i j]] [[I' J'] [i' j']].
- apply (witness _ (both (compose C _ _ _ I I') (compose C _ _ _ J' J))).
- apply both.
- trans.
- apply (category_associativity C).
- trans.
- apply (compose_respectful_left C).
- trans.
- symm.
- apply (category_associativity C).
- apply (compose_respectful_right C).
- apply i.
- assert (C_Hom_eq (compose C z y y J' (identity C y))
- J').
- apply category_right_identity.
- trans.
- apply (compose_respectful_left C).
- apply X.
- assumption.
- trans.
- apply (category_associativity C).
- trans.
- apply (compose_respectful_left C).
- trans.
- symm.
- apply (category_associativity C).
- apply (compose_respectful_right C).
- apply j'.
- assert (C_Hom_eq (compose C x y y I (identity C y))
- I).
- apply category_right_identity.
- trans.
- apply (compose_respectful_left C).
- apply X.
- assumption.
- Defined.
- apply Isomorphism_Compose.
- Defined.
- End Isomorphism.
- Section Functor.
- Context {C_Ob C_Hom C_Hom_eq} (C : @Category C_Ob C_Hom C_Hom_eq).
- Context {D_Ob D_Hom D_Hom_eq} (D : @Category D_Ob D_Hom D_Hom_eq).
- Record Functor
- := { Map_Ob : C_Ob -> D_Ob
- ; Map_Hom : forall X Y, C_Hom X Y -> D_Hom (Map_Ob X) (Map_Ob Y)
- ; functor_identity : forall X, D_Hom_eq (Map_Hom (identity C X)) (identity D (Map_Ob X))
- ; functor_compose : forall X Y Z (f : C_Hom X Y) (g : C_Hom Y Z),
- D_Hom_eq (Map_Hom (compose C _ _ _ f g)) (compose D _ _ _ (Map_Hom f) (Map_Hom g))
- }.
- Notation "F '@' x" := (Map_Ob F x) (at level 20).
- Notation "F '$' f" := (Map_Hom F f) (at level 20).
- Definition Functor_equality (F G : Functor) :=
- @Sigma (forall X : C_Ob,
- Isomorphism D (Map_Ob F X) (Map_Ob G X))
- (fun Ob_iso =>
- forall X Y (f : C_Hom X Y),
- D_Hom_eq (Map_Hom F f)
- (compose D _ _ _
- (isomorphism_to (Ob_iso _))
- (compose D _ _ _
- (Map_Hom G f)
- (isomorphism_from (Ob_iso _))))).
- Theorem Functor_equivalence : Equivalence Functor_equality.
- apply Build_Equivalence.
- intro x.
- unfold Functor_equality.
- apply witness with (t := (fun X => @Isomorphism_Identity _ _ _ D (Map_Ob x X))).
- intros X Y f.
- simpl.
- trans.
- symm.
- apply category_left_identity.
- apply compose_respectful_right.
- trans.
- symm.
- apply category_right_identity.
- apply compose_respectful_right.
- refl.
- intros F G.
- intros [F' F''].
- pose (Isomorphism_Equivalence D).
- pose (match e with
- | Build_Equivalence _ Isymm _ => Isymm
- end) as Isymm.
- unfold Functor_equality.
- apply (witness _ (fun X => Isymm _ _ (F' X))).
- intros X Y f.
- unfold Isymm in *; unfold e in *; simpl.
- generalize (F'' _ _ f).
- destruct (F' X); simpl.
- destruct t; simpl.
- destruct y; simpl.
- destruct (F' Y); simpl.
- destruct t; simpl.
- destruct y; simpl.
- intro.
- assert (
- D_Hom_eq (compose D _ _ _ d0 (compose D _ _ _ (Map_Hom F f) d3))
- (compose D _ _ _ d0 (compose D _ _ _
- (compose D (Map_Ob F X) (Map_Ob G X) (Map_Ob F Y) d
- (compose D (Map_Ob G X) (Map_Ob G Y) (Map_Ob F Y)
- (Map_Hom G f) d4)) d3))
- ).
- apply compose_respectful_right.
- apply compose_respectful_left.
- assumption.
- trans.
- Focus 2.
- symm.
- apply X1.
- (* Gf = (d0 ((d (Gf d4)) d3)) *)
- Lemma YUK
- (F : Functor)
- (G : Functor)
- (X : C_Ob)
- (Y : C_Ob)
- (f : C_Hom X Y)
- (d : D_Hom (F @ X) (G @ X))
- (d0 : D_Hom (G @ X) (F @ X))
- (d1 : D_Hom_eq (d0 [D] d) (identity D _))
- (d2 : D_Hom_eq (d [D] d0) (identity D _))
- (d3 : D_Hom (F @ Y) (G @ Y))
- (d4 : D_Hom (G @ Y) (F @ Y))
- (d5 : D_Hom_eq (d4 [D] d3) (identity D _))
- (d6 : D_Hom_eq (d3 [D] d4) (identity D _))
- (X0 : D_Hom_eq (F $ f) (d [D] ((G $ f) [D] d4)))
- (X1 : D_Hom_eq (d0 [D] ((F $ f) [D] d3))
- (d0 [D] ((d [D] ((G $ f) [D] d4)) [D] d3))) :
- D_Hom_eq (G $ f) (d0 [D] ((d [D] ((G $ f) [D] d4)) [D] d3)).
- cut (D_Hom_eq (G $ f) ((G $ f) [D] (identity D _))).
- cut (D_Hom_eq ((G $ f) [D] (identity D _)) ((G $ f) [D] (d4 [D] d3))).
- cut (D_Hom_eq ((G $ f) [D] (d4 [D] d3)) ((identity D _) [D] ((G $ f) [D] (d4 [D] d3)))).
- cut (D_Hom_eq ((identity D _) [D] ((G $ f) [D] (d4 [D] d3))) ((d0 [D] d) [D] ((G $ f) [D] (d4 [D] d3)))).
- cut (D_Hom_eq ((d0 [D] d) [D] ((G $ f) [D] (d4 [D] d3))) (d0 [D] (d [D] ((G $ f) [D] (d4 [D] d3))))).
- cut (D_Hom_eq (d0 [D] (d [D] ((G $ f) [D] (d4 [D] d3)))) (d0 [D] (d [D] (((G $ f) [D] d4) [D] d3)))).
- cut (D_Hom_eq (d0 [D] (d [D] (((G $ f) [D] d4) [D] d3))) (d0 [D] ((d [D] ((G $ f) [D] d4)) [D] d3))).
- intros.
- do 7 (trans;[hypothesis|]); refl.
- apply compose_respectful_right.
- apply (category_associativity D _ _ _ _ d ((G $ f) [D] d4) d3).
- do 2 apply compose_respectful_right.
- apply category_associativity.
- symm; apply category_associativity.
- apply compose_respectful_left.
- symm; assumption.
- symm; apply category_left_identity.
- apply compose_respectful_right.
- symm; assumption.
- symm; apply category_right_identity.
- Defined.
- apply YUK; assumption.
- intros x y z F G; unfold Functor_equality.
- destruct F.
- destruct G.
- pose (Isomorphism_Equivalence D).
- pose (match e with
- | Build_Equivalence _ _ Itrans => Itrans
- end) as Itrans.
- unfold Functor_equality.
- apply (witness _ (fun X => Itrans _ _ _ (t X) (t0 X))).
- intros; simpl.
- generalize (d X Y f).
- generalize (d0 X Y f).
- destruct (t X); simpl.
- destruct t1; destruct y0; simpl.
- destruct (t0 X); simpl.
- destruct t1; destruct y0; simpl.
- simpl.
- destruct (t Y); simpl.
- destruct t1; destruct y0; simpl.
- destruct (t0 Y); simpl.
- destruct t1; destruct y0; simpl.
- simpl.
- (* Xf = ((d1 d5)(Zf (d14 d10))) *)
- Lemma BLECH
- (F : Functor)
- (G : Functor)
- (H : Functor)
- (X : C_Ob)
- (Y : C_Ob)
- (f : C_Hom X Y)
- (d1 : D_Hom (F @ X) (G @ X))
- (d2 : D_Hom (G @ X) (F @ X))
- (d3 : D_Hom_eq (d2 [D] d1) (identity D _))
- (d4 : D_Hom_eq (d1 [D] d2) (identity D _))
- (d5 : D_Hom (G @ X) (H @ X))
- (d6 : D_Hom (H @ X) (G @ X))
- (d7 : D_Hom_eq (d6 [D] d5) (identity D _))
- (d8 : D_Hom_eq (d5 [D] d6) (identity D _))
- (d9 : D_Hom (F @ Y) (G @ Y))
- (d10 : D_Hom (G @ Y) (F @ Y))
- (d11 : D_Hom_eq (d10 [D] d9) (identity D _))
- (d12 : D_Hom_eq (d9 [D] d10) (identity D _))
- (d13 : D_Hom (G @ Y) (H @ Y))
- (d14 : D_Hom (H @ Y) (G @ Y))
- (d15 : D_Hom_eq (d14 [D] d13) (identity D _))
- (d16 : D_Hom_eq (d13 [D] d14) (identity D _))
- (WW : D_Hom_eq (F $ f) (d1 [D] ((G $ f) [D] d10)))
- (MM : D_Hom_eq (G $ f) (d5 [D] ((H $ f) [D] d14))) :
- D_Hom_eq (F $ f) ((d1 [D] d5) [D] ((H $ f) [D] (d14 [D] d10))).
- symm.
- cut (D_Hom_eq
- (G $ f)
- (d5 [D] ((H $ f) [D] d14))).
- cut (D_Hom_eq
- (F $ f)
- (d1 [D] ((G $ f) [D] d10))).
- intros.
- Ltac step K :=
- match goal with |- D_Hom_eq ?X ?Y =>
- cut (D_Hom_eq X K);[intro;trans;hypothesis|]
- end.
- step (((d1 [D] d5) [D] (((H $ f) [D] d14) [D] d10))).
- step ((d1 [D] (d5 [D] (((H $ f) [D] d14) [D] d10)))).
- match goal with |- D_Hom_eq ?X ?y =>
- cut (D_Hom_eq X ((d1 [D] ((d5 [D] ((H $ f) [D] d14)) [D] d10))))
- end.
- intro.
- trans.
- apply X4.
- match goal with |- D_Hom_eq ?X ?y =>
- cut (D_Hom_eq X (d1 [D] ((G $ f) [D] d10)))
- end.
- intro; trans.
- apply X5.
- apply compose_respectful_right.
- trans.
- apply compose_respectful_left.
- apply X1.
- symm.
- apply (category_associativity D _ _ _ _ d5 ((H $ f) [D] d14) d10).
- apply compose_respectful_right.
- apply compose_respectful_left.
- symm; hypothesis.
- step ((d1 [D] (d5 [D] (((H $ f) [D] d14) [D] d10)))).
- apply (category_associativity D _ _ _ _).
- symm; apply (category_associativity D _ _ _ _).
- trans; [apply X0|].
- apply compose_respectful_right.
- symm.
- step (((d5 [D] ((H $ f) [D] d14)) [D] d10)).
- symm; assumption.
- apply (category_associativity D _ _ _ _ d5).
- apply compose_respectful_right.
- apply (category_associativity D _ _ _ _).
- assumption.
- assumption.
- Defined.
- intros.
- eapply BLECH; hypothesis.
- Defined.
- End Functor.
- (*
- *** Local Variables: ***
- *** coq-prog-args: ("-emacs-U" "-nois") ***
- *** End: ***
- *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement