A Lean Companion to Conceptual Mathematics

Session 25: Labelings and products of graphs🔗

1. Detecting the structure of a graph by means of labelings🔗

The book defines the graph 2_D on p. 271, and we formalise it here since it will be used in Exercise 2.

def IrreflexiveGraph.TwoD : IrreflexiveGraph := { carrierA := Fin 4 carrierD := Fin 2 toSrc := fun | 0 => 0 -- a | 1 => 1 -- b | 2 => 0 -- u | 3 => 1 -- v toTgt := fun | 0 => 1 -- a | 1 => 0 -- b | 2 => 0 -- u | 3 => 1 -- v }
Exercise 1 (p. 271)

Find a graph 2_A such that a map {X \rightarrow 2_A} amounts to a division of the arrows of X into two sorts.

Solution: Exercise 1

A graph 2_A has one dot and two arrows, with both arrows being loops on the single dot. Since all morphisms {X \rightarrow 2_A} map every dot in X to the single dot in 2_A, each arrow in X can be mapped to either one of the two arrows in 2_A. The choice of mapping for each arrow divides the arrows of X into two sorts. We formalise the graph 2_A as follows:

def IrreflexiveGraph.TwoA : IrreflexiveGraph := { carrierA := Fin 2 carrierD := Unit toSrc := fun _ => () toTgt := fun _ => () }
Exercise 2 (p. 272)

(a) Show that if a diagram of sets B_1 \xrightarrow{j_1} S \xleftarrow{j_2} B_2 has the property of a coproduct, but restricted to testing against only the one cofigure-type {Y = \mathbf{2}}, then it is actually a coproduct, i.e. has that property for each object Y.

(b) Show that if a diagram of graphs B_1 \xrightarrow{j_1} S \xleftarrow{j_2} B_2 has the property of a coproduct, but restricted to testing against only the two cofigure-types {Y = 2_A} and {Y = 2_D}, then it is actually a coproduct, i.e. has that property for each object Y.

Solution: Exercise 2

For part (a), we use the restricted universal property (testing against \mathbf{2}) to establish a bijection between S and {B_1 \oplus B_2}, the canonical coproduct in the category Type. We can then use the resulting equivalence to show that S inherits the full universal property for any arbitrary type Y.

