Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
(** * ∑-categories on objects - a generalization of subcategories *)
Require Import HoTT.Basics HoTT.Types.
Require Import Category.Core Functor.Core Category.Sigma.Core.
Require Functor.Composition.Core Functor.Identity.
Require Import Functor.Paths.
Import Functor.Identity.FunctorIdentityNotations.
Import Functor.Composition.Core.FunctorCompositionCoreNotations.

Set Implicit Arguments.
Generalizable All Variables.

Local Notation sig_type := Overture.sig.
Local Notation pr1_type := Overture.pr1.

Local Open Scope morphism_scope.
Local Open Scope functor_scope.

Section sig_obj.
  Variable A : PreCategory.
  Variable Pobj : A -> Type.

  (** ** Definition of [sig_obj]-precategory *)
  Definition sig_obj : PreCategory
    := @Build_PreCategory
         (sig_type Pobj)
         (fun s d => morphism A (pr1_type s) (pr1_type d))
         (fun x => @identity A (pr1_type x))
         (fun s d d' m1 m2 => m1 o m2)%morphism
         (fun _ _ _ _ => associativity A _ _ _ _)
         (fun _ _ => left_identity A _ _)
         (fun _ _ => right_identity A _ _)
         _.

  (** ** First projection functor *)
  Definition pr1_obj : Functor sig_obj A
    := Build_Functor
         sig_obj A
         (@pr1_type _ _)
         (fun s d m => m)
         (fun _ _ _ _ _ => idpath)
         (fun _ => idpath).

  Definition sig_obj_as_sig : PreCategory
    := @sig A Pobj (fun _ _ _ => Unit) _ (fun _ => tt) (fun _ _ _ _ _ _ _ => tt).

  Definition sig_functor_obj : Functor sig_obj_as_sig sig_obj
    := Build_Functor sig_obj_as_sig sig_obj
                     (fun x => x)
                     (fun _ _ => @pr1_type _ _)
                     (fun _ _ _ _ _ => idpath)
                     (fun _ => idpath).

  Definition sig_functor_obj_inv : Functor sig_obj sig_obj_as_sig
    := Build_Functor sig_obj sig_obj_as_sig
                     (fun x => x)
                     (fun _ _ m => exist _ m tt)
                     (fun _ _ _ _ _ => idpath)
                     (fun _ => idpath).

  Local Open Scope functor_scope.

  
A: PreCategory
Pobj: A -> Type
H: Funext

(sig_functor_obj o sig_functor_obj_inv = 1) * (sig_functor_obj_inv o sig_functor_obj = 1)
A: PreCategory
Pobj: A -> Type
H: Funext

(sig_functor_obj o sig_functor_obj_inv = 1) * (sig_functor_obj_inv o sig_functor_obj = 1)
A: PreCategory
Pobj: A -> Type
H: Funext

transport (fun GO : sig_type Pobj -> sig_type Pobj => forall s d : sig_type Pobj, sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit) -> sig_type (fun _ : morphism A (pr1_type (GO s)) (pr1_type (GO d)) => Unit)) 1 (fun (s d : sig_type Pobj) (m : sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit)) => (pr1_type m; tt)) = (fun s d : sig_type Pobj => idmap)
A: PreCategory
Pobj: A -> Type
H: Funext
proj1: A
proj2: Pobj proj1

transport (fun GO : sig_type Pobj -> sig_type Pobj => forall s d : sig_type Pobj, sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit) -> sig_type (fun _ : morphism A (pr1_type (GO s)) (pr1_type (GO d)) => Unit)) 1 (fun (s d : sig_type Pobj) (m : sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit)) => (pr1_type m; tt)) (proj1; proj2) = (fun d : sig_type Pobj => idmap)
A: PreCategory
Pobj: A -> Type
H: Funext
proj1: A
proj2: Pobj proj1
proj0: A
proj3: Pobj proj0

transport (fun GO : sig_type Pobj -> sig_type Pobj => forall s d : sig_type Pobj, sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit) -> sig_type (fun _ : morphism A (pr1_type (GO s)) (pr1_type (GO d)) => Unit)) 1 (fun (s d : sig_type Pobj) (m : sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit)) => (pr1_type m; tt)) (proj1; proj2) (proj0; proj3) = idmap
A: PreCategory
Pobj: A -> Type
H: Funext
proj1: A
proj2: Pobj proj1
proj0: A
proj3: Pobj proj0
proj4: morphism A (pr1_type (proj1; proj2)) (pr1_type (proj0; proj3))

transport (fun GO : sig_type Pobj -> sig_type Pobj => forall s d : sig_type Pobj, sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit) -> sig_type (fun _ : morphism A (pr1_type (GO s)) (pr1_type (GO d)) => Unit)) 1 (fun (s d : sig_type Pobj) (m : sig_type (fun _ : morphism A (pr1_type s) (pr1_type d) => Unit)) => (pr1_type m; tt)) (proj1; proj2) (proj0; proj3) (proj4; tt) = (proj4; tt)
reflexivity. Qed. Definition sig_obj_compat : pr1_obj o sig_functor_obj = pr1' := idpath. End sig_obj. Arguments pr1_obj {A Pobj}. Module Export CategorySigmaOnObjectsNotations. Notation "{ x : A | P }" := (sig_obj A (fun x => P)) : category_scope. End CategorySigmaOnObjectsNotations.