]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gTopLevel/gTopLevel.ml
1. helmns and domImpl moved to the misc module ;-(
[helm.git] / helm / gTopLevel / gTopLevel.ml
index 9d1b3e982969625da635f395361938b5f5be9500..4bef88816c302adba3a353cdaf3f1274f0f30e15 100644 (file)
@@ -36,7 +36,6 @@
 
 (* GLOBAL CONSTANTS *)
 
-let helmns = Gdome.domString "http://www.cs.unibo.it/helm";;
 let xlinkns = Gdome.domString "http://www.w3.org/1999/xlink";;
 
 let htmlheader =
@@ -86,9 +85,6 @@ let postgresqlconnectionstring =
   Not_found -> "host=mowgli.cs.unibo.it dbname=helm_mowgli_new_schema user=helm"
 ;;
 
-let empty_id_to_uris = ([],function _ -> None);;
-
-
 (* GLOBAL REFERENCES (USED BY CALLBACKS) *)
 
 let htmlheader_and_content = ref htmlheader;;
@@ -97,8 +93,6 @@ let current_cic_infos = ref None;;
 let current_goal_infos = ref None;;
 let current_scratch_infos = ref None;;
 
-let id_to_uris = ref empty_id_to_uris;;
-
 let check_term = ref (fun _ _ _ -> assert false);;
 let mml_of_cic_term_ref = ref (fun _ _ -> assert false);;
 
@@ -221,7 +215,7 @@ let check_window outputhtml uris =
         let expr =
          let term =
           term_of_cic_textual_parser_uri
-           (Disambiguate.cic_textual_parser_uri_of_string uri)
+           (Misc.cic_textual_parser_uri_of_string uri)
          in
           (Cic.Cast (term, CicTypeChecker.type_of_aux' [] [] term))
         in
@@ -352,9 +346,6 @@ let
    raise NoChoice
 ;;
 
-EliminationTactics.interactive_user_uri_choice :=
- (fun ~selection_mode -> interactive_user_uri_choice ~selection_mode:selection_mode);;
-
 let interactive_interpretation_choice interpretations =
  let chosen = ref None in
  let window =
@@ -421,89 +412,6 @@ let get_last_query =
   function result -> !query ^ " <h1>Result:</h1> " ^ MQueryUtil.text_of_result result "<br>"
 ;;
 
-let domImpl = Gdome.domImplementation ();;
-
-let parseStyle name =
- let style =
-  domImpl#createDocumentFromURI
-(*
-   ~uri:("http://phd.cs.unibo.it:8081/getxslt?uri=" ^ name) ?mode:None
-*)
-   ~uri:("styles/" ^ name) ()
- in
-  Gdome_xslt.processStylesheet style
-;;
-
-let d_c = parseStyle "drop_coercions.xsl";;
-let tc1 = parseStyle "objtheorycontent.xsl";;
-let hc2 = parseStyle "content_to_html.xsl";;
-let l   = parseStyle "link.xsl";;
-
-let c1 = parseStyle "rootcontent.xsl";;
-let g  = parseStyle "genmmlid.xsl";;
-let c2 = parseStyle "annotatedpres.xsl";;
-
-
-let getterURL = Configuration.getter_url;;
-let processorURL = Configuration.processor_url;;
-
-let mml_styles = [d_c ; c1 ; g ; c2 ; l];;
-let mml_args ~explode_all =
- ("explodeall",(if explode_all then "true()" else "false()"))::
-  ["processorURL", "'" ^ processorURL ^ "'" ;
-   "getterURL", "'" ^ getterURL ^ "'" ;
-   "draw_graphURL", "'http%3A//phd.cs.unibo.it%3A8083/'" ;
-   "uri_set_queueURL", "'http%3A//phd.cs.unibo.it%3A8084/'" ;
-   "UNICODEvsSYMBOL", "'symbol'" ;
-   "doctype-public", "'-//W3C//DTD%20XHTML%201.0%20Transitional//EN'" ;
-   "encoding", "'iso-8859-1'" ;
-   "media-type", "'text/html'" ;
-   "keys", "'d_c%2CC1%2CG%2CC2%2CL'" ;
-   "interfaceURL", "'http%3A//phd.cs.unibo.it/helm/html/cic/index.html'" ;
-   "naturalLanguage", "'yes'" ;
-   "annotations", "'no'" ;
-   "URLs_or_URIs", "'URIs'" ;
-   "topurl", "'http://phd.cs.unibo.it/helm'" ;
-   "CICURI", "'cic:/Coq/Init/Datatypes/bool_ind.con'" ]
-;;
-
-let sequent_styles = [d_c ; c1 ; g ; c2 ; l];;
-let sequent_args =
- ["processorURL", "'" ^ processorURL ^ "'" ;
-  "getterURL", "'" ^ getterURL ^ "'" ;
-  "draw_graphURL", "'http%3A//phd.cs.unibo.it%3A8083/'" ;
-  "uri_set_queueURL", "'http%3A//phd.cs.unibo.it%3A8084/'" ;
-  "UNICODEvsSYMBOL", "'symbol'" ;
-  "doctype-public", "'-//W3C//DTD%20XHTML%201.0%20Transitional//EN'" ;
-  "encoding", "'iso-8859-1'" ;
-  "media-type", "'text/html'" ;
-  "keys", "'d_c%2CC1%2CG%2CC2%2CL'" ;
-  "interfaceURL", "'http%3A//phd.cs.unibo.it/helm/html/cic/index.html'" ;
-  "naturalLanguage", "'no'" ;
-  "annotations", "'no'" ;
-  "explodeall", "true()" ;
-  "URLs_or_URIs", "'URIs'" ;
-  "topurl", "'http://phd.cs.unibo.it/helm'" ;
-  "CICURI", "'cic:/Coq/Init/Datatypes/bool_ind.con'" ]
-;;
-
-let parse_file filename =
- let inch = open_in filename in
-  let rec read_lines () =
-   try
-    let line = input_line inch in
-     line ^ read_lines ()
-   with
-    End_of_file -> ""
-  in
-   read_lines ()
-;;
-
-let applyStylesheets input styles args =
- List.fold_left (fun i style -> Gdome_xslt.applyStylesheet i style args)
-  input styles
-;;
-
 let
  mml_of_cic_object ~explode_all uri annobj ids_to_inner_sorts ids_to_inner_types
 =
@@ -518,16 +426,16 @@ let
  in
   let input =
    match bodyxml with
-      None -> Xml2Gdome.document_of_xml domImpl xml
+      None -> Xml2Gdome.document_of_xml Misc.domImpl xml
     | Some bodyxml' ->
        Xml.pp xml (Some constanttypefile) ;
-       Xml2Gdome.document_of_xml domImpl bodyxml'
+       Xml2Gdome.document_of_xml Misc.domImpl bodyxml'
   in
 (*CSC: We save the innertypes to disk so that we can retrieve them in the  *)
 (*CSC: stylesheet. This DOES NOT work when UWOBO and/or the getter are not *)
 (*CSC: local.                                                              *)
    Xml.pp xmlinnertypes (Some innertypesfile) ;
-   let output = applyStylesheets input mml_styles (mml_args ~explode_all) in
+   let output = ApplyStylesheets.apply_proof_stylesheets input ~explode_all in
     output
 ;;
 
@@ -655,9 +563,10 @@ let refresh_sequent ?(empty_notebook=true) notebook =
            end
           else
            begin
-            let sequent_doc = Xml2Gdome.document_of_xml domImpl sequent_gdome in
+            let sequent_doc =
+             Xml2Gdome.document_of_xml Misc.domImpl sequent_gdome in
             let sequent_mml =
-             applyStylesheets sequent_doc sequent_styles sequent_args
+             ApplyStylesheets.apply_sequent_stylesheets sequent_doc
             in
              notebook#set_current_page ~may_skip_switch_page_event:true metano;
              notebook#proofw#load_doc ~dom:sequent_mml
@@ -707,11 +616,9 @@ let mml_of_cic_term metano term =
     SequentPp.XmlPp.print_sequent metasenv (metano,context,term)
    in
     let sequent_doc =
-     Xml2Gdome.document_of_xml domImpl sequent_gdome
+     Xml2Gdome.document_of_xml Misc.domImpl sequent_gdome
     in
-     let res =
-      applyStylesheets sequent_doc sequent_styles sequent_args ;
-     in
+     let res = ApplyStylesheets.apply_sequent_stylesheets sequent_doc in
       current_scratch_infos :=
        Some (term,ids_to_terms,ids_to_father_ids,ids_to_hypotheses) ;
       res
@@ -871,6 +778,8 @@ let load () =
 ;;
 
 let edit_aliases () =
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
+ let id_to_uris = inputt#id_to_uris in
  let chosen = ref false in
  let window =
   GWindow.window
@@ -929,7 +838,7 @@ let edit_aliases () =
        let n' = Str.search_forward regexpr inputtext n in
         let id = Str.matched_group 2 inputtext in
         let uri =
-         Disambiguate.cic_textual_parser_uri_of_string
+         Misc.cic_textual_parser_uri_of_string
           ("cic:" ^ (Str.matched_group 5 inputtext))
         in
          let dom,resolve_id = aux (n' + 1) in
@@ -939,11 +848,11 @@ let edit_aliases () =
            id::dom,
             (function id' -> if id = id' then Some uri else resolve_id id')
       with
-       Not_found -> empty_id_to_uris
+       Not_found -> TermEditor.empty_id_to_uris
      in
       aux 0
    in
-    id_to_uris := dom,resolve_id
+    id_to_uris := (dom,resolve_id)
 ;;
 
 let proveit () =
@@ -959,7 +868,7 @@ let proveit () =
       (*CSC: OCAML DIVERGE
       ((element : G.element)#getAttributeNS
       *)
-        ~namespaceURI:helmns
+        ~namespaceURI:Misc.helmns
         ~localName:(G.domString "xref"))#to_string
      in
       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -1001,7 +910,7 @@ let focus () =
       (*CSC: OCAML DIVERGE
       ((element : G.element)#getAttributeNS
       *)
-        ~namespaceURI:helmns
+        ~namespaceURI:Misc.helmns
         ~localName:(G.domString "xref"))#to_string
      in
       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -1098,13 +1007,7 @@ let
      in 
       show_in_show_window_uri (UriManager.uri_of_string uri)
     else
-       prerr_endline
-        "'get_action' and 'action_toggle' not yet implemented in lablgtkmathview 0.3.99"
-(* TODO commented out because not yet implemented in lablgtkmathview 0.3.99 *)
-(*
-     if mmlwidget#get_action <> None then
-      mmlwidget#action_toggle
-*)
+     ignore (mmlwidget#action_toggle n)
    in
     let _ =
      mmlwidget#connect#click (show_in_show_window_callback mmlwidget)
@@ -1136,7 +1039,7 @@ let locate_callback id =
  let uris =
   List.map
    (function uri,_ ->
-     Disambiguate.wrong_xpointer_format_from_wrong_xpointer_format' uri)
+     Misc.wrong_xpointer_format_from_wrong_xpointer_format' uri)
    result in
  let html =
   (" <h1>Locate Query: </h1><pre>" ^ get_last_query result ^ "</pre>")
@@ -1270,53 +1173,12 @@ module Callbacks =
  end
 ;;
 
-module Disambiguate' = Disambiguate.Make(Callbacks);;
-
-class term_editor ?packing ?width ?height ?isnotempty_callback () =
- let input = GEdit.text ~editable:true ?width ?height ?packing () in
- let _ =
-  match isnotempty_callback with
-     None -> ()
-   | Some callback ->
-      ignore(input#connect#changed (function () -> callback (input#length > 0)))
- in
-object(self)
- method coerce = input#coerce
- method reset =
-  input#delete_text 0 input#length
- (* CSC: txt is now a string, but should be of type Cic.term *)
- method set_term txt =
-  self#reset ;
-  ignore ((input#insert_text txt) ~pos:0)
- (* CSC: this method should disappear *)
- method get_as_string =
-  input#get_chars 0 input#length
- method get_metasenv_and_term ~context ~metasenv =
-  let name_context =
-   List.map
-    (function
-        Some (n,_) -> Some n
-      | None -> None
-    ) context
-  in
-   let lexbuf = Lexing.from_string (input#get_chars 0 input#length) in
-    let dom,mk_metasenv_and_expr =
-     CicTextualParserContext.main
-      ~context:name_context ~metasenv CicTextualLexer.token lexbuf
-    in
-     let id_to_uris',metasenv,expr =
-      Disambiguate'.disambiguate_input context metasenv dom mk_metasenv_and_expr
-       ~id_to_uris:!id_to_uris
-     in
-      id_to_uris := id_to_uris' ;
-      metasenv,expr
-end
-;;
+module TermEditor' = TermEditor.Make(Callbacks);;
 
 (* OTHER FUNCTIONS *)
 
 let locate () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
    try
     match
@@ -1337,6 +1199,7 @@ exception UriAlreadyInUse;;
 exception NotAUriToAConstant;;
 
 let new_inductive () =
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
  let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let notebook = (rendering_window ())#notebook in
@@ -1456,7 +1319,9 @@ let new_inductive () =
        GBin.scrolled_window ~border_width:5
         ~packing:(vbox#pack ~expand:true ~padding:0) () in
       let newinputt =
-       new term_editor ~width:400 ~height:20 ~packing:scrolled_window#add ()
+       TermEditor'.term_editor
+        ~width:400 ~height:20 ~packing:scrolled_window#add 
+        ~share_id_to_uris_with:inputt ()
         ~isnotempty_callback:
          (function b ->
            (*non_empty_type := b ;*)
@@ -1565,7 +1430,9 @@ let new_inductive () =
        GBin.scrolled_window ~border_width:5
         ~packing:(vbox#pack ~expand:true ~padding:0) () in
       let newinputt =
-       new term_editor ~width:400 ~height:20 ~packing:scrolled_window#add ()
+       TermEditor'.term_editor
+        ~width:400 ~height:20 ~packing:scrolled_window#add
+        ~share_id_to_uris_with:inputt ()
         ~isnotempty_callback:
          (function b ->
            (* (*non_empty_type := b ;*)
@@ -1661,8 +1528,24 @@ let new_inductive () =
       ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
 ;;
 
+let mk_fresh_name_callback context name ~typ =
+ let fresh_name =
+  match ProofEngineHelpers.mk_fresh_name context name ~typ with
+     Cic.Name fresh_name -> fresh_name
+   | Cic.Anonymous -> assert false
+ in
+  match
+   GToolbox.input_string ~title:"Enter a fresh hypothesis name" ~text:fresh_name
+    ("Enter a fresh name for the hypothesis " ^
+      CicPp.pp typ
+       (List.map (function None -> None | Some (n,_) -> Some n) context))
+  with
+     Some fresh_name' -> Cic.Name fresh_name'
+   | None -> raise NoChoice
+;;
+
 let new_proof () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
  let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let notebook = (rendering_window ())#notebook in
@@ -1707,7 +1590,8 @@ let new_proof () =
    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
  (* moved here to have visibility of the ok button *)
  let newinputt =
-  new term_editor ~width:400 ~height:100 ~packing:scrolled_window#add ()
+  TermEditor'.term_editor ~width:400 ~height:100 ~packing:scrolled_window#add
+   ~share_id_to_uris_with:inputt ()
    ~isnotempty_callback:
     (function b ->
       non_empty_type := b ;
@@ -1761,7 +1645,10 @@ let new_proof () =
      refresh_sequent notebook ;
      refresh_proof output ;
      !save_set_sensitive true ;
-     inputt#reset
+     inputt#reset ;
+     ProofEngine.intros ~mk_fresh_name_callback () ;
+     refresh_sequent notebook ;
+     refresh_proof output
   with
      RefreshSequentException e ->
       output_html outputhtml
@@ -1789,7 +1676,7 @@ let check_term_in_scratch scratch_window metasenv context expr =
 ;;
 
 let check scratch_window () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   let metasenv =
    match !ProofEngine.proof with
@@ -1814,6 +1701,23 @@ let check scratch_window () =
       ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
 ;;
 
+let decompose_uris_choice_callback uris = 
+(* N.B.: in questo passaggio perdo l'informazione su exp_named_subst !!!! *)
+  let module U = UriManager in 
+   List.map 
+    (function uri ->
+      match Misc.cic_textual_parser_uri_of_string uri with
+         CicTextualParser0.IndTyUri (uri,typeno) -> (uri,typeno,[])
+       | _ -> assert false)
+    (interactive_user_uri_choice 
+      ~selection_mode:`EXTENDED ~ok:"Ok" ~enable_button_for_non_vars:false 
+      ~title:"Decompose" ~msg:"Please, select the Inductive Types to decompose" 
+      (List.map 
+        (function (uri,typeno,_) ->
+          U.string_of_uri uri ^ "#1/" ^ string_of_int (typeno+1)
+        ) uris)
+    ) 
+;;
 
 (***********************)
 (*       TACTICS       *)
@@ -1858,7 +1762,7 @@ let call_tactic_with_input tactic () =
  let notebook = (rendering_window ())#notebook in
  let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let savedproof = !ProofEngine.proof in
  let savedgoal  = !ProofEngine.goal in
   let uri,metasenv,bo,ty =
@@ -1915,11 +1819,11 @@ let call_tactic_with_goal_input tactic () =
   let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   let savedproof = !ProofEngine.proof in
   let savedgoal  = !ProofEngine.goal in
-   match notebook#proofw#get_selection with
-     Some node ->
+   match notebook#proofw#get_selections with
+     [node] ->
       let xpath =
        ((node : Gdome.element)#getAttributeNS
-         ~namespaceURI:helmns
+         ~namespaceURI:Misc.helmns
          ~localName:(G.domString "xref"))#to_string
       in
        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -1955,9 +1859,71 @@ let call_tactic_with_goal_input tactic () =
              ProofEngine.proof := savedproof ;
              ProofEngine.goal := savedgoal ;
         end
-   | None ->
+   | [] ->
       output_html outputhtml
        ("<h1 color=\"red\">No term selected</h1>")
+   | _ ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Many terms selected</h1>")
+;;
+
+let call_tactic_with_goal_inputs tactic () =
+ let module L = LogicalOperations in
+ let module G = Gdome in
+  let notebook = (rendering_window ())#notebook in
+  let output =
+   ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
+  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+  let savedproof = !ProofEngine.proof in
+  let savedgoal  = !ProofEngine.goal in
+   try
+    let term_of_node node =
+     let xpath =
+      ((node : Gdome.element)#getAttributeNS
+        ~namespaceURI:Misc.helmns
+        ~localName:(G.domString "xref"))#to_string
+     in
+      if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
+      else
+       match !current_goal_infos with
+          Some (ids_to_terms, ids_to_father_ids,_) ->
+           let id = xpath in
+            (Hashtbl.find ids_to_terms id)
+        | None -> assert false (* "ERROR: No current term!!!" *)
+    in
+     match notebook#proofw#get_selections with
+        [] ->
+         output_html outputhtml
+          ("<h1 color=\"red\">No term selected</h1>")
+      | l ->
+         let terms = List.map term_of_node l in
+           match !current_goal_infos with
+              Some (ids_to_terms, ids_to_father_ids,_) ->
+               tactic terms ;
+               refresh_sequent notebook ;
+               refresh_proof output
+            | None -> assert false (* "ERROR: No current term!!!" *)
+   with
+      RefreshSequentException e ->
+       output_html outputhtml
+        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+         "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
+       ProofEngine.proof := savedproof ;
+       ProofEngine.goal := savedgoal ;
+       refresh_sequent notebook
+    | RefreshProofException e ->
+       output_html outputhtml
+        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+         "proof: " ^ Printexc.to_string e ^ "</h1>") ;
+       ProofEngine.proof := savedproof ;
+       ProofEngine.goal := savedgoal ;
+       refresh_sequent notebook ;
+       refresh_proof output
+    | e ->
+       output_html outputhtml
+        ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+       ProofEngine.proof := savedproof ;
+       ProofEngine.goal := savedgoal
 ;;
 
 let call_tactic_with_input_and_goal_input tactic () =
@@ -1966,14 +1932,14 @@ let call_tactic_with_input_and_goal_input tactic () =
   let notebook = (rendering_window ())#notebook in
   let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
   let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
-  let inputt = ((rendering_window ())#inputt : term_editor) in
+  let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
   let savedproof = !ProofEngine.proof in
   let savedgoal  = !ProofEngine.goal in
-   match notebook#proofw#get_selection with
-     Some node ->
+   match notebook#proofw#get_selections with
+     [node] ->
       let xpath =
        ((node : Gdome.element)#getAttributeNS
-         ~namespaceURI:helmns
+         ~namespaceURI:Misc.helmns
          ~localName:(G.domString "xref"))#to_string
       in
        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -2028,23 +1994,27 @@ let call_tactic_with_input_and_goal_input tactic () =
              ProofEngine.proof := savedproof ;
              ProofEngine.goal := savedgoal ;
         end
-   | None ->
+   | [] ->
       output_html outputhtml
        ("<h1 color=\"red\">No term selected</h1>")
+   | _ ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Many terms selected</h1>")
 ;;
 
 let call_tactic_with_goal_input_in_scratch tactic scratch_window () =
  let module L = LogicalOperations in
  let module G = Gdome in
-  let mmlwidget = (scratch_window#mmlwidget : GMathViewAux.single_selection_math_view) in
+  let mmlwidget =
+   (scratch_window#mmlwidget : GMathViewAux.multi_selection_math_view) in
   let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   let savedproof = !ProofEngine.proof in
   let savedgoal  = !ProofEngine.goal in
-   match mmlwidget#get_selection with
-     Some node ->
+   match mmlwidget#get_selections with
+     [node] ->
       let xpath =
        ((node : Gdome.element)#getAttributeNS
-         ~namespaceURI:helmns
+         ~namespaceURI:Misc.helmns
          ~localName:(G.domString "xref"))#to_string
       in
        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -2065,9 +2035,52 @@ let call_tactic_with_goal_input_in_scratch tactic scratch_window () =
            output_html outputhtml
             ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
         end
-   | None ->
+   | [] ->
       output_html outputhtml
        ("<h1 color=\"red\">No term selected</h1>")
+   | _ ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Many terms selected</h1>")
+;;
+
+let call_tactic_with_goal_inputs_in_scratch tactic scratch_window () =
+ let module L = LogicalOperations in
+ let module G = Gdome in
+  let mmlwidget =
+   (scratch_window#mmlwidget : GMathViewAux.multi_selection_math_view) in
+  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+  let savedproof = !ProofEngine.proof in
+  let savedgoal  = !ProofEngine.goal in
+   match mmlwidget#get_selections with
+      [] ->
+       output_html outputhtml
+        ("<h1 color=\"red\">No term selected</h1>")
+    | l ->
+       try
+        match !current_scratch_infos with
+           (* term is the whole goal in the scratch_area *)
+           Some (term,ids_to_terms, ids_to_father_ids,_) ->
+            let term_of_node node =
+             let xpath =
+              ((node : Gdome.element)#getAttributeNS
+                ~namespaceURI:Misc.helmns
+                ~localName:(G.domString "xref"))#to_string
+             in
+              if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
+              else
+               let id = xpath in
+                Hashtbl.find ids_to_terms id
+            in
+             let terms = List.map term_of_node l in
+              let expr = tactic terms term in
+               let mml = mml_of_cic_term 111 expr in
+                scratch_window#show () ;
+                scratch_window#mmlwidget#load_doc ~dom:mml
+         | None -> assert false (* "ERROR: No current term!!!" *)
+       with
+        e ->
+         output_html outputhtml
+          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
 ;;
 
 let call_tactic_with_hypothesis_input tactic () =
@@ -2078,11 +2091,11 @@ let call_tactic_with_hypothesis_input tactic () =
   let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   let savedproof = !ProofEngine.proof in
   let savedgoal  = !ProofEngine.goal in
-   match notebook#proofw#get_selection with
-     Some node ->
+   match notebook#proofw#get_selections with
+     [node] ->
       let xpath =
        ((node : Gdome.element)#getAttributeNS
-         ~namespaceURI:helmns
+         ~namespaceURI:Misc.helmns
          ~localName:(G.domString "xref"))#to_string
       in
        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
@@ -2118,26 +2131,29 @@ let call_tactic_with_hypothesis_input tactic () =
              ProofEngine.proof := savedproof ;
              ProofEngine.goal := savedgoal ;
         end
-   | None ->
+   | [] ->
       output_html outputhtml
        ("<h1 color=\"red\">No term selected</h1>")
+   | _ ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Many terms selected</h1>")
 ;;
 
 
-let intros = call_tactic ProofEngine.intros;;
+let intros = call_tactic (ProofEngine.intros ~mk_fresh_name_callback);;
 let exact = call_tactic_with_input ProofEngine.exact;;
 let apply = call_tactic_with_input ProofEngine.apply;;
 let elimintrossimpl = call_tactic_with_input ProofEngine.elim_intros_simpl;;
 let elimtype = call_tactic_with_input ProofEngine.elim_type;;
-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 whd = call_tactic_with_goal_inputs ProofEngine.whd;;
+let reduce = call_tactic_with_goal_inputs ProofEngine.reduce;;
+let simpl = call_tactic_with_goal_inputs ProofEngine.simpl;;
 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 cut = call_tactic_with_input (ProofEngine.cut ~mk_fresh_name_callback);;
 let change = call_tactic_with_input_and_goal_input ProofEngine.change;;
-let letin = call_tactic_with_input ProofEngine.letin;;
+let letin = call_tactic_with_input (ProofEngine.letin ~mk_fresh_name_callback);;
 let ring = call_tactic ProofEngine.ring;;
 let clearbody = call_tactic_with_hypothesis_input ProofEngine.clearbody;;
 let clear = call_tactic_with_hypothesis_input ProofEngine.clear;;
@@ -2153,21 +2169,24 @@ let split = call_tactic ProofEngine.split;;
 let left = call_tactic ProofEngine.left;;
 let right = call_tactic ProofEngine.right;;
 let assumption = call_tactic ProofEngine.assumption;;
-let generalize = call_tactic_with_goal_input ProofEngine.generalize;;
+let generalize =
+ call_tactic_with_goal_inputs (ProofEngine.generalize ~mk_fresh_name_callback);;
 let absurd = call_tactic_with_input ProofEngine.absurd;;
 let contradiction = call_tactic ProofEngine.contradiction;;
-let decompose = call_tactic_with_input ProofEngine.decompose;;
+let decompose =
+ call_tactic_with_input
+  (ProofEngine.decompose ~uris_choice_callback:decompose_uris_choice_callback);;
 
 let whd_in_scratch scratch_window =
- call_tactic_with_goal_input_in_scratch ProofEngine.whd_in_scratch
+ call_tactic_with_goal_inputs_in_scratch ProofEngine.whd_in_scratch
   scratch_window
 ;;
 let reduce_in_scratch scratch_window =
- call_tactic_with_goal_input_in_scratch ProofEngine.reduce_in_scratch
+ call_tactic_with_goal_inputs_in_scratch ProofEngine.reduce_in_scratch
   scratch_window
 ;;
 let simpl_in_scratch scratch_window =
- call_tactic_with_goal_input_in_scratch ProofEngine.simpl_in_scratch
+ call_tactic_with_goal_inputs_in_scratch ProofEngine.simpl_in_scratch
   scratch_window
 ;;
 
@@ -2254,8 +2273,8 @@ let show_query_results results =
      (fun ~row ~column ~event ->
        let (uristr,_) = List.nth results row in
         match
-         Disambiguate.cic_textual_parser_uri_of_string
-          (Disambiguate.wrong_xpointer_format_from_wrong_xpointer_format'
+         Misc.cic_textual_parser_uri_of_string
+          (Misc.wrong_xpointer_format_from_wrong_xpointer_format'
             uristr)
         with
            CicTextualParser0.ConUri uri
@@ -2473,7 +2492,7 @@ let refine_constraints (must_obj,must_rel,must_sort) =
 ;;
 
 let completeSearchPattern () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   try
    let metasenv,expr = inputt#get_metasenv_and_term ~context:[] ~metasenv:[] in
@@ -2681,7 +2700,7 @@ let choose_must list_of_must only =
 ;;
 
 let searchPattern () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   try
     let metasenv =
@@ -2712,7 +2731,7 @@ let searchPattern () =
           let uris =
            List.map
             (function uri,_ ->
-              Disambiguate.wrong_xpointer_format_from_wrong_xpointer_format' uri
+              Misc.wrong_xpointer_format_from_wrong_xpointer_format' uri
             ) result in
           let html =
            " <h1>Backward Query: </h1>" ^
@@ -2729,7 +2748,7 @@ let searchPattern () =
                    if
                     ProofEngine.can_apply
                      (term_of_cic_textual_parser_uri
-                      (Disambiguate.cic_textual_parser_uri_of_string uri))
+                      (Misc.cic_textual_parser_uri_of_string uri))
                    then
                     uri::tl',exc
                    else
@@ -2767,13 +2786,11 @@ let searchPattern () =
      ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
 ;;
       
-let choose_selection
-     (mmlwidget : GMathViewAux.single_selection_math_view) (element : Gdome.element option)
-=
+let choose_selection mmlwidget (element : Gdome.element option) =
  let module G = Gdome in
   let rec aux element =
    if element#hasAttributeNS
-       ~namespaceURI:helmns
+       ~namespaceURI:Misc.helmns
        ~localName:(G.domString "xref")
    then
      mmlwidget#set_selection (Some element)
@@ -2787,8 +2804,8 @@ let choose_selection
        | Some p -> aux (new Gdome.element_of_node p)
     with
        GdomeInit.DOMCastException _ ->
-        Printf.printf "******* trying to select above the document root ********\n" ; flush stdout
-        
+        prerr_endline
+         "******* trying to select above the document root ********"
   in
    match element with
      Some x -> aux x
@@ -2935,7 +2952,7 @@ class scratch_window =
   GBin.scrolled_window ~border_width:10
    ~packing:(vbox#pack ~expand:true ~padding:5) () in
  let mmlwidget =
-  GMathViewAux.single_selection_math_view
+  GMathViewAux.multi_selection_math_view
    ~packing:(scrolled_window#add) ~width:400 ~height:280 () in
 object(self)
  method mmlwidget = mmlwidget
@@ -2948,6 +2965,40 @@ object(self)
   ignore(simplb#connect#clicked (simpl_in_scratch self))
 end;;
 
+let open_contextual_menu_for_selected_terms mmlwidget infos =
+ let button = GdkEvent.Button.button infos in 
+ let terms_selected = List.length mmlwidget#get_selections > 0 in
+  if button = 3 then
+   begin
+    let time = GdkEvent.Button.time infos in
+    let menu = GMenu.menu () in
+    let f = new GMenu.factory menu in
+    let whd_menu_item =
+     f#add_item "Whd" ~key:GdkKeysyms._W ~callback:whd in
+    let reduce_menu_item =
+     f#add_item "Reduce" ~key:GdkKeysyms._R ~callback:reduce in
+    let simpl_menu_item =
+     f#add_item "Simpl" ~key:GdkKeysyms._S ~callback:simpl in
+    let _ = f#add_separator () in
+    let generalize_menu_item =
+     f#add_item "Generalize" ~key:GdkKeysyms._G ~callback:generalize in
+    let _ = f#add_separator () in
+    let clear_menu_item =
+     f#add_item "Clear" ~key:GdkKeysyms._C ~callback:clear in
+    let clearbody_menu_item =
+     f#add_item "ClearBody" ~key:GdkKeysyms._B ~callback:clearbody
+    in
+     whd_menu_item#misc#set_sensitive terms_selected ; 
+     reduce_menu_item#misc#set_sensitive terms_selected ; 
+     simpl_menu_item#misc#set_sensitive terms_selected ;
+     generalize_menu_item#misc#set_sensitive terms_selected ;
+     clear_menu_item#misc#set_sensitive terms_selected ;
+     clearbody_menu_item#misc#set_sensitive terms_selected ;
+     menu#popup ~button ~time
+   end ;
+  true
+;;
+
 class page () =
  let vbox1 = GPack.vbox () in
 object(self)
@@ -2970,129 +3021,128 @@ object(self)
     GBin.scrolled_window ~border_width:10
      ~packing:(vbox1#pack ~expand:true ~padding:5) () in
    let proofw =
-    GMathViewAux.single_selection_math_view ~width:400 ~height:275
+    GMathViewAux.multi_selection_math_view ~width:400 ~height:275
      ~packing:(scrolled_window1#add) () in
    let _ = proofw_ref <- Some proofw in
    let hbox3 =
     GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
-   let exactb =
-    GButton.button ~label:"Exact"
-     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let introsb =
-    GButton.button ~label:"Intros"
-     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let applyb =
-    GButton.button ~label:"Apply"
+   let ringb =
+    GButton.button ~label:"Ring"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let elimintrossimplb =
-    GButton.button ~label:"ElimIntrosSimpl"
+   let fourierb =
+    GButton.button ~label:"Fourier"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let elimtypeb =
-    GButton.button ~label:"ElimType"
+   let reflexivityb =
+    GButton.button ~label:"Reflexivity"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let whdb =
-    GButton.button ~label:"Whd"
+   let symmetryb =
+    GButton.button ~label:"Symmetry"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let reduceb =
-    GButton.button ~label:"Reduce"
+   let assumptionb =
+    GButton.button ~label:"Assumption"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let simplb =
-    GButton.button ~label:"Simpl"
+   let contradictionb =
+    GButton.button ~label:"Contradiction"
      ~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 foldwhdb =
-    GButton.button ~label:"Fold_whd"
-     ~packing:(hbox4#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"
+   let existsb =
+    GButton.button ~label:"Exists"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let cutb =
-    GButton.button ~label:"Cut"
+   let splitb =
+    GButton.button ~label:"Split"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let changeb =
-    GButton.button ~label:"Change"
+   let leftb =
+    GButton.button ~label:"Left"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let letinb =
-    GButton.button ~label:"Let ... In"
+   let rightb =
+    GButton.button ~label:"Right"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let ringb =
-    GButton.button ~label:"Ring"
+   let searchpatternb =
+    GButton.button ~label:"SearchPattern_Apply"
      ~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 clearbodyb =
-    GButton.button ~label:"ClearBody"
+   let exactb =
+    GButton.button ~label:"Exact"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let clearb =
-    GButton.button ~label:"Clear"
+   let introsb =
+    GButton.button ~label:"Intros"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let fourierb =
-    GButton.button ~label:"Fourier"
+   let applyb =
+    GButton.button ~label:"Apply"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let rewritesimplb =
-    GButton.button ~label:"RewriteSimpl ->"
+   let elimintrossimplb =
+    GButton.button ~label:"ElimIntrosSimpl"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let rewritebacksimplb =
-    GButton.button ~label:"RewriteSimpl <-"
+   let elimtypeb =
+    GButton.button ~label:"ElimType"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let replaceb =
-    GButton.button ~label:"Replace"
+   let foldwhdb =
+    GButton.button ~label:"Fold_whd"
+     ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+   let foldreduceb =
+    GButton.button ~label:"Fold_reduce"
      ~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 reflexivityb =
-    GButton.button ~label:"Reflexivity"
-     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let symmetryb =
-    GButton.button ~label:"Symmetry"
-     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let transitivityb =
-    GButton.button ~label:"Transitivity"
+   let foldsimplb =
+    GButton.button ~label:"Fold_simpl"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let existsb =
-    GButton.button ~label:"Exists"
+   let cutb =
+    GButton.button ~label:"Cut"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let splitb =
-    GButton.button ~label:"Split"
+   let changeb =
+    GButton.button ~label:"Change"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let leftb =
-    GButton.button ~label:"Left"
+   let letinb =
+    GButton.button ~label:"Let ... In"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let rightb =
-    GButton.button ~label:"Right"
+   let rewritesimplb =
+    GButton.button ~label:"RewriteSimpl ->"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
-   let assumptionb =
-    GButton.button ~label:"Assumption"
+   let rewritebacksimplb =
+    GButton.button ~label:"RewriteSimpl <-"
      ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
    let hbox7 =
     GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
-   let generalizeb =
-    GButton.button ~label:"Generalize"
-     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
    let absurdb =
     GButton.button ~label:"Absurd"
      ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
-   let contradictionb =
-    GButton.button ~label:"Contradiction"
-     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
-   let searchpatternb =
-    GButton.button ~label:"SearchPattern_Apply"
-     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
    let decomposeb =
     GButton.button ~label:"Decompose"
      ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
+   let transitivityb =
+    GButton.button ~label:"Transitivity"
+     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
+   let replaceb =
+    GButton.button ~label:"Replace"
+     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
+(* Zack: spostare in una toolbar
+   let generalizeb =
+    GButton.button ~label:"Generalize"
+     ~packing:(hbox7#pack ~expand:false ~fill:false ~padding:5) () in
+   let clearbodyb =
+    GButton.button ~label:"ClearBody"
+     ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+   let clearb =
+    GButton.button ~label:"Clear"
+     ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
+   let whdb =
+    GButton.button ~label:"Whd"
+     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
+   let reduceb =
+    GButton.button ~label:"Reduce"
+     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
+   let simplb =
+    GButton.button ~label:"Simpl"
+     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
+*)
 
    ignore(exactb#connect#clicked exact) ;
    ignore(applyb#connect#clicked apply) ;
    ignore(elimintrossimplb#connect#clicked elimintrossimpl) ;
    ignore(elimtypeb#connect#clicked elimtype) ;
-   ignore(whdb#connect#clicked whd) ;
-   ignore(reduceb#connect#clicked reduce) ;
-   ignore(simplb#connect#clicked simpl) ;
    ignore(foldwhdb#connect#clicked fold_whd) ;
    ignore(foldreduceb#connect#clicked fold_reduce) ;
    ignore(foldsimplb#connect#clicked fold_simpl) ;
@@ -3100,8 +3150,6 @@ object(self)
    ignore(changeb#connect#clicked change) ;
    ignore(letinb#connect#clicked letin) ;
    ignore(ringb#connect#clicked ring) ;
-   ignore(clearbodyb#connect#clicked clearbody) ;
-   ignore(clearb#connect#clicked clear) ;
    ignore(fourierb#connect#clicked fourier) ;
    ignore(rewritesimplb#connect#clicked rewritesimpl) ;
    ignore(rewritebacksimplb#connect#clicked rewritebacksimpl) ;
@@ -3114,13 +3162,23 @@ object(self)
    ignore(leftb#connect#clicked left) ;
    ignore(rightb#connect#clicked right) ;
    ignore(assumptionb#connect#clicked assumption) ;
-   ignore(generalizeb#connect#clicked generalize) ;
    ignore(absurdb#connect#clicked absurd) ;
    ignore(contradictionb#connect#clicked contradiction) ;
    ignore(introsb#connect#clicked intros) ;
    ignore(searchpatternb#connect#clicked searchPattern) ;
    ignore(proofw#connect#selection_changed (choose_selection proofw)) ;
+   ignore
+     ((new GObj.event_ops proofw#as_widget)#connect#button_press
+        (open_contextual_menu_for_selected_terms proofw)) ;
    ignore(decomposeb#connect#clicked decompose) ;
+(* Zack: spostare in una toolbar
+   ignore(whdb#connect#clicked whd) ;
+   ignore(reduceb#connect#clicked reduce) ;
+   ignore(simplb#connect#clicked simpl) ;
+   ignore(clearbodyb#connect#clicked clearbody) ;
+   ignore(clearb#connect#clicked clear) ;
+   ignore(generalizeb#connect#clicked generalize) ;
+*)
   ))
 end
 ;;
@@ -3320,7 +3378,8 @@ class rendering_window output (notebook : notebook) =
   GBin.scrolled_window ~border_width:5
    ~packing:frame#add () in
  let inputt =
-  new term_editor ~width:400 ~height:100 ~packing:scrolled_window1#add ()
+  TermEditor'.term_editor
+   ~width:400 ~height:100 ~packing:scrolled_window1#add ()
    ~isnotempty_callback:
     (function b ->
       check_menu_item#misc#set_sensitive b ;