let rec add i j =
let dom = Dom.union i.dom j.dom
and lo =
match i.lo, j.lo with
| None, _ -> None
| _, None -> None
| Some(alpha, q), Some(beta, p) -> Some(alpha && beta, Q.add q p)
and hi =
match i.hi, j.hi with
| None, _ -> None
| _, None -> None
| Some(q, alpha), Some(p, beta) -> Some(Q.add q p, alpha && beta)
in
make (dom, lo, hi)