(** Least upper bound *)
Definition nmem_lub (nm1 nm2: nmem) : nmem :=
match nm1, nm2 with
| NMemDead, _ => nm2
| _, NMemDead => nm1
| NMem stk1 gl1, NMem stk2 gl2 =>
NMem (ISet.inter stk1 stk2)
(PTree.combine
(fun o1 o2 =>
match o1, o2 with
| Some iv1, Some iv2 => Some(ISet.inter iv1 iv2)
| _, _ => None
end)
gl1 gl2)
end.

(* Specifications: *)
Lemma nlive_lub_l:
forall nm1 nm2 b i, nlive nm1 b i -> nlive (nmem_lub nm1 nm2) b i.
Lemma nlive_lub_r:
forall nm1 nm2 b i, nlive nm2 b i -> nlive (nmem_lub nm1 nm2) b i.