Definition zip_unit f := 
  let: FinMap s pf := f in FinMap (zip_unit_sorted' pf).

(* Specifications: *)
Lemma zip_unitE f1 f2 : (exists f, zip f1 f2 = Some f) <-> zip_unit f1 = zip_unit f2.
Lemma zip_supp' s1 s2 s : zip' s1 s2 = Some s -> map key s = map key s1.
Lemma zip_supp f1 f2 f : zip f1 f2 = Some f -> supp f =i supp f1.
Lemma zip_filter' s1 s2 s x : zip' s1 s2 = Some s -> zip' (filter (predCk V x) s1) (filter (predCk V x) s2) = Some (filter (predCk V x) s).
Lemma zip_rem f1 f2 f x : zip f1 f2 = Some f -> zip (rem x f1) (rem x f2) = Some (rem x f).
Lemma zip_fnd f1 f2 f x (v : V) : zip f1 f2 = Some f -> fnd x f = Some v -> exists v1, exists v2, [/\ zip_f v1 v2 = Some v, fnd x f1 = Some v1 & fnd x f2 = Some v2].
Lemma fnd_zip f1 f2 f x (v1 v2 : V) : fnd x f1 = Some v1 -> fnd x f2 = Some v2 -> zip f1 f2 = Some f -> fnd x f = zip_f v1 v2.
Lemma zunit0 : zip_unit (nil K V) = nil K V.
Lemma zunit_ins f k v : zip_unit (ins k v f) = ins k (unit_f v) (zip_unit f).
Lemma zunit_fcat f1 f2 : zip_unit (fcat f1 f2) = fcat (zip_unit f1) (zip_unit f2).
Lemma zunit_supp f : supp (zip_unit f) = supp f.
Lemma zunit_disj f1 f2 : disj f1 f2 = disj (zip_unit f1) (zip_unit f2).