Definition hset_struct_with_smash_laws {P : hset_cartesian_struct} {Pt : pointed_hset_struct P} (SP : hset_struct_with_smash_data P Pt) : UU := (hset_struct_point Pt (pr1 SP) = false) × (∏ (X Y : hSet) (PX : P X) (PY : P Y), hset_struct_point Pt (pr2 SP X Y PX PY) = setquotpr _ (hset_struct_point Pt PX ,, hset_struct_point Pt PY)) × (∏ (Y : hSet) (PY : P Y) (y : Y), mor_hset_struct P (pr1 SP) PY (pointed_hset_struct_map_from_unit Pt PY y)) × (∏ (X Y : hSet) (PX : P X) (PY : P Y) (f : X → bool) (Pf : mor_hset_struct P PX (pr1 SP) f) (g : X → Y) (Pg : mor_hset_struct P PX PY g), mor_hset_struct P PX PY (pointed_hset_struct_unit_map Pt PY f g)) × ∏ (X Y : hSet) (PX : P X) (PY : P Y), (∏ (y : Y), mor_hset_struct P PX (pr2 SP X Y PX PY) (λ x, setquotpr (smash_eqrel P Pt PX PY) (x ,, y))) × (∏ (x : X), mor_hset_struct P PY (pr2 SP X Y PX PY) (λ y, setquotpr (smash_eqrel P Pt PX PY) (x ,, y))) × (mor_hset_struct P (hset_struct_prod P PX PY) (pr2 SP X Y PX PY) (setquotpr (smash_eqrel P Pt PX PY))) × (∏ (Z : hSet) (PZ : P Z) (h : X → Y → Z) (Ph : mor_hset_struct P (hset_struct_prod P PX PY) PZ (λ xy, h (pr1 xy) (pr2 xy))) (hp₁ : ∏ (y₁ y₂ : Y), h (hset_struct_point Pt PX) y₁ = h (hset_struct_point Pt PX) y₂) (hp₂ : ∏ (x : X) (y : Y), h x (hset_struct_point Pt PY) = h (hset_struct_point Pt PX) y) (hp₃ : ∏ (x₁ x₂ : X), h x₁ (hset_struct_point Pt PY) = h x₂ (hset_struct_point Pt PY)), mor_hset_struct P (pr2 SP X Y PX PY) PZ (map_from_smash P Pt PX PY h hp₁ hp₂ hp₃)).
Require Import UniMath.MoreFoundations.All. Require Import UniMath.CategoryTheory.Core.Categories. Require Import UniMath.CategoryTheory.DisplayedCats.Core. Require Import UniMath.CategoryTheory.DisplayedCats.Structures.CartesianStructure. Require Import UniMath.CategoryTheory.DisplayedCats.Structures.StructureLimitsAndColimits.