(** This operator is a combination of the function space and smash operators which provides the SA equivalant of partial maps.  We also constrain the domain of the functions to be finite, giving a useful semantic characterization of finite partial maps. *)
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.

(* Specifications: *)
Lemma finMap_unit : forall x e,
finMap x -> @unit_for _ (Join_fun A _ Join_Rng) e x -> finMap e.
Lemma finMap_join : forall x y z,
@join _ (Join_fun A _ Join_Rng) x y z -> finMap x -> finMap y -> finMap z.