Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some extensions of the fundamental theorem of identity types #1243

Open
wants to merge 25 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
bc13587
unbased extended fundamental theorem of identity types
fredrik-bakke Jan 27, 2025
7224734
some prose
fredrik-bakke Jan 27, 2025
e6d9ec6
Merge branch 'master' into unbased-extended-fundamental-thm-id
fredrik-bakke Jan 27, 2025
8cfd888
revert two symbols
fredrik-bakke Jan 27, 2025
92b0358
fundamental theorem of identity types for structures and subuniverses
fredrik-bakke Jan 27, 2025
8844fcb
mild explanation
fredrik-bakke Jan 27, 2025
a58c9cc
the unbased extended fundamental theorem proper
fredrik-bakke Jan 28, 2025
82bbf22
explanation extended fundamental theorem
fredrik-bakke Jan 28, 2025
3b7c9dc
universal property of identity types follows from injectivity of `equ…
fredrik-bakke Jan 28, 2025
612d84c
simplify proof unbased extended fundamental theorem
fredrik-bakke Jan 28, 2025
1108291
edits
fredrik-bakke Jan 28, 2025
f37ef88
the strong preunivalence axiom
fredrik-bakke Jan 28, 2025
231f43b
a choice of word
fredrik-bakke Jan 28, 2025
b50fde7
rename to "structured equality duality"
fredrik-bakke Jan 28, 2025
77a73a4
Merge branch 'master' into unbased-extended-fundamental-thm-id
fredrik-bakke Jan 28, 2025
0744c3f
citations and a historical correction
fredrik-bakke Jan 28, 2025
c2f255e
strengthen definition of preunivalent category
fredrik-bakke Jan 28, 2025
71a526a
self-review
fredrik-bakke Jan 28, 2025
d88be88
remove redundant text
fredrik-bakke Jan 28, 2025
0f950e2
fix a sentence
fredrik-bakke Jan 28, 2025
13d1eaf
review
fredrik-bakke Jan 28, 2025
70929fd
edits
fredrik-bakke Jan 28, 2025
2e284ce
more edits
fredrik-bakke Jan 29, 2025
d705788
fix link
fredrik-bakke Jan 29, 2025
daee207
transfer along equivalences
fredrik-bakke Jan 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,16 @@ @article{Esc08
primaryclass = {cs.LO}
}

@online{Esc17YetAnother,
title = {Yet another characterization of univalence},
author = {Escardó, Martín Hötzel},
date = {2017-11-18},
year = {2017},
month = {11},
url = {https://groups.google.com/g/homotopytypetheory/c/FfiZj1vrkmQ/m/GJETdy0AAgAJ},
howpublished = {{{Google}} groups forum discussion}
}

@online{Esc19DefinitionsEquivalence,
title = {Definitions of Equivalence Satisfying Judgmental/Strict Groupoid Laws?},
author = {Escardó, Martín Hötzel},
Expand Down
10 changes: 7 additions & 3 deletions src/category-theory/categories.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ open import foundation.1-types
open import foundation.cartesian-product-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.fundamental-theorem-of-identity-types
open import foundation.identity-types
open import foundation.logical-equivalences
open import foundation.propositions
Expand Down Expand Up @@ -170,8 +171,11 @@ module _

is-preunivalent-category-Category :
is-preunivalent-Precategory (precategory-Category C)
is-preunivalent-category-Category x y =
is-emb-is-equiv (is-category-Category C x y)
is-preunivalent-category-Category x =
is-set-is-contr
( fundamental-theorem-id'
( iso-eq-Precategory (precategory-Category C) x)
( is-category-Category C x))
fredrik-bakke marked this conversation as resolved.
Show resolved Hide resolved

preunivalent-category-Category : Preunivalent-Category l1 l2
pr1 preunivalent-category-Category = precategory-Category C
Expand Down Expand Up @@ -301,7 +305,7 @@ module _
is-surjective-iso-eq-C x y =
is-equiv-is-emb-is-surjective
( is-surjective-iso-eq-C x y)
( is-preunivalent-Preunivalent-Category C x y)
( preunivalence-Preunivalent-Category C x y)

is-surjective-iso-eq-is-category-Preunivalent-Category :
is-category-Precategory (precategory-Preunivalent-Category C) →
Expand Down
6 changes: 5 additions & 1 deletion src/category-theory/indiscrete-precategories.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,11 @@ module _
is-strict-category-is-preunivalent-indiscrete-Precategory H x y =
is-prop-is-emb
( iso-eq-Precategory (indiscrete-Precategory X) x y)
( H x y)
( preunivalence-is-preunivalent-Precategory
( indiscrete-Precategory X)
( H)
( x)
( y))
( is-prop-Σ
( is-prop-unit)
( is-prop-is-iso-Precategory (indiscrete-Precategory X) {x} {y}))
Expand Down
19 changes: 8 additions & 11 deletions src/category-theory/opposite-preunivalent-categories.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ open import category-theory.preunivalent-categories
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.equivalences
open import foundation.functoriality-dependent-pair-types
open import foundation.identity-types
open import foundation.involutions
open import foundation.sets
Expand All @@ -41,17 +42,13 @@ abstract
{l1 l2 : Level} (C : Precategory l1 l2) →
is-preunivalent-Precategory C →
is-preunivalent-Precategory (opposite-Precategory C)
is-preunivalent-opposite-is-preunivalent-Precategory C is-preunivalent-C x y =
is-emb-htpy-emb
( comp-emb
( emb-equiv
( compute-iso-opposite-Precategory C ∘e equiv-inv-iso-Precategory C))
( _ , is-preunivalent-C x y))
( λ where
refl →
eq-type-subtype
( is-iso-prop-Precategory (opposite-Precategory C))
( refl))
is-preunivalent-opposite-is-preunivalent-Precategory C is-preunivalent-C x =
is-set-equiv'
( Σ (obj-opposite-Precategory C) (iso-Precategory C x))
( equiv-tot
( λ _ →
compute-iso-opposite-Precategory C ∘e equiv-inv-iso-Precategory C))
( is-preunivalent-C x)

abstract
is-preunivalent-is-preunivalent-opposite-Precategory :
Expand Down
105 changes: 75 additions & 30 deletions src/category-theory/preunivalent-categories.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,46 @@ open import foundation.1-types
open import foundation.cartesian-product-types
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.functoriality-dependent-pair-types
open import foundation.identity-types
open import foundation.propositional-maps
open import foundation.propositions
open import foundation.sets
open import foundation.strictly-involutive-identity-types
open import foundation.structured-equality-duality
open import foundation.universe-levels
```

