A Lean Companion to Conceptual Mathematics

Session 21: Products in categoriesπŸ”—

Definition: Product (p. 237)

Suppose that A and B are objects in a category π’ž. A product of A and B (in π’ž) is

  1. an object P in π’ž, and

  2. a pair of maps, {P \xrightarrow{p_1} A}, {P \xrightarrow{p_2} B}, in π’ž satisfying:

for every object T and every pair of maps {T \xrightarrow{q_1} A}, {T \xrightarrow{q_2} B}, there is exactly one map {T \xrightarrow{q} P} for which {q_1 = p_1 \circ q} and {q_2 = p_2 \circ q}.

See the earlier definition of product on p. 217.

Theorem (p. 239)

Suppose that {A \xleftarrow{p_1} P \xrightarrow{p_2} B} and {A \xleftarrow{q_1} Q \xrightarrow{q_2} B}, are two products of A and B. Because {A \xleftarrow{p_1} P \xrightarrow{p_2} B} is a product, viewing Q as a 'test object' gives a map {Q \rightarrow P}; because {A \xleftarrow{q_1} Q \xrightarrow{q_2} B} is a product, we also get a map {P \rightarrow Q}. These two maps are necessarily inverse to each other, and therefore the two objects P, Q are isomorphic.

We provided a proof of this theorem in Exercise 12 of Article IV using the mathlib API for (binary) products. We repeat that proof here, but this time using only the book definition.

