Fixpoint fcat' (s1 : fmap) (s2 : seq (K * V)) {struct s2} : fmap :=
if s2 is (k, v)::t then fcat' (ins k v s1) t else s1.
Definition fcat s1 s2 := fcat' s1 (seq_of s2).

(* Specifications: *)
Lemma fcat_ins' k v s1 s2 :
k \notin (map key s2) -> fcat' (ins k v s1) s2 = ins k v (fcat' s1 s2).
Lemma fcat_nil' s : fcat' nil (seq_of s) = s.
Lemma fcat0s s : fcat nil s = s. Proof. by apply: fcat_nil'. Qed.
Lemma fcats0 s : fcat s nil = s. Proof. by []. Qed.
Lemma fcat_inss k v s1 s2 :
k \notin supp s2 -> fcat (ins k v s1) s2 = ins k v (fcat s1 s2).
Lemma fcat_rems k s1 s2 :
k \notin supp s2 -> fcat (rem k s1) s2 = rem k (fcat s1 s2).
Lemma fcat_srem k s1 s2 :
k \notin supp s1 -> fcat s1 (rem k s2) = rem k (fcat s1 s2).
Lemma fnd_fcat k s1 s2 :
fnd k (fcat s1 s2) =
if k \in supp s2 then fnd k s2 else fnd k s1.
Lemma supp_fcat s1 s2 : supp (fcat s1 s2) =i [predU supp s1 & supp s2].
End Append.