Definition empty_fpm : fpm.Instance Sep_fpm : @Sep_alg fpm Join_fpm.Instance Sing_fpm:  @Sing_alg fpm _ _.Instance Canc_fpm {CA_B: Canc_alg B}: Canc_alg fpm.Instance Disj_fpm {DA_B: Disj_alg B}: Disj_alg fpm.Definition lookup_fpm (f:fpm) : A -> Rng := proj1_sig f.Definition insert_fpm (a:A) (b: B) (f:fpm) : fpm.Definition insert'_fpm (a:A)(b: option B) (f: fpm) : fpm.Definition remove_fpm (a:A) (f:fpm) : fpm.

(* Specifications: *)
Lemma fpm_gss: forall i v rho, lookup_fpm (insert_fpm i v rho) i = Some v.
Lemma fpm_gso: forall i j v rho, i <> j -> lookup_fpm (insert_fpm j v rho) i = lookup_fpm rho i.
Lemma empty_fpm_join : forall x, @join _ Join_fpm empty_fpm x x.
Lemma insert_fpm_join : forall i v (x y z:fpm), lookup_fpm y i = None -> @join _ Join_fpm x y z -> @join _ Join_fpm (insert_fpm i v x) y (insert_fpm i v z).
Lemma fpm_bij_aux: forall A B B' (f: B -> B') (rho: A -> option B), @finMap A B rho -> @finMap A B' (fun i => match rho i with None => None | Some j => Some (f j) end).