theorem uniqueness_of_products' {π’ž : Type u} [Category.{v, u} π’ž] (A B P Q : π’ž) (p₁ : P ⟢ A) (pβ‚‚ : P ⟢ B) (hP : βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), (βˆƒ! t : T ⟢ P, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ t)) (q₁ : Q ⟢ A) (qβ‚‚ : Q ⟢ B) (hQ : βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), (βˆƒ! t : T ⟢ Q, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ t)) : Nonempty (P β‰… Q) := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ t⊒ Nonempty (P β‰… Q) π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = f⊒ Nonempty (P β‰… Q) π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ Nonempty (P β‰… Q) have hgf : g ⊚ f = πŸ™ P := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ t⊒ Nonempty (P β‰… Q) π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ g ⊚ f ∧ pβ‚‚ = pβ‚‚ ⊚ g ⊚ fπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ πŸ™ P ∧ pβ‚‚ = pβ‚‚ ⊚ πŸ™ P π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ g ⊚ f ∧ pβ‚‚ = pβ‚‚ ⊚ g ⊚ f π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ g ⊚ fπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ = pβ‚‚ ⊚ g ⊚ f π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ g ⊚ f π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ ⊚ g ⊚ f = p₁ calc p₁ ⊚ (g ⊚ f) _ = (p₁ ⊚ g) ⊚ f := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ ⊚ g ⊚ f = (p₁ ⊚ g) ⊚ f All goals completed! πŸ™ _ = q₁ ⊚ f := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ (p₁ ⊚ g) ⊚ f = q₁ ⊚ f All goals completed! πŸ™ _ = p₁ := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ q₁ ⊚ f = p₁ All goals completed! πŸ™ π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ = pβ‚‚ ⊚ g ⊚ f π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ ⊚ g ⊚ f = pβ‚‚ calc pβ‚‚ ⊚ (g ⊚ f) _ = (pβ‚‚ ⊚ g) ⊚ f := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ ⊚ g ⊚ f = (pβ‚‚ ⊚ g) ⊚ f All goals completed! πŸ™ _ = qβ‚‚ ⊚ f := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ (pβ‚‚ ⊚ g) ⊚ f = qβ‚‚ ⊚ f All goals completed! πŸ™ _ = pβ‚‚ := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ qβ‚‚ ⊚ f = pβ‚‚ All goals completed! πŸ™ π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ πŸ™ P ∧ pβ‚‚ = pβ‚‚ ⊚ πŸ™ P π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ πŸ™ Pπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ = pβ‚‚ ⊚ πŸ™ P π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ p₁ = p₁ ⊚ πŸ™ Pπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = g⊒ pβ‚‚ = pβ‚‚ ⊚ πŸ™ P All goals completed! πŸ™ have hfg : f ⊚ g = πŸ™ Q := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ t⊒ Nonempty (P β‰… Q) π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ f ⊚ g ∧ qβ‚‚ = qβ‚‚ ⊚ f ⊚ gπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ πŸ™ Q ∧ qβ‚‚ = qβ‚‚ ⊚ πŸ™ Q π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ f ⊚ g ∧ qβ‚‚ = qβ‚‚ ⊚ f ⊚ g π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ f ⊚ gπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ = qβ‚‚ ⊚ f ⊚ g π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ f ⊚ g π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ ⊚ f ⊚ g = q₁ calc q₁ ⊚ (f ⊚ g) _ = (q₁ ⊚ f) ⊚ g := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ ⊚ f ⊚ g = (q₁ ⊚ f) ⊚ g All goals completed! πŸ™ _ = p₁ ⊚ g := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ (q₁ ⊚ f) ⊚ g = p₁ ⊚ g All goals completed! πŸ™ _ = q₁ := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ p₁ ⊚ g = q₁ All goals completed! πŸ™ π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ = qβ‚‚ ⊚ f ⊚ g π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ ⊚ f ⊚ g = qβ‚‚ calc qβ‚‚ ⊚ (f ⊚ g) _ = (qβ‚‚ ⊚ f) ⊚ g := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ ⊚ f ⊚ g = (qβ‚‚ ⊚ f) ⊚ g All goals completed! πŸ™ _ = pβ‚‚ ⊚ g := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ (qβ‚‚ ⊚ f) ⊚ g = pβ‚‚ ⊚ g All goals completed! πŸ™ _ = qβ‚‚ := π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ pβ‚‚ ⊚ g = qβ‚‚ All goals completed! πŸ™ π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ πŸ™ Q ∧ qβ‚‚ = qβ‚‚ ⊚ πŸ™ Q π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ πŸ™ Qπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ = qβ‚‚ ⊚ πŸ™ Q π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ q₁ = q₁ ⊚ πŸ™ Qπ’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩⊒ qβ‚‚ = qβ‚‚ ⊚ πŸ™ Q All goals completed! πŸ™ π’ž:Type uinst✝:Category.{v, u} π’žA:π’žB:π’žP:π’žQ:π’žp₁:P ⟢ Apβ‚‚:P ⟢ BhP:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = p₁ ⊚ t ∧ tβ‚‚ = pβ‚‚ ⊚ tq₁:Q ⟢ Aqβ‚‚:Q ⟢ BhQ:βˆ€ (T : π’ž) (t₁ : T ⟢ A) (tβ‚‚ : T ⟢ B), βˆƒ! t, t₁ = q₁ ⊚ t ∧ tβ‚‚ = qβ‚‚ ⊚ tf:P ⟢ Qhf_comm:p₁ = q₁ ⊚ f ∧ pβ‚‚ = qβ‚‚ ⊚ fright✝¹:βˆ€ (y : P ⟢ Q), (fun t ↦ p₁ = q₁ ⊚ t ∧ pβ‚‚ = qβ‚‚ ⊚ t) y β†’ y = fg:Q ⟢ Phg_comm:q₁ = p₁ ⊚ g ∧ qβ‚‚ = pβ‚‚ ⊚ gright✝:βˆ€ (y : Q ⟢ P), (fun t ↦ q₁ = p₁ ⊚ t ∧ qβ‚‚ = pβ‚‚ ⊚ t) y β†’ y = ghgf:g ⊚ f = πŸ™ P := ExistsUnique.unique (hP P p₁ pβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (p₁ ⊚ g) ⊚ f) (Category.assoc f g p₁))) (Eq.refl ((p₁ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = q₁ ⊚ f) (Eq.symm hg_comm.left))) (Eq.refl (q₁ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = p₁) (Eq.symm hf_comm.left))) (Eq.refl p₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (pβ‚‚ ⊚ g) ⊚ f) (Category.assoc f g pβ‚‚))) (Eq.refl ((pβ‚‚ ⊚ g) ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ f = qβ‚‚ ⊚ f) (Eq.symm hg_comm.right))) (Eq.refl (qβ‚‚ ⊚ f)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = pβ‚‚) (Eq.symm hf_comm.right))) (Eq.refl pβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ p₁ = _a) (Category.id_comp p₁))) (Eq.refl p₁), Eq.mpr (id (congrArg (fun _a ↦ pβ‚‚ = _a) (Category.id_comp pβ‚‚))) (Eq.refl pβ‚‚)⟩hfg:f ⊚ g = πŸ™ Q := ExistsUnique.unique (hQ Q q₁ qβ‚‚) ⟨Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (q₁ ⊚ f) ⊚ g) (Category.assoc g f q₁))) (Eq.refl ((q₁ ⊚ f) ⊚ g)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ g = p₁ ⊚ g) (Eq.symm hf_comm.left))) (Eq.refl (p₁ ⊚ g)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = q₁) (Eq.symm hg_comm.left))) (Eq.refl q₁))), Eq.symm (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a ↦ _a = (qβ‚‚ ⊚ f) ⊚ g) (Category.assoc g f qβ‚‚))) (Eq.refl ((qβ‚‚ ⊚ f) ⊚ g)))) (Eq.mpr (id (congrArg (fun _a ↦ _a ⊚ g = pβ‚‚ ⊚ g) (Eq.symm hf_comm.right))) (Eq.refl (pβ‚‚ ⊚ g)))) (Eq.mpr (id (congrArg (fun _a ↦ _a = qβ‚‚) (Eq.symm hg_comm.right))) (Eq.refl qβ‚‚)))⟩ ⟨Eq.mpr (id (congrArg (fun _a ↦ q₁ = _a) (Category.id_comp q₁))) (Eq.refl q₁), Eq.mpr (id (congrArg (fun _a ↦ qβ‚‚ = _a) (Category.id_comp qβ‚‚))) (Eq.refl qβ‚‚)⟩⊒ P β‰… Q All goals completed! πŸ™
Exercise 1 (p. 241)

