Section DisjointUnion.
Variable (K : ordType) (V : Type).
Notation fmap := (finMap K V).
Notation nil := (nil K V).
Definition disj (s1 s2 : fmap) :=
all (predC (fun x => x \in supp s2)) (supp s1).
CoInductive disj_spec (s1 s2 : fmap) : bool -> Type :=
| disj_true of (forall x, x \in supp s1 -> x \notin supp s2) :
disj_spec s1 s2 true
| disj_false x of x \in supp s1 & x \in supp s2 :
disj_spec s1 s2 false.

Lemma fcatC (s1 s2 : fmap) : disj s1 s2 -> fcat s1 s2 = fcat s2 s1.