CoInductive supp_spec x (s : fmap) : bool -> Type :=
| supp_spec_some v of fnd x s = Some v : supp_spec x s true
| supp_spec_none of fnd x s = None : supp_spec x s false.CoInductive supp_spec x (s : fmap) : bool -> Type :=
| supp_spec_some v of fnd x s = Some v : supp_spec x s true
| supp_spec_none of fnd x s = None : supp_spec x s false.CoInductive supp_spec x (s : fmap) : bool -> Type :=
| supp_spec_some v of fnd x s = Some v : supp_spec x s true
| supp_spec_none of fnd x s = None : supp_spec x s false.

(* Specifications: *)
Lemma suppP x (s : fmap) : supp_spec x s (x \in supp s).
Lemma suppE (s1 s2 : fmap) : supp s1 =i supp s2 <-> supp s1 = supp s2.
Lemma supp_rem k (s : fmap) : supp (rem k s) =i predI (predC1 k) (mem (supp s)).
Lemma supp_ins k v (s : fmap) : supp (ins k v s) =i [predU pred1 k & supp s].
Lemma fnd_empty k : fnd k nil = None.
Lemma rem_empty k : rem k nil = nil.
Lemma rem_supp k (s : fmap) : k \notin supp s -> rem k s = s.
Lemma fnd_supp k (s : fmap) : k \notin supp s -> fnd k s = None.
Lemma fnd_supp_in k (s : fmap) : k \in supp s -> exists v, fnd k s = Some v.
Lemma cancel_ins k v (s1 s2 : fmap) : k \notin (supp s1) -> k \notin (supp s2) -> ins k v s1 = ins k v s2 -> s1 = s2.
Lemma seqof_ins k v (s : fmap) : path ord k (supp s) -> seq_of (ins k v s) = (k, v) :: seq_of s.
Lemma path_supp_ins k1 k v (s : fmap) : ord k1 k -> path ord k1 (supp s) -> path ord k1 (supp (ins k v s)).
Lemma path_supp_ins_inv k1 k v (s : fmap) : path ord k (supp s) -> path ord k1 (supp (ins k v s)) -> ord k1 k && path ord k1 (supp s).
Lemma fmap_ind' (P : fmap -> Prop) : P nil -> (forall k v s, path ord k (supp s) -> P s -> P (ins k v s)) -> forall s, P s.
Lemma fmap_ind'' (P : fmap -> Prop) : P nil -> (forall k v s, (forall x, x \in supp s -> ord x k) -> P s -> P (ins k v s)) -> forall s, P s.