|
|
@ -583,13 +583,6 @@ let filter_heap ~f q =
|
|
|
|
|
|
|
|
|
|
|
|
(** Query *)
|
|
|
|
(** Query *)
|
|
|
|
|
|
|
|
|
|
|
|
let is_false = function
|
|
|
|
|
|
|
|
| {djns= [[]]; _} -> true
|
|
|
|
|
|
|
|
| {ctx; pure; heap; _} ->
|
|
|
|
|
|
|
|
Formula.is_false (Context.normalizef ctx pure)
|
|
|
|
|
|
|
|
|| List.exists heap ~f:(fun seg ->
|
|
|
|
|
|
|
|
Context.implies ctx (Formula.eq seg.loc Term.zero) )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let rec is_empty q =
|
|
|
|
let rec is_empty q =
|
|
|
|
List.is_empty q.heap && List.for_all ~f:(List.for_all ~f:is_empty) q.djns
|
|
|
|
List.is_empty q.heap && List.for_all ~f:(List.for_all ~f:is_empty) q.djns
|
|
|
|
|
|
|
|
|
|
|
@ -610,6 +603,8 @@ let pure_approx q =
|
|
|
|
|>
|
|
|
|
|>
|
|
|
|
[%Trace.retn fun {pf} -> pf "%a" Formula.pp]
|
|
|
|
[%Trace.retn fun {pf} -> pf "%a" Formula.pp]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let is_false q = Context.refutes q.ctx (pure_approx q)
|
|
|
|
|
|
|
|
|
|
|
|
let fold_dnf ~conj ~disj sjn (xs, conjuncts) disjuncts =
|
|
|
|
let fold_dnf ~conj ~disj sjn (xs, conjuncts) disjuncts =
|
|
|
|
let rec add_disjunct pending_splits sjn (xs, conjuncts) disjuncts =
|
|
|
|
let rec add_disjunct pending_splits sjn (xs, conjuncts) disjuncts =
|
|
|
|
let ys, sjn = bind_exists sjn ~wrt:xs in
|
|
|
|
let ys, sjn = bind_exists sjn ~wrt:xs in
|
|
|
|