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 disj_fcat (s s1 s2 : fmap) :
disj s (fcat s1 s2) = disj s s1 && disj s s2.