example (B₁ B₂ S : Type) (j₁ : B₁ S) (j₂ : B₂ S) (hS : (f₁ : B₁ Two) (f₂ : B₂ Two), (∃! f : S Two, f₁ = f j₁ f₂ = f j₂)) : (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), (∃! g : S Y, g₁ = g j₁ g₂ = g j₂) := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ classical -- Bundle j₁, j₂ into single morphism j from disjoint union B₁ ⊕ B₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ -- Show that j satisfies universal property for Two have hj : k : B₁ B₂ Two, ∃! f : S Two, k = f j := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Two∃! f, k = f j B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂∃! f, k = f j B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂(fun f k = f j) f (y : S Two), (fun f k = f j) y y = f B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂(fun f k = f j) fB₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂ (y : S Two), (fun f k = f j) y y = f B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂(fun f k = f j) f B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂x:B₁ B₂k x = (f j) x cases x with B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂b₁:B₁k (Sum.inl b₁) = (f j) (Sum.inl b₁) All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂b₂:B₂k (Sum.inr b₂) = (f j) (Sum.inr b₂) All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂ (y : S Two), (fun f k = f j) y y = f intro f' B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jf' = f B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jk Sum.inl = f' j₁ k Sum.inr = f' j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jk Sum.inl = f' j₁B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jk Sum.inr = f' j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jk Sum.inl = f' j₁B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' jk Sum.inr = f' j₂ (B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂k:B₁ B₂ Twof:S Twohf_uniq: (y : S Two), (fun f k Sum.inl = f j₁ k Sum.inr = f j₂) y y = fhf₁:k Sum.inl = f j₁hf₂:k Sum.inr = f j₂f':S Twohf':k = f' j(f' j) Sum.inr = f' j₂; All goals completed! 🐙) -- Show that j is injective have hj_inj : Function.Injective j := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ intro x B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂j x = j y x = y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yx = y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = fx = y have h : (1 : Two) = if x = y then 1 else 0 := calc (1 : Two) _ = if x = x then 1 else 0 := (if_pos rfl).symm _ = f (j x) := congr_fun hf x _ = f (j y) := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = ff (j x) = f (j y) All goals completed! 🐙 _ = if x = y then 1 else 0 := congr_fun hf.symm y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = fheq:x = yh:1 = 1x = yB₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = fheq:¬x = yh:1 = 0x = y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = fheq:x = yh:1 = 1x = y All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jx:B₁ B₂y:B₁ B₂hxy:j x = j yf:S Twohf:(fun b if x = b then 1 else 0) = f jright✝: (y : S Two), (fun f (fun b if x = b then 1 else 0) = f j) y y = fheq:¬x = yh:1 = 0x = y All goals completed! 🐙 -- Show that j is surjective have hj_surj : Function.Surjective j := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:S a, j a = s B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sFalse B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0False B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0False B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jFalse have h₁ : (fun _ : B₁ B₂ (0 : Two)) = f₁ j := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : Type) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jx:B₁ B₂0 = (f₁ j) x B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jx:B₁ B₂hnc:¬j x = s0 = (f₁ j) x B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jx:B₁ B₂hnc:¬j x = s0 = if j x = s then 1 else 0 All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jh₁:(fun x 0) = f₁ jheq:f₀ = f₁False have h_absurd : (0 : Two) = 1 := calc (0 : Two) _ = f₀ s := rfl _ = f₁ s := B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective js:Sh_not_mem:¬ a, j a = sf₀:S Two := fun x 0f₁:S Two := fun x if x = s then 1 else 0h₀:(fun x 0) = f₀ jh₁:(fun x 0) = f₁ jheq:f₀ = f₁f₀ s = f₁ s All goals completed! 🐙 _ = if s = s then 1 else 0 := rfl _ = 1 := if_pos rfl All goals completed! 🐙 intro Y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Y (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Y∃! g, g₁ = g j₁ g₂ = g j₂ -- Since j is bijective, we can construct equivalence B₁ ⊕ B₂ ≃ S B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j ∃! g, g₁ = g j₁ g₂ = g j₂ -- Construct morphism g : S ⟶ Y B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j ((fun g g₁ = g j₁ g₂ = g j₂) fun s Sum.elim g₁ g₂ (e.symm s)) (y : S Y), (fun g g₁ = g j₁ g₂ = g j₂) y y = fun s Sum.elim g₁ g₂ (e.symm s) B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j (fun g g₁ = g j₁ g₂ = g j₂) fun s Sum.elim g₁ g₂ (e.symm s)B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j (y : S Y), (fun g g₁ = g j₁ g₂ = g j₂) y y = fun s Sum.elim g₁ g₂ (e.symm s) B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j (fun g g₁ = g j₁ g₂ = g j₂) fun s Sum.elim g₁ g₂ (e.symm s) -- Prove commutativity B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j g₁ = (fun s Sum.elim g₁ g₂ (e.symm s)) j₁B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j g₂ = (fun s Sum.elim g₁ g₂ (e.symm s)) j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j g₁ = (fun s Sum.elim g₁ g₂ (e.symm s)) j₁B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j g₂ = (fun s Sum.elim g₁ g₂ (e.symm s)) j₂ B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₂g₂ b = ((fun s Sum.elim g₁ g₂ (e.symm s)) j₂) b B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₁g₁ b = ((fun s Sum.elim g₁ g₂ (e.symm s)) j₁) b B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₁g₁ b = Sum.elim g₁ g₂ (e.symm (e (Sum.inl b))) B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₁g₁ b = Sum.elim g₁ g₂ (Sum.inl b); All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₂g₂ b = ((fun s Sum.elim g₁ g₂ (e.symm s)) j₂) b B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₂g₂ b = Sum.elim g₁ g₂ (e.symm (e (Sum.inr b))) B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j b:B₂g₂ b = Sum.elim g₁ g₂ (Sum.inr b); All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j (y : S Y), (fun g g₁ = g j₁ g₂ = g j₂) y y = fun s Sum.elim g₁ g₂ (e.symm s) -- Prove uniqueness intro f' B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂f' = fun s Sum.elim g₁ g₂ (e.symm s) B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:Sf' s = Sum.elim g₁ g₂ (e.symm s) nth_rw 1 [ Equiv.apply_symm_apply e sB₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:Sf' (e (e.symm s)) = Sum.elim g₁ g₂ (e.symm s) cases e.symm s with B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:Sb₁:B₁f' (e (Sum.inl b₁)) = Sum.elim g₁ g₂ (Sum.inl b₁) All goals completed! 🐙 B₁:TypeB₂:TypeS:Typej₁:B₁ Sj₂:B₂ ShS: (f₁ : B₁ Two) (f₂ : B₂ Two), ∃! f, f₁ = f j₁ f₂ = f j₂j:B₁ B₂ S := Sum.elim j₁ j₂hj: (k : B₁ B₂ Two), ∃! f, k = f jhj_inj:Function.Injective jhj_surj:Function.Surjective jY:Typeg₁:B₁ Yg₂:B₂ Ye:B₁ B₂ S := Equiv.ofBijective j f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:Sb₂:B₂f' (e (Sum.inr b₂)) = Sum.elim g₁ g₂ (Sum.inr b₂) All goals completed! 🐙

For part (b), we follow closely the proof strategy used in part (a). The task is rather more complicated, however, since we need to account for the additional structure of objects and morphisms in the category of graphs.

We begin with a few definitions and lemmas to facilitate moving, in the main proof, between objects in the IrreflexiveGraph category and their underlying sets (types) of dots and arrows. The definitions liftTwoA and liftTwoD construct morphisms from an arbitrary graph X to the graphs 2_A and 2_D, respectively, given maps from the underlying sets of dots and arrows of X to those of 2_A and 2_D. The lemmas liftTwoA_comp and liftTwoD_comp show that these constructions are compatible with composition of morphisms in the category of graphs.

open IrreflexiveGraph def liftTwoA {X : IrreflexiveGraph} (f : X.carrierA TwoA.carrierA) : X TwoA := (f, fun _ ()), X:IrreflexiveGraphf:X.carrierA TwoA.carrierA(f, fun x ()).2 X.toSrc = TwoA.toSrc (f, fun x ()).1 (f, fun x ()).2 X.toTgt = TwoA.toTgt (f, fun x ()).1 X:IrreflexiveGraphf:X.carrierA TwoA.carrierA(f, fun x ()).2 X.toSrc = TwoA.toSrc (f, fun x ()).1X:IrreflexiveGraphf:X.carrierA TwoA.carrierA(f, fun x ()).2 X.toTgt = TwoA.toTgt (f, fun x ()).1 X:IrreflexiveGraphf:X.carrierA TwoA.carrierA(f, fun x ()).2 X.toSrc = TwoA.toSrc (f, fun x ()).1X:IrreflexiveGraphf:X.carrierA TwoA.carrierA(f, fun x ()).2 X.toTgt = TwoA.toTgt (f, fun x ()).1 All goals completed! 🐙 def mkTwoDArrow (s t : Fin 2) : Fin 4 := match (s, t) with | (0, 1) => 0 -- a | (1, 0) => 1 -- b | (0, 0) => 2 -- u | (1, 1) => 3 -- v lemma mkTwoDArrow_src (s t : Fin 2) : TwoD.toSrc (mkTwoDArrow s t) = s := s:Fin 2t:Fin 2TwoD.toSrc (mkTwoDArrow s t) = s t:Fin 2TwoD.toSrc (mkTwoDArrow ((fun i i) 0, ) t) = (fun i i) 0, t:Fin 2TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) t) = (fun i i) 1, t:Fin 2TwoD.toSrc (mkTwoDArrow ((fun i i) 0, ) t) = (fun i i) 0, t:Fin 2TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) t) = (fun i i) 1, TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 0, )) = (fun i i) 1, TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 1, )) = (fun i i) 1, TwoD.toSrc (mkTwoDArrow ((fun i i) 0, ) ((fun i i) 0, )) = (fun i i) 0, TwoD.toSrc (mkTwoDArrow ((fun i i) 0, ) ((fun i i) 1, )) = (fun i i) 0, TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 0, )) = (fun i i) 1, TwoD.toSrc (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 1, )) = (fun i i) 1, All goals completed! 🐙 lemma mkTwoDArrow_tgt (s t : Fin 2) : TwoD.toTgt (mkTwoDArrow s t) = t := s:Fin 2t:Fin 2TwoD.toTgt (mkTwoDArrow s t) = t t:Fin 2TwoD.toTgt (mkTwoDArrow ((fun i i) 0, ) t) = tt:Fin 2TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) t) = t t:Fin 2TwoD.toTgt (mkTwoDArrow ((fun i i) 0, ) t) = tt:Fin 2TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) t) = t TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 0, )) = (fun i i) 0, TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 1, )) = (fun i i) 1, TwoD.toTgt (mkTwoDArrow ((fun i i) 0, ) ((fun i i) 0, )) = (fun i i) 0, TwoD.toTgt (mkTwoDArrow ((fun i i) 0, ) ((fun i i) 1, )) = (fun i i) 1, TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 0, )) = (fun i i) 0, TwoD.toTgt (mkTwoDArrow ((fun i i) 1, ) ((fun i i) 1, )) = (fun i i) 1, All goals completed! 🐙 def liftTwoD {X : IrreflexiveGraph} (f : X.carrierD TwoD.carrierD) : X TwoD := (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f), X:IrreflexiveGraphf:X.carrierD TwoD.carrierD(fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toSrc = TwoD.toSrc (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1 (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt = TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1 X:IrreflexiveGraphf:X.carrierD TwoD.carrierD(fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toSrc = TwoD.toSrc (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1X:IrreflexiveGraphf:X.carrierD TwoD.carrierD(fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt = TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1 X:IrreflexiveGraphf:X.carrierD TwoD.carrierD(fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toSrc = TwoD.toSrc (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1X:IrreflexiveGraphf:X.carrierD TwoD.carrierD(fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt = TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1 (X:IrreflexiveGraphf:X.carrierD TwoD.carrierDa:X.carrierA((fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt) a = (TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1) a; X:IrreflexiveGraphf:X.carrierD TwoD.carrierDa:X.carrierA(TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1) a = ((fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt) a) X:IrreflexiveGraphf:X.carrierD TwoD.carrierDa:X.carrierA(TwoD.toSrc (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1) a = ((fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toSrc) a All goals completed! 🐙 X:IrreflexiveGraphf:X.carrierD TwoD.carrierDa:X.carrierA(TwoD.toTgt (fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).1) a = ((fun a mkTwoDArrow (f (X.toSrc a)) (f (X.toTgt a)), f).2 X.toTgt) a All goals completed! 🐙 lemma liftTwoA_comp {X Y : IrreflexiveGraph} (f : X Y) (g : Y.carrierA TwoA.carrierA) : liftTwoA (g f.val.1) = liftTwoA g f := X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierA TwoA.carrierAliftTwoA (g (↑f).1) = liftTwoA g f X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierA TwoA.carrierA(↑(liftTwoA (g (↑f).1))).1 = (↑(liftTwoA g f)).1X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierA TwoA.carrierA(↑(liftTwoA (g (↑f).1))).2 = (↑(liftTwoA g f)).2 X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierA TwoA.carrierA(↑(liftTwoA (g (↑f).1))).1 = (↑(liftTwoA g f)).1X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierA TwoA.carrierA(↑(liftTwoA (g (↑f).1))).2 = (↑(liftTwoA g f)).2 All goals completed! 🐙 lemma liftTwoD_comp {X Y : IrreflexiveGraph} (f : X Y) (g : Y.carrierD TwoD.carrierD) : liftTwoD (g f.val.2) = liftTwoD g f := X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierDliftTwoD (g (↑f).2) = liftTwoD g f X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierD(↑(liftTwoD (g (↑f).2))).1 = (↑(liftTwoD g f)).1X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierD(↑(liftTwoD (g (↑f).2))).2 = (↑(liftTwoD g f)).2 X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierD(↑(liftTwoD (g (↑f).2))).1 = (↑(liftTwoD g f)).1 X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierDa:X.carrierA(↑(liftTwoD (g (↑f).2))).1 a = (↑(liftTwoD g f)).1 a X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierDa:X.carrierAmkTwoDArrow (g (((↑f).2 X.toSrc) a)) (g (((↑f).2 X.toTgt) a)) = (↑(liftTwoD g f)).1 a X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierDa:X.carrierAmkTwoDArrow (g ((Y.toSrc (↑f).1) a)) (g ((Y.toTgt (↑f).1) a)) = (↑(liftTwoD g f)).1 a; All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphf:X Yg:Y.carrierD TwoD.carrierD(↑(liftTwoD (g (↑f).2))).2 = (↑(liftTwoD g f)).2 All goals completed! 🐙

Our main proof now follows. It sacrifices brevity in order to remain as close as possible to the proof strategy in part (a).

example (B₁ B₂ S : IrreflexiveGraph) (j₁ : B₁ S) (j₂ : B₂ S) (hS₁ : (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), (∃! f : S TwoA, f₁ = f j₁ f₂ = f j₂)) (hS₂ : (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), (∃! f : S TwoD, f₁ = f j₁ f₂ = f j₂)) : (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), (∃! g : S Y, g₁ = g j₁ g₂ = g j₂) := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ classical -- Extract set-level hypothesis for arrows from hS₁ have hSA : (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA : S.carrierA TwoA.carrierA, fA₁ = fA j₁.val.1 fA₂ = fA j₂.val.1 := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ intro fA₁ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierA∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂(fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) (↑f).1 (y : S.carrierA TwoA.carrierA), (fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) y y = (↑f).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂(fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) (↑f).1B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂ (y : S.carrierA TwoA.carrierA), (fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) y y = (↑f).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂(fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) (↑f).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA₁ = (↑f).1 (↑j₁).1B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA₂ = (↑f).1 (↑j₂).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA₁ = (↑f).1 (↑j₁).1 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA₂ = (↑f).1 (↑j₂).1 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂ (y : S.carrierA TwoA.carrierA), (fun fA fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1) y y = (↑f).1 intro fA' B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA':S.carrierA TwoA.carrierAhfA'₁:fA₁ = fA' (↑j₁).1hfA'₂:fA₂ = fA' (↑j₂).1fA' = (↑f).1 have := hf_uniq (liftTwoA fA') B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA':S.carrierA TwoA.carrierAhfA'₁:fA₁ = fA' (↑j₁).1hfA'₂:fA₂ = fA' (↑j₂).1liftTwoA fA₁ = liftTwoA fA' j₁ All goals completed! 🐙, B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂fA₁:B₁.carrierA TwoA.carrierAfA₂:B₂.carrierA TwoA.carrierAf:S TwoAhf_uniq: (y : S TwoA), (fun f liftTwoA fA₁ = f j₁ liftTwoA fA₂ = f j₂) y y = fhf₁:liftTwoA fA₁ = f j₁hf₂:liftTwoA fA₂ = f j₂fA':S.carrierA TwoA.carrierAhfA'₁:fA₁ = fA' (↑j₁).1hfA'₂:fA₂ = fA' (↑j₂).1liftTwoA fA₂ = liftTwoA fA' j₂ All goals completed! 🐙 All goals completed! 🐙 -- Bundle j₁, j₂ for arrows into single morphism jA from B₁ ⊕ B₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1 (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ -- Show that jA satisfies universal property for TwoA.carrierA have hjA : kA : B₁.carrierA B₂.carrierA TwoA.carrierA, ∃! fA : S.carrierA TwoA.carrierA, kA = fA jA := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierA∃! fA, kA = fA jA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1∃! fA, kA = fA jA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1(fun fA kA = fA jA) fA (y : S.carrierA TwoA.carrierA), (fun fA kA = fA jA) y y = fA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1(fun fA kA = fA jA) fAB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1 (y : S.carrierA TwoA.carrierA), (fun fA kA = fA jA) y y = fA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1(fun fA kA = fA jA) fA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1x:B₁.carrierA B₂.carrierAkA x = (fA jA) x cases x with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1bA₁:B₁.carrierAkA (Sum.inl bA₁) = (fA jA) (Sum.inl bA₁) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1bA₂:B₂.carrierAkA (Sum.inr bA₂) = (fA jA) (Sum.inr bA₂) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1 (y : S.carrierA TwoA.carrierA), (fun fA kA = fA jA) y y = fA intro fA' B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAfA' = fA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAkA Sum.inl = fA' (↑j₁).1 kA Sum.inr = fA' (↑j₂).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAkA Sum.inl = fA' (↑j₁).1B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAkA Sum.inr = fA' (↑j₂).1 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAkA Sum.inl = fA' (↑j₁).1B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jAkA Sum.inr = fA' (↑j₂).1 (B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1kA:B₁.carrierA B₂.carrierA TwoA.carrierAfA:S.carrierA TwoA.carrierAhfA_uniq: (y : S.carrierA TwoA.carrierA), (fun fA kA Sum.inl = fA (↑j₁).1 kA Sum.inr = fA (↑j₂).1) y y = fAhfA₁:kA Sum.inl = fA (↑j₁).1hfA₂:kA Sum.inr = fA (↑j₂).1fA':S.carrierA TwoA.carrierAhfA':kA = fA' jA(fA' jA) Sum.inr = fA' (↑j₂).1; All goals completed! 🐙) -- Show that jA is injective have hjA_inj : Function.Injective jA := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ intro x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAjA x = jA y x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAh:1 = if x = x then 1 else 0x = y erw [congr_fun hfA xB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAh:1 = (fA jA) xx = y at h B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAh:1 = (fA jA) yx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAh:1 = if x = y then 1 else 0x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAheq:x = yh:1 = 1x = yB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAheq:¬x = yh:1 = 0x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAheq:x = yh:1 = 1x = y All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAx:B₁.carrierA B₂.carrierAy:B₁.carrierA B₂.carrierAhxy:jA x = jA yfA:S.carrierA TwoA.carrierAhfA:(fun b if x = b then 1 else 0) = fA jAright✝: (y : S.carrierA TwoA.carrierA), (fun fA (fun b if x = b then 1 else 0) = fA jA) y y = fAheq:¬x = yh:1 = 0x = y All goals completed! 🐙 -- Show that jA is surjective have hjA_surj : Function.Surjective jA := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierA a, jA a = sA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAFalse have h₁ : (fun _ (0 : Fin 2)) = f₁ jA := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAx:B₁.carrierA B₂.carrierA0 = (f₁ jA) x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAx:B₁.carrierA B₂.carrierAhnc:¬jA x = sA0 = (f₁ jA) x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAx:B₁.carrierA B₂.carrierAhnc:¬jA x = sA0 = if jA x = sA then 1 else 0 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAh₁:(fun x 0) = f₁ jAheq:f₀ = f₁False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAh₁:(fun x 0) = f₁ jAheq:f₀ = f₁h_absurd:0 = f₀ sAFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAh₁:(fun x 0) = f₁ jAheq:f₀ = f₁h_absurd:0 = f₁ sAFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAh₁:(fun x 0) = f₁ jAheq:f₀ = f₁h_absurd:0 = if sA = sA then 1 else 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAsA:S.carrierAh_not_mem:¬ a, jA a = sAf₀:S.carrierA TwoA.carrierA := fun x 0f₁:S.carrierA TwoA.carrierA := fun x if x = sA then 1 else 0h₀:(fun x 0) = f₀ jAh₁:(fun x 0) = f₁ jAheq:f₀ = f₁h_absurd:0 = 1False All goals completed! 🐙 -- Extract set-level hypothesis for dots from hS₂ have hSD : (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD : S.carrierD TwoD.carrierD, fD₁ = fD j₁.val.2 fD₂ = fD j₂.val.2 := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ intro fD₁ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierD∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂(fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) (↑f).2 (y : S.carrierD TwoD.carrierD), (fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) y y = (↑f).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂(fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) (↑f).2B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂ (y : S.carrierD TwoD.carrierD), (fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) y y = (↑f).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂(fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) (↑f).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD₁ = (↑f).2 (↑j₁).2B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD₂ = (↑f).2 (↑j₂).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD₁ = (↑f).2 (↑j₁).2 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD₂ = (↑f).2 (↑j₂).2 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂ (y : S.carrierD TwoD.carrierD), (fun fD fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2) y y = (↑f).2 intro fD' B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD':S.carrierD TwoD.carrierDhfD'₁:fD₁ = fD' (↑j₁).2hfD'₂:fD₂ = fD' (↑j₂).2fD' = (↑f).2 have := hf_uniq (liftTwoD fD') B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD':S.carrierD TwoD.carrierDhfD'₁:fD₁ = fD' (↑j₁).2hfD'₂:fD₂ = fD' (↑j₂).2liftTwoD fD₁ = liftTwoD fD' j₁ All goals completed! 🐙, B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAfD₁:B₁.carrierD TwoD.carrierDfD₂:B₂.carrierD TwoD.carrierDf:S TwoDhf_uniq: (y : S TwoD), (fun f liftTwoD fD₁ = f j₁ liftTwoD fD₂ = f j₂) y y = fhf₁:liftTwoD fD₁ = f j₁hf₂:liftTwoD fD₂ = f j₂fD':S.carrierD TwoD.carrierDhfD'₁:fD₁ = fD' (↑j₁).2hfD'₂:fD₂ = fD' (↑j₂).2liftTwoD fD₂ = liftTwoD fD' j₂ All goals completed! 🐙 All goals completed! 🐙 -- Bundle j₁, j₂ for dots into single morphism jD from B₁ ⊕ B₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2 (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ -- Show that jD satisfies universal property for TwoD.carrierD have hjD : kD : B₁.carrierD B₂.carrierD TwoD.carrierD, ∃! fD : S.carrierD TwoD.carrierD, kD = fD jD := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierD∃! fD, kD = fD jD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2∃! fD, kD = fD jD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2(fun fD kD = fD jD) fD (y : S.carrierD TwoD.carrierD), (fun fD kD = fD jD) y y = fD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2(fun fD kD = fD jD) fDB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2 (y : S.carrierD TwoD.carrierD), (fun fD kD = fD jD) y y = fD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2(fun fD kD = fD jD) fD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2x:B₁.carrierD B₂.carrierDkD x = (fD jD) x cases x with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2bD₁:B₁.carrierDkD (Sum.inl bD₁) = (fD jD) (Sum.inl bD₁) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2hD₂:B₂.carrierDkD (Sum.inr hD₂) = (fD jD) (Sum.inr hD₂) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2 (y : S.carrierD TwoD.carrierD), (fun fD kD = fD jD) y y = fD intro fD' B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDfD' = fD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDkD Sum.inl = fD' (↑j₁).2 kD Sum.inr = fD' (↑j₂).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDkD Sum.inl = fD' (↑j₁).2B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDkD Sum.inr = fD' (↑j₂).2 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDkD Sum.inl = fD' (↑j₁).2B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jDkD Sum.inr = fD' (↑j₂).2 (B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2kD:B₁.carrierD B₂.carrierD TwoD.carrierDfD:S.carrierD TwoD.carrierDhfD_uniq: (y : S.carrierD TwoD.carrierD), (fun fD kD Sum.inl = fD (↑j₁).2 kD Sum.inr = fD (↑j₂).2) y y = fDhfD₁:kD Sum.inl = fD (↑j₁).2hfD₂:kD Sum.inr = fD (↑j₂).2fD':S.carrierD TwoD.carrierDhfD':kD = fD' jD(fD' jD) Sum.inr = fD' (↑j₂).2; All goals completed! 🐙) -- Show that jD is injective have hjD_inj : Function.Injective jD := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ intro x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDjD x = jD y x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDh:1 = if x = x then 1 else 0x = y erw [congr_fun hfD xB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDh:1 = (fD jD) xx = y at h B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDh:1 = (fD jD) yx = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDh:1 = if x = y then 1 else 0x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDheq:x = yh:1 = 1x = yB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDheq:¬x = yh:1 = 0x = y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDheq:x = yh:1 = 1x = y All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDx:B₁.carrierD B₂.carrierDy:B₁.carrierD B₂.carrierDhxy:jD x = jD yfD:S.carrierD TwoD.carrierDhfD:(fun b if x = b then 1 else 0) = fD jDright✝: (y : S.carrierD TwoD.carrierD), (fun fD (fun b if x = b then 1 else 0) = fD jD) y y = fDheq:¬x = yh:1 = 0x = y All goals completed! 🐙 -- Show that jD is surjective have hjD_surj : Function.Surjective jD := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierD a, jD a = sD B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDFalse have h₁ : (fun _ (0 : Fin 2)) = f₁ jD := B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂ (Y : IrreflexiveGraph) (g₁ : B₁ Y) (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDx:B₁.carrierD B₂.carrierD0 = (f₁ jD) x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDx:B₁.carrierD B₂.carrierDhnc:¬jD x = sD0 = (f₁ jD) x B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDx:B₁.carrierD B₂.carrierDhnc:¬jD x = sD0 = if jD x = sD then 1 else 0 All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDh₁:(fun x 0) = f₁ jDheq:f₀ = f₁False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDh₁:(fun x 0) = f₁ jDheq:f₀ = f₁h_absurd:0 = f₀ sDFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDh₁:(fun x 0) = f₁ jDheq:f₀ = f₁h_absurd:0 = f₁ sDFalse B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDh₁:(fun x 0) = f₁ jDheq:f₀ = f₁h_absurd:0 = if sD = sD then 1 else 0False B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDsD:S.carrierDh_not_mem:¬ a, jD a = sDf₀:S.carrierD TwoD.carrierD := fun x 0f₁:S.carrierD TwoD.carrierD := fun x if x = sD then 1 else 0h₀:(fun x 0) = f₀ jDh₁:(fun x 0) = f₁ jDheq:f₀ = f₁h_absurd:0 = 1False All goals completed! 🐙 intro Y B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Y (g₂ : B₂ Y), ∃! g, g₁ = g j₁ g₂ = g j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ Y∃! g, g₁ = g j₁ g₂ = g j₂ -- Since jA is bijective, we can construct equivalence for arrows B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA ∃! g, g₁ = g j₁ g₂ = g j₂ -- Since jD is bijective, we can construct equivalence for dots B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD ∃! g, g₁ = g j₁ g₂ = g j₂ -- Construct morphism g : S ⟶ Y use (fun sA Sum.elim g₁.val.1 g₂.val.1 (eA.symm sA), fun sD Sum.elim g₁.val.2 g₂.val.2 (eD.symm sD)), B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toSrc = Y.toSrc (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1 -- Prove that source commutes B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD sA:S.carrierA((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toSrc) sA = (Y.toSrc (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1) sA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierA((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toSrc) (eA bA) = (Y.toSrc (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1) (eA bA) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toSrc (eA bA))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm (eA bA))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toSrc (eA bA))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 bA) cases bA with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toSrc (eA (Sum.inl bA₁)))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm ((S.toSrc (↑j₁).1) bA₁)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (((↑j₁).2 B₁.toSrc) bA₁)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inl (B₁.toSrc bA₁)))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (Sum.inl (B₁.toSrc bA₁)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toSrc (eA (Sum.inr bA₂)))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm ((S.toSrc (↑j₂).1) bA₂)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (((↑j₂).2 B₂.toSrc) bA₂)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inr (B₂.toSrc bA₂)))) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (Sum.inr (B₂.toSrc bA₂)) = Y.toSrc (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) All goals completed! 🐙, B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toTgt = Y.toTgt (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1 -- Prove that target commutes B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD sA:S.carrierA((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toTgt) sA = (Y.toTgt (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1) sA B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierA((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).2 S.toTgt) (eA bA) = (Y.toTgt (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)).1) (eA bA) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toTgt (eA bA))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm (eA bA))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA:B₁.carrierA B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toTgt (eA bA))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 bA) cases bA with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toTgt (eA (Sum.inl bA₁)))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm ((S.toTgt (↑j₁).1) bA₁)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (((↑j₁).2 B₁.toTgt) bA₁)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inl (B₁.toTgt bA₁)))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₁:B₁.carrierASum.elim (↑g₁).2 (↑g₂).2 (Sum.inl (B₁.toTgt bA₁)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁)) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (S.toTgt (eA (Sum.inr bA₂)))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm ((S.toTgt (↑j₂).1) bA₂)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (((↑j₂).2 B₂.toTgt) bA₂)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inr (B₂.toTgt bA₂)))) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD bA₂:B₂.carrierASum.elim (↑g₁).2 (↑g₂).2 (Sum.inr (B₂.toTgt bA₂)) = Y.toTgt (Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂)) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (fun g g₁ = g j₁ g₂ = g j₂) (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (y : S Y), (fun g g₁ = g j₁ g₂ = g j₂) y y = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (fun g g₁ = g j₁ g₂ = g j₂) (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), -- Prove commutativity B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD g₁ = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₁B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD g₂ = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD g₁ = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₁B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD g₂ = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂ B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierA(↑g₂).1 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂)).1 bB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierD(↑g₂).2 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂)).2 b B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierA(↑g₁).1 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₁)).1 b B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierA(↑g₁).1 b = Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm (eA (Sum.inl b))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierA(↑g₁).1 b = Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl b); All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierD(↑g₁).2 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₁)).2 b B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierD(↑g₁).2 b = Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inl b))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₁.carrierD(↑g₁).2 b = Sum.elim (↑g₁).2 (↑g₂).2 (Sum.inl b); All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierA(↑g₂).1 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂)).1 b B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierA(↑g₂).1 b = Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm (eA (Sum.inr b))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierA(↑g₂).1 b = Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr b); All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierD(↑g₂).2 b = (↑((fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), j₂)).2 b B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierD(↑g₂).2 b = Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm (eD (Sum.inr b))) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD b:B₂.carrierD(↑g₂).2 b = Sum.elim (↑g₁).2 (↑g₂).2 (Sum.inr b); All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD (y : S Y), (fun g g₁ = g j₁ g₂ = g j₂) y y = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), -- Prove uniqueness intro f' B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂f' = (fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierA(↑f').1 s = (↑(fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), ).1 sB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierD(↑f').2 s = (↑(fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), ).2 s B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierA(↑f').1 s = (↑(fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), ).1 sB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierD(↑f').2 s = (↑(fun sA Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm sA), fun sD Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm sD)), ).2 s B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierD(↑f').2 s = Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm s) B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierA(↑f').1 s = Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm s) nth_rw 1 [ Equiv.apply_symm_apply eA sB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierA(↑f').1 (eA (eA.symm s)) = Sum.elim (↑g₁).1 (↑g₂).1 (eA.symm s) cases eA.symm s with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierAbA₁:B₁.carrierA(↑f').1 (eA (Sum.inl bA₁)) = Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inl bA₁) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierAbA₂:B₂.carrierA(↑f').1 (eA (Sum.inr bA₂)) = Sum.elim (↑g₁).1 (↑g₂).1 (Sum.inr bA₂) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierD(↑f').2 s = Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm s) nth_rw 1 [ Equiv.apply_symm_apply eD sB₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierD(↑f').2 (eD (eD.symm s)) = Sum.elim (↑g₁).2 (↑g₂).2 (eD.symm s) cases eD.symm s with B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierDbD₁:B₁.carrierD(↑f').2 (eD (Sum.inl bD₁)) = Sum.elim (↑g₁).2 (↑g₂).2 (Sum.inl bD₁) All goals completed! 🐙 B₁:IrreflexiveGraphB₂:IrreflexiveGraphS:IrreflexiveGraphj₁:B₁ Sj₂:B₂ ShS₁: (f₁ : B₁ TwoA) (f₂ : B₂ TwoA), ∃! f, f₁ = f j₁ f₂ = f j₂hS₂: (f₁ : B₁ TwoD) (f₂ : B₂ TwoD), ∃! f, f₁ = f j₁ f₂ = f j₂hSA: (fA₁ : B₁.carrierA TwoA.carrierA) (fA₂ : B₂.carrierA TwoA.carrierA), ∃! fA, fA₁ = fA (↑j₁).1 fA₂ = fA (↑j₂).1jA:B₁.carrierA B₂.carrierA S.carrierA := Sum.elim (↑j₁).1 (↑j₂).1hjA: (kA : B₁.carrierA B₂.carrierA TwoA.carrierA), ∃! fA, kA = fA jAhjA_inj:Function.Injective jAhjA_surj:Function.Surjective jAhSD: (fD₁ : B₁.carrierD TwoD.carrierD) (fD₂ : B₂.carrierD TwoD.carrierD), ∃! fD, fD₁ = fD (↑j₁).2 fD₂ = fD (↑j₂).2jD:B₁.carrierD B₂.carrierD S.carrierD := Sum.elim (↑j₁).2 (↑j₂).2hjD: (kD : B₁.carrierD B₂.carrierD TwoD.carrierD), ∃! fD, kD = fD jDhjD_inj:Function.Injective jDhjD_surj:Function.Surjective jDY:IrreflexiveGraphg₁:B₁ Yg₂:B₂ YeA:B₁.carrierA B₂.carrierA S.carrierA := Equiv.ofBijective jA eD:B₁.carrierD B₂.carrierD S.carrierD := Equiv.ofBijective jD f':S Yh₁:g₁ = f' j₁h₂:g₂ = f' j₂s:S.carrierDbD₂:B₂.carrierD(↑f').2 (eD (Sum.inr bD₂)) = Sum.elim (↑g₁).2 (↑g₂).2 (Sum.inr bD₂) All goals completed! 🐙
Exercise 3 (p. 273)

