(** 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).