Is there a map in 𝑺↻ from the 'day clock'

abbrev dayClock : SetWithEndomap := { carrier := Fin 24 toEnd := (Β· + 1) }

to some X^{↻\alpha} which together with the ['shift clock' and map]

abbrev shiftClock : SetWithEndomap := { carrier := Fin 8 toEnd := (Β· + 1) } def p₁ : dayClock ⟢ shiftClock := ⟨ fun n ↦ Fin.ofNat 8 n, ⊒ (fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd = shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n x:dayClock.carrier⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) x = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) x ⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨0, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨0, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨1, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨1, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨2, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨2, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨3, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨3, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨4, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨4, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨5, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨5, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨6, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨6, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨7, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨7, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨8, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨8, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨9, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨9, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨10, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨10, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨11, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨11, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨12, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨12, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨13, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨13, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨14, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨14, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨15, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨15, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨16, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨16, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨17, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨17, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨18, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨18, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨19, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨19, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨20, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨20, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨21, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨21, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨22, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨22, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨23, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨23, β‹―βŸ©) ⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨0, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨0, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨1, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨1, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨2, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨2, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨3, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨3, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨4, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨4, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨5, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨5, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨6, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨6, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨7, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨7, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨8, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨8, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨9, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨9, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨10, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨10, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨11, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨11, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨12, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨12, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨13, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨13, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨14, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨14, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨15, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨15, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨16, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨16, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨17, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨17, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨18, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨18, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨19, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨19, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨20, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨20, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨21, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨21, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨22, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨22, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 8 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨23, β‹―βŸ©) = (shiftClock.toEnd ⊚ fun n ↦ Fin.ofNat 8 ↑n) ((fun i ↦ i) ⟨23, β‹―βŸ©) All goals completed! πŸ™ ⟩

makes the 'day clock' into the product of X^{↻\alpha} and the 'shift clock'?

Solution: Exercise 1

We can use a '3-hour clock' as the object X^{↻\alpha}, with the required map {\mathrm{dayClock} \rightarrow X^{↻\alpha}} given by {n \mapsto n \mod 3}.

abbrev XΞ± : SetWithEndomap := { carrier := Fin 3 toEnd := (Β· + 1) } def pβ‚‚ : dayClock ⟢ XΞ± := ⟨ fun n ↦ Fin.ofNat 3 n, ⊒ (fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd = XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n x:dayClock.carrier⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) x = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) x ⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨0, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨0, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨1, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨1, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨2, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨2, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨3, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨3, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨4, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨4, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨5, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨5, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨6, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨6, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨7, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨7, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨8, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨8, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨9, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨9, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨10, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨10, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨11, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨11, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨12, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨12, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨13, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨13, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨14, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨14, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨15, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨15, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨16, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨16, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨17, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨17, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨18, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨18, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨19, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨19, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨20, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨20, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨21, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨21, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨22, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨22, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨23, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨23, β‹―βŸ©) ⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨0, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨0, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨1, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨1, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨2, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨2, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨3, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨3, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨4, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨4, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨5, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨5, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨6, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨6, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨7, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨7, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨8, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨8, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨9, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨9, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨10, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨10, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨11, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨11, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨12, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨12, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨13, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨13, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨14, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨14, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨15, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨15, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨16, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨16, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨17, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨17, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨18, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨18, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨19, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨19, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨20, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨20, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨21, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨21, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨22, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨22, β‹―βŸ©)⊒ ((fun n ↦ Fin.ofNat 3 ↑n) ⊚ dayClock.toEnd) ((fun i ↦ i) ⟨23, β‹―βŸ©) = (XΞ±.toEnd ⊚ fun n ↦ Fin.ofNat 3 ↑n) ((fun i ↦ i) ⟨23, β‹―βŸ©) All goals completed! πŸ™ ⟩

