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
}
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 _ => ()
}
(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' ⊚ j⊢ f' = 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' ⊚ j⊢ k ⊚ 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' ⊚ j⊢ k ⊚ 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' ⊚ 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' ⊚ j⊢ k ⊚ 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' ⊚ 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' ⊚ 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 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 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 = f⊢ x = 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 = f⊢ f (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 = 1⊢ x = 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 = 0⊢ 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 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 = 1⊢ x = 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 = 0⊢ x = 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 = s⊢ False
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 ↦ 0⊢ False
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 0⊢ False
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₀ ⊚ j⊢ False
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 = s⊢ 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 = s⊢ 0 = 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:S⊢ f' 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:S⊢ f' (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 2⊢ TwoD.toSrc (mkTwoDArrow s t) = s
t:Fin 2⊢ TwoD.toSrc (mkTwoDArrow ((fun i ↦ i) ⟨0, ⋯⟩) t) = (fun i ↦ i) ⟨0, ⋯⟩t:Fin 2⊢ TwoD.toSrc (mkTwoDArrow ((fun i ↦ i) ⟨1, ⋯⟩) t) = (fun i ↦ i) ⟨1, ⋯⟩ t:Fin 2⊢ TwoD.toSrc (mkTwoDArrow ((fun i ↦ i) ⟨0, ⋯⟩) t) = (fun i ↦ i) ⟨0, ⋯⟩t:Fin 2⊢ TwoD.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 2⊢ TwoD.toTgt (mkTwoDArrow s t) = t
t:Fin 2⊢ TwoD.toTgt (mkTwoDArrow ((fun i ↦ i) ⟨0, ⋯⟩) t) = tt:Fin 2⊢ TwoD.toTgt (mkTwoDArrow ((fun i ↦ i) ⟨1, ⋯⟩) t) = t t:Fin 2⊢ TwoD.toTgt (mkTwoDArrow ((fun i ↦ i) ⟨0, ⋯⟩) t) = tt:Fin 2⊢ TwoD.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.carrierA⊢ liftTwoA (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.carrierD⊢ liftTwoD (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.carrierA⊢ mkTwoDArrow (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.carrierA⊢ mkTwoDArrow (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₂).1⊢ fA' = (↑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₂).1⊢ liftTwoA 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₂).1⊢ liftTwoA 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₂.carrierA⊢ kA 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₁.carrierA⊢ kA (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₂.carrierA⊢ kA (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' ⊚ jA⊢ fA' = 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' ⊚ jA⊢ kA ⊚ 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' ⊚ jA⊢ kA ⊚ 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' ⊚ jA⊢ 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' ⊚ jA⊢ kA ⊚ 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' ⊚ jA⊢ 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' ⊚ 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₂.carrierA⊢ jA 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 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 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 = fA⊢ 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 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 0⊢ x = 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) x⊢ x = 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) 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 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 0⊢ 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 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 = 1⊢ x = 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 = 0⊢ 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 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 = 1⊢ x = 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 = 0⊢ x = 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 = sA⊢ 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 ↦ 0⊢ 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 0⊢ 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₀ ⊚ jA⊢ False
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₂.carrierA⊢ 0 = (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 = sA⊢ 0 = (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 = sA⊢ 0 = 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₀ sA⊢ 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₁ sA⊢ 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 = if sA = sA then 1 else 0⊢ 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 = 1⊢ False
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₂).2⊢ fD' = (↑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₂).2⊢ liftTwoD 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₂).2⊢ liftTwoD 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₂.carrierD⊢ kD 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₁.carrierD⊢ kD (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₂.carrierD⊢ kD (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' ⊚ jD⊢ fD' = 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' ⊚ jD⊢ kD ⊚ 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' ⊚ jD⊢ kD ⊚ 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' ⊚ jD⊢ 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' ⊚ jD⊢ kD ⊚ 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' ⊚ jD⊢ 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' ⊚ 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₂.carrierD⊢ jD 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 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 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 = fD⊢ 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 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 0⊢ x = 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) x⊢ x = 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) 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 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 0⊢ 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 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 = 1⊢ x = 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 = 0⊢ 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 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 = 1⊢ x = 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 = 0⊢ x = 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 = sD⊢ 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 ↦ 0⊢ 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 0⊢ 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₀ ⊚ jD⊢ False
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₂.carrierD⊢ 0 = (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 = sD⊢ 0 = (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 = sD⊢ 0 = 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₀ sD⊢ 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₁ sD⊢ 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 = if sD = sD then 1 else 0⊢ 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 = 1⊢ False
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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₁.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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₂.carrierA⊢ Sum.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! 🐙
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 c⊢ IsTricolouring Y (inducedColouring f c)
Y:IrreflexiveGraphX:IrreflexiveGraphf:Y ⟶ Xc:X.carrierD ⟶ Tricolourh:IsTricolouring X ca:Y.carrierA⊢ inducedColouring f c (Y.toSrc a) ≠ inducedColouring f c (Y.toTgt a)
Y:IrreflexiveGraphX:IrreflexiveGraphf:Y ⟶ Xc:X.carrierD ⟶ Tricolourh:IsTricolouring X ca:Y.carrierA⊢ c (((↑f).2 ⊚ Y.toSrc) a) ≠ c (((↑f).2 ⊚ Y.toTgt) a)
Y:IrreflexiveGraphX:IrreflexiveGraphf:Y ⟶ Xc:X.carrierD ⟶ Tricolourh:IsTricolouring X ca:Y.carrierA⊢ c ((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 c⊢ IsTricolouring' Y (inducedColouring' f c)
Y:IrreflexiveGraphX:IrreflexiveGraphf:Y ⟶ Xc:Dot X ⟶ Tricolourh:IsTricolouring' X ca:Y.carrierA⊢ inducedColouring' f c (srcDot a) ≠ inducedColouring' f c (tgtDot a)
Y:IrreflexiveGraphX:IrreflexiveGraphf:Y ⟶ Xc:Dot X ⟶ Tricolourh:IsTricolouring' X ca:Y.carrierA⊢ c (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 c⊢ IsTricolouring' 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 c⊢ IsTricolouring' 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! 🐙
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:IrreflexiveGraph⊢ Xor' (Nonempty (X ⟶ IrreflexiveGraph.Zero)) (Nonempty (D ⟶ X))
X:IrreflexiveGraphh:Nonempty X.carrierD⊢ Xor' (Nonempty (X ⟶ IrreflexiveGraph.Zero)) (Nonempty (D ⟶ X))X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ Xor' (Nonempty (X ⟶ IrreflexiveGraph.Zero)) (Nonempty (D ⟶ X))
X:IrreflexiveGraphh:Nonempty X.carrierD⊢ Xor' (Nonempty (X ⟶ IrreflexiveGraph.Zero)) (Nonempty (D ⟶ X)) X:IrreflexiveGraphh:Nonempty X.carrierD⊢ Nonempty (D ⟶ X) ∧ ¬Nonempty (X ⟶ IrreflexiveGraph.Zero)
X:IrreflexiveGraphh:Nonempty X.carrierD⊢ Nonempty (D ⟶ X)X:IrreflexiveGraphh:Nonempty X.carrierD⊢ ¬Nonempty (X ⟶ IrreflexiveGraph.Zero) X:IrreflexiveGraphh:Nonempty X.carrierD⊢ Nonempty (D ⟶ X)X:IrreflexiveGraphh:Nonempty X.carrierD⊢ ¬Nonempty (X ⟶ IrreflexiveGraph.Zero) X:IrreflexiveGraphdX:X.carrierD⊢ ¬Nonempty (X ⟶ IrreflexiveGraph.Zero)
X:IrreflexiveGraphdX:X.carrierD⊢ Nonempty (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.Zero⊢ False
All goals completed! 🐙
X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ Xor' (Nonempty (X ⟶ IrreflexiveGraph.Zero)) (Nonempty (D ⟶ X)) X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ Nonempty (X ⟶ IrreflexiveGraph.Zero) ∧ ¬Nonempty (D ⟶ X)
X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ Nonempty (X ⟶ IrreflexiveGraph.Zero)X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ ¬Nonempty (D ⟶ X)
X:IrreflexiveGraphh:¬Nonempty X.carrierD⊢ Nonempty (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 ⟶ X⊢ False
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:IrreflexiveGraph⊢ Xor' (Nonempty (X ⟶ D)) (Nonempty (A ⟶ X))
X:IrreflexiveGraphh:Nonempty X.carrierA⊢ Xor' (Nonempty (X ⟶ D)) (Nonempty (A ⟶ X))X:IrreflexiveGraphh:¬Nonempty X.carrierA⊢ Xor' (Nonempty (X ⟶ D)) (Nonempty (A ⟶ X))
X:IrreflexiveGraphh:Nonempty X.carrierA⊢ Xor' (Nonempty (X ⟶ D)) (Nonempty (A ⟶ X)) X:IrreflexiveGraphh:Nonempty X.carrierA⊢ Nonempty (A ⟶ X) ∧ ¬Nonempty (X ⟶ D)
X:IrreflexiveGraphh:Nonempty X.carrierA⊢ Nonempty (A ⟶ X)X:IrreflexiveGraphh:Nonempty X.carrierA⊢ ¬Nonempty (X ⟶ D) X:IrreflexiveGraphh:Nonempty X.carrierA⊢ Nonempty (A ⟶ X)X:IrreflexiveGraphh:Nonempty X.carrierA⊢ ¬Nonempty (X ⟶ D) X:IrreflexiveGraphaX:X.carrierA⊢ ¬Nonempty (X ⟶ D)
X:IrreflexiveGraphaX:X.carrierA⊢ Nonempty (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 ⟶ D⊢ False
All goals completed! 🐙
X:IrreflexiveGraphh:¬Nonempty X.carrierA⊢ Xor' (Nonempty (X ⟶ D)) (Nonempty (A ⟶ X)) X:IrreflexiveGraphh:¬Nonempty X.carrierA⊢ Nonempty (X ⟶ D) ∧ ¬Nonempty (A ⟶ X)
X:IrreflexiveGraphh:IsEmpty X.carrierA⊢ Nonempty (X ⟶ D) ∧ ¬Nonempty (A ⟶ X)
X:IrreflexiveGraphh:IsEmpty X.carrierA⊢ Nonempty (X ⟶ D)X:IrreflexiveGraphh:IsEmpty X.carrierA⊢ ¬Nonempty (A ⟶ X)
X:IrreflexiveGraphh:IsEmpty X.carrierA⊢ Nonempty (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 ⟶ X⊢ False
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:IrreflexiveGraph⊢ 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₁⊢ 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 ⟶ A⊢ 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₂)⊢ 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 = 0⊢ False
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₂ ⟶ X⊢ False
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) 1⊢ False
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) 0⊢ False
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) 0⊢ False
All goals completed! 🐙
TODO Exercise 25.4 (d)
2. Calculating the graphs A ⨯ Y
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 = 𝟙 C⊢ False
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 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✝ = 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 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✝ = 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✝¹.snd⊢ x✝ = (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
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))