From ca7f9200521590ecaf500a486673b83b2bc6ba51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Wed, 24 Apr 2019 12:53:36 +0200 Subject: [PATCH] [wp] refactor why3 dp --- src/plugins/wp/ProverDetect.None.ml | 9 +--- src/plugins/wp/ProverDetect.Why3.ml | 9 +--- src/plugins/wp/ProverDetect.mli | 9 +--- src/plugins/wp/ProverWhy3.ml | 72 +---------------------------- src/plugins/wp/ProverWhy3.mli | 19 ++------ src/plugins/wp/VCS.ml | 31 +++++++++++++ src/plugins/wp/VCS.mli | 24 ++++++++-- src/plugins/wp/register.ml | 18 ++------ 8 files changed, 62 insertions(+), 129 deletions(-) diff --git a/src/plugins/wp/ProverDetect.None.ml b/src/plugins/wp/ProverDetect.None.ml index 771dbba1b78..6520404f80c 100644 --- a/src/plugins/wp/ProverDetect.None.ml +++ b/src/plugins/wp/ProverDetect.None.ml @@ -26,13 +26,6 @@ (* --- Prover Detection (no why3) --- *) (* -------------------------------------------------------------------------- *) -type dp = { - dp_name : string ; - dp_version : string ; - dp_altern : string ; - dp_shortcuts : string list ; -} - -let detect () = [] +let detect () : VCS.dp list = [] (**************************************************************************) diff --git a/src/plugins/wp/ProverDetect.Why3.ml b/src/plugins/wp/ProverDetect.Why3.ml index ff6b33c6495..c2b6d1ac564 100644 --- a/src/plugins/wp/ProverDetect.Why3.ml +++ b/src/plugins/wp/ProverDetect.Why3.ml @@ -26,13 +26,6 @@ (* --- Why3 Prover Detection --- *) (* -------------------------------------------------------------------------- *) -type dp = { - dp_name : string ; - dp_version : string ; - dp_altern : string ; - dp_shortcuts : string list ; -} - open Why3 open Wstdlib open Whyconf @@ -49,7 +42,7 @@ let detect () = let dps = Mprover.fold (fun dp keys dps -> - { + VCS.{ dp_name = dp.prover_name ; dp_version = dp.prover_version ; dp_altern = dp.prover_altern ; diff --git a/src/plugins/wp/ProverDetect.mli b/src/plugins/wp/ProverDetect.mli index 14630cc1e6e..7a2cba28ff0 100644 --- a/src/plugins/wp/ProverDetect.mli +++ b/src/plugins/wp/ProverDetect.mli @@ -24,13 +24,6 @@ (** Why3 Prover Detection *) (* -------------------------------------------------------------------------- *) -type dp = { - dp_name : string ; - dp_version : string ; - dp_altern : string ; - dp_shortcuts : string list ; -} - -val detect : unit -> dp list +val detect : unit -> VCS.dp list (**************************************************************************) diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml index a40c44aecb8..38e73ded32b 100644 --- a/src/plugins/wp/ProverWhy3.ml +++ b/src/plugins/wp/ProverWhy3.ml @@ -612,74 +612,4 @@ let prove_prop ~timeout ~prover ~wpo = let prove ?timeout ~prover wpo = Task.todo (fun () -> prove_prop ~timeout ~wpo ~prover) -(* -------------------------------------------------------------------------- *) -(* --- Why3-Config --- *) -(* -------------------------------------------------------------------------- *) - -type dp = { - dp_name : string ; - dp_version : string ; - dp_prover : string ; -} - -let prover dp = Why3 dp.dp_prover - -let find name dps = - try List.find (fun d -> d.dp_prover = name) dps - with Not_found -> - let name = Transitioning.String.lowercase_ascii name in - try - List.find - (fun d -> Transitioning.String.lowercase_ascii d.dp_name = name) dps - with Not_found -> - { dp_prover = name ; dp_name = name ; dp_version = "default" } - -let parse spec = - try - let k = String.index spec ':' in - let dp_name = String.sub spec 0 k in - let dp_version = String.sub spec (succ k) (String.length spec - k - 1) - |> String.map (fun c -> if c =':' then ' ' else c) in - { dp_prover = spec ; dp_name ; dp_version } - with Not_found -> - { dp_prover = spec ; dp_name = spec ; dp_version = "default" } - -let pe_prover = Str.regexp "\\([^ ]+\\) (\\([^)]+\\))" - -class why3detect job = - object(why) - - inherit ProverTask.command "why3" - - val mutable dps = [] - - method result st = - job (if st = 0 then Some (List.rev dps) else None) - - method prover p = - begin - let dp_name = p#get_string 1 in - let dp_version = p#get_string 2 in - Wp_parameters.debug ~level:1 - "Prover %S, version %s detected." dp_name dp_version ; - let dp_prover = Printf.sprintf "%s:%s" dp_name dp_version - |> String.map - (fun c -> if c = ' ' || c = ',' then ':' else c) in - dps <- { dp_name ; dp_version ; dp_prover } :: dps - end - - method detect : unit task = - begin - why#add [ "--list-provers" ] ; - why#validate_pattern ~repeat:true ~logs:`OUT pe_prover why#prover ; - why#run ~echo:true () >>= Task.call why#result - end - - end - -let detect_why3 job = - let task = (new why3detect job)#detect in - Task.run (Task.thread task) - -let detect_provers job = - detect_why3 (function None -> job [] | Some dps -> job dps) +(* ------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/ProverWhy3.mli b/src/plugins/wp/ProverWhy3.mli index bab64eec2e2..d6a9f5bc755 100644 --- a/src/plugins/wp/ProverWhy3.mli +++ b/src/plugins/wp/ProverWhy3.mli @@ -39,22 +39,7 @@ val assemble_goal: Wpo.t -> (string list (* includes *) * goal) option val prove : ?timeout:int -> prover:string -> Wpo.t -> result task (** The string must be a valid why3 prover identifier - Return NoResult if it is already proved by Qed -*) - -type dp = { - dp_name : string ; - dp_version : string ; - dp_prover : string ; -} - -val prover : dp -> prover - -val detect_why3 : (dp list option -> unit) -> unit -val detect_provers : (dp list -> unit) -> unit - -val find : string -> dp list -> dp -val parse : string -> dp + Return NoResult if it is already proved by Qed *) (* -------------------------------------------------------------------------- *) (* --- Why3 Multi-Theorem Prover --- *) @@ -66,3 +51,5 @@ sig val compare : t -> t -> int val pretty : Format.formatter -> t -> unit end + +(* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/VCS.ml b/src/plugins/wp/VCS.ml index f1b22877570..37fea1aa59e 100644 --- a/src/plugins/wp/VCS.ml +++ b/src/plugins/wp/VCS.ml @@ -170,6 +170,37 @@ module P = struct type t = prover let compare = cmp_prover end module Pset = Set.Make(P) module Pmap = Map.Make(P) +(* -------------------------------------------------------------------------- *) +(* --- Why3 Provers --- *) +(* -------------------------------------------------------------------------- *) + +type dp = { + dp_name : string ; + dp_version : string ; + dp_altern : string ; + dp_shortcuts : string list ; +} + +let pp_altern fmt a = if a<>"" then Format.fprintf fmt " (%s)" a + +let pp_shortcut fmt = function + | ("alt-ergo" | "coq" | "tip" | "script") as p -> + Format.fprintf fmt "why3:%s" p + | p -> Format.pp_print_string fmt p + +let pp_shortcuts = + Pretty_utils.pp_list ~pre:"[" ~sep:"," ~suf:"]" ~empty:"(disabled)" + pp_shortcut + +let pretty fmt dp = + Format.fprintf fmt "%s %s%a" + dp.dp_name dp.dp_version + pp_altern dp.dp_altern + +let prover_of_dp = function + | { dp_shortcuts = key::_ } -> Why3 key + | _ -> Why3 "none" + (* -------------------------------------------------------------------------- *) (* --- Config --- *) (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/VCS.mli b/src/plugins/wp/VCS.mli index 9357b0bcc94..7d9eb27c8d2 100644 --- a/src/plugins/wp/VCS.mli +++ b/src/plugins/wp/VCS.mli @@ -44,10 +44,6 @@ type language = | L_coq | L_altergo -(* -------------------------------------------------------------------------- *) -(* --- Prover Names --- *) -(* -------------------------------------------------------------------------- *) - module Pset : Set.S with type elt = prover module Pmap : Map.S with type key = prover @@ -66,9 +62,29 @@ val pp_mode : Format.formatter -> mode -> unit val cmp_prover : prover -> prover -> int +(* -------------------------------------------------------------------------- *) +(** {2 Why3 Provers} *) +(* -------------------------------------------------------------------------- *) + +type dp = { + dp_name : string ; + dp_version : string ; + dp_altern : string ; + dp_shortcuts : string list ; +} + +val prover_of_dp : dp -> prover + +(** Without shortcuts *) +val pretty : Format.formatter -> dp -> unit +val pp_shortcut : Format.formatter -> string -> unit +val pp_shortcuts : Format.formatter -> string list -> unit + +(* -------------------------------------------------------------------------- *) (** {2 Config} [None] means current WP option default. [Some 0] means prover default. *) +(* -------------------------------------------------------------------------- *) type config = { valid : bool ; diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml index e447b0ed84c..ad824c977d6 100644 --- a/src/plugins/wp/register.ml +++ b/src/plugins/wp/register.ml @@ -846,21 +846,11 @@ let do_prover_detect () = begin let open ProverDetect in let dps = detect () in - let pp_altern fmt a = if a<>"" then Format.fprintf fmt " (%s)" a in - let pp_shortcut fmt = function - | ("alt-ergo" | "coq" | "tip" | "script") as p -> - Format.fprintf fmt "why3:%s" p - | p -> Format.pp_print_string fmt p in - let pp_shortcuts = - Pretty_utils.pp_list ~pre:"[" ~sep:"," ~suf:"]" ~empty:"(disabled)" - pp_shortcut in - let pp_prover fmt dp = - Format.fprintf fmt "%s %s%a %a" - dp.dp_name dp.dp_version - pp_altern dp.dp_altern - pp_shortcuts dp.dp_shortcuts in let pp_provers fmt dps = - List.iter (Format.fprintf fmt "@\n - %a" pp_prover) dps in + List.iter (fun dp -> + Format.fprintf fmt "@\n - %a %a" + VCS.pretty dp VCS.pp_shortcuts dp.VCS.dp_shortcuts + ) dps in if dps = [] then Wp_parameters.result "No Why3 provers detected." else -- GitLab