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_nil' s : fcat' nil (seq_of s) = s.
Lemma fcat0s s : fcat nil s = s.
Lemma fcats0 s : fcat s nil = s.
Lemma fcat_sins k v s1 s2 : fcat s1 (ins k v s2) = ins k v (fcat s1 s2).
Lemma supp_eq_ins (s1 s2 : fmap) k1 k2 v1 v2 : path ord k1 (supp s1) -> path ord k2 (supp s2) -> supp (ins k1 v1 s1) =i supp (ins k2 v2 s2) -> k1 = k2 /\ supp s1 =i supp s2.
Lemma fmap_ind2 (P : fmap -> fmap -> Prop) : P nil nil -> (forall k v1 v2 s1 s2, path ord k (supp s1) -> path ord k (supp s2) -> P s1 s2 -> P (ins k v1 s1) (ins k v2 s2)) -> forall s1 s2, supp s1 =i supp s2 -> P s1 s2.
Lemma disjP s1 s2 : disj_spec s1 s2 (disj s1 s2).
Lemma disjC s1 s2 : disj s1 s2 = disj s2 s1.
Lemma disj_nil (s : fmap) : disj s nil.
Lemma disj_rem k (s1 s2 : fmap) : disj s1 s2 -> disj s1 (rem k s2).
Lemma disj_fcat (s s1 s2 : fmap) : disj s (fcat s1 s2) = disj s s1 && disj s s2.
Lemma fcatC (s1 s2 : fmap) : disj s1 s2 -> fcat s1 s2 = fcat s2 s1.
Lemma fcatA (s1 s2 s3 : fmap) : disj s2 s3 -> fcat (fcat s1 s2) s3 = fcat s1 (fcat s2 s3).
Lemma fcatsK (s s1 s2 : fmap) : disj s1 s && disj s2 s -> fcat s1 s = fcat s2 s -> s1 = s2.
Lemma fcatKs (s s1 s2 : fmap) : disj s s1 && disj s s2 -> fcat s s1 = fcat s s2 -> s1 = s2.
Lemma feqP : Equality.axiom feq.