Imports
/-
Copyright (c) 2026 Terence Rokop. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Terence Rokop
-/
module
public import Geb.Prototypes.LargeIR.Code
meta import GebMeta -- shake: keep; supplies the cite docstring roleset_option doc.verso truePrototype: the transcription and the code agree on morphisms
Throwaway exploration, not upstream-eligible content. Every declaration here
is Classical.choice-free.
GebProto.LargeIR.arrowPshCodeEquiv identifies the output presheaf of
the transcription GebProto.LargeIR.arrowPsh of a slice polynomial
functor P at a walking-arrow presheaf Z with the presheaf of
the interpretation of the code GebProto.LargeIR.code at the family
of Z. This module extends the agreement to morphisms. The morphisms of
Fam(Type) proper, FamHom, are a map of index types with a map
of decodings over it, the morphisms of the Grothendieck construction of
U ↦ (U → Type), in contrast to those of
CategoryTheory.FreeCoprodCompDisc, which compare decodings by
equality. On them the code acts by codeMap: the σ index and
the ι point are fixed, the δ assignment is postcomposed with
the map of index types, and the decoding is carried along by the
functoriality fibreValueMap of the slice functor's fibre in the
family, which is the positivity of the code's continuation in the sense of
[GhaniNordvallForsbergMalatesta2015]
Neil Ghani, Fredrik Nordvall Forsberg, Lorenzo Malatesta (2015). “Positive Inductive-Recursive Definitions”. Logical Methods in Computer Science 11(1). https://doi.org/10.2168/LMCS-11(1:13)2015. codeMap_id and codeMap_comp.
A morphism of walking-arrow presheaves is a morphism of families,
famHomOfNatTrans, and conversely, natTransOfFamHom, through
the presheaf morphism arrowHom of a commuting square over a base
change. The naturality statements base_map and total_map say
that GebProto.LargeIR.arrowPshCodeEquiv commutes with the
transcription's action PresheafPFunctor.mapPresheaf on one side and
codeMap on the other: the isomorphism is natural in the input
presheaf, so the transcription and the positive action of the code are the
same functor on Fam(Type) up to it. Both are proved on the inverse
equivalences, base_map_symm and total_map_symm, where the
two sides agree by unfolding.
Main definitions
-
FamHom— the morphisms ofFam(Type)proper, withFamHom.id,FamHom.compand the map of total spacesFamHom.total. -
fibreValueMap— the functoriality of the slice functor's fibre in the family. -
codeMap— the action of the code's interpretation on a morphism of families. -
arrowHom— the morphism of walking-arrow presheaves of a commuting square over a base change. -
famHomOfNatTrans,natTransOfFamHom— the two directions between morphisms of walking-arrow presheaves and of families.
Main statements
-
codeMap_id,codeMap_comp— the action is functorial. -
base_map,total_map— the isomorphism ofGebProto.LargeIR.arrowPshCodeEquivis natural in the input presheaf, at each of the two levels.
References
-
[GhaniNordvallForsbergMalatesta2015]
Neil Ghani, Fredrik Nordvall Forsberg, Lorenzo Malatesta (2015). “Positive Inductive-Recursive Definitions”. Logical Methods in Computer Science 11(1). https://doi.org/10.2168/LMCS-11(1:13)2015.
Tags
prototype, presheaf, walking arrow, inductive-recursive, code, positive, naturality
@[expose] public sectionopen CategoryTheory PresheafIRUniv IndRecnamespace GebProto.LargeIRMorphisms of families
A morphism of families with Type-valued decodings: a map of index
types with a map of decodings over it.
def FamHom (F G : FreeCoprodCompDisc.{0, 1} Type) : Type :=
Σ h : F.1 → G.1, ∀ u, F.2 u → G.2 (h u)The identity morphism of families.
def FamHom.id (F : FreeCoprodCompDisc.{0, 1} Type) : FamHom F F :=
⟨_root_.id, fun _ ↦ _root_.id⟩Composition of morphisms of families.
def FamHom.comp {F G H : FreeCoprodCompDisc.{0, 1} Type} (φ : FamHom F G) (ψ : FamHom G H) :
FamHom F H :=
⟨ψ.1 ∘ φ.1, fun u z ↦ ψ.2 (φ.1 u) (φ.2 u z)⟩The map of total spaces of a morphism of families.
def FamHom.total {F G : FreeCoprodCompDisc.{0, 1} Type} (φ : FamHom F G) :
(Σ u : F.1, F.2 u) → Σ u : G.1, G.2 u :=
fun p ↦ ⟨φ.1 p.1, φ.2 p.1 p.2⟩variable {X Y : Type} (P : SlicePFunctor.{0, 0, 0, 0} X Y)The action of the code on morphisms
The slice functor's fibre is functorial in the family: a map of families
over X is applied at each direction. This is the positivity of the
code's continuation.
def fibreValueMap (y : Y) {A A' : X → Type} (φ : ∀ x, A x → A' x) :
fibreValue P y A → fibreValue P y A' :=
fun w ↦ ⟨w.1, fun b ↦ φ _ (w.2 b)⟩
The action of the code's interpretation on a morphism of families: the
σ index and the ι point are fixed, the δ assignment is
postcomposed with the map of index types, and the decoding is carried along
by fibreValueMap at the map of decodings along the assignment.
def codeMap {F G : FreeCoprodCompDisc.{0, 1} Type} (φ : FamHom F G) :
FamHom (IR.interpObj Type Type (code P) F) (IR.interpObj Type Type (code P) G) :=
⟨fun s ↦ ⟨s.1, φ.1 ∘ s.2.1, s.2.2⟩, fun s ↦ fibreValueMap P s.1 fun x ↦ φ.2 (s.2.1 x)⟩The action fixes identities.
theorem codeMap_id (F : FreeCoprodCompDisc.{0, 1} Type) :
codeMap P (FamHom.id F) = FamHom.id _ :=
rflThe action preserves composition.
theorem codeMap_comp {F G H : FreeCoprodCompDisc.{0, 1} Type} (φ : FamHom F G) (ψ : FamHom G H) :
codeMap P (φ.comp ψ) = (codeMap P φ).comp (codeMap P ψ) :=
rflMorphisms of walking-arrow presheaves and of families
The components of a commuting square over a base change, as a natural
transformation: the base map at level 0, the total map at level
1.
def squareApp {A A' B B' : Type} (h₀ : A → A') (h₁ : B → B') :
∀ i : Fin 2, arrowObj A B i → arrowObj A' B' i
| 0 => h₀
| 1 => h₁
A commuting square p' ∘ h₁ = h₀ ∘ p over a base change
h₀ : A → A' as a morphism ofSlice p ⟶ ofSlice p' of walking-arrow
presheaves. GebProto.LargeIR.ofSliceHom is the case of an identity
base map.
def arrowHom {A A' B B' : Type} {p : B → A} {p' : B' → A'} (h₀ : A → A') (h₁ : B → B')
(w : p' ∘ h₁ = h₀ ∘ p) : NatTrans (ofSlice p) (ofSlice p') where
app o := ↾ squareApp h₀ h₁ o.unop
naturality {o o'} f :=
match o, o', f with
| ⟨0⟩, ⟨0⟩, _ => rfl
| ⟨1⟩, ⟨1⟩, _ => rfl
| ⟨1⟩, ⟨0⟩, _ => congrArg TypeCat.ofHom w.symm
| ⟨0⟩, ⟨1⟩, f => absurd (leOfHom f.unop) (X:TypeY:TypeP:SlicePFunctor X YA:TypeA':TypeB:TypeB':Typep:B → Ap':B' → A'h₀:A → A'h₁:B → B'w:p' ∘ h₁ = h₀ ∘ po:(Fin 2)ᵒᵖo':(Fin 2)ᵒᵖf✝:o ⟶ o'f:Opposite.op 0 ⟶ Opposite.op 1⊢ ¬Opposite.unop (Opposite.op 1) ≤ Opposite.unop (Opposite.op 0) All goals completed! 🐙)A morphism of families as a morphism of the walking-arrow presheaves of the families: the map of total spaces over the map of index types.
def natTransOfFamHom {F G : FreeCoprodCompDisc.{0, 1} Type} (φ : FamHom F G) :
NatTrans (pshOfFam F) (pshOfFam G) :=
arrowHom φ.1 φ.total rfl
A morphism of walking-arrow presheaves as a morphism of their families:
the level-0 component on index types, and the level-1 component
on the fibres of the restriction, which it preserves by naturality.
def famHomOfNatTrans {Z Z' : (Fin 2)ᵒᵖ ⥤ Type} (α : NatTrans Z Z') :
FamHom (famOfPsh Z) (famOfPsh Z') :=
⟨α.app ⟨0⟩, fun _ z ↦ ⟨α.app ⟨1⟩ z.1,
((congrArg (fun k : Z.obj ⟨1⟩ ⟶ Z'.obj ⟨0⟩ ↦ k z.1) (α.naturality waHom.op)).symm.trans
(congrArg (α.app ⟨0⟩) z.2))⟩⟩Naturality of the isomorphism
variable {Z Z' : (Fin 2)ᵒᵖ ⥤ Type} (α : NatTrans Z Z')
On the inverse equivalences at level 0, the transcription's action
and the code's action agree by unfolding.
theorem base_map_symm (s : (pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj ⟨0⟩) :
((arrowPsh P).mapPresheaf α).app ⟨0⟩ ((arrowPshCodeEquiv P Z).base.symm s) =
(arrowPshCodeEquiv P Z').base.symm
((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app ⟨0⟩ s) := X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z's:(pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj (Opposite.op 0)⊢ (ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) ((arrowPshCodeEquiv P Z).base.symm s) =
(arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0))) s)
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z's:(pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj (Opposite.op 0)d:(arrowPsh P).B
(↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm s))).fst⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm s))).snd
d =
(↑↑↑((arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0))) s))).snd
d
cases d with
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z's:(pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj (Opposite.op 0)val✝:X⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm s))).snd
(Sum.inl val✝) =
(↑↑↑((arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0))) s))).snd
(Sum.inl val✝) All goals completed! 🐙
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z's:(pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj (Opposite.op 0)e:fibDir P
(↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm s))).fst⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm s))).snd
(Sum.inr e) =
(↑↑↑((arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0))) s))).snd
(Sum.inr e) All goals completed! 🐙
On the inverse equivalences at level 1, the transcription's action
and the code's action agree by unfolding.
theorem total_map_symm (s : (pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj ⟨1⟩) :
((arrowPsh P).mapPresheaf α).app ⟨1⟩ ((arrowPshCodeEquiv P Z).total.symm s) =
(arrowPshCodeEquiv P Z').total.symm
((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app ⟨1⟩ s) := X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z's:(pshOfFam (IR.interpObj Type Type (code P) (famOfPsh Z))).obj (Opposite.op 1)⊢ (ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) ((arrowPshCodeEquiv P Z).total.symm s) =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1))) s)
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩⊢ (ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩) =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩)
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩d:(arrowPsh P).B
(↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).fst⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
d =
(↑↑↑((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
d
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩val✝:X⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inl val✝) =
(↑↑↑((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inl val✝)X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩val✝:fibDir P
(↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).fst⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inr val✝) =
(↑↑↑((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inr val✝) X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩val✝:X⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inl val✝) =
(↑↑↑((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inl val✝)X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'fst✝¹:Yfst✝:X → (famOfPsh Z).fstsnd✝:(IR.interpObj Type Type (code P) (famOfPsh Z)).snd ⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩val✝:fibDir P
(↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).fst⊢ (↑↑↑((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inr val✝) =
(↑↑↑((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
⟨⟨fst✝¹, ⟨fst✝, { down := PUnit.unit }⟩⟩, snd✝⟩))).snd
(Sum.inr val✝) All goals completed! 🐙
The isomorphism is natural in the input presheaf at level 0: it
commutes with the transcription's action on one side and the code's action on
the other.
theorem base_map (x : ((arrowPsh P).objPresheaf Z).obj ⟨0⟩) :
(arrowPshCodeEquiv P Z').base (((arrowPsh P).mapPresheaf α).app ⟨0⟩ x) =
(natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app ⟨0⟩
((arrowPshCodeEquiv P Z).base x) := X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'x:((arrowPsh P).objPresheaf Z).obj (Opposite.op 0)⊢ (arrowPshCodeEquiv P Z').base ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x)
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'x:((arrowPsh P).objPresheaf Z).obj (Opposite.op 0)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base.symm ((arrowPshCodeEquiv P Z).base x)) =
(arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x))⊢ (arrowPshCodeEquiv P Z').base ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x)
X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'x:((arrowPsh P).objPresheaf Z).obj (Opposite.op 0)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x =
(arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x))⊢ (arrowPshCodeEquiv P Z').base ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x)
rw [h, X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'x:((arrowPsh P).objPresheaf Z).obj (Opposite.op 0)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x =
(arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x))⊢ (arrowPshCodeEquiv P Z').base
((arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x))) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x) (arrowPshCodeEquiv P Z').base.apply_symm_apply X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z'x:((arrowPsh P).objPresheaf Z).obj (Opposite.op 0)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 0))) x =
(arrowPshCodeEquiv P Z').base.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x))⊢ (ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 0)))
((arrowPshCodeEquiv P Z).base x)] All goals completed! 🐙
The isomorphism is natural in the input presheaf at level 1.
theorem total_map (t : ((arrowPsh P).objPresheaf Z).obj ⟨1⟩) :
(arrowPshCodeEquiv P Z').total (((arrowPsh P).mapPresheaf α).app ⟨1⟩ t) =
(natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app ⟨1⟩
((arrowPshCodeEquiv P Z).total t) := by X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)⊢ (arrowPshCodeEquiv P Z').total ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t)
have h := total_map_symm P α ((arrowPshCodeEquiv P Z).total t) X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total.symm ((arrowPshCodeEquiv P Z).total t)) =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))⊢ (arrowPshCodeEquiv P Z').total ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t)
rw [(arrowPshCodeEquiv P Z).total.symm_apply_apply X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))⊢ (arrowPshCodeEquiv P Z').total ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t)] at h X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))⊢ (arrowPshCodeEquiv P Z').total ((ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t)
rw [h, X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))⊢ (arrowPshCodeEquiv P Z').total
((arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t) (arrowPshCodeEquiv P Z').total.apply_symm_apply X:TypeY:TypeP:SlicePFunctor X YZ:(Fin 2)ᵒᵖ ⥤ TypeZ':(Fin 2)ᵒᵖ ⥤ Typeα:NatTrans Z Z't:((arrowPsh P).objPresheaf Z).obj (Opposite.op 1)h:(ConcreteCategory.hom (((arrowPsh P).mapPresheaf α).app (Opposite.op 1))) t =
(arrowPshCodeEquiv P Z').total.symm
((ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t))⊢ (ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t) =
(ConcreteCategory.hom ((natTransOfFamHom (codeMap P (famHomOfNatTrans α))).app (Opposite.op 1)))
((arrowPshCodeEquiv P Z).total t)] All goals completed! 🐙end GebProto.LargeIR