Section FinitePartialMap.
Variable A:Type.
Variable dec_A : EqDec A.
Variable B:Type.
Variable PJ_B: Join B.
Variable Perm_B : Perm_alg B.
Variable Pos_B : Pos_alg B.
Let Rng := option B.
Let Join_Rng := Join_lower PJ_B.
Let Sep_Rng := Sep_lower B.
Let Perm_Rng := Perm_lower B.
Definition finMap (f:A -> Rng) : Prop :=
exists l, forall a:A, ~In a l -> f a = None.
Definition fpm := sig finMap.
Instance Join_fpm : Join fpm :=
Join_prop (A -> option B)  (Join_fun A (option B) Join_Rng) finMap.
Definition PAF: (@Perm_alg (A -> Rng)  (Join_fun A Rng Join_Rng))
:= Perm_fun _ _ _ Perm_Rng.
Instance Perm_fpm : @Perm_alg fpm Join_fpm :=
Perm_prop (A -> Rng) _ _ finMap finMap_join.
Instance Disj_fpm {DA_B: Disj_alg B}: Disj_alg fpm.

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).