Other Agda modules in this section (54)
- AbsoluteObjects
- Contractible
- CoproductDomain
- CoreOfFun
- Currying
- Evaluation
- EvaluationCalculus.CoreViaFunctorCategories
- EvaluationCalculus.EvaluatedAssociativitySquare
- EvaluationCalculus.EvaluatedProjectionNormalization
- EvaluationCalculus.EvaluatedRightUnit
- EvaluationCalculus.EvaluatedSeparationChange
- EvaluationCalculus.EvaluatedUnitSquare
- EvaluationCalculus.EvaluationNaturality
- EvaluationCalculus.IsomorphismLifting
- EvaluationCalculus.IteratedCompatibility
- EvaluationCalculus.MappingCompatibility
- EvaluationCalculus.MappingProofs
- EvaluationCalculus.MappingSubstitution
- EvaluationCalculus.MappingTests
- EvaluationCalculus.NestedCoordinateNaturality
- EvaluationCalculus.PostcompositionTriangleFrames
- EvaluationCalculus.PostcompositionUnitFrame
- EvaluationCalculus.PrecompositionMiddleEvaluation
- EvaluationCalculus.PrecompositionMiddleRestriction
- EvaluationCalculus.PrecompositionOuterFrame
- EvaluationCalculus.PrecompositionProductFrameComparison
- EvaluationCalculus.PrecompositionRestrictedOuterFrame
- EvaluationCalculus.PrecompositionTriangleFrames
- EvaluationCalculus.PrecompositionUnitEvaluation
- EvaluationCalculus.ProductSeparationUnits
- EvaluationCalculus.Representation
- EvaluationCalculus.RestrictedFrameNaturality
- EvaluationCalculus.RestrictedFrames
- EvaluationCalculus.SubstitutionCoherence
- EvaluationCalculus.UncurryingAction
- EvaluationCalculus.UncurryingUnits
- Everything
- FunctorCategories
- FunctorProducts
- FunctorPullbacks
- Functoriality
- MappingComparison
- PullbackCalculus.ConeCurrying
- PullbackCalculus.ConeReflection
- PullbackCalculus.ConeUncurrying
- PullbackCalculus.ConeUncurryingNormalization
- PullbackCalculus.ConeUncurryingPre
- PullbackCalculus.MappedCones
- PullbackCalculus.PullbackMappingTests
- PullbackCalculus.UncurryingCones
- PullbackCalculus.UncurryingSquares
- Setup
- TerminalDomain
- Uniqueness
Complete compiler-highlighted source. Follow a symbol to its declaration.
Corresponding book passages
# The internal exponential law This proves `lem:Internal_Adjunction_Product_Fun`. The preferred functor curries double evaluation; the inverse curries evaluation twice. The equivalence is proved by testing on mapping animae, uncurrying twice, and reassociating the parameter product. ```agda {-# OPTIONS --safe --without-K #-} open import Agda.Primitive using (Level) open import SCT.VolumeI.Chapter01.Theory using (Theory) import SCT.VolumeI.Chapter01.Section04.MappingAnimae as Mapping import SCT.VolumeI.Chapter01.Section07.FunctorCategories as Categories module SCT.VolumeI.Chapter01.Section07.ExponentialLaw {c m a : Level} (π― : Theory c m a) (M : Mapping.MappingAnimae π―) (F : Categories.FunctorCategories π― M) where open import SCT.VolumeI.Chapter01.Section05.Setup π― M open import SCT.VolumeI.Chapter01.Section04.Uncurrying π― M using (module Reassociation) open import SCT.VolumeI.Chapter01.Section07.Currying π― M F open import SCT.VolumeI.Chapter01.Section07.EvaluationCalculus.MappingTests π― M F using (module Test; fourfold-regroup) open import SCT.VolumeI.Chapter01.Section04.EquivalenceDetection π― M using (post-tests-all) module ExponentialLaw (X C D : CAT) where Nested : CAT Nested = Fun X (Fun C D) Flat : CAT Flat = Fun (X Γ C) D doubleUncurry : {Z : CAT} β MAP Z Nested β MAP ((Z Γ X) Γ C) D doubleUncurry f = funUncurry (funUncurry f) doubleEvaluation : MAP ((Nested Γ X) Γ C) D doubleEvaluation = funUncurry (funEval {X} {Fun C D}) forwardEvaluation : MAP (Nested Γ (X Γ C)) D forwardEvaluation = doubleEvaluation β Associativity.backward Nested X C forward : MAP Nested Flat forward = funCurry forwardEvaluation backwardEvaluation : MAP ((Flat Γ X) Γ C) D backwardEvaluation = funEval β Associativity.forward Flat X C backwardFirstCurry : MAP (Flat Γ X) (Fun C D) backwardFirstCurry = funCurry backwardEvaluation backward : MAP Flat Nested backward = funCurry backwardFirstCurry forward-Ξ² : (funUncurry forward) =β forwardEvaluation forward-Ξ² = funCurry-Ξ² forwardEvaluation backward-Ξ² : (doubleUncurry backward) =β backwardEvaluation backward-Ξ² = funCurry-Ξ² backwardEvaluation β funUncurry-cong (funCurry-Ξ² backwardFirstCurry) doubleUncurry-restrict : {R Z : CAT} (f : MAP Z Nested) (Ο : MAP R Z) β (doubleUncurry (f β Ο)) =β (doubleUncurry f β productMap (productMap Ο (id X)) (id C)) doubleUncurry-restrict f Ο = funUncurry-restrict (funUncurry f) (productMap Ο (id X)) β funUncurry-cong (funUncurry-restrict f Ο) doubleReflect : {Z : CAT} (f g : MAP Z Nested) β (doubleUncurry f) =β (doubleUncurry g) β f =β g doubleReflect f g Ξ± = funReflect f g (funReflect (funUncurry f) (funUncurry g) Ξ±) doubleUncurry-id : (doubleUncurry (id Nested)) =β doubleEvaluation doubleUncurry-id = funUncurry-cong (funUncurry-id X (Fun C D)) ``` Substitution into the two constructions gives their representing formulas. Each proof separates beta reduction from reassociation of the three factors. ```agda forward-represents : {Z : CAT} (f : MAP Z Nested) β (funUncurry (forward β f)) =β (doubleUncurry f β Associativity.backward Z X C) forward-represents {Z} f = let changePair = productMap f (id (X Γ C)) changeTriple = productMap (productMap f (id X)) (id C) regroup = Associativity.backward Z X C substitute : (funUncurry (forward β f)) =β (forwardEvaluation β changePair) substitute = (forward-Ξ² β· changePair) β funUncurry-restrict forward f regroupParameters : (forwardEvaluation β changePair) =β ((doubleEvaluation β changeTriple) β regroup) regroupParameters = (comp-assoc regroup changeTriple doubleEvaluation) β»ΒΉ β ((doubleEvaluation β Reassociation.backward-natural f) β comp-assoc changePair (Associativity.backward Nested X C) doubleEvaluation) evaluate : (doubleEvaluation β changeTriple) =β (doubleUncurry f) evaluate = (funUncurry-restrict (funEval {X} {Fun C D}) (productMap f (id X))) β»ΒΉ in (evaluate β· regroup) β (regroupParameters β substitute) backward-represents : {Z : CAT} (f : MAP Z Flat) β (doubleUncurry (backward β f)) =β (funUncurry f β Associativity.forward Z X C) backward-represents {Z} f = let changePair = productMap f (id (X Γ C)) changeTriple = productMap (productMap f (id X)) (id C) regroup = Associativity.forward Z X C substitute : (doubleUncurry (backward β f)) =β (backwardEvaluation β changeTriple) substitute = (backward-Ξ² β· changeTriple) β doubleUncurry-restrict backward f regroupParameters : (backwardEvaluation β changeTriple) =β (funUncurry f β regroup) regroupParameters = (comp-assoc regroup changePair funEval) β»ΒΉ β ((funEval β Reassociation.forward-natural f) β comp-assoc changeTriple (Associativity.forward Flat X C) funEval) in regroupParameters β substitute ``` For each test category, the source route uncurries twice and restricts along the product associator. The target route uncurries once. The representing formula above identifies `mapPost forward` with this chain. The four-factor calculation only identifies functors; it does not assert an unstated higher coherence for the product associators. ```agda module OnMaps (T : CAT) where module First = Test T X (Fun C D) module Second = Test (T Γ X) C D module FlatTest = Test T (X Γ C) D A = Map T Nested r = Associativity.backward T X C k = productMap (id A) r bβ = Associativity.backward A T (X Γ C) bβ = Associativity.backward (A Γ T) X C bβ = Associativity.backward A (T Γ X) C e = productMap (Associativity.backward A T X) (id C) evaluation = doubleUncurry (mapEval {T} {Nested}) normal = evaluation β (bβ β bβ) sourceComparison = mapPre r β (Second.forward β First.forward) source-isEquiv : IsEquiv sourceComparison source-isEquiv = equiv-compose (Second.forward β First.forward) (mapPre r) (equiv-compose First.forward Second.forward First.forward-isEquiv Second.forward-isEquiv) (mapPre-isEquiv r (equiv-inverse (Associativity.forward-isEquiv T X C))) source-evaluation : (mapUncurry sourceComparison) =β normal source-evaluation = (evaluation β (fourfold-regroup A T X C) β»ΒΉ) β (comp-assoc (bβ β k) e evaluation β (((funUncurry-restrict (funUncurry mapEval) (Associativity.backward A T X) β funUncurry-cong (mapCurry-Ξ² (map-isAn T Nested) First.evaluation)) β· (bβ β k)) β (comp-assoc k bβ (funUncurry (mapUncurry First.forward)) β ((Second.represents First.forward β· k) β mapPre-uncurry r (Second.forward β First.forward))))) tested-evaluation : (mapUncurry (FlatTest.forward β mapPost forward)) =β normal tested-evaluation = comp-assoc bβ bβ evaluation β ((forward-represents mapEval β· bβ) β ((funUncurry-cong (mapPost-Ξ² forward) β· bβ) β FlatTest.represents (mapPost forward))) comparison-square : (FlatTest.forward β mapPost forward) =β sourceComparison comparison-square = mapReflect (map-isAn T Nested) _ _ (source-evaluation β»ΒΉ β tested-evaluation) comparison-isEquiv : IsEquiv (mapPost {C = T} forward) comparison-isEquiv = equiv-cancel-left (mapPost forward) FlatTest.forward FlatTest.forward-isEquiv (equiv-transport (comparison-square β»ΒΉ) source-isEquiv) forward-isEquiv : IsEquiv forward forward-isEquiv = post-tests-all forward OnMaps.comparison-isEquiv ``` The backward functor described in the manuscript is indeed an inverse. Its evaluation formula gives the first comparison; the second follows by reflection through the equivalence already proved on mapping animae. These computations are not used to establish that equivalence. ```agda forward-backward : (forward β backward) =β (id Flat) forward-backward = funReflect _ _ ((funUncurry-id (X Γ C) D) β»ΒΉ β (comp-unitΚ³ funEval β ((funEval β Associativity.forward-backward Flat X C) β (comp-assoc (Associativity.backward Flat X C) (Associativity.forward Flat X C) funEval β ((backward-Ξ² β· Associativity.backward Flat X C) β forward-represents backward))))) backward-forward : (backward β forward) =β (id Nested) backward-forward = equiv-reflect forward-isEquiv _ _ ((comp-unitΚ³ forward) β»ΒΉ β (comp-unitΛ‘ forward β ((forward-backward β· forward) β (comp-assoc forward backward forward) β»ΒΉ))) ```