Tricoloring a graph means assigning to each dot one of the three colors white, red, or green, in such a way that for each arrow, the source and target have different colors. If you fix a tricoloring of a graph X, and you have a map of graphs {Y \xrightarrow{f} X}, then you can color the dots of Y also: just color each dot {D \xrightarrow{y} Y} the same color as {f y}. This is called the 'tricoloring of Y induced by f'.

(a) Show that this induced coloring is a tricoloring; i.e. no arrow of Y has source and target the same color.

(b) Find Fatima's tricolored graph F. It is the best tricolored graph: For any graph Y, each tricoloring of Y is induced by exactly one map {Y \rightarrow F}.

Solution: Exercise 3

We first define an inductive type to represent the three colours.

inductive Tricolour | white | red | green

For part (a), we define what it means for a colouring of an irreflexive graph to be a tricolouring. We then show that if we have a tricolouring of a graph X, we can induce a tricolouring of any graph Y that maps to X.

def IsTricolouring (X : IrreflexiveGraph) (c : X.carrierD Tricolour) : Prop := a : X.carrierA, c (X.toSrc a) c (X.toTgt a) def inducedColouring {Y X : IrreflexiveGraph} (f : Y X) (c : X.carrierD Tricolour) : Y.carrierD Tricolour := c f.val.2 example {Y X : IrreflexiveGraph} (f : Y X) (c : X.carrierD Tricolour) (h : IsTricolouring X c) : IsTricolouring Y (inducedColouring f c) := Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:X.carrierD Tricolourh:IsTricolouring X cIsTricolouring Y (inducedColouring f c) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:X.carrierD Tricolourh:IsTricolouring X ca:Y.carrierAinducedColouring f c (Y.toSrc a) inducedColouring f c (Y.toTgt a) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:X.carrierD Tricolourh:IsTricolouring X ca:Y.carrierAc (((↑f).2 Y.toSrc) a) c (((↑f).2 Y.toTgt) a) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:X.carrierD Tricolourh:IsTricolouring X ca:Y.carrierAc ((X.toSrc (↑f).1) a) c ((X.toTgt (↑f).1) a) All goals completed! 🐙

