diff --git a/src/plugins/wp/gui/GuiGoal.ml b/src/plugins/wp/gui/GuiGoal.ml index 04f83bb3faab159d63e0222325ddbe227f06cb9d..0148e3f44485bb1f35da507c9c9ed4ffbeb38aeb 100644 --- a/src/plugins/wp/gui/GuiGoal.ml +++ b/src/plugins/wp/gui/GuiGoal.ml @@ -117,7 +117,8 @@ class pane (gprovers : GuiConfig.provers) = let autofocus = new autofocus in let iformat = new iformat in let rformat = new rformat in - let autosearch = new GuiTactic.auto () in + let autosearch = new GuiTactic.autosearch () in + let strategies = new GuiTactic.strategies () in object(self) val mutable state : state = Empty @@ -146,7 +147,9 @@ class pane (gprovers : GuiConfig.provers) = provers <- why3_provers ; List.iter (fun p -> palette#add_tool p#tool) provers ; palette#add_tool autosearch#tool ; + palette#add_tool strategies#tool ; Strategy.iter autosearch#register ; + ProofStrategy.iter strategies#register ; Tactical.iter (fun tac -> let gtac = new GuiTactic.tactic tac printer#pp_selection in @@ -381,22 +384,26 @@ class pane (gprovers : GuiConfig.provers) = | None -> printer#set_target Tactical.Empty ; autosearch#connect None ; + strategies#connect None ; List.iter (fun tactic -> tactic#clear) tactics - | Some(tree,sequent,sel) -> + | Some(tree,wpo,sequent,sel) -> on_proof_context tree begin fun () -> - autosearch#connect (Some (self#autosearch sequent)) ; - let select (tactic : GuiTactic.tactic) = - let process = self#apply in - let composer = self#compose in - let browser = self#browse in - tactic#select ~process ~composer ~browser ~tree sel - in - List.iter select tactics ; - let tgt = - if List.exists (fun tactics -> tactics#targeted) tactics - then sel else Tactical.Empty in - printer#set_target tgt + (* configure strategies *) + let hints = ProofStrategy.hints wpo in + autosearch#connect (Some (self#autosearch sequent)); + strategies#connect ~hints (Some self#strategies); + (* configure tactics *) + List.iter (fun (tactic : GuiTactic.tactic) -> + let process = self#apply in + let composer = self#compose in + let browser = self#browse in + tactic#select ~process ~composer ~browser ~tree sel + ) tactics ; + (* target selection feedback *) + printer#set_target + (if List.exists (fun tactics -> tactics#targeted) tactics + then sel else Tactical.Empty) end () method private update_scriptbar = @@ -513,7 +520,7 @@ class pane (gprovers : GuiConfig.provers) = self#update_provers (Some wpo) ; let sequent = printer#sequent in let select = printer#selection in - self#update_tactics (Some(proof,sequent,select)) ; + self#update_tactics (Some(proof,wpo,sequent,select)) ; end | Composer _ | Browser _ -> () @@ -692,6 +699,30 @@ class pane (gprovers : GuiConfig.provers) = end end + method private strategies ~depth strategy = + match state with + | Empty | Forking _ | Composer _ | Browser _ -> () + | Proof proof -> + Wutil.later + begin fun () -> + ProverScript.explore + ~depth ?strategy + ~result: + (fun wpo prv res -> + text#printf "[%a] %a : %a@." + VCS.pp_prover prv + Wpo.pp_title wpo + VCS.pp_result res) + ~success: + (fun _ _ -> + ProofEngine.forward proof ; + self#update ; + text#printf "Strategie(s) Explored." ) + proof (ProofEngine.anchor proof ()) ; + let server = ProverTask.server () in + Task.launch server + end + method private backtrack node = match state with | Empty | Forking _ | Composer _ | Browser _ -> () diff --git a/src/plugins/wp/gui/GuiTactic.ml b/src/plugins/wp/gui/GuiTactic.ml index 4d641d16e66fdf7550b8a6ae37da790baef408c6..dcfb10b46439d25ae5d75c275dc6530fd7b8bf47 100644 --- a/src/plugins/wp/gui/GuiTactic.ml +++ b/src/plugins/wp/gui/GuiTactic.ml @@ -517,7 +517,7 @@ let checkbox ~(form:Wpane.form) ~default ~label ~tooltip = type auto_callback = depth:int -> width:int -> Strategy.heuristic list -> unit -class auto () = +class autosearch () = let form = new Wpane.form () in let depth = spinner ~form ~default:1 ~label:"Depth" ~tooltip:"Limit the number of nested strategies" in @@ -616,11 +616,10 @@ class strategies () = button#connect (self#strategy s) ; end - method hints (hs: ProofStrategy.strategy list) = - filter <- hs ; self#update - - method connect (cb : callback option) = - callback <- cb ; self#update + method connect ?(hints=[]) (cb : callback option) = + callback <- cb ; + filter <- hints ; + self#update method private strategy (s : ProofStrategy.strategy) () = Option.iter (fun fn -> fn ~depth:depth#get (Some s)) callback diff --git a/src/plugins/wp/gui/GuiTactic.mli b/src/plugins/wp/gui/GuiTactic.mli index 3ea343716b676310262294b080549afe5cae9dd4..716d4620b65d0e4e0804fa1f2fa6af3ed59893d8 100644 --- a/src/plugins/wp/gui/GuiTactic.mli +++ b/src/plugins/wp/gui/GuiTactic.mli @@ -74,7 +74,7 @@ class tactic : Tactical.t -> (Format.formatter -> Tactical.selection -> unit) -> type auto_callback = depth:int -> width:int -> Strategy.heuristic list -> unit -class auto : unit -> +class autosearch : unit -> object inherit Wpalette.tool method register : Strategy.heuristic -> unit @@ -85,15 +85,14 @@ class auto : unit -> (* --- Strategies Dongle --- *) (* -------------------------------------------------------------------------- *) - type callback = (depth:int -> ProofStrategy.strategy option -> unit) class strategies : unit -> object inherit Wpalette.tool method register : ProofStrategy.strategy -> unit - method hints : ProofStrategy.strategy list -> unit - method connect : callback option -> unit + method connect : ?hints:ProofStrategy.strategy list -> + callback option -> unit end (* -------------------------------------------------------------------------- *)