The proof is a direct application of the Chinese Remainder Theorem (CRT), and we begin by defining some helpers:

[Isomorphism] Construct Fin 24 from Fin 8 and Fin 3 via CRT.

def crt (a : Fin 8) (b : Fin 3) : Fin 24 := Fin.ofNat 24 (9 * a.val + 16 * b.val)

[Homomorphism] Show that crt preserves (Β· + 1) structure.

lemma h_crt_comm (a : Fin 8) (b : Fin 3) : crt (a + 1) (b + 1) = crt a b + 1 := a:Fin 8b:Fin 3⊒ crt (a + 1) (b + 1) = crt a b + 1 b:Fin 3⊒ crt ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨3, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨4, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨5, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨6, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b + 1 b:Fin 3⊒ crt ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨3, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨4, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨5, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨6, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b + 1b:Fin 3⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) (b + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b + 1 ⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1 ⊒ crt ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨3, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨3, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨3, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨4, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨4, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨4, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨5, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨5, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨5, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨6, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨6, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨6, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨0, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨1, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©) + 1⊒ crt ((fun i ↦ i) ⟨7, β‹―βŸ© + 1) ((fun i ↦ i) ⟨2, β‹―βŸ© + 1) = crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©) + 1 All goals completed! πŸ™

[Commutativity] Show that p₁ ∘ crt and pβ‚‚ ∘ crt recover components.

