(* *)
(* PROJECT HELM *)
(* *)
-(* Claudio Sacerdoti Coen <sacerdot@cs.unibo.it> *)
+(* Claudio Sacerdoti Coen <natile@cs.unibo.it> *)
(* 06/01/2002 *)
(* *)
(* *)
"</html>"
;;
-let prooffile = "/public/sacerdot/currentproof";;
-let prooffiletype = "/public/sacerdot/currentprooftype";;
+let prooffile = "/public/natile/currentproof";;
+let prooffiletype = "/public/natile/currentprooftype";;
(* SACERDOT
-let prooffile = "/public/sacerdot/currentproof";;
-let prooffiletype = "/public/sacerdot/currentprooftype";;
+let prooffile = "/public/natile/currentproof";;
+let prooffiletype = "/public/natile/currentprooftype";;
*)
(* TASSI
(*CSC: the getter should handle the innertypes, not the FS *)
-let innertypesfile = "/public/sacerdot/innertypes";;
-let constanttypefile = "/public/sacerdot/constanttype";;
+let innertypesfile = "/public/natile/innertypes";;
+let constanttypefile = "/public/natile/constanttype";;
(* SACERDOT
-let innertypesfile = "/public/sacerdot/innertypes";;
-let constanttypefile = "/public/sacerdot/constanttype";;
+let innertypesfile = "/public/natile/innertypes";;
+let constanttypefile = "/public/natile/constanttype";;
*)
(* TASSI
let whd = call_tactic_with_goal_input ProofEngine.whd;;
let reduce = call_tactic_with_goal_input ProofEngine.reduce;;
let simpl = call_tactic_with_goal_input ProofEngine.simpl;;
-let fold = call_tactic_with_input ProofEngine.fold;;
+let fold_whd = call_tactic_with_input ProofEngine.fold_whd;;
+let fold_reduce = call_tactic_with_input ProofEngine.fold_reduce;;
+let fold_simpl = call_tactic_with_input ProofEngine.fold_simpl;;
let cut = call_tactic_with_input ProofEngine.cut;;
let change = call_tactic_with_input_and_goal_input ProofEngine.change;;
let letin = call_tactic_with_input ProofEngine.letin;;
try
let dom,mk_metasenv_and_expr = inputt#get_term ~context:[] ~metasenv:[] in
let metasenv,expr = disambiguate_input [] [] dom mk_metasenv_and_expr in
- ignore (MQueryLevels2.get_constraints expr)
+ let must,can = MQueryLevels2.get_constraints expr in
+ let result = MQueryGenerator.searchPattern must can in
+ output_html outputhtml
+ ("<h1 color=\"maroon\"><pre>" ^ MQueryUtil.text_of_result result "\n" ^ "</pre></h1>")
with
e ->
output_html outputhtml
("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
;;
+let choose_must list_of_must can =
+ let chosen = ref None in
+ let user_constraints = ref [] in
+ let window =
+ GWindow.window
+ ~modal:true ~title:"Query refinement." ~border_width:2 () in
+ let vbox = GPack.vbox ~packing:window#add () in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let lMessage =
+ GMisc.label
+ ~text:
+ ("You can now specify the genericity of the query. " ^
+ "The more generic the slower.")
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let lMessage =
+ GMisc.label
+ ~text:
+ "Suggestion: start with faster queries before moving to more generic ones."
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let notebook =
+ GPack.notebook ~scrollable:true
+ ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+ let _ =
+ let page = ref 0 in
+ let last = List.length list_of_must in
+ List.map
+ (function must ->
+ incr page ;
+ let label =
+ GMisc.label ~text:
+ (if !page = 1 then "More generic" else
+ if !page = last then "More precise" else " ") () in
+ let expected_height = 25 * (List.length must + 2) in
+ let height = if expected_height > 400 then 400 else expected_height in
+ let scrolled_window =
+ GBin.scrolled_window ~border_width:10 ~height ~width:600
+ ~packing:(notebook#append_page ~tab_label:label#coerce) () in
+ let clist =
+ GList.clist ~columns:2 ~packing:scrolled_window#add
+ ~titles:["URI" ; "Position"] ()
+ in
+ ignore
+ (List.map
+ (function (uri,position) ->
+ let n =
+ clist#append
+ [uri; if position then "MainConclusion" else "Conclusion"]
+ in
+ clist#set_row ~selectable:false n
+ ) must
+ ) ;
+ clist#columns_autosize ()
+ ) list_of_must in
+ let _ =
+ let label = GMisc.label ~text:"User provided" () in
+ let vbox =
+ GPack.vbox ~packing:(notebook#append_page ~tab_label:label#coerce) () in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let lMessage =
+ GMisc.label
+ ~text:"Select the constraints that must be satisfied and press OK."
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let expected_height = 25 * (List.length can + 2) in
+ let height = if expected_height > 400 then 400 else expected_height in
+ let scrolled_window =
+ GBin.scrolled_window ~border_width:10 ~height ~width:600
+ ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+ let clist =
+ GList.clist ~columns:2 ~packing:scrolled_window#add
+ ~selection_mode:`EXTENDED
+ ~titles:["URI" ; "Position"] ()
+ in
+ ignore
+ (List.map
+ (function (uri,position) ->
+ let n =
+ clist#append
+ [uri; if position then "MainConclusion" else "Conclusion"]
+ in
+ clist#set_row ~selectable:true n
+ ) can
+ ) ;
+ clist#columns_autosize () ;
+ ignore
+ (clist#connect#select_row
+ (fun ~row ~column ~event ->
+ user_constraints := (List.nth can row)::!user_constraints)) ;
+ ignore
+ (clist#connect#unselect_row
+ (fun ~row ~column ~event ->
+ user_constraints :=
+ List.filter
+ (function uri -> uri != (List.nth can row)) !user_constraints)) ;
+ in
+ let hbox =
+ GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let okb =
+ GButton.button ~label:"Ok"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let cancelb =
+ GButton.button ~label:"Abort"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ (* actions *)
+ ignore (window#connect#destroy GMain.Main.quit) ;
+ ignore (cancelb#connect#clicked window#destroy) ;
+ ignore
+ (okb#connect#clicked
+ (function () -> chosen := Some notebook#current_page ; window#destroy ())) ;
+ window#set_position `CENTER ;
+ window#show () ;
+ GMain.Main.main () ;
+ match !chosen with
+ None -> raise NoChoice
+ | Some n ->
+ if n = List.length list_of_must then
+ (* user provided constraints *)
+ !user_constraints
+ else
+ List.nth list_of_must n
+;;
+
let searchPattern () =
let inputt = ((rendering_window ())#inputt : term_editor) in
let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
try
- let rec get_level ?(last_invalid=false) () =
- match
- GToolbox.input_string
- ~title:"Insert the strictness parameter for the query:"
- ((if last_invalid then
- "Invalid input (must be a non-negative natural number). Insert again "
- else
- "Insert "
- ) ^ "the strictness parameter for the query:")
- with
- None -> raise NoChoice
- | Some n ->
- try
- int_of_string n
- with
- _ -> get_level ~last_invalid:true ()
- in
- let level = get_level () in
let metasenv =
match !ProofEngine.proof with
None -> assert false
| Some metano ->
let (_, ey ,ty) = List.find (function (m,_,_) -> m=metano) metasenv in
let list_of_must,can = MQueryLevels.out_restr metasenv ey ty in
- let len = List.length list_of_must in
- let must = if level < len then List.nth list_of_must level else can in
- let result = MQueryGenerator.searchPattern metasenv ey ty must can in
+ let must = choose_must list_of_must can in
+ let torigth_restriction (u,b) =
+ let p = if b then "http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion"
+ else "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion" in
+ (u,p,None)
+ in
+ let rigth_must = List.map torigth_restriction must in
+ let rigth_can = Some (List.map torigth_restriction can) in
+ let result = MQueryGenerator.searchPattern (rigth_must,[],[]) (rigth_can,None,None) in
let uris =
List.map
(function uri,_ ->
) result in
let html =
" <h1>Backward Query: </h1>" ^
- " <h2>Levels: </h2> " ^
- MQueryLevels.string_of_levels
- (MQueryLevels.levels_of_term metasenv ey ty) "<br>" ^
" <pre>" ^ get_last_query result ^ "</pre>"
in
output_html outputhtml html ;
let simplb =
GButton.button ~label:"Simpl"
~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
- let foldb =
- GButton.button ~label:"Fold"
- ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
- let cutb =
- GButton.button ~label:"Cut"
+ let foldwhdb =
+ GButton.button ~label:"Fold_whd"
~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
let hbox4 =
GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let foldreduceb =
+ GButton.button ~label:"Fold_reduce"
+ ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ let foldsimplb =
+ GButton.button ~label:"Fold_simpl"
+ ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ let cutb =
+ GButton.button ~label:"Cut"
+ ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
let changeb =
GButton.button ~label:"Change"
~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
let clearb =
GButton.button ~label:"Clear"
~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ let hbox5 =
+ GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
let fourierb =
GButton.button ~label:"Fourier"
- ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
let rewritesimplb =
GButton.button ~label:"RewriteSimpl ->"
- ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
let reflexivityb =
GButton.button ~label:"Reflexivity"
- ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
- let hbox5 =
- GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
let symmetryb =
GButton.button ~label:"Symmetry"
~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
let splitb =
GButton.button ~label:"Split"
~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+ let hbox6 =
+ GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
let leftb =
GButton.button ~label:"Left"
- ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
let rightb =
GButton.button ~label:"Right"
- ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
let assumptionb =
GButton.button ~label:"Assumption"
- ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
let generalizeb =
GButton.button ~label:"Generalize"
- ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
- let hbox6 =
- GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
let absurdb =
GButton.button ~label:"Absurd"
~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
ignore(whdb#connect#clicked whd) ;
ignore(reduceb#connect#clicked reduce) ;
ignore(simplb#connect#clicked simpl) ;
- ignore(foldb#connect#clicked fold) ;
+ ignore(foldwhdb#connect#clicked fold_whd) ;
+ ignore(foldreduceb#connect#clicked fold_reduce) ;
+ ignore(foldsimplb#connect#clicked fold_simpl) ;
ignore(cutb#connect#clicked cut) ;
ignore(changeb#connect#clicked change) ;
ignore(letinb#connect#clicked letin) ;