# Lawvere's fixed point theorem

```agda
module foundation.lawveres-fixed-point-theorem where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.existential-quantification
open import foundation.function-extensionality
open import foundation.propositional-truncations
open import foundation.surjective-maps
open import foundation.universe-levels

open import foundation-core.identity-types
```

</details>

## Idea

{{#concept "Lawvere's fixed point theorem" Agda=fixed-point-theorem-Lawvere}}
asserts that if there is a [surjective map](foundation.surjective-maps.md)
`A → (A → B)`, then any map `B → B` must have a fixed point.

## Theorem

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  A  B}
  where

  abstract
    fixed-point-theorem-Lawvere :
      is-surjective f  (h : B  B)  exists-structure B  b  h b  b)
    fixed-point-theorem-Lawvere H h =
      apply-universal-property-trunc-Prop
        ( H g)
        ( exists-structure-Prop B  b  h b  b))
        ( λ (x , p)  intro-exists (f x x) (inv (htpy-eq p x)))
      where
      g : A  B
      g a = h (f a a)
```