let build_prop_of_from wenv (pre:WpPropId.pred_info list) wp =
on_context wenv "build_froms" wp Keep_opened Keep_assigns
(fun env _assigns p ->
let alpha, p' = F.p_more_alpha_cv F.empty_alpha p in
let p = F.p_implies p p' in
let add_pre (alpha, p) (id, pre) =
let pid = WpPropId.property_of_id id in
match predicate env pre with
| Result pre ->
let pre =
match L.find_mem env Clabels.Pre with
| Some at ->
let here = L.mem_at env Clabels.Here in
WpModel.update ~at ~here pre
| None -> pre
in
Datalib.Collector.add_depend pid ;
let p = F.p_implies pre p in
let alpha', pre' = F.p_more_alpha_cv alpha pre in
let p = F.p_implies pre' p in
alpha', p
| Warning(source,reason) ->
Datalib.Collector.add_warning ~source ~reason
"Ignored hypothesis %a" Description.pp_property pid ;
alpha, p
in
let alpha, p = List.fold_left add_pre (alpha, p) pre in
let vars = F.fold_alpha (fun _v v' acc -> v'::acc) alpha [] in
let p = F.p_forall vars p in
let p = F.p_forall (L.collect_logic_vars env) p in
p
)