(* returns the proposition generated by a fact *)
Definition eval_fact i f :=
  match f with
  | eqH h1 h2 => interp i h1 = interp i h2
  | eqD d1 d2 => d1 = d2
  | eqX x1 x2 => plook i x1 = plook i x2
  end.Notation pread' x t := (odflt (dyn tt) (pread x t)).Definition pfree x t := filter (predC (ptreq x)) t.Definition hfree h t := filter (predC (vareq h)) t.

Lemma cancel_sound' i sh1 sh2 unm fs : interp i sh2 = interp i (sh1 ++ unm) -> def (interp i sh2) -> eval i fs -> eval i (cancel' i sh1 sh2 unm fs).