Strictly speaking, since the exercise defines a 'dot' as a morphism {D \xrightarrow{y} Y}, we should be working only with morphisms and not elements of the carrier types. We can reformulate the above definitions and proof exclusively in terms of morphisms, as follows:

def Dot (X : IrreflexiveGraph) := IrreflexiveGraph.D X def srcDot {X : IrreflexiveGraph} (a : X.carrierA) : Dot X := (Empty.elim, fun _ X.toSrc a), X:IrreflexiveGrapha:X.carrierA(Empty.elim, fun x X.toSrc a).2 IrreflexiveGraph.D.toSrc = X.toSrc (Empty.elim, fun x X.toSrc a).1 X:IrreflexiveGrapha:X.carrierAx:IrreflexiveGraph.D.carrierA((Empty.elim, fun x X.toSrc a).2 IrreflexiveGraph.D.toSrc) x = (X.toSrc (Empty.elim, fun x X.toSrc a).1) x; All goals completed! 🐙, X:IrreflexiveGrapha:X.carrierA(Empty.elim, fun x X.toSrc a).2 IrreflexiveGraph.D.toTgt = X.toTgt (Empty.elim, fun x X.toSrc a).1 X:IrreflexiveGrapha:X.carrierAx:IrreflexiveGraph.D.carrierA((Empty.elim, fun x X.toSrc a).2 IrreflexiveGraph.D.toTgt) x = (X.toTgt (Empty.elim, fun x X.toSrc a).1) x; All goals completed! 🐙 def tgtDot {X : IrreflexiveGraph} (a : X.carrierA) : Dot X := (Empty.elim, fun _ X.toTgt a), X:IrreflexiveGrapha:X.carrierA(Empty.elim, fun x X.toTgt a).2 IrreflexiveGraph.D.toSrc = X.toSrc (Empty.elim, fun x X.toTgt a).1 X:IrreflexiveGrapha:X.carrierAx:IrreflexiveGraph.D.carrierA((Empty.elim, fun x X.toTgt a).2 IrreflexiveGraph.D.toSrc) x = (X.toSrc (Empty.elim, fun x X.toTgt a).1) x; All goals completed! 🐙, X:IrreflexiveGrapha:X.carrierA(Empty.elim, fun x X.toTgt a).2 IrreflexiveGraph.D.toTgt = X.toTgt (Empty.elim, fun x X.toTgt a).1 X:IrreflexiveGrapha:X.carrierAx:IrreflexiveGraph.D.carrierA((Empty.elim, fun x X.toTgt a).2 IrreflexiveGraph.D.toTgt) x = (X.toTgt (Empty.elim, fun x X.toTgt a).1) x; All goals completed! 🐙 def IsTricolouring' (X : IrreflexiveGraph) (c : Dot X Tricolour) : Prop := a : X.carrierA, c (srcDot a) c (tgtDot a) def inducedColouring' {Y X : IrreflexiveGraph} (f : Y X) (c : Dot X Tricolour) : Dot Y Tricolour := fun y c (f y) example {Y X : IrreflexiveGraph} (f : Y X) (c : Dot X Tricolour) (h : IsTricolouring' X c) : IsTricolouring' Y (inducedColouring' f c) := Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X cIsTricolouring' Y (inducedColouring' f c) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAinducedColouring' f c (srcDot a) inducedColouring' f c (tgtDot a) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAc (f srcDot a) c (f tgtDot a) have h_src : f srcDot a = srcDot (f.val.1 a) := Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X cIsTricolouring' Y (inducedColouring' f c) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierA(↑(f srcDot a)).1 = (↑(srcDot ((↑f).1 a))).1Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierA(↑(f srcDot a)).2 = (↑(srcDot ((↑f).1 a))).2 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierA(↑(f srcDot a)).1 = (↑(srcDot ((↑f).1 a))).1Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierA(↑(f srcDot a)).2 = (↑(srcDot ((↑f).1 a))).2 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAx:IrreflexiveGraph.D.carrierD(↑(f srcDot a)).2 x = (↑(srcDot ((↑f).1 a))).2 x Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAx:IrreflexiveGraph.D.carrierA(↑(f srcDot a)).1 x = (↑(srcDot ((↑f).1 a))).1 x All goals completed! 🐙 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAx:IrreflexiveGraph.D.carrierD(↑(f srcDot a)).2 x = (↑(srcDot ((↑f).1 a))).2 x All goals completed! 🐙 have h_tgt : f tgtDot a = tgtDot (f.val.1 a) := Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X cIsTricolouring' Y (inducedColouring' f c) Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)(↑(f tgtDot a)).1 = (↑(tgtDot ((↑f).1 a))).1Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)(↑(f tgtDot a)).2 = (↑(tgtDot ((↑f).1 a))).2 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)(↑(f tgtDot a)).1 = (↑(tgtDot ((↑f).1 a))).1Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)(↑(f tgtDot a)).2 = (↑(tgtDot ((↑f).1 a))).2 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)x:IrreflexiveGraph.D.carrierD(↑(f tgtDot a)).2 x = (↑(tgtDot ((↑f).1 a))).2 x Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)x:IrreflexiveGraph.D.carrierA(↑(f tgtDot a)).1 x = (↑(tgtDot ((↑f).1 a))).1 x All goals completed! 🐙 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)x:IrreflexiveGraph.D.carrierD(↑(f tgtDot a)).2 x = (↑(tgtDot ((↑f).1 a))).2 x All goals completed! 🐙 Y:IrreflexiveGraphX:IrreflexiveGraphf:Y Xc:Dot X Tricolourh:IsTricolouring' X ca:Y.carrierAh_src:f srcDot a = srcDot ((↑f).1 a)h_tgt:f tgtDot a = tgtDot ((↑f).1 a)c (srcDot ((↑f).1 a)) c (tgtDot ((↑f).1 a)) All goals completed! 🐙

In part (b), we find that Fatima's tricoloured graph F consists of exactly six arrows: white-to-red, white-to-green, red-to-white, red-to-green, green-to-white, and green-to-red. That is, F consists of exactly one arrow for each ordered pair of distinct colours, which we formalise as follows:

def F : IrreflexiveGraph := { carrierA := { p : Tricolour × Tricolour // p.1 p.2 } carrierD := Tricolour toSrc := fun p p.val.1 toTgt := fun p p.val.2 }

We then prove that for any graph Y, each tricolouring of Y is induced by exactly one map {Y \rightarrow F}.

example : IsTricolouring F (𝟙 F.carrierD) := fun a a.property example {Y : IrreflexiveGraph} (c : Y.carrierD Tricolour) (h : IsTricolouring Y c) : ∃! g : Y F, inducedColouring g (𝟙 F.carrierD) = c := Y:IrreflexiveGraphc:Y.carrierD Tricolourh:IsTricolouring Y c∃! g, inducedColouring g (𝟙 F.carrierD) = c Y:IrreflexiveGraphc:Y.carrierD Tricolourh:IsTricolouring Y c (y : Y F), (fun g inducedColouring g (𝟙 F.carrierD) = c) y y = (fun a (c (Y.toSrc a), c (Y.toTgt a)), , c), Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gD(fst✝, gD), = (fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gD(↑(fst✝, gD), ).1 = (↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).1Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gD(↑(fst✝, gD), ).2 = (↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).2 Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gD(↑(fst✝, gD), ).1 = (↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).1 Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gDa:Y.carrierA(↑(fst✝, gD), ).1 a = (↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).1 a Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gDa:Y.carrierA((↑(fst✝, gD), ).1 a) = ((↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).1 a) All goals completed! 🐙 Y:IrreflexiveGraphfst✝:Y.carrierA F.carrierAgD:Y.carrierD F.carrierDh_src:(fst✝, gD).2 Y.toSrc = F.toSrc (fst✝, gD).1h_tgt:(fst✝, gD).2 Y.toTgt = F.toTgt (fst✝, gD).1h:IsTricolouring Y gD(↑(fst✝, gD), ).2 = (↑(fun a (gD (Y.toSrc a), gD (Y.toTgt a)), , gD), ).2 All goals completed! 🐙
Exercise 4 (p. 273)

In this exercise, \mathbf{0} is the initial graph, with no dots (and, of course, no arrows)

abbrev IrreflexiveGraph.Zero : IrreflexiveGraph := emptyIG

and A_2 is the graph

def IrreflexiveGraph.A₂ : IrreflexiveGraph := { carrierA := Fin 2 carrierD := Fin 3 toSrc := fun | 0 => 0 | 1 => 1 toTgt := fun | 0 => 1 | 1 => 2 }

Show that for each graph X:

(a) there is either a map {X \rightarrow \mathbf{0}} or a map {D \rightarrow X}, but not both; and

(b) there is either a map {X \rightarrow D} or {A \rightarrow X}, but not both; and

(c) there is either a map {X \rightarrow A} or {A_2 \rightarrow X}, but not both.

Can the sequence \mathbf{0}, D, A, A_2 be continued? That is, is there a graph C such that for each graph X

(d) there is either a map {X \rightarrow A_2} or {C \rightarrow X}, but not both?

Solution: Exercise 4

Our proof of part (a) relies on the fact that a map {X \rightarrow \mathbf{0}} can only exist if X has no dots, while a map {D \rightarrow X} can only exist if X has at least one dot.

open IrreflexiveGraph in example : X : IrreflexiveGraph, Xor' (Nonempty (X Zero)) (Nonempty (D X)) := (X : IrreflexiveGraph), Xor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X)) X:IrreflexiveGraphXor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X)) X:IrreflexiveGraphh:Nonempty X.carrierDXor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X))X:IrreflexiveGraphh:¬Nonempty X.carrierDXor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X)) X:IrreflexiveGraphh:Nonempty X.carrierDXor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X)) X:IrreflexiveGraphh:Nonempty X.carrierDNonempty (D X) ¬Nonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphh:Nonempty X.carrierDNonempty (D X)X:IrreflexiveGraphh:Nonempty X.carrierD¬Nonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphh:Nonempty X.carrierDNonempty (D X)X:IrreflexiveGraphh:Nonempty X.carrierD¬Nonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphdX:X.carrierD¬Nonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphdX:X.carrierDNonempty (D X) X:IrreflexiveGraphdX:X.carrierD(Empty.elim, fun x dX).2 D.toSrc = X.toSrc (Empty.elim, fun x dX).1X:IrreflexiveGraphdX:X.carrierD(Empty.elim, fun x dX).2 D.toTgt = X.toTgt (Empty.elim, fun x dX).1 all_goals X:IrreflexiveGraphdX:X.carrierDaD:D.carrierA((Empty.elim, fun x dX).2 D.toTgt) aD = (X.toTgt (Empty.elim, fun x dX).1) aD All goals completed! 🐙 X:IrreflexiveGraphdX:X.carrierD¬Nonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphdX:X.carrierDf:X IrreflexiveGraph.ZeroFalse All goals completed! 🐙 X:IrreflexiveGraphh:¬Nonempty X.carrierDXor' (Nonempty (X IrreflexiveGraph.Zero)) (Nonempty (D X)) X:IrreflexiveGraphh:¬Nonempty X.carrierDNonempty (X IrreflexiveGraph.Zero) ¬Nonempty (D X) X:IrreflexiveGraphh:¬Nonempty X.carrierDNonempty (X IrreflexiveGraph.Zero)X:IrreflexiveGraphh:¬Nonempty X.carrierD¬Nonempty (D X) X:IrreflexiveGraphh:¬Nonempty X.carrierDNonempty (X IrreflexiveGraph.Zero) X:IrreflexiveGraphh:¬Nonempty X.carrierD(fun aX .elim, fun dX .elim).2 X.toSrc = IrreflexiveGraph.Zero.toSrc (fun aX .elim, fun dX .elim).1X:IrreflexiveGraphh:¬Nonempty X.carrierD(fun aX .elim, fun dX .elim).2 X.toTgt = IrreflexiveGraph.Zero.toTgt (fun aX .elim, fun dX .elim).1 all_goals X:IrreflexiveGraphh:¬Nonempty X.carrierDaX:X.carrierA((fun aX .elim, fun dX .elim).2 X.toTgt) aX = (IrreflexiveGraph.Zero.toTgt (fun aX .elim, fun dX .elim).1) aX X:IrreflexiveGraphh:¬Nonempty X.carrierDaX:X.carrierA((fun aX .elim, fun dX .elim).2 X.toSrc) aX = (IrreflexiveGraph.Zero.toSrc (fun aX .elim, fun dX .elim).1) aX All goals completed! 🐙 X:IrreflexiveGraphh:¬Nonempty X.carrierDaX:X.carrierA((fun aX .elim, fun dX .elim).2 X.toTgt) aX = (IrreflexiveGraph.Zero.toTgt (fun aX .elim, fun dX .elim).1) aX All goals completed! 🐙 X:IrreflexiveGraphh:¬Nonempty X.carrierD¬Nonempty (D X) X:IrreflexiveGraphh:¬Nonempty X.carrierDg:D XFalse All goals completed! 🐙

Our proof of part (b) follows a similar approach to that of part (a) but relies instead on reasoning about the existence of arrows in X.

open IrreflexiveGraph in example : X : IrreflexiveGraph, Xor' (Nonempty (X D)) (Nonempty (A X)) := (X : IrreflexiveGraph), Xor' (Nonempty (X D)) (Nonempty (A X)) X:IrreflexiveGraphXor' (Nonempty (X D)) (Nonempty (A X)) X:IrreflexiveGraphh:Nonempty X.carrierAXor' (Nonempty (X D)) (Nonempty (A X))X:IrreflexiveGraphh:¬Nonempty X.carrierAXor' (Nonempty (X D)) (Nonempty (A X)) X:IrreflexiveGraphh:Nonempty X.carrierAXor' (Nonempty (X D)) (Nonempty (A X)) X:IrreflexiveGraphh:Nonempty X.carrierANonempty (A X) ¬Nonempty (X D) X:IrreflexiveGraphh:Nonempty X.carrierANonempty (A X)X:IrreflexiveGraphh:Nonempty X.carrierA¬Nonempty (X D) X:IrreflexiveGraphh:Nonempty X.carrierANonempty (A X)X:IrreflexiveGraphh:Nonempty X.carrierA¬Nonempty (X D) X:IrreflexiveGraphaX:X.carrierA¬Nonempty (X D) X:IrreflexiveGraphaX:X.carrierANonempty (A X) X:IrreflexiveGraphaX:X.carrierA(fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).2 A.toSrc = X.toSrc (fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).1X:IrreflexiveGraphaX:X.carrierA(fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).2 A.toTgt = X.toTgt (fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).1 all_goals X:IrreflexiveGraphaX:X.carrierAaA:A.carrierA((fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).2 A.toTgt) aA = (X.toTgt (fun x aX, fun x match x with | 0 => X.toSrc aX | 1 => X.toTgt aX).1) aA All goals completed! 🐙 X:IrreflexiveGraphaX:X.carrierA¬Nonempty (X D) X:IrreflexiveGraphaX:X.carrierAf:X DFalse All goals completed! 🐙 X:IrreflexiveGraphh:¬Nonempty X.carrierAXor' (Nonempty (X D)) (Nonempty (A X)) X:IrreflexiveGraphh:¬Nonempty X.carrierANonempty (X D) ¬Nonempty (A X) X:IrreflexiveGraphh:IsEmpty X.carrierANonempty (X D) ¬Nonempty (A X) X:IrreflexiveGraphh:IsEmpty X.carrierANonempty (X D)X:IrreflexiveGraphh:IsEmpty X.carrierA¬Nonempty (A X) X:IrreflexiveGraphh:IsEmpty X.carrierANonempty (X D) X:IrreflexiveGraphh:IsEmpty X.carrierA(fun aX h.elim aX, fun x ()).2 X.toSrc = D.toSrc (fun aX h.elim aX, fun x ()).1X:IrreflexiveGraphh:IsEmpty X.carrierA(fun aX h.elim aX, fun x ()).2 X.toTgt = D.toTgt (fun aX h.elim aX, fun x ()).1 all_goals X:IrreflexiveGraphh:IsEmpty X.carrierAaX:X.carrierA((fun aX h.elim aX, fun x ()).2 X.toTgt) aX = (D.toTgt (fun aX h.elim aX, fun x ()).1) aX All goals completed! 🐙 X:IrreflexiveGraphh:IsEmpty X.carrierA¬Nonempty (A X) X:IrreflexiveGraphh:IsEmpty X.carrierAg:A XFalse All goals completed! 🐙

Our proof of part (c) again follows a similar approach but relies this time on reasoning about the existence of a path of length two in X.

open IrreflexiveGraph in example : X : IrreflexiveGraph, Xor' (Nonempty (X A)) (Nonempty (A₂ X)) := (X : IrreflexiveGraph), Xor' (Nonempty (X A)) (Nonempty (A₂ X)) X:IrreflexiveGraphXor' (Nonempty (X A)) (Nonempty (A₂ X)) X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁Xor' (Nonempty (X A)) (Nonempty (A₂ X))X:IrreflexiveGraphh:¬ a₁ a₂, X.toSrc a₂ = X.toTgt a₁Xor' (Nonempty (X A)) (Nonempty (A₂ X)) X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁Xor' (Nonempty (X A)) (Nonempty (A₂ X)) X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁Nonempty (A₂ X) ¬Nonempty (X A) X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁Nonempty (A₂ X)X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁¬Nonempty (X A) X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁Nonempty (A₂ X)X:IrreflexiveGraphh: a₁ a₂, X.toSrc a₂ = X.toTgt a₁¬Nonempty (X A) X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁¬Nonempty (X A) X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁Nonempty (A₂ X) X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁(fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toSrc = X.toSrc (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁(fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt = X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1 all_goals X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁aA2:A₂.carrierA((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) aA2 = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) aA2 X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁aA2:Fin 2((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) aA2 = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) aA2 X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) ((fun i i) 0, ) = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) ((fun i i) 0, )X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) ((fun i i) 1, ) = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) ((fun i i) 1, ) try (X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toTgt aX₁ | 2 => X.toTgt aX₂).2 A₂.toTgt) ((fun i i) 0, ) = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toTgt aX₁ | 2 => X.toTgt aX₂).1) ((fun i i) 0, )X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) ((fun i i) 1, ) = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) ((fun i i) 1, ); X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁((fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).2 A₂.toTgt) ((fun i i) 1, ) = (X.toTgt (fun x match x with | 0 => aX₁ | 1 => aX₂, fun x match x with | 0 => X.toSrc aX₁ | 1 => X.toSrc aX₂ | 2 => X.toTgt aX₂).1) ((fun i i) 1, )) All goals completed! 🐙 X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁¬Nonempty (X A) X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁f:X AFalse X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁f:X Ah_src:(↑f).2 (X.toSrc aX₂) = A.toSrc ((↑f).1 aX₂)False X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁f:X Ah_src:(↑f).2 (X.toSrc aX₂) = A.toSrc ((↑f).1 aX₂)h_tgt:(↑f).2 (X.toTgt aX₁) = A.toTgt ((↑f).1 aX₁)False X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁f:X Ah_src:A.toTgt ((↑f).1 aX₁) = A.toSrc ((↑f).1 aX₂)h_tgt:(↑f).2 (X.toTgt aX₁) = A.toTgt ((↑f).1 aX₁)False X:IrreflexiveGraphaX₁:X.carrierAaX₂:X.carrierAhaX:X.toSrc aX₂ = X.toTgt aX₁f:X Ah_tgt:(↑f).2 (X.toTgt aX₁) = A.toTgt ((↑f).1 aX₁)h_src:1 = 0False All goals completed! 🐙 X:IrreflexiveGraphh:¬ a₁ a₂, X.toSrc a₂ = X.toTgt a₁Xor' (Nonempty (X A)) (Nonempty (A₂ X)) X:IrreflexiveGraphh:¬ a₁ a₂, X.toSrc a₂ = X.toTgt a₁Nonempty (X A) ¬Nonempty (A₂ X) X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁Nonempty (X A) ¬Nonempty (A₂ X) X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁Nonempty (X A)X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁¬Nonempty (A₂ X) X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁Nonempty (X A) classical X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁(fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).2 X.toSrc = A.toSrc (fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).1X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁(fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).2 X.toTgt = A.toTgt (fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).1 all_goals X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁aX:X.carrierA((fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).2 X.toTgt) aX = (A.toTgt (fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).1) aX X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁aX:X.carrierA((fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).2 X.toSrc) aX = (A.toSrc (fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).1) aX All goals completed! 🐙 X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁aX:X.carrierA((fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).2 X.toTgt) aX = (A.toTgt (fun x (), fun dX if aX, X.toTgt aX = dX then 1 else 0).1) aX X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁aX:X.carrierA(if aX_1, X.toTgt aX_1 = X.toTgt aX then 1 else 0) = 1 All goals completed! 🐙 X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁¬Nonempty (A₂ X) X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁g:A₂ XFalse X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁g:A₂ Xh_src:((↑g).2 A₂.toSrc) 1 = (X.toSrc (↑g).1) 1False X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁g:A₂ Xh_src:((↑g).2 A₂.toSrc) 1 = (X.toSrc (↑g).1) 1h_tgt:((↑g).2 A₂.toTgt) 0 = (X.toTgt (↑g).1) 0False X:IrreflexiveGraphh: (a₁ a₂ : X.carrierA), X.toSrc a₂ X.toTgt a₁g:A₂ Xh_src:((↑g).2 A₂.toSrc) 1 = (X.toSrc (↑g).1) 1h_tgt:((↑g).2 A₂.toTgt) 0 = (X.toTgt (↑g).1) 0this:(X.toSrc (↑g).1) 1 = (X.toTgt (↑g).1) 0False All goals completed! 🐙

TODO Exercise 25.4 (d)

2. Calculating the graphs A ⨯ Y🔗

Exercise 5 (p. 274)

In this exercise, {B =}

def B : IrreflexiveGraph := { carrierA := Fin 2 carrierD := Fin 3 toSrc := fun | 0 => 0 | 1 => 1 toTgt := fun | 0 => 1 | 1 => 2 }

and {C =}

def C : IrreflexiveGraph := { carrierA := Fin 2 carrierD := Fin 3 toSrc := fun | 0 => 0 | 1 => 1 toTgt := fun | 0 => 1 | 1 => 0 }

Show that B is not isomorphic to C, but that {A \times B} is isomorphic to {A \times C}. (We already know examples of the 'failure of cancellation': {\mathbf{0} \times X} and {\mathbf{0} \times Y} are isomorphic for every X and Y; we also saw that {D \times A} is isomorphic to {D \times \mathbf{2}}. This exercise shows that cancellation can fail even when the factor we want to cancel is more 'substantial'.)

Solution: Exercise 5

We show that B is not isomorphic to C by proving that there is no valid morphism from C to B.

example : IsEmpty (B C) := IsEmpty (B C) (a : B C), False hom✝:B Cg:C Bhom_inv_id✝:g hom✝ = 𝟙 Binv_hom_id✝:hom✝ g = 𝟙 CFalse have h_false : (gA : Fin 2 Fin 2) (gD : Fin 3 Fin 3), ( a : Fin 2, gD (C.toSrc a) = B.toSrc (gA a)) ( a : Fin 2, gD (C.toTgt a) = B.toTgt (gA a)) False := IsEmpty (B C) All goals completed! 🐙 All goals completed! 🐙

To show that {A \times B} is isomorphic to {A \times C}, we first extend our IrreflexiveGraph category to allow use of the infix operator for the categorical product.

def IrreflexiveGraph.prodObj (X Y : IrreflexiveGraph) : IrreflexiveGraph := { carrierA := X.carrierA × Y.carrierA carrierD := X.carrierD × Y.carrierD toSrc := fun p (X.toSrc p.1, Y.toSrc p.2) toTgt := fun p (X.toTgt p.1, Y.toTgt p.2) } def IrreflexiveGraph.fstHom (X Y : IrreflexiveGraph) : prodObj X Y X := (Prod.fst, Prod.fst), rfl, rfl def IrreflexiveGraph.sndHom (X Y : IrreflexiveGraph) : prodObj X Y Y := (Prod.snd, Prod.snd), rfl, rfl def IrreflexiveGraph.binaryFan (X Y : IrreflexiveGraph) : BinaryFan X Y := BinaryFan.mk (fstHom X Y) (sndHom X Y) def IrreflexiveGraph.isLimit (X Y : IrreflexiveGraph) : IsLimit (binaryFan X Y) := BinaryFan.isLimitMk (fun s (fun a (s.fst.val.1 a, s.snd.val.1 a), fun d (s.fst.val.2 d, s.snd.val.2 d)), X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Y(fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toSrc = (X.prodObj Y).toSrc (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1 (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt = (X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1 X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Y(fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toSrc = (X.prodObj Y).toSrc (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Y(fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt = (X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1 X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Y(fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toSrc = (X.prodObj Y).toSrc (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Y(fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt = (X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1 (X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt) a = ((X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a; X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt) a).1 = (((X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).1X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt) a).2 = (((X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).2) X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toSrc) a).1 = (((X.prodObj Y).toSrc (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).1 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toSrc) a).2 = (((X.prodObj Y).toSrc (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).2 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt) a).1 = (((X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).1 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphs:BinaryFan X Ya:s.pt.carrierA(((fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).2 s.pt.toTgt) a).2 = (((X.prodObj Y).toTgt (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)).1) a).2 All goals completed! 🐙) (fun _ X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X YX.fstHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝ = x✝.fst X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.fstHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).1 = (↑x✝.fst).1X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.fstHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).2 = (↑x✝.fst).2 X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.fstHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).1 = (↑x✝.fst).1X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.fstHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).2 = (↑x✝.fst).2 All goals completed! 🐙) (fun _ X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X YX.sndHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝ = x✝.snd X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.sndHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).1 = (↑x✝.snd).1X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.sndHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).2 = (↑x✝.snd).2 X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.sndHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).1 = (↑x✝.snd).1X:IrreflexiveGraphY:IrreflexiveGraphx✝:BinaryFan X Y(↑(X.sndHom Y (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝)).2 = (↑x✝.snd).2 All goals completed! 🐙) (fun _ _ hm₁ hm₂ X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx✝ = (fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹ X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.snd(↑x✝).1 = (↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).1X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.snd(↑x✝).2 = (↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.snd(↑x✝).1 = (↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).1X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.snd(↑x✝).2 = (↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 (X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierD(↑x✝).2 x = (↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 x; X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierD((↑x✝).2 x).1 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 x).1X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierD((↑x✝).2 x).2 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 x).2) X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierA((↑x✝).1 x).1 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).1 x).1 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierA((↑x✝).1 x).2 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).1 x).2 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierD((↑x✝).2 x).1 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 x).1 All goals completed! 🐙 X:IrreflexiveGraphY:IrreflexiveGraphx✝¹:BinaryFan X Yx✝:x✝¹.pt X.prodObj Yhm₁:X.fstHom Y x✝ = x✝¹.fsthm₂:X.sndHom Y x✝ = x✝¹.sndx:x✝¹.pt.carrierD((↑x✝).2 x).2 = ((↑((fun s (fun a ((↑s.fst).1 a, (↑s.snd).1 a), fun d ((↑s.fst).2 d, (↑s.snd).2 d)), ) x✝¹)).2 x).2 All goals completed! 🐙) open IrreflexiveGraph in instance (X Y : IrreflexiveGraph) : HasBinaryProduct X Y := HasLimit.mk binaryFan X Y, isLimit X Y

We then construct an isomorphism between {A \times B} and {A \times C} by applying the identity mapping to the arrows and swapping the dots {(1, 2)} and {(1, 0)}. This permutation aligns the target of the second arrow in the product graphs, exactly compensating for the structural difference between B and C.

def swapD : Fin 2 × Fin 3 Fin 2 × Fin 3 | (1, 2) => (1, 0) | (1, 0) => (1, 2) | d => d open IrreflexiveGraph in noncomputable example : A B A C := A B A C have h_iso : prodObj A B prodObj A C := { hom := (id, swapD), (id, swapD).2 (A.prodObj B).toSrc = (A.prodObj C).toSrc (id, swapD).1 (id, swapD).2 (A.prodObj B).toTgt = (A.prodObj C).toTgt (id, swapD).1 (id, swapD).2 (A.prodObj B).toSrc = (A.prodObj C).toSrc (id, swapD).1(id, swapD).2 (A.prodObj B).toTgt = (A.prodObj C).toTgt (id, swapD).1 all_goals fst✝:A.carrierAaB:B.carrierA((id, swapD).2 (A.prodObj B).toTgt) (fst✝, aB) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, aB) fst✝:A.carrierAaB:Fin 2((id, swapD).2 (A.prodObj B).toTgt) (fst✝, aB) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, aB) fst✝:A.carrierA((id, swapD).2 (A.prodObj B).toTgt) (fst✝, (fun i i) 0, ) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, (fun i i) 0, )fst✝:A.carrierA((id, swapD).2 (A.prodObj B).toTgt) (fst✝, (fun i i) 1, ) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, (fun i i) 1, ) fst✝:A.carrierA((id, swapD).2 (A.prodObj B).toTgt) (fst✝, (fun i i) 0, ) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, (fun i i) 0, )fst✝:A.carrierA((id, swapD).2 (A.prodObj B).toTgt) (fst✝, (fun i i) 1, ) = ((A.prodObj C).toTgt (id, swapD).1) (fst✝, (fun i i) 1, ) All goals completed! 🐙 inv := (id, swapD), (id, swapD).2 (A.prodObj C).toSrc = (A.prodObj B).toSrc (id, swapD).1 (id, swapD).2 (A.prodObj C).toTgt = (A.prodObj B).toTgt (id, swapD).1 (id, swapD).2 (A.prodObj C).toSrc = (A.prodObj B).toSrc (id, swapD).1(id, swapD).2 (A.prodObj C).toTgt = (A.prodObj B).toTgt (id, swapD).1 all_goals fst✝:A.carrierAaB:C.carrierA((id, swapD).2 (A.prodObj C).toTgt) (fst✝, aB) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, aB) fst✝:A.carrierAaB:Fin 2((id, swapD).2 (A.prodObj C).toTgt) (fst✝, aB) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, aB) fst✝:A.carrierA((id, swapD).2 (A.prodObj C).toTgt) (fst✝, (fun i i) 0, ) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, (fun i i) 0, )fst✝:A.carrierA((id, swapD).2 (A.prodObj C).toTgt) (fst✝, (fun i i) 1, ) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, (fun i i) 1, ) fst✝:A.carrierA((id, swapD).2 (A.prodObj C).toTgt) (fst✝, (fun i i) 0, ) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, (fun i i) 0, )fst✝:A.carrierA((id, swapD).2 (A.prodObj C).toTgt) (fst✝, (fun i i) 1, ) = ((A.prodObj B).toTgt (id, swapD).1) (fst✝, (fun i i) 1, ) All goals completed! 🐙 hom_inv_id := (id, swapD), (id, swapD), = 𝟙 (A.prodObj B) (↑((id, swapD), (id, swapD), )).1 = (↑(𝟙 (A.prodObj B))).1(↑((id, swapD), (id, swapD), )).2 = (↑(𝟙 (A.prodObj B))).2 (↑((id, swapD), (id, swapD), )).1 = (↑(𝟙 (A.prodObj B))).1 All goals completed! 🐙 (↑((id, swapD), (id, swapD), )).2 = (↑(𝟙 (A.prodObj B))).2 dA:A.carrierDdB:B.carrierD(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj B))).2 (dA, dB) dB:B.carrierDdA:Fin 2(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj B))).2 (dA, dB) dA:Fin 2dB:Fin 3(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj B))).2 (dA, dB) dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , dB) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 0, , dB)dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , dB) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , dB) dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , dB) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 0, , dB)dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , dB) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , dB) (↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 2, ) (↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 0, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 0, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 0, , (fun i i) 2, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj B))).2 ((fun i i) 1, , (fun i i) 2, ) All goals completed! 🐙 inv_hom_id := (id, swapD), (id, swapD), = 𝟙 (A.prodObj C) (↑((id, swapD), (id, swapD), )).1 = (↑(𝟙 (A.prodObj C))).1(↑((id, swapD), (id, swapD), )).2 = (↑(𝟙 (A.prodObj C))).2 (↑((id, swapD), (id, swapD), )).1 = (↑(𝟙 (A.prodObj C))).1 All goals completed! 🐙 (↑((id, swapD), (id, swapD), )).2 = (↑(𝟙 (A.prodObj C))).2 dA:A.carrierDdB:C.carrierD(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj C))).2 (dA, dB) dB:C.carrierDdA:Fin 2(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj C))).2 (dA, dB) dA:Fin 2dB:Fin 3(↑((id, swapD), (id, swapD), )).2 (dA, dB) = (↑(𝟙 (A.prodObj C))).2 (dA, dB) dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , dB) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 0, , dB)dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , dB) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , dB) dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , dB) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 0, , dB)dB:Fin 3(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , dB) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , dB) (↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 2, ) (↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 0, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 0, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 0, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 0, , (fun i i) 2, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 0, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 0, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 1, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 1, )(↑((id, swapD), (id, swapD), )).2 ((fun i i) 1, , (fun i i) 2, ) = (↑(𝟙 (A.prodObj C))).2 ((fun i i) 1, , (fun i i) 2, ) All goals completed! 🐙 } calc A B _ prodObj A B := limit.isoLimitCone _, isLimit A B _ prodObj A C := h_iso _ A C := (limit.isoLimitCone _, isLimit A C).symm

3. The distributive law🔗

Exercise 6 (p. 275)

Assuming that X, B_1 and B_2 are objects of a category with sums and products, construct a map from the sum of {X \times B_1} and {X \times B_2} to the product of X with {B_1 + B_2}, i.e. construct a map (X \times B_1) + (X \times B_2) \rightarrow X \times (B_1 + B_2) Hint: Use the universal mapping properties of sum and product, and combine appropriate injections and projections.

Solution: Exercise 6

By the universal mapping property of the sum, to construct a map from {(X \times B_1) + (X \times B_2)} to {X \times (B_1 + B_2)}, it suffices to construct maps from {X \times B_1} and {X \times B_2} to {X \times (B_1 + B_2)}. We can construct these maps using the universal mapping property of the product.

noncomputable example {𝒞 : Type u} [Category.{v, u} 𝒞] {X B₁ B₂ : 𝒞} [HasBinaryProducts 𝒞] [HasBinaryCoproducts 𝒞] : (X B₁) ⨿ (X B₂) X (B₁ ⨿ B₂) := coprod.desc (prod.lift prod.fst (coprod.inl prod.snd)) (prod.lift prod.fst (coprod.inr prod.snd))