lemma h_p₁_crt (a : Fin 8) (b : Fin 3) : p₁.val (crt a b) = a := a:Fin 8b:Fin 3⊒ ↑p₁ (crt a b) = a b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b) = (fun i ↦ i) ⟨0, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b) = (fun i ↦ i) ⟨1, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b) = (fun i ↦ i) ⟨2, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b) = (fun i ↦ i) ⟨3, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b) = (fun i ↦ i) ⟨4, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b) = (fun i ↦ i) ⟨5, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b) = (fun i ↦ i) ⟨6, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b) = (fun i ↦ i) ⟨7, β‹―βŸ© b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b) = (fun i ↦ i) ⟨0, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b) = (fun i ↦ i) ⟨1, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b) = (fun i ↦ i) ⟨2, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b) = (fun i ↦ i) ⟨3, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b) = (fun i ↦ i) ⟨4, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b) = (fun i ↦ i) ⟨5, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b) = (fun i ↦ i) ⟨6, β‹―βŸ©b:Fin 3⊒ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b) = (fun i ↦ i) ⟨7, β‹―βŸ© ⊒ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ© ⊒ ↑p₁ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨3, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨3, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨3, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨4, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨4, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨4, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨5, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨5, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨5, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨6, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨6, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨6, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ ↑p₁ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ© All goals completed! πŸ™ lemma h_pβ‚‚_crt (a : Fin 8) (b : Fin 3) : pβ‚‚.val (crt a b) = b := a:Fin 8b:Fin 3⊒ ↑pβ‚‚ (crt a b) = b b:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b) = b b:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) b) = bb:Fin 3⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) b) = b ⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ© ⊒ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨0, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨1, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨2, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨3, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨4, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨5, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨6, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ ↑pβ‚‚ (crt ((fun i ↦ i) ⟨7, β‹―βŸ©) ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ© All goals completed! πŸ™

[Uniqueness] Show that any Fin 24 decomposes into projections.

lemma h_crt_uniq (x : dayClock.carrier) : crt (p₁.val x) (pβ‚‚.val x) = x := x:dayClock.carrier⊒ crt (↑p₁ x) (↑pβ‚‚ x) = x ⊒ crt (↑p₁ ((fun i ↦ i) ⟨0, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨1, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨2, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨3, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨3, β‹―βŸ©)) = (fun i ↦ i) ⟨3, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨4, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨4, β‹―βŸ©)) = (fun i ↦ i) ⟨4, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨5, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨5, β‹―βŸ©)) = (fun i ↦ i) ⟨5, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨6, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨6, β‹―βŸ©)) = (fun i ↦ i) ⟨6, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨7, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨7, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨8, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨8, β‹―βŸ©)) = (fun i ↦ i) ⟨8, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨9, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨9, β‹―βŸ©)) = (fun i ↦ i) ⟨9, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨10, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨10, β‹―βŸ©)) = (fun i ↦ i) ⟨10, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨11, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨11, β‹―βŸ©)) = (fun i ↦ i) ⟨11, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨12, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨12, β‹―βŸ©)) = (fun i ↦ i) ⟨12, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨13, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨13, β‹―βŸ©)) = (fun i ↦ i) ⟨13, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨14, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨14, β‹―βŸ©)) = (fun i ↦ i) ⟨14, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨15, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨15, β‹―βŸ©)) = (fun i ↦ i) ⟨15, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨16, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨16, β‹―βŸ©)) = (fun i ↦ i) ⟨16, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨17, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨17, β‹―βŸ©)) = (fun i ↦ i) ⟨17, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨18, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨18, β‹―βŸ©)) = (fun i ↦ i) ⟨18, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨19, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨19, β‹―βŸ©)) = (fun i ↦ i) ⟨19, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨20, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨20, β‹―βŸ©)) = (fun i ↦ i) ⟨20, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨21, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨21, β‹―βŸ©)) = (fun i ↦ i) ⟨21, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨22, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨22, β‹―βŸ©)) = (fun i ↦ i) ⟨22, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨23, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨23, β‹―βŸ©)) = (fun i ↦ i) ⟨23, β‹―βŸ© ⊒ crt (↑p₁ ((fun i ↦ i) ⟨0, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨0, β‹―βŸ©)) = (fun i ↦ i) ⟨0, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨1, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨1, β‹―βŸ©)) = (fun i ↦ i) ⟨1, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨2, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨2, β‹―βŸ©)) = (fun i ↦ i) ⟨2, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨3, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨3, β‹―βŸ©)) = (fun i ↦ i) ⟨3, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨4, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨4, β‹―βŸ©)) = (fun i ↦ i) ⟨4, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨5, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨5, β‹―βŸ©)) = (fun i ↦ i) ⟨5, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨6, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨6, β‹―βŸ©)) = (fun i ↦ i) ⟨6, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨7, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨7, β‹―βŸ©)) = (fun i ↦ i) ⟨7, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨8, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨8, β‹―βŸ©)) = (fun i ↦ i) ⟨8, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨9, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨9, β‹―βŸ©)) = (fun i ↦ i) ⟨9, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨10, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨10, β‹―βŸ©)) = (fun i ↦ i) ⟨10, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨11, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨11, β‹―βŸ©)) = (fun i ↦ i) ⟨11, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨12, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨12, β‹―βŸ©)) = (fun i ↦ i) ⟨12, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨13, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨13, β‹―βŸ©)) = (fun i ↦ i) ⟨13, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨14, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨14, β‹―βŸ©)) = (fun i ↦ i) ⟨14, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨15, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨15, β‹―βŸ©)) = (fun i ↦ i) ⟨15, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨16, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨16, β‹―βŸ©)) = (fun i ↦ i) ⟨16, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨17, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨17, β‹―βŸ©)) = (fun i ↦ i) ⟨17, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨18, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨18, β‹―βŸ©)) = (fun i ↦ i) ⟨18, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨19, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨19, β‹―βŸ©)) = (fun i ↦ i) ⟨19, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨20, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨20, β‹―βŸ©)) = (fun i ↦ i) ⟨20, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨21, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨21, β‹―βŸ©)) = (fun i ↦ i) ⟨21, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨22, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨22, β‹―βŸ©)) = (fun i ↦ i) ⟨22, β‹―βŸ©βŠ’ crt (↑p₁ ((fun i ↦ i) ⟨23, β‹―βŸ©)) (↑pβ‚‚ ((fun i ↦ i) ⟨23, β‹―βŸ©)) = (fun i ↦ i) ⟨23, β‹―βŸ© All goals completed! πŸ™

We are now ready to prove that the 'day clock' with the given projections is the product of the 'shift clock' and our '3-hour clock' X^{↻\alpha}.

