Section ENVSEC.
Context {key: Type}{A: Type}.
Instance JA: Join A := Join_equiv A.
Definition env := fpm key (pshare * A).
Definition env_get (rho: env) (id: key) : option (pshare * A) := lookup_fpm rho id.
Definition env_set_sh {KE: EqDec key} (id: key) (v: option (pshare * A)) (rho: env) : env :=
insert'_fpm _ id v rho.
Definition env_set {KE: EqDec key} (id: key) (v: A) (rho: env) : env :=
insert_fpm _ id (pfullshare,v) rho.
Definition finite_idfun (f: key -> option (pshare * A)) :=
(exists l, forall a, ~In a l -> f a = None).
Definition mk_env_aux: forall f, finite_idfun f -> finMap f.
Definition mk_env (f: key -> option (pshare * A))  (FIN: finite_idfun f):  env :=
exist _ _ (mk_env_aux _ FIN).
intros.
destruct rho.
unfold finite_idfun, finMap in *.
generalize f; intros [l ?].
exists l; simpl in *.
intros; unfold compose in *.
apply e; auto.
Qed.

Lemma env_funct: forall rho1 rho2,
rho1 = rho2 -> forall id sh1 sh2 v1 v2, env_get rho1 id = Some(sh1, v1)
-> env_get rho2 id = Some(sh2, v2)
-> v1 = v2.