# Isomorphism induction in precategories

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

<details><summary>Imports</summary>

```agda
open import category-theory.isomorphisms-in-precategories
open import category-theory.precategories

open import foundation.commuting-triangles-of-maps
open import foundation.dependent-pair-types
open import foundation.function-types
open import foundation.identity-systems
open import foundation.identity-types
open import foundation.sections
open import foundation.torsorial-type-families
open import foundation.universe-levels
```

</details>

## Idea

**Isomorphism induction** in a precategory `𝒞` 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, hence this is one approach to proving that a precategory is a
category.

## Statement

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

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

  induction-principle-iso-Precategory :
    {l : Level} (P : (B : obj-Precategory C)  iso-Precategory C A B  UU l) 
    UU (l1  l2  l)
  induction-principle-iso-Precategory P = section (ev-id-iso-Precategory P)

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

## Properties

### Contractibility of the total space of isomorphisms implies isomorphism induction

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

  abstract
    is-identity-system-is-torsorial-iso-Precategory :
      is-torsorial (iso-Precategory C A) 
      is-identity-system (iso-Precategory C A) A (id-iso-Precategory C)
    is-identity-system-is-torsorial-iso-Precategory =
      is-identity-system-is-torsorial A (id-iso-Precategory C)
```

### Isomorphism induction implies contractibility of the total space of isomorphisms

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

  is-torsorial-equiv-induction-principle-iso-Precategory :
    is-identity-system (iso-Precategory C A) A (id-iso-Precategory C) 
    is-torsorial (iso-Precategory C A)
  is-torsorial-equiv-induction-principle-iso-Precategory =
    is-torsorial-is-identity-system A (id-iso-Precategory C)
```