Parameter env: forall (key: Type) (A: Type), Type.
Section ENVSEC.
Context {key: Type}{A: Type}.
Instance JA: Join A := Join_equiv A. (* It's a feature, not a bug, that this Instance is not visible as an Instance
outside the Section *)
Parameter env_get: forall (rho: env key A) (id: key), option (pshare * A).
Parameter env_set_sh: forall {KE: EqDec key} (id: key) (v: option (pshare * A)) (rho: env key A), env key A.
Definition env_set  {KE: EqDec key} (id: key) (v: A) (rho: env key A) : env key A :=
env_set_sh id (Some (pfullshare, v)) rho.

(* Specifications: *)
Axiom env_gss: forall {KE: EqDec key}  i a rho, env_get (env_set i a rho) i = Some (pfullshare, a).
Axiom env_gso: forall {KE: EqDec key}  i j a rho, i <> j -> env_get (env_set j a rho) i = env_get rho i.
Axiom env_gss_sh: forall {KE: EqDec key} i v rho,
env_get (env_set_sh i v rho) i = v.
Axiom env_gso_sh: forall {KE: EqDec key} i j v rho, i <> j ->
env_get (env_set_sh j v rho) i = env_get rho i.