Definition env_mapsto: forall {key A}{KE: EqDec key} (id: key) (sh: Share.t) (v: A) , pred (env key A) := @_env_mapsto.

(* Specifications: *)
Lemma env_mapsto_exists{key A}{KE: EqDec key}: forall id sh (v: A), exists rho, _env_mapsto id (pshare_sh sh) v rho.
Lemma env_get_mapsto {key A}{KE: EqDec key}: forall (id: key) (v: A) (rho: env _ _), (exists sh, env_get rho id = Some (sh,v)) = (exp (fun sh => _env_mapsto id sh v) * TT)%pred rho.
Lemma env_get_mapsto' {key A}{KE: EqDec key}: forall id (sh: pshare) (v: A) rho, env_get rho id = Some(pfullshare,v) -> (_env_mapsto id (pshare_sh sh) v * TT)%pred rho.
Lemma env_mapsto_set {key A}{KE: EqDec key}: forall id (v: A), env_mapsto id Share.top v (env_set id v empty_env).
Lemma env_mapsto_set_sh{key A}{KE: EqDec key}: forall id (sh: pshare) (v: A), _env_mapsto id (pshare_sh sh) v (env_set_sh id (Some (sh,v)) empty_env).
Lemma env_mapsto_get{key A}{KE: EqDec key}: forall id sh (v:A) rho, env_mapsto id sh v rho -> exists Pf: nonunit sh, env_get rho id = Some (exist nonunit sh Pf, v).
Lemma env_mapsto_empty_env {key A}{KE: EqDec key} : forall id (v:A) sh, ~(env_mapsto id sh v empty_env).
Lemma env_mapsto_get_neq {key A}{KE: EqDec key} : forall (id1 id2: key) (sh: Share.t) (v: A) rho, id1 <> id2 -> env_mapsto id1 sh v rho -> env_get rho id2 = None.
Lemma env_mapsto_splittable {key A}{KE: EqDec key}: forall id (v:A) (sh sh1 sh2: pshare) rho, join (proj1_sig sh1) (proj1_sig sh2) (proj1_sig sh) -> (_env_mapsto id (pshare_sh sh) v rho <-> (_env_mapsto id (pshare_sh sh1) v * _env_mapsto id (pshare_sh sh2) v)%pred rho).
Lemma env_mapsto_positive{key: Type}{A: Type}{KE: EqDec key}: forall id sh (v: A) rho, env_mapsto id sh v rho -> nonidentity sh.
Lemma emp_empty_env {key: Type}{A: Type}: forall rho: env key A, emp rho <-> rho = empty_env.
Lemma emp_empty_env' {key}{A}: emp (@empty_env key A).
Lemma env_mapsto_precise{key: Type}{A: Type}{KE: EqDec key}: forall id sh (v:A), precise (env_mapsto id sh v).