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 role
set_option doc.verso true

Prototype: 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.
. The action is functorial, 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 of Fam(Type) proper, with FamHom.id, FamHom.comp and the map of total spaces FamHom.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 of GebProto.­LargeIR.­arrowPshCodeEquiv is 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.LargeIR

Morphisms 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 _ := rfl

The 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 ψ) := rfl

Morphisms 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) 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) := 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) 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) 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) All goals completed! 🐙
end GebProto.LargeIR