example : IsLimit (BinaryFan.mk p₁ pβ‚‚) := { -- Construct morphism f from cone point s.pt to product lift s := ⟨ fun x ↦ crt ((BinaryFan.fst s).val x) ((BinaryFan.snd s).val x), s:Cone (pair shiftClock XΞ±)⊒ (fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x) s:Cone (pair shiftClock XΞ±)x:s.pt.carrier⊒ ((fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x = ((BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) x s:Cone (pair shiftClock XΞ±)x:s.pt.carrierhf₁_comm:(↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd) x = (((pair shiftClock XΞ±).obj { as := WalkingPair.left }).toEnd ⊚ ↑(BinaryFan.fst s)) x := congr_fun (BinaryFan.fst s).property x⊒ ((fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x = ((BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) x s:Cone (pair shiftClock XΞ±)x:s.pt.carrierhf₁_comm:(↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd) x = (((pair shiftClock XΞ±).obj { as := WalkingPair.left }).toEnd ⊚ ↑(BinaryFan.fst s)) x := congr_fun (BinaryFan.fst s).property xhfβ‚‚_comm:(↑(BinaryFan.snd s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.right }).toEnd) x = (((pair shiftClock XΞ±).obj { as := WalkingPair.right }).toEnd ⊚ ↑(BinaryFan.snd s)) x := congr_fun (BinaryFan.snd s).property x⊒ ((fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x = ((BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x)) x s:Cone (pair shiftClock XΞ±)x:s.pt.carrierhf₁_comm:↑(BinaryFan.fst s) (s.pt.toEnd x) = ↑(BinaryFan.fst s) x + 1 := congr_fun (BinaryFan.fst s).property xhfβ‚‚_comm:↑(BinaryFan.snd s) (s.pt.toEnd x) = ↑(BinaryFan.snd s) x + 1 := congr_fun (BinaryFan.snd s).property x⊒ crt (↑(BinaryFan.fst s) (s.pt.toEnd x)) (↑(BinaryFan.snd s) (s.pt.toEnd x)) = crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x) + 1 All goals completed! πŸ™ ⟩ -- Verify triangle diagrams commute for both legs of cone s fac s j := s:Cone (pair shiftClock XΞ±)j:Discrete WalkingPair⊒ (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© = s.Ο€.app j s:Cone (pair shiftClock XΞ±)⊒ (BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.left } ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© = s.Ο€.app { as := WalkingPair.left }s:Cone (pair shiftClock XΞ±)⊒ (BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© = s.Ο€.app { as := WalkingPair.right } all_goals s:Cone (pair shiftClock XΞ±)⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ©) = ↑(s.Ο€.app { as := WalkingPair.right }) s:Cone (pair shiftClock XΞ±)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.right }) x first | s:Cone (pair shiftClock XΞ±)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.right }) x | All goals completed! πŸ™ -- Show morphism f is unique by decomposing it into projections uniq s f hf := s:Cone (pair shiftClock XΞ±)f:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthf:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ f = s.Ο€.app j⊒ f = ⟨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© s:Cone (pair shiftClock XΞ±)f:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthf:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ f = s.Ο€.app j⊒ ↑f = β†‘βŸ¨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© s:Cone (pair shiftClock XΞ±)f:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthf:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ f = s.Ο€.app jx:s.pt.carrier⊒ ↑f x = β†‘βŸ¨fun x ↦ crt (↑(BinaryFan.fst s) x) (↑(BinaryFan.snd s) x), β‹―βŸ© x s:Cone (pair shiftClock XΞ±)f:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthf:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ f = s.Ο€.app jx:s.pt.carrier⊒ ↑f x = crt (↑(s.Ο€.app { as := WalkingPair.left }) x) (↑(s.Ο€.app { as := WalkingPair.right }) x) s:Cone (pair shiftClock XΞ±)f:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthf:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ f = s.Ο€.app jx:s.pt.carrier⊒ crt (↑p₁ (↑f x)) (↑pβ‚‚ (↑f x)) = crt (↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.left } ⊚ f) x) (↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ f) x) All goals completed! πŸ™ }
Exercise 2 (p. 244)

What is the product {C_m \times C_n} of an m-cycle and an n-cycle? For example, what is the product {C_{12} \times C_{8}}? Hint: Start by investigating products of cycles of smaller sizes.

Solution: Exercise 2

TODO Exercise 21.2

Exercise 3 (p. 244)

Return to Exercise 3 of Session 12. Show that the object which was called {\mathbf{G} \times \mathbf{C}}, when provided with appropriate projection maps, really is the product in the category 𝑺↻↻.

