A Lean Companion to Conceptual Mathematics

Session 22: Universal mapping properties; Incidence relations🔗

4. Basic figure-types, singular figures, and incidence, in the category of graphs🔗

Exercise 1 (p. 250)

Consider the diagram of graphs B_1 \leftarrow P \rightarrow B_2 Suppose it satisfies the fragment of the definition of product in which we test against only the two figure-types {X = A} and {X = D}. Prove that the diagram actually is a product, i.e. that the product property holds for all graphs X.

Solution: Exercise 1

We begin by creating helpers for two key equivalences.

open IrreflexiveGraph in -- Establish equivalence between Hom(A, X) and arrows of X def homAEquiv (X : IrreflexiveGraph) : (A X) X.carrierA where toFun fAX := fAX.val.1 () invFun xA := (fun _ xA, (fun | 0 => X.toSrc xA | 1 => X.toTgt xA : Fin 2 X.carrierD)), X:IrreflexiveGraphxA:X.carrierA(fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toSrc = X.toSrc (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1 (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toTgt = X.toTgt (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1 X:IrreflexiveGraphxA:X.carrierA(fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toSrc = X.toSrc (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1X:IrreflexiveGraphxA:X.carrierA(fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toTgt = X.toTgt (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1 X:IrreflexiveGraphxA:X.carrierA(fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toSrc = X.toSrc (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1X:IrreflexiveGraphxA:X.carrierA(fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toTgt = X.toTgt (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1 (X:IrreflexiveGraphxA:X.carrierAx✝:A.carrierA((fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).2 A.toTgt) x✝ = (X.toTgt (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA).1) x✝; All goals completed! 🐙) left_inv fAX := X:IrreflexiveGraphfAX:A X(fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX) = fAX X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).1 = (↑fAX).1X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 = (↑fAX).2 X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).1 = (↑fAX).1 X:IrreflexiveGraphfAX:A Xx✝:A.carrierA(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).1 x✝ = (↑fAX).1 x✝; All goals completed! 🐙 X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 = (↑fAX).2 X:IrreflexiveGraphfAX:A Xi:A.carrierD(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 i = (↑fAX).2 i X:IrreflexiveGraphfAX:A Xi:Fin 2(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 i = (↑fAX).2 i X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 ((fun i i) 0, ) = (↑fAX).2 ((fun i i) 0, )X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 ((fun i i) 1, ) = (↑fAX).2 ((fun i i) 1, ) X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 ((fun i i) 0, ) = (↑fAX).2 ((fun i i) 0, ) All goals completed! 🐙 X:IrreflexiveGraphfAX:A X(↑((fun xA (fun x xA, fun x match x with | 0 => X.toSrc xA | 1 => X.toTgt xA), ) ((fun fAX (↑fAX).1 ()) fAX))).2 ((fun i i) 1, ) = (↑fAX).2 ((fun i i) 1, ) All goals completed! 🐙 right_inv xA := rfl open IrreflexiveGraph in -- Establish equivalence between Hom(D, X) and dots of X def homDEquiv (X : IrreflexiveGraph) : (D X) X.carrierD where toFun fDX := fDX.val.2 () invFun xD := (Empty.elim, fun _ xD), X:IrreflexiveGraphxD:X.carrierD(Empty.elim, fun x xD).2 D.toSrc = X.toSrc (Empty.elim, fun x xD).1 (Empty.elim, fun x xD).2 D.toTgt = X.toTgt (Empty.elim, fun x xD).1 X:IrreflexiveGraphxD:X.carrierD(Empty.elim, fun x xD).2 D.toSrc = X.toSrc (Empty.elim, fun x xD).1X:IrreflexiveGraphxD:X.carrierD(Empty.elim, fun x xD).2 D.toTgt = X.toTgt (Empty.elim, fun x xD).1 X:IrreflexiveGraphxD:X.carrierD(Empty.elim, fun x xD).2 D.toSrc = X.toSrc (Empty.elim, fun x xD).1X:IrreflexiveGraphxD:X.carrierD(Empty.elim, fun x xD).2 D.toTgt = X.toTgt (Empty.elim, fun x xD).1 (X:IrreflexiveGraphxD:X.carrierDe:D.carrierA((Empty.elim, fun x xD).2 D.toTgt) e = (X.toTgt (Empty.elim, fun x xD).1) e; All goals completed! 🐙) left_inv fDX := X:IrreflexiveGraphfDX:D X(fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX) = fDX X:IrreflexiveGraphfDX:D X(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).1 = (↑fDX).1X:IrreflexiveGraphfDX:D X(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).2 = (↑fDX).2 X:IrreflexiveGraphfDX:D X(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).1 = (↑fDX).1 X:IrreflexiveGraphfDX:D Xe:D.carrierA(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).1 e = (↑fDX).1 e; All goals completed! 🐙 X:IrreflexiveGraphfDX:D X(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).2 = (↑fDX).2 X:IrreflexiveGraphfDX:D Xx✝:D.carrierD(↑((fun xD (Empty.elim, fun x xD), ) ((fun fDX (↑fDX).2 ()) fDX))).2 x✝ = (↑fDX).2 x✝; All goals completed! 🐙 right_inv xD := rfl

Our proof then follows.

open IrreflexiveGraph in example (P B₁ B₂ : IrreflexiveGraph) (p₁ : P B₁) (p₂ : P B₂) -- Satisfies fragment of definition of product for X = A (hA : (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP : A P, p₁ fAP = fAP₁ p₂ fAP = fAP₂) -- Satisfies fragment of definition of product for X = D (hD : (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP : D P, p₁ fDP = fDP₁ p₂ fDP = fDP₂) : (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f : X P, p₁ f = f₁ p₂ f = f₂ := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ intro X P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁ (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂∃! f, p₁ f = f₁ p₂ f = f₂ -- For each arrow in X, get equivalent morphism fAX : A ⟶ X P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xA∃! f, p₁ f = f₁ p₂ f = f₂ -- For each dot in X, get equivalent morphism fDX : D ⟶ X P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xD∃! f, p₁ f = f₁ p₂ f = f₂ -- Construct fA : X.carrierA ⟶ P.carrierA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)∃! f, p₁ f = f₁ p₂ f = f₂ -- Construct fD : X.carrierD ⟶ P.carrierD (cf. fA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)∃! f, p₁ f = f₁ p₂ f = f₂ -- For each arrow in P, get morphism fAP : A ⟶ P P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pA∃! f, p₁ f = f₁ p₂ f = f₂ -- For each dot in P, get morphism fDP : D ⟶ P P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pD∃! f, p₁ f = f₁ p₂ f = f₂ -- Show that p₁ ⊚ fAP = f₁ ⊚ fAX ∧ p₂ ⊚ fAP = f₂ ⊚ fAX have hA_proj : xA : X.carrierA, p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDxA:X.carrierAp₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDxA:X.carrierAp₁ (homAEquiv P).symm (fA xA) = f₁ (homAEquiv X).symm xA p₂ (homAEquiv P).symm (fA xA) = f₂ (homAEquiv X).symm xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDxA:X.carrierAp₁ Classical.choose = f₁ (homAEquiv X).symm xA p₂ Classical.choose = f₂ (homAEquiv X).symm xA All goals completed! 🐙 -- Show that p₁ ⊚ fDP = f₁ ⊚ fDX ∧ p₂ ⊚ fDP = f₂ ⊚ fDX have hD_proj : xD : X.carrierD, p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)xD:X.carrierDp₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)xD:X.carrierDp₁ (homDEquiv P).symm (fD xD) = f₁ (homDEquiv X).symm xD p₂ (homDEquiv P).symm (fD xD) = f₂ (homDEquiv X).symm xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)xD:X.carrierDp₁ Classical.choose = f₁ (homDEquiv X).symm xD p₂ Classical.choose = f₂ (homDEquiv X).symm xD All goals completed! 🐙 -- Show that P.toSrc ⊚ fA = fD ⊚ X.toSrc have hSrc_comm : xA : X.carrierA, P.toSrc (fA xA) = fD (X.toSrc xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAP.toSrc (fA xA) = fD (X.toSrc xA) -- Show that p₁ ⊚ fDP = f₁ ⊚ fDX have hp₁ : p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ -- Transform goal from map equality to dot equality P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierA(homDEquiv B₁) (p₁ fDP (P.toSrc (fA xA))) = (homDEquiv B₁) (f₁ fDX (X.toSrc xA)) calc (p₁.val.2 P.toSrc) (fA xA) _ = (B₁.toSrc p₁.val.1) (fA xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierA((↑p₁).2 P.toSrc) (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA) All goals completed! 🐙 _ = B₁.toSrc ((p₁ fAP (fA xA)).val.1 ()) := rfl _ = B₁.toSrc ((f₁ fAX xA).val.1 ()) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAB₁.toSrc ((↑(p₁ fAP (fA xA))).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ()) All goals completed! 🐙 _ = (B₁.toSrc f₁.val.1) xA := rfl _ = (f₁.val.2 X.toSrc) xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierA(B₁.toSrc (↑f₁).1) xA = ((↑f₁).2 X.toSrc) xA All goals completed! 🐙 -- Show that p₂ ⊚ fDP = f₂ ⊚ fDX have hp₂ : p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ -- Transform goal from map equality to dot equality P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))(homDEquiv B₂) (p₂ fDP (P.toSrc (fA xA))) = (homDEquiv B₂) (f₂ fDX (X.toSrc xA)) calc (p₂.val.2 P.toSrc) (fA xA) _ = (B₂.toSrc p₂.val.1) (fA xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))((↑p₂).2 P.toSrc) (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA) All goals completed! 🐙 _ = B₂.toSrc ((p₂ fAP (fA xA)).val.1 ()) := rfl _ = B₂.toSrc ((f₂ fAX xA).val.1 ()) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))B₂.toSrc ((↑(p₂ fAP (fA xA))).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ()) All goals completed! 🐙 _ = (B₂.toSrc f₂.val.1) xA := rfl _ = (f₂.val.2 X.toSrc) xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))(B₂.toSrc (↑f₂).1) xA = ((↑f₂).2 X.toSrc) xA All goals completed! 🐙 -- Transform goal from dot equality to map equality P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))hp₂:p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA))))(homDEquiv P).symm (P.toSrc (fA xA)) = (homDEquiv P).symm (fD (X.toSrc xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))hp₂:p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA))))fDP (P.toSrc (fA xA)) = fDP (fD (X.toSrc xA)) -- Get unique witness for D ⟶ P P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))hp₂:p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toSrc xA) p₂ fDP = f₂ fDX (X.toSrc xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).rightfDP (P.toSrc (fA xA)) = fDP (fD (X.toSrc xA)) -- Show that lhs and rhs both equal unique witness P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))hp₂:p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toSrc xA) p₂ fDP = f₂ fDX (X.toSrc xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).righth_left:fDP (P.toSrc (fA xA)) = Classical.choose := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂fDP (P.toSrc (fA xA)) = fDP (fD (X.toSrc xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)xA:X.carrierAhp₁:p₁ fDP (P.toSrc (fA xA)) = f₁ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA))))hp₂:p₂ fDP (P.toSrc (fA xA)) = f₂ fDX (X.toSrc xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toSrc xA) p₂ fDP = f₂ fDX (X.toSrc xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).righth_left:fDP (P.toSrc (fA xA)) = Classical.choose := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂h_right:fDP (fD (X.toSrc xA)) = Classical.choose := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA))fDP (P.toSrc (fA xA)) = fDP (fD (X.toSrc xA)) All goals completed! 🐙 -- Show that P.toTgt ⊚ fA = fD ⊚ X.toTgt (cf. hSrc_comm) have hTgt_comm : xA : X.carrierA, P.toTgt (fA xA) = fD (X.toTgt xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAP.toTgt (fA xA) = fD (X.toTgt xA) have hp₁ : p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierA(homDEquiv B₁) (p₁ fDP (P.toTgt (fA xA))) = (homDEquiv B₁) (f₁ fDX (X.toTgt xA)) calc (p₁.val.2 P.toTgt) (fA xA) _ = (B₁.toTgt p₁.val.1) (fA xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierA((↑p₁).2 P.toTgt) (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA) All goals completed! 🐙 _ = B₁.toTgt ((p₁ fAP (fA xA)).val.1 ()) := rfl _ = B₁.toTgt ((f₁ fAX xA).val.1 ()) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAB₁.toTgt ((↑(p₁ fAP (fA xA))).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ()) All goals completed! 🐙 _ = (B₁.toTgt f₁.val.1) xA := rfl _ = (f₁.val.2 X.toTgt) xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierA(B₁.toTgt (↑f₁).1) xA = ((↑f₁).2 X.toTgt) xA All goals completed! 🐙 have hp₂ : p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))(homDEquiv B₂) (p₂ fDP (P.toTgt (fA xA))) = (homDEquiv B₂) (f₂ fDX (X.toTgt xA)) calc (p₂.val.2 P.toTgt) (fA xA) _ = (B₂.toTgt p₂.val.1) (fA xA) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))((↑p₂).2 P.toTgt) (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA) All goals completed! 🐙 _ = B₂.toTgt ((p₂ fAP (fA xA)).val.1 ()) := rfl _ = B₂.toTgt ((f₂ fAX xA).val.1 ()) := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))B₂.toTgt ((↑(p₂ fAP (fA xA))).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ()) All goals completed! 🐙 _ = (B₂.toTgt f₂.val.1) xA := rfl _ = (f₂.val.2 X.toTgt) xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))(B₂.toTgt (↑f₂).1) xA = ((↑f₂).2 X.toTgt) xA All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))hp₂:p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA))))(homDEquiv P).symm (P.toTgt (fA xA)) = (homDEquiv P).symm (fD (X.toTgt xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))hp₂:p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA))))fDP (P.toTgt (fA xA)) = fDP (fD (X.toTgt xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))hp₂:p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toTgt xA) p₂ fDP = f₂ fDX (X.toTgt xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).rightfDP (P.toTgt (fA xA)) = fDP (fD (X.toTgt xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))hp₂:p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toTgt xA) p₂ fDP = f₂ fDX (X.toTgt xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).righth_left:fDP (P.toTgt (fA xA)) = Classical.choose := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂fDP (P.toTgt (fA xA)) = fDP (fD (X.toTgt xA)) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))xA:X.carrierAhp₁:p₁ fDP (P.toTgt (fA xA)) = f₁ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA))))hp₂:p₂ fDP (P.toTgt (fA xA)) = f₂ fDX (X.toTgt xA) := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA))))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX (X.toTgt xA) p₂ fDP = f₂ fDX (X.toTgt xA)) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).righth_left:fDP (P.toTgt (fA xA)) = Classical.choose := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂h_right:fDP (fD (X.toTgt xA)) = Classical.choose := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA))fDP (P.toTgt (fA xA)) = fDP (fD (X.toTgt xA)) All goals completed! 🐙 -- Bundle fA and fD into morphism f : X ⟶ P let f : X P := (fA, fD), P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))(fA, fD).2 X.toSrc = P.toSrc (fA, fD).1 (fA, fD).2 X.toTgt = P.toTgt (fA, fD).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))(fA, fD).2 X.toSrc = P.toSrc (fA, fD).1P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))(fA, fD).2 X.toTgt = P.toTgt (fA, fD).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))(fA, fD).2 X.toSrc = P.toSrc (fA, fD).1P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))(fA, fD).2 X.toTgt = P.toTgt (fA, fD).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))x:X.carrierA((fA, fD).2 X.toTgt) x = (P.toTgt (fA, fD).1) x P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))x:X.carrierA((fA, fD).2 X.toSrc) x = (P.toSrc (fA, fD).1) x All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))x:X.carrierA((fA, fD).2 X.toTgt) x = (P.toTgt (fA, fD).1) x All goals completed! 🐙 -- Show that f satisfies commutativity and uniqueness conditions P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (fun f p₁ f = f₁ p₂ f = f₂) f (y : X P), (fun f p₁ f = f₁ p₂ f = f₂) y y = f P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (fun f p₁ f = f₁ p₂ f = f₂) fP:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (y : X P), (fun f p₁ f = f₁ p₂ f = f₂) y y = f P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (fun f p₁ f = f₁ p₂ f = f₂) fP:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (y : X P), (fun f p₁ f = f₁ p₂ f = f₂) y y = f P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (y : X P), p₁ y = f₁ p₂ y = f₂ y = f -- Show that the triangles commute P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), p₁ f = f₁P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), p₂ f = f₂ -- Show that p₁ ⊚ f = f₁ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), p₁ f = f₁ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₁ f)).1 = (↑f₁).1P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₁ f)).2 = (↑f₁).2 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₁ f)).1 = (↑f₁).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierA(↑(p₁ f)).1 xA = (↑f₁).1 xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierAh:p₁ fAP (fA xA) = f₁ fAX xA := (hA_proj xA).left(↑(p₁ f)).1 xA = (↑f₁).1 xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierAh:(↑(p₁ fAP (fA xA))).1 () = (↑(f₁ fAX xA)).1 ()(↑(p₁ f)).1 xA = (↑f₁).1 xA All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₁ f)).2 = (↑f₁).2 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierD(↑(p₁ f)).2 xD = (↑f₁).2 xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierDh:p₁ fDP (fD xD) = f₁ fDX xD := (hD_proj xD).left(↑(p₁ f)).2 xD = (↑f₁).2 xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierDh:(↑(p₁ fDP (fD xD))).2 () = (↑(f₁ fDX xD)).2 ()(↑(p₁ f)).2 xD = (↑f₁).2 xD All goals completed! 🐙 -- Show that p₂ ⊚ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₂ f)).1 = (↑f₂).1P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₂ f)).2 = (↑f₂).2 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₂ f)).1 = (↑f₂).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierA(↑(p₂ f)).1 xA = (↑f₂).1 xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierAh:p₂ fAP (fA xA) = f₂ fAX xA := (hA_proj xA).right(↑(p₂ f)).1 xA = (↑f₂).1 xA P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xA:X.carrierAh:(↑(p₂ fAP (fA xA))).1 () = (↑(f₂ fAX xA)).1 ()(↑(p₂ f)).1 xA = (↑f₂).1 xA All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (↑(p₂ f)).2 = (↑f₂).2 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierD(↑(p₂ f)).2 xD = (↑f₂).2 xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierDh:p₂ fDP (fD xD) = f₂ fDX xD := (hD_proj xD).right(↑(p₂ f)).2 xD = (↑f₂).2 xD P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), xD:X.carrierDh:(↑(p₂ fDP (fD xD))).2 () = (↑(f₂ fDX xD)).2 ()(↑(p₂ f)).2 xD = (↑f₂).2 xD All goals completed! 🐙 -- Prove uniqueness of f P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), (y : X P), p₁ y = f₁ p₂ y = f₂ y = f intro f' P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂f' = f P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂(↑f').1 = (↑f).1P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂(↑f').2 = (↑f).2 -- Show that arrow maps are equal P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂(↑f').1 = (↑f).1 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierA(↑f').1 xA = (↑f).1 xA have hp₁ : p₁ fAP (f'.val.1 xA) = f₁ fAX xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierA(homAEquiv B₁) (p₁ fAP ((↑f').1 xA)) = (homAEquiv B₁) (f₁ fAX xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₂:p₂ f' = f₂xA:X.carrierAhf'₁:(↑(p₁ f')).1 xA = (↑f₁).1 xA(homAEquiv B₁) (p₁ fAP ((↑f').1 xA)) = (homAEquiv B₁) (f₁ fAX xA) All goals completed! 🐙 have hp₂ : p₂ fAP (f'.val.1 xA) = f₂ fAX xA := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))(homAEquiv B₂) (p₂ fAP ((↑f').1 xA)) = (homAEquiv B₂) (f₂ fAX xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hf'₂:(↑(p₂ f')).1 xA = (↑f₂).1 xA(homAEquiv B₂) (p₂ fAP ((↑f').1 xA)) = (homAEquiv B₂) (f₂ fAX xA) All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hp₂:p₂ fAP ((↑f').1 xA) = f₂ fAX xA := Equiv.injective (homAEquiv B₂) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₂.carrierD) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xA))(homAEquiv P).symm ((↑f').1 xA) = (homAEquiv P).symm ((↑f).1 xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hp₂:p₂ fAP ((↑f').1 xA) = f₂ fAX xA := Equiv.injective (homAEquiv B₂) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₂.carrierD) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xA))fAP ((↑f').1 xA) = fAP (fA xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hp₂:p₂ fAP ((↑f').1 xA) = f₂ fAX xA := Equiv.injective (homAEquiv B₂) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₂.carrierD) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xA))h_uniq: (y : A P), (fun fAP p₁ fAP = f₁ fAX xA p₂ fAP = f₂ fAX xA) y y = Classical.choose := (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).rightfAP ((↑f').1 xA) = fAP (fA xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hp₂:p₂ fAP ((↑f').1 xA) = f₂ fAX xA := Equiv.injective (homAEquiv B₂) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₂.carrierD) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xA))h_uniq: (y : A P), (fun fAP p₁ fAP = f₁ fAX xA p₂ fAP = f₂ fAX xA) y y = Classical.choose := (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).righth_left:fAP ((↑f').1 xA) = Classical.choose := h_uniq (fAP ((↑f').1 xA)) hp₁, hp₂fAP ((↑f').1 xA) = fAP (fA xA) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xA:X.carrierAhp₁:p₁ fAP ((↑f').1 xA) = f₁ fAX xA := Equiv.injective (homAEquiv B₁) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₁.carrierD) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xA))hp₂:p₂ fAP ((↑f').1 xA) = f₂ fAX xA := Equiv.injective (homAEquiv B₂) (eq_of_heq ((fun β self self' e'_2 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.1 a self'.1 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.1 a self'.1 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.1 a self'.1 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_2 x self.1 a self'.1 a) e'_2 (fun h Eq.ndrec (motive := fun self' (e_2 : self = self'), e_2 Eq.refl self self.1 a self'.1 a) (fun e_2 h HEq.refl (self.1 a)) (Eq.symm h) e'_2) (Eq.refl self') (HEq.refl e'_2)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (X.carrierD B₂.carrierD) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xA))h_uniq: (y : A P), (fun fAP p₁ fAP = f₁ fAX xA p₂ fAP = f₂ fAX xA) y y = Classical.choose := (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).righth_left:fAP ((↑f').1 xA) = Classical.choose := h_uniq (fAP ((↑f').1 xA)) hp₁, hp₂h_right:fAP (fA xA) = Classical.choose := h_uniq (fAP (fA xA)) (hA_proj xA)fAP ((↑f').1 xA) = fAP (fA xA) All goals completed! 🐙 -- Show dot maps are equal P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂(↑f').2 = (↑f).2 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierD(↑f').2 xD = (↑f).2 xD have hp₁ : p₁ fDP (f'.val.2 xD) = f₁ fDX xD := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierD(homDEquiv B₁) (p₁ fDP ((↑f').2 xD)) = (homDEquiv B₁) (f₁ fDX xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₂:p₂ f' = f₂xD:X.carrierDhf'₁:(↑(p₁ f')).2 xD = (↑f₁).2 xD(homDEquiv B₁) (p₁ fDP ((↑f').2 xD)) = (homDEquiv B₁) (f₁ fDX xD) All goals completed! 🐙 have hp₂ : p₂ fDP (f'.val.2 xD) = f₂ fDX xD := P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂ (X : IrreflexiveGraph) (f₁ : X B₁) (f₂ : X B₂), ∃! f, p₁ f = f₁ p₂ f = f₂ P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))(homDEquiv B₂) (p₂ fDP ((↑f').2 xD)) = (homDEquiv B₂) (f₂ fDX xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hf'₂:(↑(p₂ f')).2 xD = (↑f₂).2 xD(homDEquiv B₂) (p₂ fDP ((↑f').2 xD)) = (homDEquiv B₂) (f₂ fDX xD) All goals completed! 🐙 P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hp₂:p₂ fDP ((↑f').2 xD) = f₂ fDX xD := Equiv.injective (homDEquiv B₂) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xD))(homDEquiv P).symm ((↑f').2 xD) = (homDEquiv P).symm ((↑f).2 xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hp₂:p₂ fDP ((↑f').2 xD) = f₂ fDX xD := Equiv.injective (homDEquiv B₂) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xD))fDP ((↑f').2 xD) = fDP (fD xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hp₂:p₂ fDP ((↑f').2 xD) = f₂ fDX xD := Equiv.injective (homDEquiv B₂) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xD))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX xD p₂ fDP = f₂ fDX xD) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).rightfDP ((↑f').2 xD) = fDP (fD xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hp₂:p₂ fDP ((↑f').2 xD) = f₂ fDX xD := Equiv.injective (homDEquiv B₂) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xD))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX xD p₂ fDP = f₂ fDX xD) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).righth_left:fDP ((↑f').2 xD) = Classical.choose := h_uniq (fDP ((↑f').2 xD)) hp₁, hp₂fDP ((↑f').2 xD) = fDP (fD xD) P:IrreflexiveGraphB₁:IrreflexiveGraphB₂:IrreflexiveGraphp₁:P B₁p₂:P B₂hA: (fAP₁ : A B₁) (fAP₂ : A B₂), ∃! fAP, p₁ fAP = fAP₁ p₂ fAP = fAP₂hD: (fDP₁ : D B₁) (fDP₂ : D B₂), ∃! fDP, p₁ fDP = fDP₁ p₂ fDP = fDP₂X:IrreflexiveGraphf₁:X B₁f₂:X B₂fAX:X.carrierA (A X) := fun xA (homAEquiv X).symm xAfDX:X.carrierD (D X) := fun xD (homDEquiv X).symm xDfA:X.carrierA P.carrierA := fun xA let h_uniq := ; (homAEquiv P) (Classical.choose h_uniq)fD:X.carrierD P.carrierD := fun xD let h_uniq := ; (homDEquiv P) (Classical.choose h_uniq)fAP:P.carrierA (A P) := fun pA (homAEquiv P).symm pAfDP:P.carrierD (D P) := fun pD (homDEquiv P).symm pDhA_proj: (xA : X.carrierA), p₁ fAP (fA xA) = f₁ fAX xA p₂ fAP (fA xA) = f₂ fAX xA := fun xA id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homAEquiv X).symm xA p₂ _a = f₂ (homAEquiv X).symm xA) (Equiv.symm_apply_apply (homAEquiv P) (Classical.choose (hA (f₁ fAX xA) (f₂ fAX xA)))))) (Classical.choose_spec (hA (f₁ fAX xA) (f₂ fAX xA))).left)hD_proj: (xD : X.carrierD), p₁ fDP (fD xD) = f₁ fDX xD p₂ fDP (fD xD) = f₂ fDX xD := fun xD id (Eq.mpr (id (congrArg (fun _a p₁ _a = f₁ (homDEquiv X).symm xD p₂ _a = f₂ (homDEquiv X).symm xD) (Equiv.symm_apply_apply (homDEquiv P) (Classical.choose (hD (f₁ fDX xD) (f₂ fDX xD)))))) (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).left)hSrc_comm: (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toSrc (↑p₁).1) (fA xA)) p₁.property.left)) (Eq.refl ((B₁.toSrc (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toSrc ((↑_a).1 ()) = B₁.toSrc ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toSrc ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toSrc (↑f₁).1) xA = _a xA) f₁.property.left)) (Eq.refl ((B₁.toSrc (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toSrc (↑p₂).1) (fA xA)) p₂.property.left)) (Eq.refl ((B₂.toSrc (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toSrc ((↑_a).1 ()) = B₂.toSrc ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toSrc ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toSrc (↑f₂).1) xA = _a xA) f₂.property.left)) (Eq.refl ((B₂.toSrc (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA)))).right; have h_left := h_uniq (fDP (P.toSrc (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toSrc xA))) (hD_proj (X.toSrc xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toSrc xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toSrc xA)) (f₂ fDX (X.toSrc xA))))))))hTgt_comm: (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA) := fun xA have hp₁ := Equiv.injective (homDEquiv B₁) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₁.toTgt (↑p₁).1) (fA xA)) p₁.property.right)) (Eq.refl ((B₁.toTgt (↑p₁).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₁.toTgt ((↑_a).1 ()) = B₁.toTgt ((↑(f₁ fAX xA)).1 ())) (hA_proj xA).left)) (Eq.refl (B₁.toTgt ((↑(f₁ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₁.toTgt (↑f₁).1) xA = _a xA) f₁.property.right)) (Eq.refl ((B₁.toTgt (↑f₁).1) xA)))); have hp₂ := Equiv.injective (homDEquiv B₂) (Trans.trans (Trans.trans (Trans.trans (Trans.trans (Trans.trans rfl (Eq.mpr (id (congrArg (fun _a _a (fA xA) = (B₂.toTgt (↑p₂).1) (fA xA)) p₂.property.right)) (Eq.refl ((B₂.toTgt (↑p₂).1) (fA xA))))) rfl) (Eq.mpr (id (congrArg (fun _a B₂.toTgt ((↑_a).1 ()) = B₂.toTgt ((↑(f₂ fAX xA)).1 ())) (hA_proj xA).right)) (Eq.refl (B₂.toTgt ((↑(f₂ fAX xA)).1 ()))))) rfl) (Eq.mpr (id (congrArg (fun _a (B₂.toTgt (↑f₂).1) xA = _a xA) f₂.property.right)) (Eq.refl ((B₂.toTgt (↑f₂).1) xA)))); Equiv.injective (homDEquiv P).symm (id (have h_uniq := (Classical.choose_spec (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA)))).right; have h_left := h_uniq (fDP (P.toTgt (fA xA))) hp₁, hp₂; have h_right := h_uniq (fDP (fD (X.toTgt xA))) (hD_proj (X.toTgt xA)); Eq.mpr (id (congrArg (fun _a _a = fDP (fD (X.toTgt xA))) h_left)) (Eq.mpr (id (congrArg (fun _a Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))) = _a) h_right)) (Eq.refl (Classical.choose (hD (f₁ fDX (X.toTgt xA)) (f₂ fDX (X.toTgt xA))))))))f:X P := (fA, fD), f':X Phf'₁:p₁ f' = f₁hf'₂:p₂ f' = f₂xD:X.carrierDhp₁:p₁ fDP ((↑f').2 xD) = f₁ fDX xD := Equiv.injective (homDEquiv B₁) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₁ f')) (↑f₁) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₁.carrierA) × (X.carrierD B₁.carrierD)) (fun f f.2 X.toSrc = B₁.toSrc f.1 f.2 X.toTgt = B₁.toTgt f.1) (p₁ f') f₁ hf'₁)) xD))hp₂:p₂ fDP ((↑f').2 xD) = f₂ fDX xD := Equiv.injective (homDEquiv B₂) (eq_of_heq ((fun self self' e'_1 a Eq.casesOn (motive := fun a_1 x f₁ = a_1 hf'₁ x self.2 a self'.2 a) hf'₁ (fun h (Eq.symm h let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun hf'₁ hp₁ h Eq.casesOn (motive := fun a_1 x f₂ = a_1 hf'₂ x self.2 a self'.2 a) hf'₂ (fun h Eq.ndrec (motive := fun f₂ (hf'₂ : p₂ f' = f₂), let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) (f₂ fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) (f₂ fDX xD); (homDEquiv P) (Classical.choose h_uniq); (∀ (xA : X.carrierA), p₁ fAP (fA xA) = (p₁ f') fAX xA p₂ fAP (fA xA) = f₂ fAX xA) (∀ (xD : X.carrierD), p₁ fDP (fD xD) = (p₁ f') fDX xD p₂ fDP (fD xD) = f₂ fDX xD) (hSrc_comm : (xA : X.carrierA), P.toSrc (fA xA) = fD (X.toSrc xA)) (hTgt_comm : (xA : X.carrierA), P.toTgt (fA xA) = fD (X.toTgt xA)), let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); hf'₂ Eq.refl (p₂ f') self.2 a self'.2 a) (fun hf'₂ let fA := fun xA let h_uniq := hA ((p₁ f') fAX xA) ((p₂ f') fAX xA); (homAEquiv P) (Classical.choose h_uniq); let fD := fun xD let h_uniq := hD ((p₁ f') fDX xD) ((p₂ f') fDX xD); (homDEquiv P) (Classical.choose h_uniq); fun hA_proj hD_proj hSrc_comm hTgt_comm let f := (fA, fD), funext fun x Eq.symm (hSrc_comm x), funext fun x Eq.symm (hTgt_comm x); fun h Eq.casesOn (motive := fun a_1 x self' = a_1 e'_1 x self.2 a self'.2 a) e'_1 (fun h Eq.ndrec (motive := fun self' (e_1 : self = self'), e_1 Eq.refl self self.2 a self'.2 a) (fun e_1 h HEq.refl (self.2 a)) (Eq.symm h) e'_1) (Eq.refl self') (HEq.refl e'_1)) (Eq.symm h) hf'₂ hA_proj hD_proj hSrc_comm hTgt_comm) (Eq.refl f₂) (HEq.refl hf'₂)) hA_proj hD_proj hSrc_comm hTgt_comm hf'₁ hp₁) (Eq.refl f₁) (HEq.refl hf'₁)) (↑(p₂ f')) (↑f₂) (eq_of_heq ((fun α p self self' e'_3 Eq.casesOn (motive := fun a x self' = a e'_3 x self self') e'_3 (fun h Eq.ndrec (motive := fun self' (e_3 : self = self'), e_3 Eq.refl self self self') (fun e_3 h HEq.refl self) (Eq.symm h) e'_3) (Eq.refl self') (HEq.refl e'_3)) ((X.carrierA B₂.carrierA) × (X.carrierD B₂.carrierD)) (fun f f.2 X.toSrc = B₂.toSrc f.1 f.2 X.toTgt = B₂.toTgt f.1) (p₂ f') f₂ hf'₂)) xD))h_uniq: (y : D P), (fun fDP p₁ fDP = f₁ fDX xD p₂ fDP = f₂ fDX xD) y y = Classical.choose := (Classical.choose_spec (hD (f₁ fDX xD) (f₂ fDX xD))).righth_left:fDP ((↑f').2 xD) = Classical.choose := h_uniq (fDP ((↑f').2 xD)) hp₁, hp₂h_right:fDP (fD xD) = Classical.choose := h_uniq (fDP (fD xD)) (hD_proj xD)fDP ((↑f').2 xD) = fDP (fD xD) All goals completed! 🐙
Exercise 2 (p. 252)

What is a figure of shape

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

in a graph X? What are the various ways in which it can be singular?

Solution: Exercise 2

A figure of shape A_2 in a graph X is a morphism {A_2 \xrightarrow{f} X} that maps the two arrows of A_2 to two arrows (not necessarily distinct) in X and the three dots of A_2 to three dots (not necessarily distinct) in X in such a way as to preserve sources and targets.

def FigA₂ (X : IrreflexiveGraph) := A₂ X

The figure is singular if the two arrows of A_2 are mapped to the same arrow in X or if any two of the three dots of A_2 are mapped to the same dot in X—that is, if the morphism f fails to be injective on either the arrows or the dots.

def FigA₂.IsSingular {X : IrreflexiveGraph} (f : FigA₂ X) : Prop := ¬(Function.Injective f.val.1 Function.Injective f.val.2)

Specifically, the figure is singular if any of the following conditions hold:

(1) the two arrows of A_2 are mapped to the same arrow in X

example {X : IrreflexiveGraph} (f : FigA₂ X) (h : f.val.1 0 = f.val.1 1) : f.IsSingular := X:IrreflexiveGraphf:FigA₂ Xh:(↑f).1 0 = (↑f).1 1f.IsSingular X:IrreflexiveGraphf:FigA₂ Xh:(↑f).1 0 = (↑f).1 1hA:Function.Injective (↑f).1right✝:Function.Injective (↑f).2False exact absurd (hA h) (X:IrreflexiveGraphf:FigA₂ Xh:(↑f).1 0 = (↑f).1 1hA:Function.Injective (↑f).1right✝:Function.Injective (↑f).2¬0 = 1 All goals completed! 🐙)

(2) the first and second dots of A_2 are mapped to the same dot in X

example {X : IrreflexiveGraph} (f : FigA₂ X) (h : f.val.2 0 = f.val.2 1) : f.IsSingular := X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 1f.IsSingular X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 1left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2False exact absurd (hD h) (X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 1left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2¬0 = 1 All goals completed! 🐙)

(3) the first and third dots of A_2 are mapped to the same dot in X

example {X : IrreflexiveGraph} (f : FigA₂ X) (h : f.val.2 0 = f.val.2 2) : f.IsSingular := X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 2f.IsSingular X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 2left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2False exact absurd (hD h) (X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 0 = (↑f).2 2left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2¬0 = 2 All goals completed! 🐙)

(4) the second and third dots of A_2 are mapped to the same dot in X

example {X : IrreflexiveGraph} (f : FigA₂ X) (h : f.val.2 1 = f.val.2 2) : f.IsSingular := X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 1 = (↑f).2 2f.IsSingular X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 1 = (↑f).2 2left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2False exact absurd (hD h) (X:IrreflexiveGraphf:FigA₂ Xh:(↑f).2 1 = (↑f).2 2left✝:Function.Injective (↑f).1hD:Function.Injective (↑f).2¬1 = 2 All goals completed! 🐙)

The case in which all three dots of A_2 are mapped to the same dot in X is covered by any of conditions (2), (3), or (4), since if all three dots are mapped to the same dot, then in particular any two dots are mapped to the same dot.