# Isomorphism induction in categories

```agda
module category-theory.isomorphism-induction-categories where
```

<details><summary>Imports</summary>

```agda
open import category-theory.categories
open import category-theory.isomorphism-induction-precategories
open import category-theory.isomorphisms-in-categories

open import foundation.commuting-triangles-of-maps
open import foundation.contractible-maps
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.identity-types
open import foundation.sections
open import foundation.universal-property-identity-systems
open import foundation.universe-levels
```

</details>

## Idea

**Isomorphism induction** in a [category](category-theory.categories.md) `𝒞` is
the principle asserting that, given an object `A : 𝒞` and any type family

```text
  P : (B : 𝒞) (ϕ : A ≅ B) → 𝒰
```

of types indexed by all
[isomorphisms](category-theory.isomorphisms-in-categories.md) with domain `A`,
there is a [section](foundation.sections.md) of the evaluation map

```text
  ((B : 𝒞) (ϕ : A ≅ B) → P B ϕ) → P A id-iso.
```

The principle of isomorphism induction is equivalent to the univalence axiom for
categories.

## Statement

```agda
module _
  {l1 l2 : Level} (C : Category l1 l2) {A : obj-Category C}
  where

  ev-id-iso-Category :
    {l : Level} (P : (B : obj-Category C)  (iso-Category C A B)  UU l) 
    ((B : obj-Category C) (e : iso-Category C A B)  P B e) 
    P A (id-iso-Category C)
  ev-id-iso-Category = ev-id-iso-Precategory (precategory-Category C)

  induction-principle-iso-Category :
    {l : Level} (P : (B : obj-Category C) (e : iso-Category C A B)  UU l) 
    UU (l1  l2  l)
  induction-principle-iso-Category =
    induction-principle-iso-Precategory (precategory-Category C)

  triangle-ev-id-iso-Category :
    {l : Level}
    (P : (B : obj-Category C)  iso-Category C A B  UU l) 
    coherence-triangle-maps
      ( ev-point (A , id-iso-Category C))
      ( ev-id-iso-Category P)
      ( ev-pair)
  triangle-ev-id-iso-Category =
    triangle-ev-id-iso-Precategory (precategory-Category C)
```

## Properties

### Isomorphism induction in a category

```agda
module _
  {l1 l2 l3 : Level} (C : Category l1 l2) {A : obj-Category C}
  (P : (B : obj-Category C) (e : iso-Category C A B)  UU l3)
  where

  abstract
    is-identity-system-iso-Category : section (ev-id-iso-Category C P)
    is-identity-system-iso-Category =
      is-identity-system-is-torsorial-iso-Precategory
        ( precategory-Category C)
        ( is-torsorial-iso-Category C A)
        ( P)

  ind-iso-Category :
    P A (id-iso-Category C) 
    {B : obj-Category C} (e : iso-Category C A B)  P B e
  ind-iso-Category p {B} = pr1 is-identity-system-iso-Category p B

  compute-ind-iso-Category :
    (u : P A (id-iso-Category C))  ind-iso-Category u (id-iso-Category C)  u
  compute-ind-iso-Category = pr2 is-identity-system-iso-Category
```

### The evaluation map `ev-id-iso-Category` is an equivalence

```agda
module _
  {l1 l2 l3 : Level} (C : Category l1 l2) {A : obj-Category C}
  (P : (B : obj-Category C) (e : iso-Category C A B)  UU l3)
  where

  is-equiv-ev-id-iso-Category : is-equiv (ev-id-iso-Category C P)
  is-equiv-ev-id-iso-Category =
    dependent-universal-property-identity-system-is-torsorial
      ( id-iso-Category C)
      ( is-torsorial-iso-Category C A)
      ( P)

  is-contr-map-ev-id-iso-Category :
    is-contr-map (ev-id-iso-Category C P)
  is-contr-map-ev-id-iso-Category =
    is-contr-map-is-equiv is-equiv-ev-id-iso-Category
```