Solution: Exercise 3

See Exercise 3 of Session 12 for the relevant definitions.

We begin by defining appropriate projection maps.

def p₁ : GC ⟢ G := ⟨ fun (g, _) ↦ g, ⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd = G.toEnd ⊚ fun x ↦ match x with | (g, snd) => g) ∧ (fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2 = G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g ⊒ (fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd = G.toEnd ⊚ fun x ↦ match x with | (g, snd) => g⊒ (fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2 = G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g ⊒ (fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd = G.toEnd ⊚ fun x ↦ match x with | (g, snd) => g x:GC.carrier⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd) x = (G.toEnd ⊚ fun x ↦ match x with | (g, snd) => g) x All goals completed! πŸ™ ⊒ (fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2 = G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g x₁:Genderxβ‚‚:Clan⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (x₁, xβ‚‚) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (x₁, xβ‚‚) xβ‚‚:Clan⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.female, xβ‚‚) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.female, xβ‚‚)xβ‚‚:Clan⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, xβ‚‚) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, xβ‚‚) xβ‚‚:Clan⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.female, xβ‚‚) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.female, xβ‚‚)xβ‚‚:Clan⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, xβ‚‚) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, xβ‚‚) ⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, Clan.wolf) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, Clan.wolf)⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, Clan.bear) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, Clan.bear) ⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.female, Clan.wolf) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.female, Clan.wolf)⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.female, Clan.bear) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.female, Clan.bear)⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, Clan.wolf) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, Clan.wolf)⊒ ((fun x ↦ match x with | (g, snd) => g) ⊚ GC.toEnd2) (Gender.male, Clan.bear) = (G.toEnd2 ⊚ fun x ↦ match x with | (g, snd) => g) (Gender.male, Clan.bear) All goals completed! πŸ™ ⟩ def pβ‚‚ : GC ⟢ C := ⟨ fun (_, c) ↦ c, ⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd = C.toEnd ⊚ fun x ↦ match x with | (fst, c) => c) ∧ (fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2 = C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c ⊒ (fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd = C.toEnd ⊚ fun x ↦ match x with | (fst, c) => c⊒ (fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2 = C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c ⊒ (fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd = C.toEnd ⊚ fun x ↦ match x with | (fst, c) => c x:GC.carrier⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd) x = (C.toEnd ⊚ fun x ↦ match x with | (fst, c) => c) x All goals completed! πŸ™ ⊒ (fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2 = C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c x₁:Genderxβ‚‚:Clan⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (x₁, xβ‚‚) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (x₁, xβ‚‚) xβ‚‚:Clan⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.female, xβ‚‚) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.female, xβ‚‚)xβ‚‚:Clan⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, xβ‚‚) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, xβ‚‚) xβ‚‚:Clan⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.female, xβ‚‚) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.female, xβ‚‚)xβ‚‚:Clan⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, xβ‚‚) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, xβ‚‚) ⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, Clan.wolf) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, Clan.wolf)⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, Clan.bear) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, Clan.bear) ⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.female, Clan.wolf) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.female, Clan.wolf)⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.female, Clan.bear) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.female, Clan.bear)⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, Clan.wolf) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, Clan.wolf)⊒ ((fun x ↦ match x with | (fst, c) => c) ⊚ GC.toEnd2) (Gender.male, Clan.bear) = (C.toEnd2 ⊚ fun x ↦ match x with | (fst, c) => c) (Gender.male, Clan.bear) All goals completed! πŸ™ ⟩

We use mathlib's API for binary products in the proof that follows.

