(** Least upper bound *)
Definition combine_acontents (c1 c2: option acontent) : option acontent :=
match c1, c2 with
| Some (ACval chunk1 v1), Some (ACval chunk2 v2) =>
if chunk_eq chunk1 chunk2 then Some(ACval chunk1 (vlub v1 v2)) else None
| _, _ =>
None
end.
Definition blub (ab1 ab2: ablock) : ablock :=
{| ab_contents := ZTree.combine combine_acontents ab1.(ab_contents) ab2.(ab_contents);
ab_summary := plub ab1.(ab_summary) ab2.(ab_summary) |}.

(* Specifications: *)
Lemma smatch_lub_l:
forall m b p q, smatch m b p -> smatch m b (plub p q).
Lemma smatch_lub_r:
forall m b p q, smatch m b q -> smatch m b (plub p q).
Lemma bmatch_lub_l:
forall m b x y, bmatch m b x -> bmatch m b (blub x y).
Lemma bmatch_lub_r:
forall m b x y, bmatch m b y -> bmatch m b (blub x y).