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.Mathlib.Data.PFunctor.Presheaf.W
public import Mathlib.CategoryTheory.Category.Preorder
public import Mathlib.Order.Fin.Basic
public import Mathlib.Data.Fintype.Basic
public import Mathlib.Tactic.NormNumPrototype: the dependent-type universe as a presheaf over the walking arrow
Throwaway exploration, not upstream-eligible content. This is a Lean port of
the IRCode/IRdecode example of the Idris-2 file
src/LanguageDef/Test/PolyIndTypesTest.idr — the universe closed under
dependent sums and dependent products — in the inductive-inductive
(arrow) formulation of that file, on top of the presheaf inductive-inductive
types of Geb.Mathlib.Data.PFunctor.Presheaf.W (the W-types of presheaf
polynomial endofunctors), with the walking arrow as the underlying category.
The construction
The walking arrow is Fin 2 as a preorder (the unique non-identity morphism
0 ⟶ 1). A presheaf on it is a pair of types with a map, so the presheaf
initial algebra of an endofunctor F : PresheafPFunctor (Fin 2) (Fin 2) is a
pair of mutually-defined types together with a fibration — the presheaf
inductive-inductive reading of an inductive-recursive definition: one fibre
plays the role of the data type and the other the role of the decoding, with
the restriction map as the decoder.
univPsh K is the endofunctor of the Idris example: the shapes are the
constructors — the starting-type codes iota k (k : K), the dependent-sum
code sigma, the dependent-product code pi, and the two term shapes
termSigma, termPi — and the directions are their recursive fields: no
fields for iota, the bound code for sigma/pi, and for the terms the
code together with a payload. Every shape and direction is a finite type
(the sigma/pi code directions are a point and the term directions are two
points).
The W-type univW K := (univPsh K).W is a presheaf over the walking arrow:
Codes := (univW K).obj ⟨0⟩ is the type of codes, Terms := (univW K).obj ⟨1⟩ the type of terms, and fib : Terms → Codes — the restriction map of
the presheaf along 0 ⟶ 1 — the decoding of a term into its code. A term
termSigma p d decodes to the sigma code at p, discarding the payload
d; dually termPi p d decodes to the pi code at p. The fibre of fib
over a code — the type of its terms — is therefore the payload type: over a
sigma or pi code it is (isomorphic to) the codes themselves, and over a
starting-type code it is empty.
Relationship to the Idris-2 formulation
The Idris-2 file defines the same universe twice: once by explicit
induction-recursion (IRCode, IRdecode — the family formulation, which the
Lean port Geb.Mathlib.Data.PFunctor.IndRec.Universes follows) and once
inductively-inductively over arrows (IRCode', IRTerm, IRfib — the arrow
formulation, a presheaf over the walking arrow, whose domain is the terms and
whose codomain the codes). This module follows the arrow formulation. Two
deviations are forced by the W-type machinery, and both are recorded here for
the review this prototype is intended for:
In the Idris-2 arrow formulation a code constructor carries its recursive
data in its shape: IRCsigma' u v is a node whose constructor argument
is the pair (u, v) with u : IRCode' and v : IRfib u → IRCode'. A
W-type of a polynomial functor has a fixed shape type, so the data of a
code cannot live in its shape; it lives in its children. Here the bound
code u is a child, and the family v — a function, and so not a
well-founded tree — is dropped, the term payload taking its place. The
dependent-sum and dependent-product formers are consequently binary:
sigma (u, v) with v : Fib u → Code is not representable; the code
former at u is.
In the Idris-2 formulation the terms' payloads are elements of the decodings, which may be arbitrary types. A W-type's children are trees, so a leaf payload cannot be carried; the payload here is itself a code.
Both deviations make the types smaller than the Idris-2 types: every code
and term is a well-founded tree built from finite shapes and directions, and
the decoding of a code — the fibre of fib — is a subtype of the terms, not
an arbitrary type. What is preserved is the shape of the example: a universe
generated by starting types, closed under dependent sums and products, whose
terms decode to their codes by the walking-arrow fibration, obtained as the
presheaf initial algebra rather than by explicit induction-recursion.
Main definitions
waHom — the unique non-identity morphism 0 ⟶ 1 of the walking arrow.
univShape / univDir / univR / univQ — the shapes (the constructor
tags), directions (the recursive fields), the direction-input map, and the
shape-output map of univPsh.
univPsh — the presheaf polynomial endofunctor over the walking arrow.
univW — its W-type, a presheaf over the walking arrow.
Codes / Terms / fib — the two fibres and the fibration.
univIota / univSigma / univPi — the code constructors.
univTermSigma / univTermPi — the term constructors.
Main statements
univShapeRestr_over — the restricted shape lies over the target index.
univDirection_empty — every shape has no directions over 1; all
recursion is over the code fibre.
univPshLaws — the seven functor laws of univPsh; the whole construction
is Classical.choice-free, depending only on propext and Quot.sound.
The decoding theorems — fib (univTermSigma p d) = univSigma p and the
fibre statement fib_eq_iff — go through the root-restriction
wRestrTree of the presheaf W-type, whose computation is too deep for this
prototype; they are deferred to the review below ("Decoding").
Tags
prototype, inductive-inductive, presheaf, walking arrow, W-type, universe, dependent sum, dependent product
@[expose] public sectionopen CategoryTheoryuniverse uKnamespace PresheafIRUniv
The unique non-identity morphism of the walking arrow (Fin 2 as a
preorder), 0 ⟶ 1.
def waHom : (0 : Fin 2) ⟶ (1 : Fin 2) :=
ULift.up (PLift.up (⊢ 0 ≤ 1 All goals completed! 🐙))The presheaf endofunctor
The shapes of univPsh: the starting-type code iota k for each
k : K, the dependent-sum code sigma, the dependent-product code pi,
and the two term shapes termSigma, termPi.
inductive univShape (K : Type uK) : Type uK where
| iota (k : K)
| sigma
| pi
| termSigma
| termPi
The directions of univPsh: none for iota; the bound code (a point)
for sigma and pi; and the code-and-payload pair (two points) for the two
term shapes.
def univDir (K : Type uK) : univShape K → Type 0
| .iota _ => PEmpty
| .sigma => PUnit
| .pi => PUnit
| .termSigma => PUnit ⊕ PUnit
| .termPi => PUnit ⊕ PUnit
The direction-input map: every direction lies over the code fibre 0,
so the recursion of the W-type runs through the codes.
The shape-output map: iota, sigma, and pi are codes (fibre 0);
termSigma and termPi are terms (fibre 1).
def univQ (K : Type uK) : univShape K → Fin 2
| .iota _ => 0
| .sigma => 0
| .pi => 0
| .termSigma => 1
| .termPi => 1
The slice polynomial functor underlying univPsh.
def univSlice (K : Type uK) : SlicePFunctor.{uK, 0, 0, 0} (Fin 2) (Fin 2) :=
{ toPFunctor := ⟨univShape K, univDir K⟩
r := univR K
q := univQ K }
Every shape has no directions over 1: all recursion is over the code
fibre, which is what makes the W-type's hereditary naturality over the single
non-identity morphism vacuous at every node.
theorem univDirection_empty (K : Type uK) (a : univShape K) :
IsEmpty (SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor a
(1 : Fin 2)) := K:Type uKa:univShape K⊢ IsEmpty ((univSlice K).Direction a 1)
exact IsEmpty.mk fun d => K:Type uKa:univShape Kd:(univSlice K).Direction a 1⊢ False
K:Type uKa:univShape Kd:(univSlice K).Direction a 1h:(univSlice K).DirectionOver a 1 ↑d⊢ False
K:Type uKa:univShape Kd:(univSlice K).Direction a 1h:0 = 1⊢ False
All goals completed! 🐙
The direction-restriction of univPsh: morphisms into 0 are
identities, so the restriction is the identity on the directions over 0;
there are no directions over 1 to restrict.
def univDirectionRestr (K : Type uK) (a : univShape K) (i i' : Fin 2)
(_f : i' ⟶ i) (d : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor a i) :
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor a i' := K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:i' ⟶ id:(univSlice K).Direction a i⊢ (univSlice K).Direction a i'
match i, i' with
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:0 ⟶ 0d:(univSlice K).Direction a 0⊢ (univSlice K).Direction a 0 All goals completed! 🐙
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:1 ⟶ 0d:(univSlice K).Direction a 0⊢ (univSlice K).Direction a 1
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:1 ⟶ 0d:(univSlice K).Direction a 0⊢ False
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:1 ⟶ 0d:(univSlice K).Direction a 0hle:1 ≤ 0⊢ False
All goals completed! 🐙
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:0 ⟶ 1d:(univSlice K).Direction a 1⊢ (univSlice K).Direction a 0 All goals completed! 🐙
K:Type uKa:univShape Ki:Fin 2i':Fin 2_f:1 ⟶ 1d:(univSlice K).Direction a 1⊢ (univSlice K).Direction a 1 All goals completed! 🐙
The shape-restriction of univPsh to a target index t: the code
shapes are fixed, and the term shapes are sent to the code shape of the same
former (termSigma to sigma, termPi to pi).
def univRestrShape (K : Type uK) (a : univShape K) (t : Fin 2) : univShape K :=
match a, t with
| .termSigma, 0 => .sigma
| .termPi, 0 => .pi
| _, _ => aThe restricted shape lies over the target index.
theorem univShapeRestr_over (K : Type uK) (a : univShape K) (t : Fin 2)
(ht : t ≤ univQ K a) : univQ K (univRestrShape K a t) = t := K:Type uKa:univShape Kt:Fin 2ht:t ≤ univQ K a⊢ univQ K (univRestrShape K a t) = t
cases a with
K:Type uKt:Fin 2k:Kht:t ≤ univQ K (univShape.iota k)⊢ univQ K (univRestrShape K (univShape.iota k) t) = t
K:Type uKt:Fin 2k:Kht:t ≤ 0⊢ univQ K (univRestrShape K (univShape.iota k) t) = t
iota K:Type uKt:Fin 2k:Kht:t ≤ 0ht0:t = 0⊢ univQ K (univRestrShape K (univShape.iota k) t) = t
subst ht0 iota K:Type uKk:Kht:0 ≤ 0⊢ univQ K (univRestrShape K (univShape.iota k) 0) = 0
rfl All goals completed! 🐙
| sigma => sigma K:Type uKt:Fin 2ht:t ≤ univQ K univShape.sigma⊢ univQ K (univRestrShape K univShape.sigma t) = t
change t ≤ (0 : Fin 2) at ht sigma K:Type uKt:Fin 2ht:t ≤ 0⊢ univQ K (univRestrShape K univShape.sigma t) = t
have ht0 : t = (0 : Fin 2) := by K:Type uKa:univShape Kt:Fin 2ht:t ≤ univQ K a⊢ univQ K (univRestrShape K a t) = t omega sigma K:Type uKt:Fin 2ht:t ≤ 0ht0:t = 0⊢ univQ K (univRestrShape K univShape.sigma t) = t
subst ht0 sigma K:Type uKht:0 ≤ 0⊢ univQ K (univRestrShape K univShape.sigma 0) = 0
rfl All goals completed! 🐙
| pi => pi K:Type uKt:Fin 2ht:t ≤ univQ K univShape.pi⊢ univQ K (univRestrShape K univShape.pi t) = t
change t ≤ (0 : Fin 2) at ht pi K:Type uKt:Fin 2ht:t ≤ 0⊢ univQ K (univRestrShape K univShape.pi t) = t
have ht0 : t = (0 : Fin 2) := by K:Type uKa:univShape Kt:Fin 2ht:t ≤ univQ K a⊢ univQ K (univRestrShape K a t) = t omega pi K:Type uKt:Fin 2ht:t ≤ 0ht0:t = 0⊢ univQ K (univRestrShape K univShape.pi t) = t
subst ht0 pi K:Type uKht:0 ≤ 0⊢ univQ K (univRestrShape K univShape.pi 0) = 0
rfl All goals completed! 🐙
| termSigma => termSigma K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigma⊢ univQ K (univRestrShape K univShape.termSigma t) = t
unfold univRestrShape univQ termSigma K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigma⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
by_cases ht0 : t = (0 : Fin 2) pos K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigmaht0:t = 0⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
tneg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigmaht0:¬t = 0⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
· pos K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigmaht0:t = 0⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t subst ht0 pos K:Type uKht:0 ≤ univQ K univShape.termSigma⊢ (match
match univShape.termSigma, 0 with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
0
rfl All goals completed! 🐙
· neg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigmaht0:¬t = 0⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t have ht1 : t = (1 : Fin 2) := by K:Type uKa:univShape Kt:Fin 2ht:t ≤ univQ K a⊢ univQ K (univRestrShape K a t) = t omega neg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termSigmaht0:¬t = 0ht1:t = 1⊢ (match
match univShape.termSigma, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
subst ht1 neg K:Type uKht:1 ≤ univQ K univShape.termSigmaht0:¬1 = 0⊢ (match
match univShape.termSigma, 1 with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termSigma with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
1
rfl All goals completed! 🐙
| termPi => termPi K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPi⊢ univQ K (univRestrShape K univShape.termPi t) = t
unfold univRestrShape univQ termPi K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPi⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
by_cases ht0 : t = (0 : Fin 2) pos K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPiht0:t = 0⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
tneg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPiht0:¬t = 0⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
· pos K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPiht0:t = 0⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t subst ht0 pos K:Type uKht:0 ≤ univQ K univShape.termPi⊢ (match
match univShape.termPi, 0 with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
0
rfl All goals completed! 🐙
· neg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPiht0:¬t = 0⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t have ht1 : t = (1 : Fin 2) := by K:Type uKa:univShape Kt:Fin 2ht:t ≤ univQ K a⊢ univQ K (univRestrShape K a t) = t omega neg K:Type uKt:Fin 2ht:t ≤ univQ K univShape.termPiht0:¬t = 0ht1:t = 1⊢ (match
match univShape.termPi, t with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
t
subst ht1 neg K:Type uKht:1 ≤ univQ K univShape.termPiht0:¬1 = 0⊢ (match
match univShape.termPi, 1 with
| univShape.termSigma, 0 => univShape.sigma
| univShape.termPi, 0 => univShape.pi
| x, x_1 => univShape.termPi with
| univShape.iota k => 0
| univShape.sigma => 0
| univShape.pi => 0
| univShape.termSigma => 1
| univShape.termPi => 1) =
1
rfl All goals completed! 🐙
The shape-restriction of univPsh.
def univShapeRestr (K : Type uK) ⦃j j' : Fin 2⦄ (g : j' ⟶ j)
(s : SlicePFunctor.Shape (univSlice K) j) : SlicePFunctor.Shape (univSlice K) j' :=
⟨univRestrShape K s.1 j', univShapeRestr_over K s.1 j' (by K:Type uKj:Fin 2j':Fin 2g:j' ⟶ js:(univSlice K).Shape j⊢ j' ≤ univQ K ↑s
have hs : univQ K s.1 = j := s.2 K:Type uKj:Fin 2j':Fin 2g:j' ⟶ js:(univSlice K).Shape jhs:univQ K ↑s = j⊢ j' ≤ univQ K ↑s
rw [hs K:Type uKj:Fin 2j':Fin 2g:j' ⟶ js:(univSlice K).Shape jhs:univQ K ↑s = j⊢ j' ≤ j] K:Type uKj:Fin 2j':Fin 2g:j' ⟶ js:(univSlice K).Shape jhs:univQ K ↑s = j⊢ j' ≤ j
exact leOfHom g All goals completed! 🐙)⟩
The raw direction map of the reindexing: on the code shapes the identity,
and on the term shapes the code component (Sum.inl) when restricting along
0 ⟶ 1, the identity otherwise.
def univReindexDir (K : Type uK) (a : univShape K) (t : Fin 2) :
univDir K (univRestrShape K a t) → univDir K a :=
match a, t with
| .iota _, _ => fun b => PEmpty.elim b
| .sigma, _ => fun b => b
| .pi, _ => fun b => b
| .termSigma, 0 => fun b => Sum.inl b
| .termSigma, 1 => fun b => b
| .termPi, 0 => fun b => Sum.inr b
| .termPi, 1 => fun b => b
The arity reindexing of univPsh along a walking-arrow morphism.
def univReindex (K : Type uK) ⦃j j' : Fin 2⦄ (g : j' ⟶ j)
(a : SlicePFunctor.Shape (univSlice K) j) ⦃i : Fin 2⦄
(d : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(univShapeRestr K g a).1 i) :
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor a.1 i := by K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univSlice K).Shape ji:Fin 2d:(univSlice K).Direction (↑(univShapeRestr K g a)) i⊢ (univSlice K).Direction (↑a) i
match i with
| 0 => K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univSlice K).Shape ji:Fin 2d:(univSlice K).Direction (↑(univShapeRestr K g a)) 0⊢ (univSlice K).Direction (↑a) 0 exact ⟨univReindexDir K a.1 j' d.1, rfl⟩ All goals completed! 🐙
| 1 => K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univSlice K).Shape ji:Fin 2d:(univSlice K).Direction (↑(univShapeRestr K g a)) 1⊢ (univSlice K).Direction (↑a) 1 exact (univDirection_empty K (univShapeRestr K g a).1).elim d All goals completed! 🐙The operations of the presheaf polynomial endofunctor of the universe.
def univPshData (K : Type uK) : PresheafPFunctorData.{0, 0, uK, 0, 0, 0}
(Fin 2) (Fin 2) :=
{ toPFunctor := ⟨univShape K, univDir K⟩
r := univR K
q := univQ K
directionRestr := univDirectionRestr K
shapeRestr := univShapeRestr K
reindex := univReindex K }
The identity law for shapeRestr, as a standalone theorem.
theorem univShapeRestr_id_thm (K : Type uK) : (univPshData K).ShapeRestrId := by K:Type uK⊢ (univPshData K).ShapeRestrId
intro j K:Type uKj:Fin 2⊢ (univPshData K).shapeRestr (𝟙 j) = id
funext s K:Type uKj:Fin 2s:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ (univPshData K).shapeRestr (𝟙 j) s = id s
refine Subtype.ext ?_ K:Type uKj:Fin 2s:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ ↑((univPshData K).shapeRestr (𝟙 j) s) = ↑(id s)
change univRestrShape K s.1 j = s.1 K:Type uKj:Fin 2s:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ univRestrShape K (↑s) j = ↑s
obtain ⟨a, ha⟩ := s K:Type uKj:Fin 2a:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Aha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j a⊢ univRestrShape K (↑⟨a, ha⟩) j = ↑⟨a, ha⟩
cases a with
| iota k => iota K:Type uKj:Fin 2k:Kha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j (univShape.iota k)⊢ univRestrShape K (↑⟨univShape.iota k, ha⟩) j = ↑⟨univShape.iota k, ha⟩ rfl All goals completed! 🐙
| sigma => sigma K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.sigma⊢ univRestrShape K (↑⟨univShape.sigma, ha⟩) j = ↑⟨univShape.sigma, ha⟩ rfl All goals completed! 🐙
| pi => pi K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.pi⊢ univRestrShape K (↑⟨univShape.pi, ha⟩) j = ↑⟨univShape.pi, ha⟩ rfl All goals completed! 🐙
| termSigma => termSigma K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigma⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j = ↑⟨univShape.termSigma, ha⟩
have hq : (univPshData K).q .termSigma = j := by K:Type uK⊢ (univPshData K).ShapeRestrId exact ha termSigma K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = j⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j = ↑⟨univShape.termSigma, ha⟩
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrId
change j = (univPshData K).q .termSigma K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = j⊢ j = (univPshData K).q univShape.termSigma
exact hq.symm termSigma K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = jhj:j = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j = ↑⟨univShape.termSigma, ha⟩
subst hj termSigma K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1 = ↑⟨univShape.termSigma, ha⟩
rfl All goals completed! 🐙
| termPi => termPi K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPi⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j = ↑⟨univShape.termPi, ha⟩
have hq : (univPshData K).q .termPi = j := by K:Type uK⊢ (univPshData K).ShapeRestrId exact ha termPi K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = j⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j = ↑⟨univShape.termPi, ha⟩
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrId
change j = (univPshData K).q .termPi K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = j⊢ j = (univPshData K).q univShape.termPi
exact hq.symm termPi K:Type uKj:Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = jhj:j = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j = ↑⟨univShape.termPi, ha⟩
subst hj termPi K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) 1 = ↑⟨univShape.termPi, ha⟩
rfl All goals completed! 🐙
The composition law for shapeRestr, as a standalone theorem.
theorem univShapeRestr_comp_thm (K : Type uK) : (univPshData K).ShapeRestrComp := by K:Type uK⊢ (univPshData K).ShapeRestrComp
intro j j' j'' g h K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'⊢ (univPshData K).shapeRestr (h ≫ g) = (univPshData K).shapeRestr h ∘ (univPshData K).shapeRestr g
funext s K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j's:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ (univPshData K).shapeRestr (h ≫ g) s = ((univPshData K).shapeRestr h ∘ (univPshData K).shapeRestr g) s
refine Subtype.ext ?_ K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j's:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ ↑((univPshData K).shapeRestr (h ≫ g) s) = ↑(((univPshData K).shapeRestr h ∘ (univPshData K).shapeRestr g) s)
change univRestrShape K s.1 j'' = univRestrShape K (univRestrShape K s.1 j') j'' K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j's:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Shape j⊢ univRestrShape K (↑s) j'' = univRestrShape K (univRestrShape K (↑s) j') j''
obtain ⟨a, ha⟩ := s K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.Aha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j a⊢ univRestrShape K (↑⟨a, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨a, ha⟩) j') j''
cases a with
| iota k => iota K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'k:Kha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j (univShape.iota k)⊢ univRestrShape K (↑⟨univShape.iota k, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.iota k, ha⟩) j') j'' rfl All goals completed! 🐙
| sigma => sigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.sigma⊢ univRestrShape K (↑⟨univShape.sigma, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.sigma, ha⟩) j') j'' rfl All goals completed! 🐙
| pi => pi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.pi⊢ univRestrShape K (↑⟨univShape.pi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.pi, ha⟩) j') j'' rfl All goals completed! 🐙
| termSigma => termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigma⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
have hq : (univPshData K).q .termSigma = j := by K:Type uK⊢ (univPshData K).ShapeRestrComp exact ha termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = j⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp
change j = (univPshData K).q .termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = j⊢ j = (univPshData K).q univShape.termSigma
exact hq.symm termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termSigmahq:(univPshData K).q univShape.termSigma = jhj:j = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
subst hj termSigma K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
by_cases hj' : j' = (0 : Fin 2) pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1hj':j' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1hj':¬j' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
· pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1hj':j' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j'' subst hj' pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j''
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j''neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j''
· pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j'' subst hj'' pos K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:0 ⟶ 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0 = univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) 0
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j'' have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0hj''1:j'' = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) j''
subst hj''1 neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1 = univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0) 1
exfalso neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom h neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1hj':¬j' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j'' have hj'1 : j' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1hj':¬j' = 0hj'1:j' = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) j') j''
subst hj'1 neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j''
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j''neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j''
· pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j'' subst hj'' pos K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) 0 = univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) 0
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j'' have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0hj''1:j'' = 1⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) j'' =
univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) j''
subst hj''1 neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1hj'':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1 = univRestrShape K (univRestrShape K (↑⟨univShape.termSigma, ha⟩) 1) 1
rfl All goals completed! 🐙
| termPi => termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPi⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
have hq : (univPshData K).q .termPi = j := by K:Type uK⊢ (univPshData K).ShapeRestrComp exact ha termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = j⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp
change j = (univPshData K).q .termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = j⊢ j = (univPshData K).q univShape.termPi
exact hq.symm termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver j univShape.termPihq:(univPshData K).q univShape.termPi = jhj:j = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
subst hj termPi K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
by_cases hj' : j' = (0 : Fin 2) pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1hj':j' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1hj':¬j' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
· pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1hj':j' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j'' subst hj' pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j''
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j''neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j''
· pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j'' subst hj'' pos K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:0 ⟶ 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) 0 = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) 0
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j'' have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1hj'':¬j'' = 0hj''1:j'' = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) j''
subst hj''1 neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) 1 = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 0) 1
exfalso neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom h neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0hj'':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1hj':¬j' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j'' have hj'1 : j' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1hj':¬j' = 0hj'1:j' = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) j') j''
subst hj'1 neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j''
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j''neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j''
· pos K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j'' subst hj'' pos K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) 0 = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) 0
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j'' have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ShapeRestrComp omega neg K:Type uKj'':Fin 2ha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1hj':¬1 = 0hj'':¬j'' = 0hj''1:j'' = 1⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) j'' = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) j''
subst hj''1 neg K:Type uKha:{ toSliceDomPFunctor := (univPshData K).toSliceDomPFunctor, q := (univPshData K).q }.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1hj'':¬1 = 0⊢ univRestrShape K (↑⟨univShape.termPi, ha⟩) 1 = univRestrShape K (univRestrShape K (↑⟨univShape.termPi, ha⟩) 1) 1
rfl All goals completed! 🐙Casting along an equality of a type with itself is the identity.
theorem cast_self.{u} {α : Sort u} (e : α = α) (a : α) : cast e a = a := by α:Sort ue:α = αa:α⊢ cast e a = a
cases e refl α:Sort ua:α⊢ cast ⋯ a = a
rfl All goals completed! 🐙
The seven functor laws of univPsh. The direction-side laws hold by the
empty and identity cases of univDirectionRestr; the shape-side laws by the
definition of univRestrShape; and the reindex laws by the definition of
univReindexDir and the empty direction types.
theorem univPshLaws (K : Type uK) : (univPshData K).IsFunctorial := {
directionRestr_id := by K:Type uK⊢ (univPshData K).DirectionRestrId
intro a i K:Type uKa:(univPshData K).Ai:Fin 2⊢ (univPshData K).directionRestr a (𝟙 i) = id
funext d K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a i⊢ (univPshData K).directionRestr a (𝟙 i) d = id d
by_cases hi : i = (0 : Fin 2) pos K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a ihi:i = 0⊢ (univPshData K).directionRestr a (𝟙 i) d = id dneg K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a ihi:¬i = 0⊢ (univPshData K).directionRestr a (𝟙 i) d = id d
· pos K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a ihi:i = 0⊢ (univPshData K).directionRestr a (𝟙 i) d = id d subst hi pos K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 0⊢ (univPshData K).directionRestr a (𝟙 0) d = id d
rfl All goals completed! 🐙
· neg K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a ihi:¬i = 0⊢ (univPshData K).directionRestr a (𝟙 i) d = id d have hi1 : i = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).DirectionRestrId omega neg K:Type uKa:(univPshData K).Ai:Fin 2d:(univPshData K).Direction a ihi:¬i = 0hi1:i = 1⊢ (univPshData K).directionRestr a (𝟙 i) d = id d
subst hi1 neg K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 1hi:¬1 = 0⊢ (univPshData K).directionRestr a (𝟙 1) d = id d
exact (univDirection_empty K a).elim d All goals completed! 🐙
directionRestr_comp := by K:Type uK⊢ (univPshData K).DirectionRestrComp
intro a i i' i'' f g K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'⊢ (univPshData K).directionRestr a (g ≫ f) = (univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f
funext d K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a i⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
by_cases hi : i = (0 : Fin 2) pos K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a ihi:i = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) dneg K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a ihi:¬i = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
· pos K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a ihi:i = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d subst hi pos K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
by_cases hi' : i' = (0 : Fin 2) pos K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0hi':i' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) dneg K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0hi':¬i' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
· pos K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0hi':i' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d subst hi' pos K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
by_cases hi'' : i'' = (0 : Fin 2) pos K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0hi'':i'' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) dneg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0hi'':¬i'' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
· pos K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0hi'':i'' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d subst hi'' pos K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 0f:0 ⟶ 0g:0 ⟶ 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
rfl All goals completed! 🐙
· neg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0hi'':¬i'' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d have hi''1 : i'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).DirectionRestrComp omega neg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 0f:0 ⟶ 0hi'':¬i'' = 0hi''1:i'' = 1⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
subst hi''1 neg K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 0f:0 ⟶ 0g:1 ⟶ 0hi'':¬1 = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
exfalso neg K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 0f:0 ⟶ 0g:1 ⟶ 0hi'':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom g neg K:Type uKa:(univPshData K).Ad:(univPshData K).Direction a 0f:0 ⟶ 0g:1 ⟶ 0hi'':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0hi':¬i' = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d have hi'1 : i' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).DirectionRestrComp omega neg K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 0d:(univPshData K).Direction a 0hi':¬i' = 0hi'1:i' = 1⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
subst hi'1 neg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 1f:1 ⟶ 0hi':¬1 = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
exfalso neg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 1f:1 ⟶ 0hi':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom f neg K:Type uKa:(univPshData K).Ai'':Fin 2d:(univPshData K).Direction a 0g:i'' ⟶ 1f:1 ⟶ 0hi':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a ihi:¬i = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d have hi1 : i = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).DirectionRestrComp omega neg K:Type uKa:(univPshData K).Ai:Fin 2i':Fin 2i'':Fin 2f:i' ⟶ ig:i'' ⟶ i'd:(univPshData K).Direction a ihi:¬i = 0hi1:i = 1⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
subst hi1 neg K:Type uKa:(univPshData K).Ai':Fin 2i'':Fin 2g:i'' ⟶ i'f:i' ⟶ 1d:(univPshData K).Direction a 1hi:¬1 = 0⊢ (univPshData K).directionRestr a (g ≫ f) d = ((univPshData K).directionRestr a g ∘ (univPshData K).directionRestr a f) d
exact (univDirection_empty K a).elim d All goals completed! 🐙
shapeRestr_id := univShapeRestr_id_thm K
shapeRestr_comp := univShapeRestr_comp_thm K
reindex_naturality := by K:Type uK⊢ (univPshData K).ReindexNaturality
intro j j' g a i i' f K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ i⊢ (univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a =
(univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f
funext d K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) i⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
by_cases hi : i = (0 : Fin 2) pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) ihi:i = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) dneg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) ihi:¬i = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
· pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) ihi:i = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d subst hi pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
by_cases hi' : i' = (0 : Fin 2) pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0hi':i' = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) dneg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0hi':¬i' = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
· pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0hi':i' = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d subst hi' pos K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape jd:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0f:0 ⟶ 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
rfl All goals completed! 🐙
· neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0hi':¬i' = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d have hi'1 : i' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexNaturality omega neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 0d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0hi':¬i' = 0hi'1:i' = 1⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
subst hi'1 neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape jd:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0f:1 ⟶ 0hi':¬1 = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
exfalso neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape jd:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0f:1 ⟶ 0hi':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom f neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape jd:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 0f:1 ⟶ 0hi':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) ihi:¬i = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d have hi1 : i = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexNaturality omega neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji:Fin 2i':Fin 2f:i' ⟶ id:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) ihi:¬i = 0hi1:i = 1⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
subst hi1 neg K:Type uKj:Fin 2j':Fin 2g:j' ⟶ ja:(univPshData K).toSlicePFunctor.Shape ji':Fin 2f:i' ⟶ 1d:(univPshData K).Direction (↑((univPshData K).shapeRestr g a)) 1hi:¬1 = 0⊢ ((univPshData K).directionRestr (↑a) f ∘ (univPshData K).reindex g a) d =
((univPshData K).reindex g a ∘ (univPshData K).directionRestr (↑((univPshData K).shapeRestr g a)) f) d
exact (univDirection_empty K (univShapeRestr K g a).1).elim d All goals completed! 🐙
reindex_id := by K:Type uK⊢ (univPshData K).ReindexId ⋯
intro j a i b K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) i⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b
by_cases hi : i = (0 : Fin 2) pos K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) ihi:i = 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ bneg K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) ihi:¬i = 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b
· pos K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) ihi:i = 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b subst hi pos K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape jb:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b
obtain ⟨ashape, ha⟩ := a pos K:Type uKj:Fin 2ashape:(univPshData K).toSlicePFunctor.Aha:(univPshData K).toSlicePFunctor.ShapeOver j ashapeb:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨ashape, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨ashape, ha⟩ b = cast ⋯ b
cases ashape with
| iota k => pos.iota K:Type uKj:Fin 2k:Kha:(univPshData K).toSlicePFunctor.ShapeOver j (univShape.iota k)b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.iota k, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.iota k, ha⟩ b = cast ⋯ b cases b.1 All goals completed! 🐙
| sigma => pos.sigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.sigma, ha⟩ b = cast ⋯ b
have hsub : ∀ x y : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.sigma, ha⟩ : SlicePFunctor.Shape (univSlice K) j).1 (0 : Fin 2), x = y := by K:Type uK⊢ (univPshData K).ReindexId ⋯
intro x y K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ x = y
apply Subtype.ext K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ ↑x = ↑y
cases x.1 unit K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ PUnit.unit = ↑y; cases y.1 unit.unit K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ PUnit.unit = PUnit.unit; rfl pos.sigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.sigma, ha⟩)) 0hsub:∀ (x y : (univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0), x = y⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.sigma, ha⟩ b = cast ⋯ b
exact hsub _ _ All goals completed! 🐙
| pi => pos.pi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.pi, ha⟩ b = cast ⋯ b
have hsub : ∀ x y : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.pi, ha⟩ : SlicePFunctor.Shape (univSlice K) j).1 (0 : Fin 2), x = y := by K:Type uK⊢ (univPshData K).ReindexId ⋯
intro x y K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ x = y
apply Subtype.ext K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ ↑x = ↑y
cases x.1 unit K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ PUnit.unit = ↑y; cases y.1 unit.unit K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ PUnit.unit = PUnit.unit; rfl pos.pi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.pi, ha⟩)) 0hsub:∀ (x y : (univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0), x = y⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.pi, ha⟩ b = cast ⋯ b
exact hsub _ _ All goals completed! 🐙
| termSigma => pos.termSigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termSigma, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
have hq : (univPshData K).q .termSigma = j := by K:Type uK⊢ (univPshData K).ReindexId ⋯ exact ha pos.termSigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = j⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexId ⋯
change j = (univPshData K).q .termSigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = j⊢ j = (univPshData K).q univShape.termSigma
exact hq.symm pos.termSigma K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = jhj:j = 1⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
subst hj pos.termSigma K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
have e : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(univShapeRestr K (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩).1 0 =
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.termSigma, ha⟩ : SlicePFunctor.Shape (univSlice K) (1 : Fin 2)).1 0 :=
congrArg (fun s : SlicePFunctor.Shape (univSlice K) (1 : Fin 2) ↦
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor s.1 0)
(congrFun (univShapeRestr_id_thm K (1 : Fin 2)) ⟨.termSigma, ha⟩) pos.termSigma K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1e:(univSlice K).Direction (↑(univShapeRestr K (𝟙 1) ⟨univShape.termSigma, ha⟩)) 0 =
(univSlice K).Direction (↑⟨univShape.termSigma, ha⟩) 0⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
cases e pos.termSigma.refl K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b = cast ⋯ b
apply Subtype.ext pos.termSigma.refl K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1⊢ ↑((univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b) = ↑(cast ⋯ b)
rfl All goals completed! 🐙
| termPi => pos.termPi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termPi, ha⟩)) 0⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
have hq : (univPshData K).q .termPi = j := by K:Type uK⊢ (univPshData K).ReindexId ⋯ exact ha pos.termPi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = j⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexId ⋯
change j = (univPshData K).q .termPi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = j⊢ j = (univPshData K).q univShape.termPi
exact hq.symm pos.termPi K:Type uKj:Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = jhj:j = 1⊢ (univPshData K).reindex (𝟙 j) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
subst hj pos.termPi K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
have e : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(univShapeRestr K (𝟙 (1 : Fin 2)) ⟨.termPi, ha⟩).1 0 =
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.termPi, ha⟩ : SlicePFunctor.Shape (univSlice K) (1 : Fin 2)).1 0 :=
congrArg (fun s : SlicePFunctor.Shape (univSlice K) (1 : Fin 2) ↦
SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor s.1 0)
(congrFun (univShapeRestr_id_thm K (1 : Fin 2)) ⟨.termPi, ha⟩) pos.termPi K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1e:(univSlice K).Direction (↑(univShapeRestr K (𝟙 1) ⟨univShape.termPi, ha⟩)) 0 =
(univSlice K).Direction (↑⟨univShape.termPi, ha⟩) 0⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
cases e pos.termPi.refl K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩ b = cast ⋯ b
apply Subtype.ext pos.termPi.refl K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1⊢ ↑((univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩ b) = ↑(cast ⋯ b)
rfl All goals completed! 🐙
· neg K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) ihi:¬i = 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b have hi1 : i = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexId ⋯
omega neg K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) ihi:¬i = 0hi1:i = 1⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b
subst hi1 neg K:Type uKj:Fin 2a:(univPshData K).toSlicePFunctor.Shape jb:(univPshData K).Direction (↑((univPshData K).shapeRestr (𝟙 j) a)) 1hi:¬1 = 0⊢ (univPshData K).reindex (𝟙 j) a b = cast ⋯ b
exact (univDirection_empty K (univShapeRestr K (𝟙 j) a).1).elim b All goals completed! 🐙
reindex_comp := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
intro j j' j'' g h a i b K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) i⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))
by_cases hi : i = (0 : Fin 2) pos K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) ihi:i = 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))neg K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) ihi:¬i = 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))
· pos K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) ihi:i = 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b)) subst hi pos K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape jb:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))
obtain ⟨ashape, ha⟩ := a pos K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ashape:(univPshData K).toSlicePFunctor.Aha:(univPshData K).toSlicePFunctor.ShapeOver j ashapeb:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨ashape, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨ashape, ha⟩ b =
(univPshData K).reindex g ⟨ashape, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨ashape, ha⟩) (cast ⋯ b))
cases ashape with
| iota k => pos.iota K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'k:Kha:(univPshData K).toSlicePFunctor.ShapeOver j (univShape.iota k)b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.iota k, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.iota k, ha⟩ b =
(univPshData K).reindex g ⟨univShape.iota k, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.iota k, ha⟩) (cast ⋯ b)) cases b.1 All goals completed! 🐙
| sigma => pos.sigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.sigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.sigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.sigma, ha⟩) (cast ⋯ b))
have hsub : ∀ x y : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.sigma, ha⟩ : SlicePFunctor.Shape (univSlice K) j).1 (0 : Fin 2), x = y := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
intro x y K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ x = y
apply Subtype.ext K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ ↑x = ↑y
cases x.1 unit K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ PUnit.unit = ↑y; cases y.1 unit.unit K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0⊢ PUnit.unit = PUnit.unit; rfl pos.sigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.sigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.sigma, ha⟩)) 0hsub:∀ (x y : (univSlice K).Direction (↑⟨univShape.sigma, ha⟩) 0), x = y⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.sigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.sigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.sigma, ha⟩) (cast ⋯ b))
exact hsub _ _ All goals completed! 🐙
| pi => pos.pi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.pi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.pi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.pi, ha⟩) (cast ⋯ b))
have hsub : ∀ x y : SliceDomPFunctor.Direction (univSlice K).toSliceDomPFunctor
(⟨.pi, ha⟩ : SlicePFunctor.Shape (univSlice K) j).1 (0 : Fin 2), x = y := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
intro x y K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ x = y
apply Subtype.ext K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ ↑x = ↑y
cases x.1 unit K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ PUnit.unit = ↑y; cases y.1 unit.unit K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0x:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0y:(univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0⊢ PUnit.unit = PUnit.unit; rfl pos.pi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.pib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.pi, ha⟩)) 0hsub:∀ (x y : (univSlice K).Direction (↑⟨univShape.pi, ha⟩) 0), x = y⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.pi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.pi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.pi, ha⟩) (cast ⋯ b))
exact hsub _ _ All goals completed! 🐙
| termSigma => pos.termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
have hq : (univPshData K).q .termSigma = j := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ exact ha pos.termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = j⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
change j = (univPshData K).q .termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = j⊢ j = (univPshData K).q univShape.termSigma
exact hq.symm pos.termSigma K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = jhj:j = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
subst hj pos.termSigma K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
have ec : (univPshData K).Direction
((univPshData K).shapeRestr (h ≫ g) ⟨.termSigma, ha⟩).1 0 =
(univPshData K).Direction
((univPshData K).shapeRestr h
((univPshData K).shapeRestr g ⟨.termSigma, ha⟩)).1 0 :=
congrArg (fun s : (univPshData K).toSlicePFunctor.Shape j'' ↦
(univPshData K).Direction s.1 0)
(congrFun (univShapeRestr_comp_thm K g h) ⟨.termSigma, ha⟩) pos.termSigma K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
by_cases hj' : j' = (0 : Fin 2) pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
· pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) subst hj' pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
· pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) subst hj'' pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (h ≫ g) ⟨.termSigma, ha⟩ (i := 0) b =
(univPshData K).reindex g ⟨.termSigma, ha⟩ (i := 0)
((univPshData K).reindex h
((univPshData K).shapeRestr g ⟨.termSigma, ha⟩) (i := 0) (cast ec b)) pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ec b))
apply Subtype.ext pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ ↑((univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b) =
↑((univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ec b)))
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬j'' = 0hj''1:j'' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
subst hj''1 neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
exfalso neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom h neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) have hj'1 : j' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmab:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0hq:(univPshData K).q univShape.termSigma = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬j' = 0hj'1:j' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
subst hj'1 neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
· pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) subst hj'' pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (h ≫ g) ⟨.termSigma, ha⟩ (i := 0) b =
(univPshData K).reindex g ⟨.termSigma, ha⟩ (i := 0)
((univPshData K).reindex h
((univPshData K).shapeRestr g ⟨.termSigma, ha⟩) (i := 0) (cast ec b)) pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ec b))
apply Subtype.ext pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0⊢ ↑((univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b) =
↑((univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ec b)))
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0hj''1:j'' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
subst hj''1 neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
have hg : g = 𝟙 (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
exact Subsingleton.elim _ _ neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
have hh : h = 𝟙 (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
exact Subsingleton.elim _ _ neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
rw [hh, neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ g) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩) (cast ⋯ b)) hg neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ 𝟙 1) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b))] neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ 𝟙 1) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩ (i := 0) b =
(univPshData K).reindex (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩ (i := 0)
((univPshData K).reindex (𝟙 (1 : Fin 2))
((univPshData K).shapeRestr (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩)
(i := 0) (cast _ b)) neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
apply Subtype.ext neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termSigmahq:(univPshData K).q univShape.termSigma = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termSigma, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termSigma, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ ↑((univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b) =
↑((univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b)))
rfl All goals completed! 🐙
| termPi => pos.termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
have hq : (univPshData K).q .termPi = j := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ exact ha pos.termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = j⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
have hj : j = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
change j = (univPshData K).q .termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = j⊢ j = (univPshData K).q univShape.termPi
exact hq.symm pos.termPi K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'ha:(univPshData K).toSlicePFunctor.ShapeOver j univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = jhj:j = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
subst hj pos.termPi K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
have ec : (univPshData K).Direction
((univPshData K).shapeRestr (h ≫ g) ⟨.termPi, ha⟩).1 0 =
(univPshData K).Direction
((univPshData K).shapeRestr h
((univPshData K).shapeRestr g ⟨.termPi, ha⟩)).1 0 :=
congrArg (fun s : (univPshData K).toSlicePFunctor.Shape j'' ↦
(univPshData K).Direction s.1 0)
(congrFun (univShapeRestr_comp_thm K g h) ⟨.termPi, ha⟩) pos.termPi K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
by_cases hj' : j' = (0 : Fin 2) pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
· pos K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) subst hj' pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
· pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) subst hj'' pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (h ≫ g) ⟨.termPi, ha⟩ (i := 0) b =
(univPshData K).reindex g ⟨.termPi, ha⟩ (i := 0)
((univPshData K).reindex h
((univPshData K).shapeRestr g ⟨.termPi, ha⟩) (i := 0) (cast ec b)) pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ec b))
apply Subtype.ext pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:0 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ ↑((univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b) =
↑((univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ec b)))
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 0g:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬j'' = 0hj''1:j'' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
subst hj''1 neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
exfalso neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0⊢ False
have hle : (1 : Fin 2) ≤ (0 : Fin 2) := leOfHom h neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:0 ⟶ 1h:1 ⟶ 0b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hle:1 ≤ 0⊢ False
omega All goals completed! 🐙
· neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬j' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) have hj'1 : j' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj':Fin 2j'':Fin 2h:j'' ⟶ j'g:j' ⟶ 1ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPib:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0hq:(univPshData K).q univShape.termPi = 1ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬j' = 0hj'1:j' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
subst hj'1 neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
by_cases hj'' : j'' = (0 : Fin 2) pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
· pos K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0hj'':j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) subst hj'' pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (h ≫ g) ⟨.termPi, ha⟩ (i := 0) b =
(univPshData K).reindex g ⟨.termPi, ha⟩ (i := 0)
((univPshData K).reindex h
((univPshData K).shapeRestr g ⟨.termPi, ha⟩) (i := 0) (cast ec b)) pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ec b))
apply Subtype.ext pos K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:0 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0⊢ ↑((univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b) =
↑((univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ec b)))
rfl All goals completed! 🐙
· neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) have hj''1 : j'' = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯ omega neg K:Type uKj'':Fin 2ha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1h:j'' ⟶ 1g:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj':¬1 = 0hj'':¬j'' = 0hj''1:j'' = 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
subst hj''1 neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
have hg : g = 𝟙 (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
exact Subsingleton.elim _ _ neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
have hh : h = 𝟙 (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
exact Subsingleton.elim _ _ neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (h ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b))
rw [hh, neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ g) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex g ⟨univShape.termPi, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩) (cast ⋯ b)) hg neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ 𝟙 1) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩) (cast ⋯ b))] neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1 ≫ 𝟙 1) ⟨univShape.termPi, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termPi, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termPi, ha⟩) (cast ⋯ b))
change (univPshData K).reindex (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩ (i := 0) b =
(univPshData K).reindex (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩ (i := 0)
((univPshData K).reindex (𝟙 (1 : Fin 2))
((univPshData K).shapeRestr (𝟙 (1 : Fin 2)) ⟨.termSigma, ha⟩)
(i := 0) (cast _ b)) neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ (univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b =
(univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b))
apply Subtype.ext neg K:Type uKha:(univPshData K).toSlicePFunctor.ShapeOver 1 univShape.termPihq:(univPshData K).q univShape.termPi = 1g:1 ⟶ 1hj':¬1 = 0h:1 ⟶ 1b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0ec:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) ⟨univShape.termPi, ha⟩)) 0 =
(univPshData K).Direction (↑((univPshData K).shapeRestr h ((univPshData K).shapeRestr g ⟨univShape.termPi, ha⟩))) 0hj'':¬1 = 0hg:g = 𝟙 1hh:h = 𝟙 1⊢ ↑((univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩ b) =
↑((univPshData K).reindex (𝟙 1) ⟨univShape.termSigma, ha⟩
((univPshData K).reindex (𝟙 1) ((univPshData K).shapeRestr (𝟙 1) ⟨univShape.termSigma, ha⟩) (cast ⋯ b)))
rfl All goals completed! 🐙
· neg K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) ihi:¬i = 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b)) have hi1 : i = (1 : Fin 2) := by K:Type uK⊢ (univPshData K).ReindexComp ⋯
omega neg K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape ji:Fin 2b:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) ihi:¬i = 0hi1:i = 1⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))
subst hi1 neg K:Type uKj:Fin 2j':Fin 2j'':Fin 2g:j' ⟶ jh:j'' ⟶ j'a:(univPshData K).toSlicePFunctor.Shape jb:(univPshData K).Direction (↑((univPshData K).shapeRestr (h ≫ g) a)) 1hi:¬1 = 0⊢ (univPshData K).reindex (h ≫ g) a b =
(univPshData K).reindex g a ((univPshData K).reindex h ((univPshData K).shapeRestr g a) (cast ⋯ b))
exact (univDirection_empty K (univShapeRestr K (h ≫ g) a).1).elim b All goals completed! 🐙
}
The presheaf polynomial endofunctor of the universe over the walking
arrow: its W-type is the presheaf inductive-inductive universe, the codes at
fibre 0 and the terms at fibre 1.
def univPsh (K : Type uK) : PresheafPFunctor.{0, 0, uK, 0, 0, 0}
(Fin 2) (Fin 2) :=
{ toPresheafPFunctorData := univPshData K
isFunctorial := univPshLaws K }The presheaf initial algebra
The W-type of univPsh: the presheaf inductive-inductive universe over
the walking arrow.
The codes: the fibre of univW over 0.
abbrev Codes (K : Type uK) : Type uK :=
(univW K).obj ⟨(0 : Fin 2)⟩
The terms: the fibre of univW over 1.
abbrev Terms (K : Type uK) : Type uK :=
(univW K).obj ⟨(1 : Fin 2)⟩
The decoding of a term into its code: the restriction map of the presheaf
univW along 0 ⟶ 1.
The constructors
The node data of the iota code at the starting type k: the shape
.iota k, whose direction type is empty, so the direction-assignment and both
its compatibility and naturality are vacuous.
def iotaNode (K : Type uK) (k : K) :
((univPsh K).objPresheaf (univW K)).obj ⟨(0 : Fin 2)⟩ :=
⟨⟨⟨⟨(.iota k : univShape K), fun b ↦ PEmpty.elim b⟩,
(univPsh K).toSliceDomPFunctor.compatible_iff _ (.iota k) _ |>.mpr
(by K:Type uKk:K⊢ ∀ (b : (univPsh K).B (univShape.iota k)),
PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩.snd b) =
(univPsh K).r ⟨univShape.iota k, b⟩ intro b K:Type uKk:Kb:(univPsh K).B (univShape.iota k)⊢ PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩.snd b) =
(univPsh K).r ⟨univShape.iota k, b⟩; cases b All goals completed! 🐙)⟩,
by K:Type uKk:K⊢ (univPsh K).IsNatural ⟨⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩, ⋯⟩
intro i i' f b K:Type uKk:Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩, ⋯⟩).fst i⊢ (univPsh K).value ⟨⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.iota k, fun b ↦ PEmpty.elim b⟩, ⋯⟩ b)
cases b.1 All goals completed! 🐙⟩,
rfl⟩
The iota code at the starting type k.
def univIota (K : Type uK) (k : K) : Codes K :=
PresheafPFunctor.W.mk (iotaNode K k)
The node data of the sigma code with bound code u: the shape .sigma,
whose single direction is assigned the bound code, the direction-input map
being constantly 0.
def sigmaNode (K : Type uK) (u : Codes K) :
((univPsh K).objPresheaf (univW K)).obj ⟨(0 : Fin 2)⟩ :=
⟨⟨⟨⟨(.sigma : univShape K), fun _ ↦ ⟨(0 : Fin 2), u⟩⟩,
(univPsh K).toSliceDomPFunctor.compatible_iff _ .sigma _ |>.mpr
(by K:Type uKu:Codes K⊢ ∀ (b : (univPsh K).B univShape.sigma),
PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩.snd b) =
(univPsh K).r ⟨univShape.sigma, b⟩ intro b K:Type uKu:Codes Kb:(univPsh K).B univShape.sigma⊢ PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩.snd b) =
(univPsh K).r ⟨univShape.sigma, b⟩; rfl All goals completed! 🐙)⟩,
by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
intro i i' f b K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst i⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hb : (0 : Fin 2) = i := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
have hb' : univR K ⟨.sigma, b.1⟩ = i := b.2 K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb':univR K ⟨univShape.sigma, ↑b⟩ = i⊢ 0 = i
change (0 : Fin 2) = i at hb' K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb':0 = i⊢ 0 = i
exact hb' K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb:0 = i⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hb K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hi' : i' = (0 : Fin 2) := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
have hle : i' ≤ (0 : Fin 2) := leOfHom f K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0hle:i' ≤ 0⊢ i' = 0
omega K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0hi':i' = 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hi' K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0f:0 ⟶ 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hf : f = 𝟙 (0 : Fin 2) := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
apply Subsingleton.elim K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0f:0 ⟶ 0hf:f = 𝟙 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hf K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 0).op)) ((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rw [show (𝟙 (0 : Fin 2)).op = 𝟙 (Opposite.op (0 : Fin 2)) from rfl K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)] K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rw [(univW K).map_id K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)] K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value ⟨⟨univShape.sigma, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rfl All goals completed! 🐙⟩,
rfl⟩
The sigma code with bound code u.
def univSigma (K : Type uK) (u : Codes K) : Codes K :=
PresheafPFunctor.W.mk (sigmaNode K u)
The node data of the pi code with bound code u.
def piNode (K : Type uK) (u : Codes K) :
((univPsh K).objPresheaf (univW K)).obj ⟨(0 : Fin 2)⟩ :=
⟨⟨⟨⟨(.pi : univShape K), fun _ ↦ ⟨(0 : Fin 2), u⟩⟩,
(univPsh K).toSliceDomPFunctor.compatible_iff _ .pi _ |>.mpr
(by K:Type uKu:Codes K⊢ ∀ (b : (univPsh K).B univShape.pi),
PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩.snd b) = (univPsh K).r ⟨univShape.pi, b⟩ intro b K:Type uKu:Codes Kb:(univPsh K).B univShape.pi⊢ PresheafDomPFunctorData.elemProj (univW K) (⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩.snd b) = (univPsh K).r ⟨univShape.pi, b⟩; rfl All goals completed! 🐙)⟩,
by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
intro i i' f b K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst i⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hb : (0 : Fin 2) = i := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
have hb' : univR K ⟨.pi, b.1⟩ = i := b.2 K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb':univR K ⟨univShape.pi, ↑b⟩ = i⊢ 0 = i
change (0 : Fin 2) = i at hb' K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb':0 = i⊢ 0 = i
exact hb' K:Type uKu:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst ihb:0 = i⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hb K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hi' : i' = (0 : Fin 2) := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
have hle : i' ≤ (0 : Fin 2) := leOfHom f K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0hle:i' ≤ 0⊢ i' = 0
omega K:Type uKu:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0hi':i' = 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hi' K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0f:0 ⟶ 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
have hf : f = 𝟙 (0 : Fin 2) := by K:Type uKu:Codes K⊢ (univPsh K).IsNatural ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
apply Subsingleton.elim K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0f:0 ⟶ 0hf:f = 𝟙 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst f b) =
(ConcreteCategory.hom ((univW K).map f.op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
subst hf K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 0).op)) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rw [show (𝟙 (0 : Fin 2)).op = 𝟙 (Opposite.op (0 : Fin 2)) from rfl K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0)))) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)] K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0)))) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rw [(univW K).map_id K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0)))) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)] K:Type uKu:Codes Kb:(univPsh K).Direction (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst 0⊢ (univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩
((univPsh K).directionRestr (↑⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩).fst (𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0)))) ((univPsh K).value ⟨⟨univShape.pi, fun x ↦ ⟨0, u⟩⟩, ⋯⟩ b)
rfl All goals completed! 🐙⟩,
rfl⟩
The pi code with bound code u.
def univPi (K : Type uK) (u : Codes K) : Codes K :=
PresheafPFunctor.W.mk (piNode K u)
The node data of the sigma term at the code p with payload d: the
shape .termSigma, whose two directions are assigned the code and the
payload.
def termSigmaNode (K : Type uK) (p d : Codes K) :
((univPsh K).objPresheaf (univW K)).obj ⟨(1 : Fin 2)⟩ :=
⟨⟨⟨⟨(.termSigma : univShape K),
fun b ↦ match b with
| Sum.inl _ => ⟨(0 : Fin 2), p⟩
| Sum.inr _ => ⟨(0 : Fin 2), d⟩⟩,
(univPsh K).toSliceDomPFunctor.compatible_iff _ .termSigma _ |>.mpr
(by K:Type uKp:Codes Kd:Codes K⊢ ∀ (b : (univPsh K).B univShape.termSigma),
PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
b) =
(univPsh K).r ⟨univShape.termSigma, b⟩ intro b K:Type uKp:Codes Kd:Codes Kb:(univPsh K).B univShape.termSigma⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
b) =
(univPsh K).r ⟨univShape.termSigma, b⟩; cases b inl K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inl val✝)) =
(univPsh K).r ⟨univShape.termSigma, Sum.inl val✝⟩inr K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inr val✝)) =
(univPsh K).r ⟨univShape.termSigma, Sum.inr val✝⟩ <;> inl K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inl val✝)) =
(univPsh K).r ⟨univShape.termSigma, Sum.inl val✝⟩inr K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inr val✝)) =
(univPsh K).r ⟨univShape.termSigma, Sum.inr val✝⟩ rfl All goals completed! 🐙)⟩,
by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
intro i i' f b K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
i⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hb : (0 : Fin 2) = i := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
have hb' : univR K ⟨.termSigma, b.1⟩ = i := b.2 K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb':univR K ⟨univShape.termSigma, ↑b⟩ = i⊢ 0 = i
change (0 : Fin 2) = i at hb' K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb':0 = i⊢ 0 = i
exact hb' K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb:0 = i⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hb K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hi' : i' = (0 : Fin 2) := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
have hle : i' ≤ (0 : Fin 2) := leOfHom f K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0hle:i' ≤ 0⊢ i' = 0
omega K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0hi':i' = 0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hi' K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0f:0 ⟶ 0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hf : f = 𝟙 (0 : Fin 2) := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
apply Subsingleton.elim K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0f:0 ⟶ 0hf:f = 𝟙 0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hf K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 0).op))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rw [show (𝟙 (0 : Fin 2)).op = 𝟙 (Opposite.op (0 : Fin 2)) from rfl K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)] K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rw [(univW K).map_id K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)] K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termSigma, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rfl All goals completed! 🐙⟩,
rfl⟩
The sigma term at the code p with payload d.
def univTermSigma (K : Type uK) (p d : Codes K) : Terms K :=
PresheafPFunctor.W.mk (termSigmaNode K p d)
The node data of the pi term at the code p with payload d.
def termPiNode (K : Type uK) (p d : Codes K) :
((univPsh K).objPresheaf (univW K)).obj ⟨(1 : Fin 2)⟩ :=
⟨⟨⟨⟨(.termPi : univShape K),
fun b ↦ match b with
| Sum.inl _ => ⟨(0 : Fin 2), p⟩
| Sum.inr _ => ⟨(0 : Fin 2), d⟩⟩,
(univPsh K).toSliceDomPFunctor.compatible_iff _ .termPi _ |>.mpr
(by K:Type uKp:Codes Kd:Codes K⊢ ∀ (b : (univPsh K).B univShape.termPi),
PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
b) =
(univPsh K).r ⟨univShape.termPi, b⟩ intro b K:Type uKp:Codes Kd:Codes Kb:(univPsh K).B univShape.termPi⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
b) =
(univPsh K).r ⟨univShape.termPi, b⟩; cases b inl K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inl val✝)) =
(univPsh K).r ⟨univShape.termPi, Sum.inl val✝⟩inr K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inr val✝)) =
(univPsh K).r ⟨univShape.termPi, Sum.inr val✝⟩ <;> inl K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inl val✝)) =
(univPsh K).r ⟨univShape.termPi, Sum.inl val✝⟩inr K:Type uKp:Codes Kd:Codes Kval✝:PUnit.{1}⊢ PresheafDomPFunctorData.elemProj (univW K)
(⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩.snd
(Sum.inr val✝)) =
(univPsh K).r ⟨univShape.termPi, Sum.inr val✝⟩ rfl All goals completed! 🐙)⟩,
by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
intro i i' f b K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
i⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hb : (0 : Fin 2) = i := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
have hb' : univR K ⟨.termPi, b.1⟩ = i := b.2 K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb':univR K ⟨univShape.termPi, ↑b⟩ = i⊢ 0 = i
change (0 : Fin 2) = i at hb' K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb':0 = i⊢ 0 = i
exact hb' K:Type uKp:Codes Kd:Codes Ki:Fin 2i':Fin 2f:i' ⟶ ib:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
ihb:0 = i⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hb K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hi' : i' = (0 : Fin 2) := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
have hle : i' ≤ (0 : Fin 2) := leOfHom f K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0hle:i' ≤ 0⊢ i' = 0
omega K:Type uKp:Codes Kd:Codes Ki':Fin 2f:i' ⟶ 0b:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0hi':i' = 0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hi' K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0f:0 ⟶ 0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
have hf : f = 𝟙 (0 : Fin 2) := by K:Type uKp:Codes Kd:Codes K⊢ (univPsh K).IsNatural
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
apply Subsingleton.elim K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0f:0 ⟶ 0hf:f = 𝟙 0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
f b) =
(ConcreteCategory.hom ((univW K).map f.op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
subst hf K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 0).op))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rw [show (𝟙 (0 : Fin 2)).op = 𝟙 (Opposite.op (0 : Fin 2)) from rfl K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)] K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom ((univW K).map (𝟙 (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rw [(univW K).map_id K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)] K:Type uKp:Codes Kd:Codes Kb:(univPsh K).Direction
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
0⊢ (univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
((univPsh K).directionRestr
(↑⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩).fst
(𝟙 0) b) =
(ConcreteCategory.hom (𝟙 ((univW K).obj (Opposite.op 0))))
((univPsh K).value
⟨⟨univShape.termPi, fun b ↦
match b with
| Sum.inl val => ⟨0, p⟩
| Sum.inr val => ⟨0, d⟩⟩,
⋯⟩
b)
rfl All goals completed! 🐙⟩,
rfl⟩
The pi term at the code p with payload d.
def univTermPi (K : Type uK) (p d : Codes K) : Terms K :=
PresheafPFunctor.W.mk (termPiNode K p d)Decoding
The decoding of a term into its code is the restriction map fib; its
computation on the constructors — fib (univTermSigma p d) = univSigma p —
goes through the root-restriction wRestrTree of the presheaf W-type and is
deferred to the review this prototype is intended for. The tests exercise the
construction at the level that does compute: the fibres, the constructors, and
the shapes of the constructed codes and terms.
end PresheafIRUnivend