example : IsLimit (BinaryFan.mk p₁ pβ‚‚) := { lift s := ⟨ fun x ↦ ((BinaryFan.fst s).val x, (BinaryFan.snd s).val x), s:Cone (pair G C)⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ∧ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd = ((pair G C).obj { as := WalkingPair.left }).toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd2 = ((pair G C).obj { as := WalkingPair.left }).toEnd2 ⊚ ↑(BinaryFan.fst s)⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ∧ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd = ((pair G C).obj { as := WalkingPair.left }).toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.left }).toEnd2 = ((pair G C).obj { as := WalkingPair.left }).toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.right }).toEnd = ((pair G C).obj { as := WalkingPair.right }).toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ (((Functor.const (Discrete WalkingPair)).obj s.pt).obj { as := WalkingPair.right }).toEnd2 = ((pair G C).obj { as := WalkingPair.right }).toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ∧ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = (BinaryFan.mk p₁ pβ‚‚).pt.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ∧ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd = GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x = (GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x).1 = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x).2 = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x).1 = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (↑(BinaryFan.fst s) ⊚ s.pt.toEnd) x = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (G.toEnd ⊚ ↑(BinaryFan.fst s)) x = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1; All goals completed! πŸ™ s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd) x).2 = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (↑(BinaryFan.snd s) ⊚ s.pt.toEnd) x = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (C.toEnd ⊚ ↑(BinaryFan.snd s)) x = ((GC.toEnd ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2; All goals completed! πŸ™ s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)⊒ (fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2 = GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x) s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ ((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2) x = (GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2) x).1 = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2) x).2 = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2) x).1 = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (↑(BinaryFan.fst s) ⊚ s.pt.toEnd2) x = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (G.toEnd2 ⊚ ↑(BinaryFan.fst s)) x = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrierc:((pair G C).obj { as := WalkingPair.right }).carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, c)).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.wolf)).1s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.bear)).1 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.wolf)).1s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ G.toEnd2 (↑(BinaryFan.fst s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.bear)).1 All goals completed! πŸ™ s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (((fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) ⊚ s.pt.toEnd2) x).2 = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (↑(BinaryFan.snd s) ⊚ s.pt.toEnd2) x = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ (C.toEnd2 ⊚ ↑(BinaryFan.snd s)) x = ((GC.toEnd2 ⊚ fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)) x).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ C.toEnd2 (↑(BinaryFan.snd s) x) = (GC.toEnd2 (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x)).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrierc:((pair G C).obj { as := WalkingPair.right }).carrier⊒ C.toEnd2 c = (GC.toEnd2 (↑(BinaryFan.fst s) x, c)).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ C.toEnd2 Clan.wolf = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.wolf)).2s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ C.toEnd2 Clan.bear = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.bear)).2 s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ C.toEnd2 Clan.wolf = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.wolf)).2s:Cone (pair G C)h_fst_m:↑(BinaryFan.fst s) ⊚ s.pt.toEnd = G.toEnd ⊚ ↑(BinaryFan.fst s)h_fst_f:↑(BinaryFan.fst s) ⊚ s.pt.toEnd2 = G.toEnd2 ⊚ ↑(BinaryFan.fst s)h_snd_m:↑(BinaryFan.snd s) ⊚ s.pt.toEnd = C.toEnd ⊚ ↑(BinaryFan.snd s)h_snd_f:↑(BinaryFan.snd s) ⊚ s.pt.toEnd2 = C.toEnd2 ⊚ ↑(BinaryFan.snd s)x:s.pt.carrier⊒ C.toEnd2 Clan.bear = (GC.toEnd2 (↑(BinaryFan.fst s) x, Clan.bear)).2 All goals completed! πŸ™ ⟩ fac s j := s:Cone (pair G C)j:Discrete WalkingPair⊒ (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© = s.Ο€.app j s:Cone (pair G C)j:Discrete WalkingPair⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) = ↑(s.Ο€.app j) s:Cone (pair G C)j:Discrete WalkingPairx:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app j) x s:Cone (pair G C)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.left } ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.left }) xs:Cone (pair G C)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.right }) x s:Cone (pair G C)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.left } ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.left }) xs:Cone (pair G C)x:s.pt.carrier⊒ ↑((BinaryFan.mk p₁ pβ‚‚).Ο€.app { as := WalkingPair.right } ⊚ ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ©) x = ↑(s.Ο€.app { as := WalkingPair.right }) x All goals completed! πŸ™ uniq s m hm := s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app j⊒ m = ⟨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app j⊒ ↑m = β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app jx:s.pt.carrier⊒ ↑m x = β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© x s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app jx:s.pt.carrier⊒ (↑m x).1 = (β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© x).1s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app jx:s.pt.carrier⊒ (↑m x).2 = (β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© x).2 s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app jx:s.pt.carrier⊒ (↑m x).1 = (β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© x).1 All goals completed! πŸ™ s:Cone (pair G C)m:s.pt ⟢ (BinaryFan.mk p₁ pβ‚‚).pthm:βˆ€ (j : Discrete WalkingPair), (BinaryFan.mk p₁ pβ‚‚).Ο€.app j ⊚ m = s.Ο€.app jx:s.pt.carrier⊒ (↑m x).2 = (β†‘βŸ¨fun x ↦ (↑(BinaryFan.fst s) x, ↑(BinaryFan.snd s) x), β‹―βŸ© x).2 All goals completed! πŸ™ }