let export_wpo export kf bhv wrn dep propid gpred =
let gname = WpPropId.prop_id_name propid in
let gid = Wpo.gid ~context:Descr.context ~kf ~bhv ~propid in
Wp_parameters.debug ~dkey "Export PO %s " gname;
let fhead = Wpo.file_for_head ~gid in
Wp_parameters.debug ~dkey "DO HEADER in %s" fhead ;
Command.pp_to_file fhead
(fun fmt ->
Format.fprintf fmt "@[<v 0>Proof Obligation %s:@]@\n" gname ;
Format.fprintf fmt "Environment: %s@\n" export.env ;
List.iter (fun d -> Format.fprintf fmt "%a@\n" (Wpo.pp_dependency kf) d) dep ;
List.iter (fun w -> Format.fprintf fmt "%a@\n" Wpo.pp_warning w) wrn ;
) ;
Wp_parameters.debug ~dkey "DONE HEADER in %s" fhead;
let fbody = Wpo.file_for_body ~gid in
Wp_parameters.debug ~dkey "DO BODY in %s" fbody ;
Command.pp_to_file fbody
(fun fmt ->
Format.fprintf fmt "@[<v 2>Goal %s:@ %a@]" gid F.pp_pred gpred ;
) ;
Wp_parameters.debug ~dkey "DONE BODY in %s" fbody ;
let export_lgg l =
Wp_parameters.debug ~dkey "DO export goal in language %a"
Wpo.pp_language l;
Command.pp_to_file (Wpo.file_for_goal ~gid l )
(fun fmt ->
match l with
| Wpo.L_why -> Why.export_goal fmt gid gpred
| Wpo.L_coq -> Coq.export_goal fmt gid gpred
| Wpo.L_altergo -> Ergo.export_goal fmt gid gpred
) ;
Wp_parameters.debug ~dkey "DONE export goal in language %a"
Wpo.pp_language l;
in
let export_all () =
export_lgg Wpo.L_why ;
export_lgg Wpo.L_coq ;
export_lgg Wpo.L_altergo;
in
(
if !Config.is_gui || (Wp_parameters.debug_atleast 2) then
(Wp_parameters.debug ~dkey
"Into gui config, goal has to be produce in all languages";
export_all () )
else
(match active_lgg () with
| None -> ()
| Some l ->export_lgg l
)
);
if wrn <> [] then
begin
let pp_warnings fmt ws =
let n = List.length ws in if n = 1
then Format.pp_print_string fmt "1 warning"
else Format.fprintf fmt "%d warnings" n
in
let degenerated = List.exists (fun w -> w.Wpo.wrn_severe) wrn in
if not (Wp_parameters.Details.get ()) then
Wp_parameters.warning ~current:false ~once:true
"Use -wp-warnings for details about 'Stronger' and 'Degenerated' goals" ;
Wp_parameters.warning ~current:false
"%s goal %s (%a)"
(if degenerated then "Degenerated" else "Stronger")
gid pp_warnings wrn ;
if Wp_parameters.Details.get () then
List.iter
(fun w ->
Log.print_on_output
(fun fmt -> Wpo.pp_warning fmt w ; Format.pp_print_newline fmt ())
) wrn ;
end ;
let emitter =
Emitter.create Me.name
~correctness:[] ~tuning:[ Wp_parameters.Prover.parameter ]
in
let wpo = {
Wpo.po_fun = kf ;
Wpo.po_bhv = bhv ;
Wpo.po_name = gname ;
Wpo.po_gid = gid ;
Wpo.po_model = Descr.shared ;
Wpo.po_env = export.env ;
Wpo.po_pid = propid ;
Wpo.po_dep = dep ;
Wpo.po_warn = wrn ;
Wpo.po_updater = emitter;
}
in
Wpo.add wpo ;
if F.is_true gpred then
Wpo.set_result wpo Wpo.WP Wpo.Valid ;
export.goals <- wpo :: export.goals