</details>

## Idea

A **preunivalent category** is a [precategory](category-theory.precategories.md)
for which the [identifications](foundation-core.identity-types.md) between the
objects [embed](foundation-core.embeddings.md) into the
[isomorphisms](category-theory.isomorphisms-in-precategories.md). More
specifically, an equality between objects gives rise to an isomorphism between
them, by the J-rule. A precategory is a preunivalent category if this function,
called `iso-eq`, is an embedding.

The idea of [preunivalence](foundation.preunivalence.md) is that it is a common
generalization of univalent mathematics and mathematics with Axiom K. Hence
preunivalent categories generalize both
[(univalent) categories](category-theory.categories.md) and
A {{#concept "preunivalent category" Agda=Preunivalent-Category}} `𝒞` is a
[precategory](category-theory.precategories.md) for which every mapping of the
concrete groupoid of objects into the groupoid of
[isomorphisms](category-theory.isomorphisms-in-precategories.md) is an
[embedding](foundation-core.embeddings.md). Equivalently, by
[subuniverse equality duality](foundation.structured-equality-duality.md), a
preunivalent category is a precategory whose based isomorphism types
`Σ (x : 𝒞₀), (* ≅ x)` are [sets](foundation-core.sets.md).

The main function of _preunivalence_ is to serve as a common generalization of
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The main function of _preunivalence_ is to serve as a common generalization of
The main purpose of _preunivalence_ is to serve as a common generalization of

univalent mathematics and mathematics with Axiom K by restricting the ways that
identity and equivalence may interact. Hence preunivalent categories generalize
both [(univalent) categories](category-theory.categories.md) and
[strict categories](category-theory.strict-categories.md), which are
precategories whose objects form a [set](foundation-core.sets.md).

The preunivalence condition on precategories states that the type of objects is
a subgroupoid of the [groupoid](category-theory.groupoids.md) of isomorphisms.
For univalent categories the groupoid of objects is equivalent to the groupoid
of isomorphisms, while for strict categories the groupoid of objects is
discrete. Indeed, in this sense preunivalence provides a generalization of both
notions of "category", with _no more structure_. This is opposed to the even
more general notion of precategory, where the homotopy structure on the objects
can be almost completely unrelated to the homotopy structure of the morphisms.
precategories whose objects form a [set](foundation-core.sets.md). Note,
however, that our definition of preunivalence here is a
[strengthening](foundation.strong-preunivalence.md) of the
[preunivalence axiom](foundation.preunivalence.md).

## Definitions

### The predicate on precategories of being a preunivalent category

We define preunivalence of a precategory `𝒞` to be the condition that for every
`x : 𝒞₀`, the type `Σ (y : 𝒞₀), (x ≅ y)` is a set.

Comment on lines 53 to +57
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In situations like this, where you want to redefine something with a different axiom, it is a question whether it is a good idea to replace the old definition, or whether to keep a version of it around while also defining the new version.

I think it could be a good idea to keep the old version around under some name, because it is clearly a condition that could come up sometimes, and under the current proposal of this PR we won't have that old definition in the library anymore.

Copy link
Collaborator Author

@fredrik-bakke fredrik-bakke Jan 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While I'd currently like to think of the previous definition as "deprecated", I don't have a good rebuttal for the proposal to keep it. However, I'd like to give it a name that makes it clear it is an inferior condition. Perhaps we can call it "quasipreunivalent" or "weakly preunivalent"?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling these categories "weakly preunivalent" creates a strange situation though, because weak preunivalent categories would then satisfy the preunivalence axiom, and preunivalent categories would satisfy the strong preunivalence axiom. This can only create confusion.

I'd propose keeping the name "Preunivalent categories" for the old concept, and indeed not changing the name "preunivalence" in foundation either. Preunivalence is a somewhat established concept, that other people like Martin Escardo, Evan Cavallo, and Peter Lumsdaine are also interested in. Then we could name the new concept "Strongly preunivalent categories", which is in line with the name for the new axiom that you came up with.

That's quite a mouthful, but it could be an advantage. If people don't like the name "strongly preunivalent category" they have an obvious alternative: Bakke categories :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fiiiiine, we'll call them strongly preunivalent. Is it okay if we remove most mentions of preunivalent categories over strongly preunivalent categories though? The preunivalence axiom (for all types) has the advantage over preunivalence for categories, AFAIK, that one can metatheoretically prove that id-equiv : {l : Level} {X : UU l} -> X ≃ X is the only type-polymorphic function of this signature, while for categories it is possible that one indeed has multiple families of morphisms of type (x : obj C) -> iso C x x.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's fine. Thank you so much for doing that.

Could you also include some discussion of why you think the stronger version has advantages? You've clearly thought deeply about these conditions and I could definitely learn from it if you'd write it down carefully.

```agda
module _
{l1 l2 : Level} (C : Precategory l1 l2)
Expand All @@ -64,12 +65,25 @@ module _
Π-Prop
( obj-Precategory C)
( λ x →
Π-Prop
( obj-Precategory C)
( λ y → is-emb-Prop (iso-eq-Precategory C x y)))
is-set-Prop
( Σ ( obj-Precategory C)
( iso-Precategory C x)))

is-preunivalent-Precategory : UU (l1 ⊔ l2)
is-preunivalent-Precategory = type-Prop is-preunivalent-prop-Precategory

preunivalence-is-preunivalent-Precategory :
is-preunivalent-Precategory →
(x y : obj-Precategory C) →
is-emb (iso-eq-Precategory C x y)
preunivalence-is-preunivalent-Precategory H x y =
is-emb-is-prop-map
( backward-implication-subuniverse-equality-duality
( is-prop-Prop)
(H x)
( x)
( iso-eq-Precategory C x)
( y))
```

### The type of preunivalent categories
Expand Down Expand Up @@ -168,13 +182,44 @@ module _
is-preunivalent-Precategory precategory-Preunivalent-Category
is-preunivalent-Preunivalent-Category = pr2 C

iso-Preunivalent-Category : (x y : obj-Preunivalent-Category) → UU l2
iso-Preunivalent-Category = iso-Precategory precategory-Preunivalent-Category

iso-eq-Preunivalent-Category :
(x y : obj-Preunivalent-Category) → x = y → iso-Preunivalent-Category x y
iso-eq-Preunivalent-Category =
iso-eq-Precategory precategory-Preunivalent-Category

preunivalence-Preunivalent-Category :
(x y : obj-Preunivalent-Category) →
is-emb (iso-eq-Preunivalent-Category x y)
preunivalence-Preunivalent-Category =
preunivalence-is-preunivalent-Precategory
( precategory-Preunivalent-Category)
( is-preunivalent-Preunivalent-Category)

emb-iso-eq-Preunivalent-Category :
{x y : obj-Preunivalent-Category} →
(x = y) ↪ (iso-Precategory precategory-Preunivalent-Category x y)
pr1 (emb-iso-eq-Preunivalent-Category {x} {y}) =
iso-eq-Precategory precategory-Preunivalent-Category x y
pr2 (emb-iso-eq-Preunivalent-Category {x} {y}) =
is-preunivalent-Preunivalent-Category x y
emb-iso-eq-Preunivalent-Category {x} {y} =
( iso-eq-Precategory precategory-Preunivalent-Category x y ,
preunivalence-Preunivalent-Category x y)
```

### The right-based isomorphism types of a preunivalent category are also sets

```agda
is-preunivalent-Preunivalent-Category' :
{l1 l2 : Level} (C : Preunivalent-Category l1 l2) →
( x : obj-Preunivalent-Category C) →
is-set
( Σ (obj-Preunivalent-Category C) (λ y → iso-Preunivalent-Category C y x))
is-preunivalent-Preunivalent-Category' C x =
is-set-equiv
( Σ (obj-Preunivalent-Category C) (iso-Preunivalent-Category C x))
( equiv-tot
( λ y → equiv-inv-iso-Precategory (precategory-Preunivalent-Category C)))
( is-preunivalent-Preunivalent-Category C x)
```

### The total hom-type of a preunivalent category
Expand Down Expand Up @@ -255,7 +300,7 @@ module _
is-1-type-obj-Preunivalent-Category x y =
is-set-is-emb
( iso-eq-Precategory (precategory-Preunivalent-Category C) x y)
( is-preunivalent-Preunivalent-Category C x y)
( preunivalence-Preunivalent-Category C x y)
( is-set-iso-Precategory (precategory-Preunivalent-Category C))

obj-1-type-Preunivalent-Category : 1-Type l1
Expand Down
10 changes: 4 additions & 6 deletions src/category-theory/strict-categories.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,10 @@ module _
abstract
is-preunivalent-Strict-Category :
is-preunivalent-Precategory (precategory-Strict-Category C)
is-preunivalent-Strict-Category x y =
is-emb-is-injective
( is-set-type-subtype
( is-iso-prop-Precategory (precategory-Strict-Category C))
( is-set-hom-Strict-Category C x y))
( λ _ → eq-is-prop (is-set-obj-Strict-Category C x y))
is-preunivalent-Strict-Category x =
is-set-Σ
( is-set-obj-Strict-Category C)
( λ y → is-set-iso-Precategory (precategory-Strict-Category C) {x} {y})

preunivalent-category-Strict-Category : Preunivalent-Category l1 l2
pr1 preunivalent-category-Strict-Category = precategory-Strict-Category C
Expand Down
11 changes: 11 additions & 0 deletions src/foundation-core/equality-dependent-pair-types.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,17 @@ module _
ap-pr1-eq-pair-Σ refl refl = refl
```

### Transport in `B` along the first projection of an identification in `Σ A B`

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

tr-eq-Σ : {x y : Σ A B} (p : x = y) → tr B (ap pr1 p) (pr2 x) = pr2 y
tr-eq-Σ refl = refl
```

## See also

- Equality proofs in cartesian product types are characterized in
Expand Down
6 changes: 6 additions & 0 deletions src/foundation-core/injective-maps.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ module _
is-injective h → is-injective g → is-injective (g ∘ h)
is-injective-comp is-inj-h is-inj-g = is-inj-h ∘ is-inj-g

comp-injection : injection B C → injection A B → injection A C
comp-injection (g , G) (h , H) = (g ∘ h , is-injective-comp H G)

is-injective-left-map-triangle :
(f : A → C) (g : B → C) (h : A → B) → f ~ (g ∘ h) →
is-injective h → is-injective g → is-injective f
Expand All @@ -111,6 +114,9 @@ module _
is-injective-equiv : (e : A ≃ B) → is-injective (map-equiv e)
is-injective-equiv e = is-injective-is-equiv (is-equiv-map-equiv e)

injection-equiv : A ≃ B → injection A B
injection-equiv e = (map-equiv e , is-injective-equiv e)

abstract
is-injective-map-inv-equiv :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) →
Expand Down
2 changes: 2 additions & 0 deletions src/foundation.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -392,9 +392,11 @@ open import foundation.standard-ternary-pullbacks public
open import foundation.strict-symmetrization-binary-relations public
open import foundation.strictly-involutive-identity-types public
open import foundation.strictly-right-unital-concatenation-identifications public
open import foundation.strong-preunivalence public
open import foundation.strongly-extensional-maps public
open import foundation.structure public
open import foundation.structure-identity-principle public
open import foundation.structured-equality-duality public
open import foundation.structured-type-duality public
open import foundation.subsingleton-induction public
open import foundation.subterminal-types public
Expand Down
51 changes: 24 additions & 27 deletions src/foundation/functoriality-dependent-function-types.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ id-map-equiv-Π B h = eq-htpy (compute-map-equiv-Π B id-equiv (λ _ → id-equi

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

equiv-htpy-map-Π-fam-equiv :
Expand All @@ -133,35 +133,32 @@ module _
( λ a → equiv-ap (e a) (f a) (g a))
```

### Truncated families of maps induce truncated maps on dependent function types
### Families of truncated maps induce truncated maps on dependent function types

```agda
abstract
is-trunc-map-map-Π :
(k : 𝕋) {l1 l2 l3 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3}
(f : (i : I) → A i → B i) →
((i : I) → is-trunc-map k (f i)) → is-trunc-map k (map-Π f)
is-trunc-map-map-Π k {I = I} f H h =
is-trunc-equiv' k
( (i : I) → fiber (f i) (h i))
( compute-fiber-map-Π f h)
( is-trunc-Π k (λ i → H i (h i)))
module _
{l1 l2 l3 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3}
where

abstract
is-emb-map-Π :
{l1 l2 l3 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3}
{f : (i : I) → A i → B i} →
((i : I) → is-emb (f i)) → is-emb (map-Π f)
is-emb-map-Π {f = f} H =
is-emb-is-prop-map
( is-trunc-map-map-Π neg-one-𝕋 f
( λ i → is-prop-map-is-emb (H i)))

emb-Π :
{l1 l2 l3 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} →
((i : I) → A i ↪ B i) → ((i : I) → A i) ↪ ((i : I) → B i)
pr1 (emb-Π f) = map-Π (λ i → map-emb (f i))
pr2 (emb-Π f) = is-emb-map-Π (λ i → is-emb-map-emb (f i))
abstract
is-trunc-map-map-Π :
(k : 𝕋) (f : (i : I) → A i → B i) →
((i : I) → is-trunc-map k (f i)) → is-trunc-map k (map-Π f)
is-trunc-map-map-Π k f H h =
is-trunc-equiv' k
( (i : I) → fiber (f i) (h i))
( compute-fiber-map-Π f h)
( is-trunc-Π k (λ i → H i (h i)))

abstract
is-emb-map-Π :
{f : (i : I) → A i → B i} → ((i : I) → is-emb (f i)) → is-emb (map-Π f)
is-emb-map-Π {f} H =
is-emb-is-prop-map
( is-trunc-map-map-Π neg-one-𝕋 f (λ i → is-prop-map-is-emb (H i)))

emb-Π : ((i : I) → A i ↪ B i) → ((i : I) → A i) ↪ ((i : I) → B i)
emb-Π f = (map-Π (map-emb ∘ f) , is-emb-map-Π (is-emb-map-emb ∘ f))
```

### A family of truncated maps over any map induces a truncated map on dependent function types
Expand Down
Loading