*Disclaimer: Take what I say with a pinch of salt as I can and do say frivolous things occasionally*
So yesterday, Mike said that to his knowledge there was no proof of associativity of the smash product (I suppose if you define it as a pushout). I would like to collect some information about this so perhaps it can get some ideas floating around.
So in classical Algebraic Topology, the smash product is only associative when (at least two of) the spaces are compact and Hausdorff. The usual counter example is (Q∧Q)∧N not being homeomorphic to Q∧(Q∧N) where Q, N are the rationals and naturals with subspace topology. The problems come from Q not being locally compact (and therefore not compact). This example is explained in detail in May and Sigurdsson's book 'Parameterized Homotopy Theory' (Section 1.5).
Now we shouldn't have any of those problems with types, given that they are essentially CW-complexes and by Univalence we have homotopic types are equal so we should expect this to be true.
We can define the wedge sum of two (pointed or inhabited) types in HoTT as the pushout X <-- 1 --> Y. The smash product can then be defined as the pushout of 1 <-- XvY --> XxY. Where the map XvY --> XxY is the inclusion of the wedge sum into the product type. This can be defined by induction on the HIT of the pushout. Really the smash product is the correct coproduct of pointed types, the product being the same.
So this definition is pretty simple, and I think is the one that is used in the agda formalisation. I have formalise the definition in coq, using the pushouts as coequalisers, however I can't manage to use Mike's new commit which gets rid of coequalisers.
Here is some Coq code if you want to try it yourself, if you manage to prove the last statement please let me know :)
Require Import HoTT.HIT.Pushout.
Require Import HoTT.Basics.Overture.
Require Import HoTT.Pointed.
Require Import HoTT.Types.Unit.
Open Scope pointed_scope.
Definition unit_map (A : pType) : Unit -> A
:= fun _ => point A.
Definition Wedge (A B : pType) : pType.
simple refine (Build_pType (pushout (unit_map A) (unit_map B)) _).
refine (coeq _).
refine (inl (point A)).
Defined.
Definition Cofiber {A B : pType} (f : A -> B) : pType.
refine (Build_pType (pushout (fun _ => tt) f) _).
refine (coeq _).
refine (inr (f (point A))).
Defined.
(* Now we need to define the inclusion map i : AvB -> AxB *)
Definition wedge_prod_inc {A B : pType} : (Wedge A B) -> (A * B).
simple refine (pushout_ind _ _ _ _ _).
+ induction a.
refine ((a, point B)).
refine ((point A, b)).
+ compute.
induction a.
induction (cp tt).
reflexivity.
Defined.
Definition Smash (A B : pType) : pType.
simple refine (Build_pType (@Cofiber _ _ _) _).
refine (Wedge A B).
refine (Build_pType (A*B) ispointed_prod).
refine (wedge_prod_inc).
Defined.
Theorem Smash_Assoc {A B C : pType} : Smash (Smash A B) C <~> Smash A (Smash B C).
Proof.