I wonder if we can make the proof of the 3x3 lemma for pushouts shorter in the following way:
Given the 3x3 commutative diagram, we can encode this data as 4 types (the corners), 4 type families indexed by types on the edge (the edges) and finally a type family over the total spaces of the four type families (the middle).
It is easy to show that the 4 homotopies witnessing the commutativity of the diagram can also be recovered from this "type theoretric" encoding of a 3x3 diagram. You can get the original 3x3 by looking at the total spaces of the families and the original maps become the projection maps.
Now from this consider the HIT with 4 point constructors for each of the 4 corner types. 4 path constructors making sure that coming from the middle of an edge through a corner agrees and finally a square constructor for these 4 paths.
Now the idea is that it should be simpler to show that a double pushout is equivalent to this symmetric double pushout HIT. Which you can do both ways.
I tried to formalise this in coq earlier this year, but the path algebra got a bit heavy for me. Seeing the success of the Torus, I expect this to work easily.
This was originally Mike Shulmans idea.
Here is the following coq code you can use as pseudocode:
Section Push.
Context
{A00 A10 A01 A11 : Type}
{A0x : A00 -> A01 -> Type}
{A1x : A10 -> A11 -> Type}
{Ax0 : A00 -> A10 -> Type}
{Ax1 : A01 -> A11 -> Type}
(Axx : forall a00 a01 a10 a11,
A0x a00 a01 ->
A1x a10 a11 ->
Ax0 a00 a10 ->
Ax1 a01 a11 -> Type).
Local Definition B00 := A00.
Local Definition B10 := A10.
Local Definition B01 := A01.
Local Definition B11 := A11.
Local Definition B0x := {a00 : A00 & {a01 : A01 & A0x a00 a01}}.
Local Definition B1x := {a10 : A10 & {a11 : A11 & A1x a10 a11}}.
Local Definition Bx0 := {a00 : A00 & {a10 : A10 & Ax0 a00 a10}}.
Local Definition Bx1 := {a01 : A01 & {a11 : A11 & Ax1 a01 a11}}.
Local Definition Bxx := {a00 : A00 & {a01 : A01 & {a10 : A10 & {a11 : A11 &
{a0x : A0x a00 a01 & {a1x : A1x a10 a11 &
{ax0 : Ax0 a00 a10 & {ax1 : Ax1 a01 a11 &
Axx a00 a01 a10 a11 a0x a1x ax0 ax1}}}}}}}}.
Local Definition fi0 : Bx0 -> B00 := pr1.
Local Definition fj0 : Bx0 -> B10 := fun x => pr1 (pr2 x).
Local Definition f'ix : Bxx -> B0x := fun a => (a.1; a.2.1; a.2.2.2.2.1).
Local Definition fjx : Bxx -> B1x := fun a => (a.2.2.1; a.2.2.2.1; a.2.2.2.2.2.1).
Local Definition fi1 : Bx1 -> B01 := pr1.
Local Definition fj1 : Bx1 -> B11 := fun x => pr1 (pr2 x).
Local Definition f0i : B0x -> B00 := pr1.
Local Definition f0j : B0x -> B01 := fun x => pr1 (pr2 x).
Local Definition fxi : Bxx -> Bx0 := fun a => (a.1; a.2.2.1; a.2.2.2.2.2.2.1).
Local Definition fxj : Bxx -> Bx1 := fun a => (a.2.1; a.2.2.2.1; a.2.2.2.2.2.2.2.1).
Local Definition f1i : B1x -> B10 := pr1.
Local Definition f1j : B1x -> B11 := fun x => pr1 (pr2 x).
Private Inductive SymP :=
| a : B00 -> SymP
| b : B10 -> SymP
| c : B01 -> SymP
| d : B11 -> SymP.
Axiom H1 : a o f0i == c o f0j.
Axiom H2 : a o fi0 == b o fj0.
Axiom H3 : c o fi1 == d o fj1.
Axiom H4 : b o f1i == d o f1j.
Axiom sq
: forall x,
Square (H1 (f'ix x)) (H4 (fjx x)) (H2 (fxi x)) (H3 (fxj x)).