]> 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 e4af786ceb2e4e81a83f6f2c109f4bb881cf6ec4..4bef88816c302adba3a353cdaf3f1274f0f30e15 100644 (file)
 (******************************************************************************)
 
 
-(* CSC: quick fix: a function from [uri#xpointer(path)] to [uri#path] *)
-let wrong_xpointer_format_from_wrong_xpointer_format' uri =
- try
-  let index_sharp =  String.index uri '#' in
-  let index_rest = index_sharp + 10 in
-   let baseuri = String.sub uri 0 index_sharp in
-   let rest = String.sub uri index_rest (String.length uri - index_rest - 1) in
-    baseuri ^ "#" ^ rest
- with Not_found -> uri
-;;
-
 (* GLOBAL CONSTANTS *)
 
-let helmns = Gdome.domString "http://www.cs.unibo.it/helm";;
 let xlinkns = Gdome.domString "http://www.w3.org/1999/xlink";;
 
 let htmlheader =
@@ -60,25 +48,42 @@ let htmlfooter =
  "</html>"
 ;;
 
-(*
-let prooffile = "/home/tassi/miohelm/tmp/currentproof";;
-let prooffile = "/public/sacerdot/currentproof";;
-*)
+let prooffile =
+ try
+  Sys.getenv "GTOPLEVEL_PROOFFILE"
+ with
+  Not_found -> "/public/currentproof"
+;;
 
-let prooffile = "/public/sacerdot/currentproof";;
-let prooffiletype = "/public/sacerdot/currentprooftype";;
+let prooffiletype =
+ try
+  Sys.getenv "GTOPLEVEL_PROOFFILETYPE"
+ with
+  Not_found -> "/public/currentprooftype"
+;;
 
 (*CSC: the getter should handle the innertypes, not the FS *)
-(*
-let innertypesfile = "/home/tassi/miohelm/tmp/innertypes";;
-let innertypesfile = "/public/sacerdot/innertypes";;
-*)
 
-let innertypesfile = "/public/sacerdot/innertypes";;
-let constanttypefile = "/public/sacerdot/constanttype";;
+let innertypesfile =
+ try
+  Sys.getenv "GTOPLEVEL_INNERTYPESFILE"
+ with
+  Not_found -> "/public/innertypes"
+;;
 
-let empty_id_to_uris = ([],function _ -> None);;
+let constanttypefile =
+ try
+  Sys.getenv "GTOPLEVEL_CONSTANTTYPEFILE"
+ with
+  Not_found -> "/public/constanttype"
+;;
 
+let postgresqlconnectionstring =
+ try
+  Sys.getenv "POSTGRESQL_CONNECTION_STRING"
+ with
+  Not_found -> "host=mowgli.cs.unibo.it dbname=helm_mowgli_new_schema user=helm"
+;;
 
 (* GLOBAL REFERENCES (USED BY CALLBACKS) *)
 
@@ -88,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);;
 
@@ -150,62 +153,8 @@ let argspec =
 in
 Arg.parse argspec ignore ""
 
-(* A WIDGET TO ENTER CIC TERMS *)
-
-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_term ~context ~metasenv =
-  let lexbuf = Lexing.from_string (input#get_chars 0 input#length) in
-   CicTextualParserContext.main ~context ~metasenv CicTextualLexer.token lexbuf
-end
-;;
-
 (* MISC FUNCTIONS *)
 
-exception IllFormedUri of string;;
-
-let cic_textual_parser_uri_of_string uri' =
- try
-  (* Constant *)
-  if String.sub uri' (String.length uri' - 4) 4 = ".con" then
-   CicTextualParser0.ConUri (UriManager.uri_of_string uri')
-  else
-   if String.sub uri' (String.length uri' - 4) 4 = ".var" then
-    CicTextualParser0.VarUri (UriManager.uri_of_string uri')
-   else
-    (try
-      (* Inductive Type *)
-      let uri'',typeno = CicTextualLexer.indtyuri_of_uri uri' in
-       CicTextualParser0.IndTyUri (uri'',typeno)
-     with
-      _ ->
-       (* Constructor of an Inductive Type *)
-       let uri'',typeno,consno =
-        CicTextualLexer.indconuri_of_uri uri'
-       in
-        CicTextualParser0.IndConUri (uri'',typeno,consno)
-    )
- with
-  _ -> raise (IllFormedUri uri')
-;;
-
 let term_of_cic_textual_parser_uri uri =
  let module C = Cic in
  let module CTP = CicTextualParser0 in
@@ -261,18 +210,18 @@ let check_window outputhtml uris =
      in
       lazy 
        (let mmlwidget =
-         GMathView.math_view
+         GMathViewAux.single_selection_math_view
           ~packing:scrolled_window#add ~width:400 ~height:280 () in
         let expr =
          let term =
-          term_of_cic_textual_parser_uri (cic_textual_parser_uri_of_string uri)
+          term_of_cic_textual_parser_uri
+           (Misc.cic_textual_parser_uri_of_string uri)
          in
           (Cic.Cast (term, CicTypeChecker.type_of_aux' [] [] term))
         in
          try
           let mml = !mml_of_cic_term_ref 111 expr in
-prerr_endline ("### " ^ CicPp.ppterm expr) ;
-           mmlwidget#load_tree ~dom:mml
+           mmlwidget#load_doc ~dom:mml
          with
           e ->
            output_html outputhtml
@@ -288,10 +237,12 @@ prerr_endline ("### " ^ CicPp.ppterm expr) ;
 exception NoChoice;;
 
 let
- interactive_user_uri_choice ~selection_mode ?(ok="Ok") ~title ~msg uris
+ interactive_user_uri_choice ~(selection_mode:[`SINGLE|`EXTENDED]) ?(ok="Ok")
+  ?(enable_button_for_non_vars=false) ~title ~msg uris
 =
  let choices = ref [] in
  let chosen = ref false in
+ let use_only_constants = ref false in
  let window =
   GWindow.dialog ~modal:true ~title ~width:600 () in
  let lMessage =
@@ -304,7 +255,7 @@ let
   let expected_height = 18 * List.length uris in
    let height = if expected_height > 400 then 400 else expected_height in
     GList.clist ~columns:1 ~packing:scrolled_window#add
-     ~height ~selection_mode () in
+     ~height ~selection_mode:(selection_mode :> Gtk.Tags.selection_mode) () in
  let _ = List.map (function x -> clist#append [x]) uris in
  let hbox2 =
   GPack.hbox ~border_width:0
@@ -321,6 +272,13 @@ let
   GButton.button ~label:ok
    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
  let _ = okb#misc#set_sensitive false in
+ let nonvarsb =
+  GButton.button
+   ~packing:
+    (function w ->
+      if enable_button_for_non_vars then
+       hbox#pack ~expand:false ~fill:false ~padding:5 w)
+   ~label:"Try constants only" () in
  let checkb =
   GButton.button ~label:"Check"
    ~packing:(hbox#pack ~padding:5) () in
@@ -337,6 +295,13 @@ let
   ignore (cancelb#connect#clicked window#destroy) ;
   ignore
    (okb#connect#clicked (function () -> chosen := true ; window#destroy ())) ;
+  ignore
+   (nonvarsb#connect#clicked
+     (function () ->
+       use_only_constants := true ;
+       chosen := true ;
+       window#destroy ()
+   )) ;
   ignore (checkb#connect#clicked check_callback) ;
   ignore
    (clist#connect#select_row
@@ -370,8 +335,13 @@ let
   window#set_position `CENTER ;
   window#show () ;
   GMain.Main.main () ;
-  if !chosen && List.length !choices > 0 then
-   !choices
+  if !chosen then
+   if !use_only_constants then
+    List.filter
+     (function uri -> not (String.sub uri (String.length uri - 4) 4 = ".var"))
+     uris
+   else
+    if List.length !choices > 0 then !choices else raise NoChoice
   else
    raise NoChoice
 ;;
@@ -442,112 +412,30 @@ 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
 =
 (*CSC: ????????????????? *)
  let xml, bodyxml =
-  Cic2Xml.print_object uri ~ids_to_inner_sorts annobj 
+  Cic2Xml.print_object uri ~ids_to_inner_sorts ~ask_dtd_to_the_getter:true
+   annobj 
  in
  let xmlinnertypes =
-  Cic2Xml.print_inner_types uri ~ids_to_inner_sorts
-   ~ids_to_inner_types
+  Cic2Xml.print_inner_types uri ~ids_to_inner_sorts ~ids_to_inner_types
+   ~ask_dtd_to_the_getter:true
  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
 ;;
 
@@ -561,11 +449,12 @@ let
  in
   let path = pathname ^ "/" ^ name in
   let xml, bodyxml =
-   Cic2Xml.print_object uri ~ids_to_inner_sorts annobj 
+   Cic2Xml.print_object uri ~ids_to_inner_sorts ~ask_dtd_to_the_getter:false
+    annobj 
   in
   let xmlinnertypes =
-   Cic2Xml.print_inner_types uri ~ids_to_inner_sorts
-    ~ids_to_inner_types
+   Cic2Xml.print_inner_types uri ~ids_to_inner_sorts ~ids_to_inner_types
+    ~ask_dtd_to_the_getter:false
   in
    (* innertypes *)
    let innertypesuri = UriManager.innertypesuri_of_uri uri in
@@ -605,7 +494,7 @@ let
 exception RefreshSequentException of exn;;
 exception RefreshProofException of exn;;
 
-let refresh_proof (output : GMathView.math_view) =
+let refresh_proof (output : GMathViewAux.single_selection_math_view) =
  try
   let uri,currentproof =
    match !ProofEngine.proof with
@@ -625,7 +514,7 @@ let refresh_proof (output : GMathView.math_view) =
      mml_of_cic_object ~explode_all:true uri acic ids_to_inner_sorts
       ids_to_inner_types
     in
-     output#load_tree mml ;
+     output#load_doc ~dom:mml ;
      current_cic_infos :=
       Some (ids_to_terms,ids_to_father_ids,ids_to_conjectures,ids_to_hypotheses)
  with
@@ -674,12 +563,13 @@ 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_tree ~dom:sequent_mml
+             notebook#proofw#load_doc ~dom:sequent_mml
            end ;
           current_goal_infos :=
            Some (ids_to_terms,ids_to_father_ids,ids_to_hypotheses)
@@ -726,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
@@ -748,6 +636,20 @@ let make_dirs dirpath =
  ignore (Unix.system ("mkdir -p " ^ dirpath))
 ;;
 
+let save_obj uri obj =
+ let
+  (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
+   ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
+ =
+  Cic2acic.acic_object_of_cic_object obj
+ in
+  (* let's save the theorem and register it to the getter *) 
+  let pathname = pathname_of_annuri (UriManager.buri_of_uri uri) in
+   make_dirs pathname ;
+   save_object_to_disk uri acic ids_to_inner_sorts ids_to_inner_types
+    pathname
+;;
+
 let qed () =
  match !ProofEngine.proof with
     None -> assert false
@@ -769,7 +671,7 @@ let qed () =
           mml_of_cic_object ~explode_all:false uri acic ids_to_inner_sorts
            ids_to_inner_types
          in
-          ((rendering_window ())#output : GMathView.math_view)#load_tree mml ;
+          ((rendering_window ())#output : GMathViewAux.single_selection_math_view)#load_doc mml ;
           !qed_set_sensitive false ;
           (* let's save the theorem and register it to the getter *) 
           let pathname = pathname_of_annuri (UriManager.buri_of_uri uri) in
@@ -786,12 +688,6 @@ let qed () =
   | _ -> raise OpenConjecturesStillThere
 ;;
 
-(*????
-let dtdname = "http://www.cs.unibo.it/helm/dtd/cic.dtd";;
-let dtdname = "/home/tassi/miohelm/helm/dtd/cic.dtd";;
-*)
-let dtdname = "/projects/helm/V7_mowgli/dtd/cic.dtd";;
-
 let save () =
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   match !ProofEngine.proof with
@@ -805,7 +701,10 @@ let save () =
         Cic2acic.acic_object_of_cic_object currentproof
        in
         let xml, bodyxml =
-         match Cic2Xml.print_object uri ~ids_to_inner_sorts acurrentproof with
+         match
+          Cic2Xml.print_object uri ~ids_to_inner_sorts
+           ~ask_dtd_to_the_getter:true acurrentproof
+         with
             xml,Some bodyxml -> xml,bodyxml
           | _,None -> assert false
         in
@@ -834,7 +733,7 @@ let typecheck_loaded_proof metasenv bo ty =
 
 let load () =
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
- let output = ((rendering_window ())#output : GMathView.math_view) in
+ let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let notebook = (rendering_window ())#notebook in
   try
    match 
@@ -879,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
@@ -937,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 =
-         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
@@ -947,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 () =
@@ -967,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!!!" *)
@@ -1009,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!!!" *)
@@ -1063,52 +964,56 @@ let setgoal metano =
         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
 ;;
 
-let show_in_show_window, show_in_show_window_callback =
+let
+ show_in_show_window_obj, show_in_show_window_uri, show_in_show_window_callback
+=
  let window =
   GWindow.window ~width:800 ~border_width:2 () in
  let scrolled_window =
   GBin.scrolled_window ~border_width:10 ~packing:window#add () in
  let mmlwidget =
-  GMathView.math_view ~packing:scrolled_window#add ~width:600 ~height:400 () in
+  GMathViewAux.single_selection_math_view ~packing:scrolled_window#add ~width:600 ~height:400 () in
  let _ = window#event#connect#delete (fun _ -> window#misc#hide () ; true ) in
  let href = Gdome.domString "href" in
-  let show_in_show_window uri =
+  let show_in_show_window_obj uri obj =
    let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
     try
-     CicTypeChecker.typecheck uri ;
-     let obj = CicEnvironment.get_cooked_obj uri in
-      let
-       (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
-        ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
-      =
-       Cic2acic.acic_object_of_cic_object obj
+     let
+      (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
+       ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
+     =
+      Cic2acic.acic_object_of_cic_object obj
+     in
+      let mml =
+       mml_of_cic_object ~explode_all:false uri acic ids_to_inner_sorts
+        ids_to_inner_types
       in
-       let mml =
-        mml_of_cic_object ~explode_all:false uri acic ids_to_inner_sorts
-         ids_to_inner_types
-       in
-        window#set_title (UriManager.string_of_uri uri) ;
-        window#misc#hide () ; window#show () ;
-        mmlwidget#load_tree mml ;
+       window#set_title (UriManager.string_of_uri uri) ;
+       window#misc#hide () ; window#show () ;
+       mmlwidget#load_doc mml ;
     with
      e ->
       output_html outputhtml
        ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
   in
-   let show_in_show_window_callback mmlwidget (n : Gdome.element) =
+  let show_in_show_window_uri uri =
+   let obj = CicEnvironment.get_obj uri in
+    show_in_show_window_obj uri obj
+  in
+   let show_in_show_window_callback mmlwidget (n : Gdome.element) _ =
     if n#hasAttributeNS ~namespaceURI:xlinkns ~localName:href then
      let uri =
       (n#getAttributeNS ~namespaceURI:xlinkns ~localName:href)#to_string
      in 
-      show_in_show_window (UriManager.uri_of_string uri)
+      show_in_show_window_uri (UriManager.uri_of_string uri)
     else
-     if mmlwidget#get_action <> None then
-      mmlwidget#action_toggle
+     ignore (mmlwidget#action_toggle n)
    in
     let _ =
-     mmlwidget#connect#clicked (show_in_show_window_callback mmlwidget)
+     mmlwidget#connect#click (show_in_show_window_callback mmlwidget)
     in
-     show_in_show_window, show_in_show_window_callback
+     show_in_show_window_obj, show_in_show_window_uri,
+      show_in_show_window_callback
 ;;
 
 exception NoObjectsLocated;;
@@ -1133,7 +1038,8 @@ let locate_callback id =
  let result = MQueryGenerator.locate id in
  let uris =
   List.map
-   (function uri,_ -> wrong_xpointer_format_from_wrong_xpointer_format' uri)
+   (function uri,_ ->
+     Misc.wrong_xpointer_format_from_wrong_xpointer_format' uri)
    result in
  let html =
   (" <h1>Locate Query: </h1><pre>" ^ get_last_query result ^ "</pre>")
@@ -1146,22 +1052,6 @@ let locate_callback id =
    uris
 ;;
 
-let locate () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
- let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
-   try
-    match
-     GToolbox.input_string ~title:"Locate" "Enter an identifier to locate:"
-    with
-       None -> raise NoChoice
-     | Some input ->
-        let uri = locate_callback input in
-         inputt#set_term uri
-   with
-    e ->
-     output_html outputhtml
-      ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
-;;
 
 let input_or_locate_uri ~title =
  let uri = ref None in
@@ -1267,137 +1157,401 @@ let input_or_locate_uri ~title =
    | Some uri -> UriManager.uri_of_string ("cic:" ^ uri)
 ;;
 
-let locate_one_id id =
- let result = MQueryGenerator.locate id in
- let uris =
-  List.map
-   (function uri,_ ->
-     wrong_xpointer_format_from_wrong_xpointer_format' uri
-   ) result in
- let html= " <h1>Locate Query: </h1><pre>" ^ get_last_query result ^ "</pre>" in
-  output_html (rendering_window ())#outputhtml html ;
-  let uris' =
-   match uris with
-      [] ->
-       [UriManager.string_of_uri
-         (input_or_locate_uri ~title:("URI matching \"" ^ id ^ "\" unknown."))]
-    | [uri] -> [uri]
-    | _ ->
-      interactive_user_uri_choice
-       ~selection_mode:`EXTENDED
-       ~ok:"Try every selection."
-       ~title:"Ambiguous input."
-       ~msg:
-         ("Ambiguous input \"" ^ id ^
-          "\". Please, choose one or more interpretations:")
-       uris
-  in
-   List.map cic_textual_parser_uri_of_string uris'
+exception AmbiguousInput;;
+
+(* A WIDGET TO ENTER CIC TERMS *)
+
+module Callbacks =
+ struct
+  let output_html msg = output_html (outputhtml ()) msg;;
+  let interactive_user_uri_choice =
+   fun ~selection_mode ?ok ?enable_button_for_non_vars ~title ~msg ~id ->
+    interactive_user_uri_choice ~selection_mode ?ok
+     ?enable_button_for_non_vars ~title ~msg;;
+  let interactive_interpretation_choice = interactive_interpretation_choice;;
+  let input_or_locate_uri = input_or_locate_uri;;
+ end
 ;;
 
-exception ThereDoesNotExistAnyWellTypedInterpretationOfTheInput;;
-exception AmbiguousInput;;
+module TermEditor' = TermEditor.Make(Callbacks);;
 
-let disambiguate_input context metasenv dom mk_metasenv_and_expr =
- let known_ids,resolve_id = !id_to_uris in
- let dom' =
-  let rec filter =
-   function
-      [] -> []
-    | he::tl ->
-       if List.mem he known_ids then filter tl else he::(filter tl)
-  in
-   filter dom
- in
-  (* for each id in dom' we get the list of uris associated to it *)
-  let list_of_uris = List.map locate_one_id dom' in
-  (* and now we compute the list of all possible assignments from id to uris *)
-  let resolve_ids =
-   let rec aux ids list_of_uris =
-    match ids,list_of_uris with
-       [],[] -> [resolve_id]
-     | id::idtl,uris::uristl ->
-        let resolves = aux idtl uristl in
-         List.concat
-          (List.map
-            (function uri ->
-              List.map
-               (function f ->
-                 function id' -> if id = id' then Some uri else f id'
-               ) resolves
-            ) uris
-          )
-     | _,_ -> assert false
-   in
-    aux dom' list_of_uris
-  in
-   let tests_no = List.length resolve_ids in
-    if tests_no > 1 then
-     output_html (outputhtml ())
-      ("<h1>Disambiguation phase started: " ^
-        string_of_int (List.length resolve_ids) ^ " cases will be tried.") ;
-   (* now we select only the ones that generates well-typed terms *)
-   let resolve_ids' =
-    let rec filter =
-     function
-        [] -> []
-      | resolve::tl ->
-         let metasenv',expr = mk_metasenv_and_expr resolve in
-          try
-(*CSC: Bug here: we do not try to typecheck also the metasenv' *)
-           ignore
-            (CicTypeChecker.type_of_aux' metasenv context expr) ;
-           resolve::(filter tl)
-          with
-           _ -> filter tl
-    in
-     filter resolve_ids
-   in
-    let resolve_id' =
-     match resolve_ids' with
-        [] -> raise ThereDoesNotExistAnyWellTypedInterpretationOfTheInput
-      | [resolve_id] -> resolve_id
-      | _ ->
-        let choices =
-         List.map
-          (function resolve ->
-            List.map
-             (function id ->
-               id,
-                match resolve id with
-                   None -> assert false
-                 | Some uri ->
-                    match uri with
-                       CicTextualParser0.ConUri uri
-                     | CicTextualParser0.VarUri uri ->
-                        UriManager.string_of_uri uri
-                     | CicTextualParser0.IndTyUri (uri,tyno) ->
-                        UriManager.string_of_uri uri ^ "#xpointer(1/" ^
-                         string_of_int (tyno+1) ^ ")"
-                     | CicTextualParser0.IndConUri (uri,tyno,consno) ->
-                        UriManager.string_of_uri uri ^ "#xpointer(1/" ^
-                         string_of_int (tyno+1) ^ "/" ^ string_of_int consno ^                           ")"
-             ) dom
-          ) resolve_ids'
-        in
-         let index = interactive_interpretation_choice choices in
-          List.nth resolve_ids' index
-    in
-     id_to_uris := known_ids @ dom', resolve_id' ;
-     mk_metasenv_and_expr resolve_id'
+(* OTHER FUNCTIONS *)
+
+let locate () =
+ let inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
+ let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+   try
+    match
+     GToolbox.input_string ~title:"Locate" "Enter an identifier to locate:"
+    with
+       None -> raise NoChoice
+     | Some input ->
+        let uri = locate_callback input in
+         inputt#set_term uri
+   with
+    e ->
+     output_html outputhtml
+      ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
 ;;
 
+
 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
+
+ let chosen = ref false in
+ let inductive = ref true in
+ let paramsno = ref 0 in
+ let get_uri = ref (function _ -> assert false) in
+ let get_base_uri = ref (function _ -> assert false) in
+ let get_names = ref (function _ -> assert false) in
+ let get_types_and_cons = ref (function _ -> assert false) in
+ let get_context_and_subst = ref (function _ -> assert false) in 
+ let window =
+  GWindow.window
+   ~width:600 ~modal:true ~position:`CENTER
+   ~title:"New Block of Mutual (Co)Inductive Definitions"
+   ~border_width:2 () in
+ let vbox = GPack.vbox ~packing:window#add () in
+ let hbox =
+  GPack.hbox ~border_width:0
+   ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+  GMisc.label ~text:"Enter the URI for the new block:"
+   ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let uri_entry =
+  GEdit.entry ~editable:true
+   ~packing:(hbox#pack ~expand:true ~fill:true ~padding:5) () in
+ let hbox0 =
+  GPack.hbox ~border_width:0
+   ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+  GMisc.label
+   ~text:
+     "Enter the number of left parameters in every arity and constructor type:"
+   ~packing:(hbox0#pack ~expand:false ~fill:false ~padding:5) () in
+ let paramsno_entry =
+  GEdit.entry ~editable:true ~text:"0"
+   ~packing:(hbox0#pack ~expand:true ~fill:true ~padding:5) () in
+ let hbox1 =
+  GPack.hbox ~border_width:0
+   ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+  GMisc.label ~text:"Are the definitions inductive or coinductive?"
+   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let inductiveb =
+  GButton.radio_button ~label:"Inductive"
+   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let coinductiveb =
+  GButton.radio_button ~label:"Coinductive"
+   ~group:inductiveb#group
+   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let hbox2 =
+  GPack.hbox ~border_width:0
+   ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+  GMisc.label ~text:"Enter the list of the names of the types:"
+   ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
+ let names_entry =
+  GEdit.entry ~editable:true
+   ~packing:(hbox2#pack ~expand:true ~fill:true ~padding:5) () in
+ let hboxn =
+  GPack.hbox ~border_width:0
+   ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let okb =
+  GButton.button ~label:"> Next"
+   ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ = okb#misc#set_sensitive true in
+ let cancelb =
+  GButton.button ~label:"Abort"
+   ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+ ignore (window#connect#destroy GMain.Main.quit) ;
+ ignore (cancelb#connect#clicked window#destroy) ;
+ (* First phase *)
+ let rec phase1 () =
+  ignore
+   (okb#connect#clicked
+     (function () ->
+       try
+        let uristr = "cic:" ^ uri_entry#text in
+        let namesstr = names_entry#text in
+        let paramsno' = int_of_string (paramsno_entry#text) in
+         match Str.split (Str.regexp " +") namesstr with
+            [] -> assert false
+          | (he::tl) as names ->
+             let uri = UriManager.uri_of_string (uristr ^ "/" ^ he ^ ".ind") in
+              begin
+               try
+                ignore (Getter.resolve uri) ;
+                raise UriAlreadyInUse
+               with
+                Getter.Unresolved ->
+                 get_uri := (function () -> uri) ; 
+                 get_names := (function () -> names) ;
+                 inductive := inductiveb#active ;
+                 paramsno := paramsno' ;
+                 phase2 ()
+              end
+       with
+        e ->
+         output_html outputhtml
+          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+     ))
+ (* Second phase *)
+ and phase2 () =
+  let type_widgets =
+   List.map
+    (function name ->
+      let frame =
+       GBin.frame ~label:name
+        ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+      let vbox = GPack.vbox ~packing:frame#add () in
+      let hbox = GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false) () in
+      let _ =
+       GMisc.label ~text:("Enter its type:")
+        ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+      let scrolled_window =
+       GBin.scrolled_window ~border_width:5
+        ~packing:(vbox#pack ~expand:true ~padding:0) () in
+      let newinputt =
+       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 ;*)
+           okb#misc#set_sensitive true) (*(b && uri_entry#text <> ""))*)
+      in
+      let hbox =
+       GPack.hbox ~border_width:0
+        ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+      let _ =
+       GMisc.label ~text:("Enter the list of its constructors:")
+        ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+      let cons_names_entry =
+       GEdit.entry ~editable:true
+        ~packing:(hbox#pack ~expand:true ~fill:true ~padding:5) () in
+      (newinputt,cons_names_entry)
+    ) (!get_names ())
+  in
+   vbox#remove hboxn#coerce ;
+   let hboxn =
+    GPack.hbox ~border_width:0
+     ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+   let okb =
+    GButton.button ~label:"> Next"
+     ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+   let cancelb =
+    GButton.button ~label:"Abort"
+     ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+   ignore (cancelb#connect#clicked window#destroy) ;
+   ignore
+    (okb#connect#clicked
+      (function () ->
+        try
+         let names = !get_names () in
+         let types_and_cons =
+          List.map2
+           (fun name (newinputt,cons_names_entry) ->
+             let consnamesstr = cons_names_entry#text in
+             let cons_names = Str.split (Str.regexp " +") consnamesstr in
+             let metasenv,expr =
+              newinputt#get_metasenv_and_term ~context:[] ~metasenv:[]
+             in
+              match metasenv with
+                 [] -> expr,cons_names
+               | _ -> raise AmbiguousInput
+           ) names type_widgets
+         in
+          let uri = !get_uri () in
+          let _ =
+           (* Let's see if so far the definition is well-typed *)
+           let params = [] in
+           let paramsno = 0 in
+           (* To test if the arities of the inductive types are well *)
+           (* typed, we check the inductive block definition where   *)
+           (* no constructor is given to each type.                  *)
+           let tys =
+            List.map2
+             (fun name (ty,cons) -> (name, !inductive, ty, []))
+             names types_and_cons
+           in
+            CicTypeChecker.typecheck_mutual_inductive_defs uri
+             (tys,params,paramsno)
+          in
+           get_context_and_subst :=
+            (function () ->
+              let i = ref 0 in
+               List.fold_left2
+                (fun (context,subst) name (ty,_) ->
+                  let res =
+                   (Some (Cic.Name name, Cic.Decl ty))::context,
+                    (Cic.MutInd (uri,!i,[]))::subst
+                  in
+                   incr i ; res
+                ) ([],[]) names types_and_cons) ;
+           let types_and_cons' =
+            List.map2
+             (fun name (ty,cons) -> (name, !inductive, ty, phase3 name cons))
+             names types_and_cons
+           in
+            get_types_and_cons := (function () -> types_and_cons') ;
+            chosen := true ;
+            window#destroy ()
+        with
+         e ->
+          output_html outputhtml
+           ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+      ))
+ (* Third phase *)
+ and phase3 name cons =
+  let get_cons_types = ref (function () -> assert false) in
+  let window2 =
+   GWindow.window
+    ~width:600 ~modal:true ~position:`CENTER
+    ~title:(name ^ " Constructors")
+    ~border_width:2 () in
+  let vbox = GPack.vbox ~packing:window2#add () in
+  let cons_type_widgets =
+   List.map
+    (function consname ->
+      let hbox =
+       GPack.hbox ~border_width:0
+        ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+      let _ =
+       GMisc.label ~text:("Enter the type of " ^ consname ^ ":")
+        ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+      let scrolled_window =
+       GBin.scrolled_window ~border_width:5
+        ~packing:(vbox#pack ~expand:true ~padding:0) () in
+      let newinputt =
+       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 ;*)
+           okb#misc#set_sensitive true) (*(b && uri_entry#text <> ""))*) *)())
+      in
+       newinputt
+    ) cons in
+  let hboxn =
+   GPack.hbox ~border_width:0
+    ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+  let okb =
+   GButton.button ~label:"> Next"
+    ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+  let _ = okb#misc#set_sensitive true in
+  let cancelb =
+   GButton.button ~label:"Abort"
+    ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+  ignore (window2#connect#destroy GMain.Main.quit) ;
+  ignore (cancelb#connect#clicked window2#destroy) ;
+  ignore
+   (okb#connect#clicked
+     (function () ->
+       try
+        chosen := true ;
+        let context,subst= !get_context_and_subst () in
+        let cons_types =
+         List.map2
+          (fun name inputt ->
+            let metasenv,expr =
+             inputt#get_metasenv_and_term ~context ~metasenv:[]
+            in
+             match metasenv with
+                [] ->
+                 let undebrujined_expr =
+                  List.fold_left
+                   (fun expr t -> CicSubstitution.subst t expr) expr subst
+                 in
+                  name, undebrujined_expr
+              | _ -> raise AmbiguousInput
+          ) cons cons_type_widgets
+        in
+         get_cons_types := (function () -> cons_types) ;
+         window2#destroy ()
+       with
+        e ->
+         output_html outputhtml
+          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+     )) ;
+  window2#show () ;
+  GMain.Main.main () ;
+  let okb_pressed = !chosen in
+   chosen := false ;
+   if (not okb_pressed) then
+    begin
+     window#destroy () ;
+     assert false (* The control never reaches this point *)
+    end
+   else
+    (!get_cons_types ())
+ in
+  phase1 () ;
+  (* No more phases left or Abort pressed *) 
+  window#show () ;
+  GMain.Main.main () ;
+  window#destroy () ;
+  if !chosen then
+   try
+    let uri = !get_uri () in
+(*CSC: Da finire *)
+    let params = [] in
+    let tys = !get_types_and_cons () in
+     let obj = Cic.InductiveDefinition tys params !paramsno in
+      begin
+       try
+        prerr_endline (CicPp.ppobj obj) ;
+        CicTypeChecker.typecheck_mutual_inductive_defs uri
+         (tys,params,!paramsno) ;
+        with
+         e ->
+          prerr_endline "Offending mutual (co)inductive type declaration:" ;
+          prerr_endline (CicPp.ppobj obj) ;
+      end ;
+      (* We already know that obj is well-typed. We need to add it to the  *)
+      (* environment in order to compute the inner-types without having to *)
+      (* debrujin it or having to modify lots of other functions to avoid  *)
+      (* asking the environment for the MUTINDs we are defining now.       *)
+      CicEnvironment.put_inductive_definition uri obj ;
+      save_obj uri obj ;
+      show_in_show_window_obj uri obj
+   with
+    e ->
+     output_html outputhtml
+      ("<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 : GMathView.math_view) in
+ let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let notebook = (rendering_window ())#notebook in
 
  let chosen = ref false in
- let get_parsed = ref (function _ -> assert false) in
+ let get_metasenv_and_term = ref (function _ -> assert false) in
  let get_uri = ref (function _ -> assert false) in
  let non_empty_type = ref false in
  let window =
@@ -1436,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 ;
@@ -1457,7 +1612,7 @@ let new_proof () =
     (function () ->
       chosen := true ;
       try
-       let parsed = newinputt#get_term [] [] in
+       let metasenv,parsed = newinputt#get_metasenv_and_term [] [] in
        let uristr = "cic:" ^ uri_entry#text in
        let uri = UriManager.uri_of_string uristr in
         if String.sub uristr (String.length uristr - 4) 4 <> ".con" then
@@ -1469,7 +1624,7 @@ let new_proof () =
            raise UriAlreadyInUse
           with
            Getter.Unresolved ->
-            get_parsed := (function () -> parsed) ;
+            get_metasenv_and_term := (function () -> metasenv,parsed) ;
             get_uri := (function () -> uri) ; 
             window#destroy ()
          end
@@ -1482,18 +1637,18 @@ let new_proof () =
  GMain.Main.main () ;
  if !chosen then
   try
-   let dom,mk_metasenv_and_expr = !get_parsed () in
-    let metasenv,expr =
-     disambiguate_input [] [] dom mk_metasenv_and_expr
-    in
-     let _  = CicTypeChecker.type_of_aux' metasenv [] expr in
-      ProofEngine.proof :=
-       Some (!get_uri (), (1,[],expr)::metasenv, Cic.Meta (1,[]), expr) ;
-      ProofEngine.goal := Some 1 ;
-      refresh_sequent notebook ;
-      refresh_proof output ;
-      !save_set_sensitive true ;
-      inputt#reset
+   let metasenv,expr = !get_metasenv_and_term () in
+    let _  = CicTypeChecker.type_of_aux' metasenv [] expr in
+     ProofEngine.proof :=
+      Some (!get_uri (), (1,[],expr)::metasenv, Cic.Meta (1,[]), expr) ;
+     ProofEngine.goal := Some 1 ;
+     refresh_sequent notebook ;
+     refresh_proof output ;
+     !save_set_sensitive true ;
+     inputt#reset ;
+     ProofEngine.intros ~mk_fresh_name_callback () ;
+     refresh_sequent notebook ;
+     refresh_proof output
   with
      RefreshSequentException e ->
       output_html outputhtml
@@ -1510,11 +1665,10 @@ let new_proof () =
 
 let check_term_in_scratch scratch_window metasenv context expr = 
  try
-  let ty  = CicTypeChecker.type_of_aux' metasenv context expr in
+  let ty = CicTypeChecker.type_of_aux' metasenv context expr in
    let mml = mml_of_cic_term 111 (Cic.Cast (expr,ty)) in
-prerr_endline ("### " ^ CicPp.ppterm expr ^ " ==> " ^ CicPp.ppterm ty) ;
     scratch_window#show () ;
-    scratch_window#mmlwidget#load_tree ~dom:mml
+    scratch_window#mmlwidget#load_doc ~dom:mml
  with
   e ->
    print_endline ("? " ^ CicPp.ppterm expr) ;
@@ -1522,42 +1676,48 @@ prerr_endline ("### " ^ CicPp.ppterm expr ^ " ==> " ^ CicPp.ppterm ty) ;
 ;;
 
 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
       None -> []
     | Some (_,metasenv,_,_) -> metasenv
   in
-  let context,names_context =
-   let context =
-    match !ProofEngine.goal with
-       None -> []
-     | Some metano ->
-        let (_,canonical_context,_) =
-         List.find (function (m,_,_) -> m=metano) metasenv
-        in
-         canonical_context
-   in
-    context,
-    List.map
-     (function
-         Some (n,_) -> Some n
-       | None -> None
-     ) context
+  let context =
+   match !ProofEngine.goal with
+      None -> []
+    | Some metano ->
+       let (_,canonical_context,_) =
+        List.find (function (m,_,_) -> m=metano) metasenv
+       in
+        canonical_context
   in
    try
-    let dom,mk_metasenv_and_expr = inputt#get_term names_context metasenv in
-     let (metasenv',expr) =
-      disambiguate_input context metasenv dom mk_metasenv_and_expr
-     in
-      check_term_in_scratch scratch_window metasenv' context expr
+    let metasenv',expr = inputt#get_metasenv_and_term context metasenv in
+     check_term_in_scratch scratch_window metasenv' context expr
    with
     e ->
      output_html outputhtml
       ("<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       *)
@@ -1565,7 +1725,7 @@ let check scratch_window () =
 
 let call_tactic tactic () =
  let notebook = (rendering_window ())#notebook in
- let output = ((rendering_window ())#output : GMathView.math_view) 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
@@ -1600,9 +1760,9 @@ let call_tactic tactic () =
 
 let call_tactic_with_input tactic () =
  let notebook = (rendering_window ())#notebook in
- let output = ((rendering_window ())#output : GMathView.math_view) 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 =
@@ -1618,24 +1778,16 @@ let call_tactic_with_input tactic () =
          List.find (function (m,_,_) -> m=metano) metasenv
         in
          canonical_context
-   in
-   let context =
-    List.map
-     (function
-         Some (n,_) -> Some n
-       | None -> None
-     ) canonical_context
    in
     try
-     let dom,mk_metasenv_and_expr = inputt#get_term context metasenv in
-      let (metasenv',expr) =
-       disambiguate_input canonical_context metasenv dom mk_metasenv_and_expr
-      in
-       ProofEngine.proof := Some (uri,metasenv',bo,ty) ;
-       tactic expr ;
-       refresh_sequent notebook ;
-       refresh_proof output ;
-       inputt#reset
+     let metasenv',expr =
+      inputt#get_metasenv_and_term canonical_context metasenv
+     in
+      ProofEngine.proof := Some (uri,metasenv',bo,ty) ;
+      tactic expr ;
+      refresh_sequent notebook ;
+      refresh_proof output ;
+      inputt#reset
     with
        RefreshSequentException e ->
         output_html outputhtml
@@ -1663,15 +1815,15 @@ let call_tactic_with_goal_input tactic () =
  let module L = LogicalOperations in
  let module G = Gdome in
   let notebook = (rendering_window ())#notebook in
-  let output = ((rendering_window ())#output : GMathView.math_view) 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
-   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!!!" *)
@@ -1707,66 +1859,118 @@ 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_input_and_goal_input tactic () =
+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 : GMathView.math_view) 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 savedproof = !ProofEngine.proof in
   let savedgoal  = !ProofEngine.goal in
-   match notebook#proofw#get_selection with
-     Some node ->
-      let xpath =
-       ((node : Gdome.element)#getAttributeNS
-         ~namespaceURI:helmns
-         ~localName:(G.domString "xref"))#to_string
-      in
-       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
-       else
-        begin
-         try
-          match !current_goal_infos with
-             Some (ids_to_terms, ids_to_father_ids,_) ->
-              let id = xpath in
-               let uri,metasenv,bo,ty =
-                match !ProofEngine.proof with
-                   None -> assert false
-                 | Some (uri,metasenv,bo,ty) -> uri,metasenv,bo,ty
-               in
-                let canonical_context =
-                 match !ProofEngine.goal with
-                    None -> assert false
+   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 () =
+ 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 inputt = ((rendering_window ())#inputt : TermEditor.term_editor) in
+  let savedproof = !ProofEngine.proof in
+  let savedgoal  = !ProofEngine.goal in
+   match notebook#proofw#get_selections with
+     [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
+        begin
+         try
+          match !current_goal_infos with
+             Some (ids_to_terms, ids_to_father_ids,_) ->
+              let id = xpath in
+               let uri,metasenv,bo,ty =
+                match !ProofEngine.proof with
+                   None -> assert false
+                 | Some (uri,metasenv,bo,ty) -> uri,metasenv,bo,ty
+               in
+                let canonical_context =
+                 match !ProofEngine.goal with
+                    None -> assert false
                   | Some metano ->
                      let (_,canonical_context,_) =
                       List.find (function (m,_,_) -> m=metano) metasenv
                      in
                       canonical_context in
-                let context =
-                 List.map
-                  (function
-                      Some (n,_) -> Some n
-                    | None -> None
-                  ) canonical_context
+                let (metasenv',expr) =
+                 inputt#get_metasenv_and_term canonical_context metasenv
                 in
-                 let dom,mk_metasenv_and_expr = inputt#get_term context metasenv
-                 in
-                  let (metasenv',expr) =
-                   disambiguate_input canonical_context metasenv dom
-                    mk_metasenv_and_expr
-                  in
-                   ProofEngine.proof := Some (uri,metasenv',bo,ty) ;
-                   tactic ~goal_input:(Hashtbl.find ids_to_terms id)
-                    ~input:expr ;
-                   refresh_sequent notebook ;
-                   refresh_proof output ;
-                   inputt#reset
+                 ProofEngine.proof := Some (uri,metasenv',bo,ty) ;
+                 tactic ~goal_input:(Hashtbl.find ids_to_terms id)
+                  ~input:expr ;
+                 refresh_sequent notebook ;
+                 refresh_proof output ;
+                 inputt#reset
            | None -> assert false (* "ERROR: No current term!!!" *)
          with
             RefreshSequentException e ->
@@ -1790,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 : GMathView.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!!!" *)
@@ -1820,31 +2028,74 @@ let call_tactic_with_goal_input_in_scratch tactic scratch_window () =
                let expr = tactic term (Hashtbl.find ids_to_terms id) in
                 let mml = mml_of_cic_term 111 expr in
                  scratch_window#show () ;
-                 scratch_window#mmlwidget#load_tree ~dom:mml
+                 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>")
         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 () =
  let module L = LogicalOperations in
  let module G = Gdome in
   let notebook = (rendering_window ())#notebook in
-  let output = ((rendering_window ())#output : GMathView.math_view) 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
-   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!!!" *)
@@ -1880,46 +2131,62 @@ 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 elimsimplintros = call_tactic_with_input ProofEngine.elim_simpl_intros;;
+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 fold = call_tactic_with_input ProofEngine.fold;;
-let cut = call_tactic_with_input ProofEngine.cut;;
+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 ~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;;
 let fourier = call_tactic ProofEngine.fourier;;
 let rewritesimpl = call_tactic_with_input ProofEngine.rewrite_simpl;;
+let rewritebacksimpl = call_tactic_with_input ProofEngine.rewrite_back_simpl;;
+let replace = call_tactic_with_input_and_goal_input ProofEngine.replace;;
 let reflexivity = call_tactic ProofEngine.reflexivity;;
 let symmetry = call_tactic ProofEngine.symmetry;;
 let transitivity = call_tactic_with_input ProofEngine.transitivity;;
+let exists = call_tactic ProofEngine.exists;;
+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_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 ~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
 ;;
 
@@ -1933,7 +2200,7 @@ let simpl_in_scratch scratch_window =
 let show () =
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
   try
-   show_in_show_window (input_or_locate_uri ~title:"Show")
+   show_in_show_window_uri (input_or_locate_uri ~title:"Show")
   with
    e ->
     output_html outputhtml
@@ -1944,7 +2211,7 @@ exception NotADefinition;;
 
 let open_ () =
  let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
- let output = ((rendering_window ())#output : GMathView.math_view) in
+ let output = ((rendering_window ())#output : GMathViewAux.single_selection_math_view) in
  let notebook = (rendering_window ())#notebook in
    try
     let uri = input_or_locate_uri ~title:"Open" in
@@ -1976,29 +2243,466 @@ let open_ () =
         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
 ;;
 
+let show_query_results results =
+ let window =
+  GWindow.window
+   ~modal:false ~title:"Query results." ~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:"Click on a URI to show that object"
+   ~packing:hbox#add () in
+ let scrolled_window =
+  GBin.scrolled_window ~border_width:10 ~height:400 ~width:600
+   ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+ let clist = GList.clist ~columns:1 ~packing:scrolled_window#add () in
+  ignore
+   (List.map
+     (function (uri,_) ->
+       let n =
+        clist#append [uri]
+       in
+        clist#set_row ~selectable:false n
+     ) results
+   ) ;
+  clist#columns_autosize () ;
+  ignore
+   (clist#connect#select_row
+     (fun ~row ~column ~event ->
+       let (uristr,_) = List.nth results row in
+        match
+         Misc.cic_textual_parser_uri_of_string
+          (Misc.wrong_xpointer_format_from_wrong_xpointer_format'
+            uristr)
+        with
+           CicTextualParser0.ConUri uri
+         | CicTextualParser0.VarUri uri
+         | CicTextualParser0.IndTyUri (uri,_)
+         | CicTextualParser0.IndConUri (uri,_,_) ->
+            show_in_show_window_uri uri
+     )
+   ) ;
+  window#show ()
+;;
 
-let searchPattern () =
- let inputt = ((rendering_window ())#inputt : term_editor) in
+let refine_constraints (must_obj,must_rel,must_sort) =
+ let chosen = ref false in
+ let use_only = ref false in
+ let window =
+  GWindow.window
+   ~modal:true ~title:"Constraints refinement."
+   ~width:800 ~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: "\"Only\" constraints can be enforced or not."
+   ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let onlyb =
+  GButton.toggle_button ~label:"Enforce \"only\" constraints"
+   ~active:false ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) ()
+ in
+  ignore
+   (onlyb#connect#toggled (function () -> use_only := onlyb#active)) ;
+ (* Notebook for the constraints choice *)
+ let notebook =
+  GPack.notebook ~scrollable:true
+   ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+ (* Rel constraints *)
+ let label =
+  GMisc.label
+   ~text: "Constraints on Rels" () 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: "You can now specify the constraints on Rels."
+   ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let expected_height = 25 * (List.length must_rel + 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 scrolled_vbox = GPack.vbox ~packing:scrolled_window#add_with_viewport () in
+ let rel_constraints =
+  List.map
+   (function (position,depth) ->
+     let hbox =
+      GPack.hbox
+       ~packing:(scrolled_vbox#pack ~expand:false ~fill:false ~padding:5) () in
+     let lMessage =
+      GMisc.label
+       ~text:position
+       ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+     match depth with
+        None -> position, ref None
+      | Some depth' ->
+         let mutable_ref = ref (Some depth') in
+         let depthb =
+          GButton.toggle_button
+           ~label:("depth = " ^ string_of_int depth') ~active:true
+           ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) ()
+         in
+          ignore
+           (depthb#connect#toggled
+             (function () ->
+               let sel_depth = if depthb#active then Some depth' else None in
+                mutable_ref := sel_depth
+            )) ;
+          position, mutable_ref
+   ) must_rel in
+ (* Sort constraints *)
+ let label =
+  GMisc.label
+   ~text: "Constraints on Sorts" () 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: "You can now specify the constraints on Sorts."
+   ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let expected_height = 25 * (List.length must_sort + 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 scrolled_vbox = GPack.vbox ~packing:scrolled_window#add_with_viewport () in
+ let sort_constraints =
+  List.map
+   (function (position,depth,sort) ->
+     let hbox =
+      GPack.hbox
+       ~packing:(scrolled_vbox#pack ~expand:false ~fill:false ~padding:5) () in
+     let lMessage =
+      GMisc.label
+       ~text:(sort ^ " " ^ position)
+       ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+     match depth with
+        None -> position, ref None, sort
+      | Some depth' ->
+         let mutable_ref = ref (Some depth') in
+         let depthb =
+          GButton.toggle_button ~label:("depth = " ^ string_of_int depth')
+           ~active:true
+           ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) ()
+         in
+          ignore
+           (depthb#connect#toggled
+             (function () ->
+               let sel_depth = if depthb#active then Some depth' else None in
+                mutable_ref := sel_depth
+            )) ;
+          position, mutable_ref, sort
+   ) must_sort in
+ (* Obj constraints *)
+ let label =
+  GMisc.label
+   ~text: "Constraints on constants" () 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: "You can now specify the constraints on constants."
+   ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let expected_height = 25 * (List.length must_obj + 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 scrolled_vbox = GPack.vbox ~packing:scrolled_window#add_with_viewport () in
+ let obj_constraints =
+  List.map
+   (function (uri,position,depth) ->
+     let hbox =
+      GPack.hbox
+       ~packing:(scrolled_vbox#pack ~expand:false ~fill:false ~padding:5) () in
+     let lMessage =
+      GMisc.label
+       ~text:(uri ^ " " ^ position)
+       ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+     match depth with
+        None -> uri, position, ref None
+      | Some depth' ->
+         let mutable_ref = ref (Some depth') in
+         let depthb =
+          GButton.toggle_button ~label:("depth = " ^ string_of_int depth')
+           ~active:true
+           ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) ()
+         in
+          ignore
+           (depthb#connect#toggled
+             (function () ->
+               let sel_depth = if depthb#active then Some depth' else None in
+                mutable_ref := sel_depth
+            )) ;
+          uri, position, mutable_ref
+   ) must_obj in
+ (* Confirm/abort buttons *)
+ 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
+  ignore (window#connect#destroy GMain.Main.quit) ;
+  ignore (cancelb#connect#clicked window#destroy) ;
+  ignore
+   (okb#connect#clicked (function () -> chosen := true ; window#destroy ()));
+  window#set_position `CENTER ;
+  window#show () ;
+  GMain.Main.main () ;
+  if !chosen then
+   let chosen_must_rel =
+    List.map
+     (function (position,ref_depth) -> position,!ref_depth) rel_constraints in
+   let chosen_must_sort =
+    List.map
+     (function (position,ref_depth,sort) -> position,!ref_depth,sort)
+     sort_constraints
+   in
+   let chosen_must_obj =
+    List.map
+     (function (uri,position,ref_depth) -> uri,position,!ref_depth)
+     obj_constraints
+   in
+    (chosen_must_obj,chosen_must_rel,chosen_must_sort),
+     (if !use_only then
+(*CSC: ???????????????????????? I assume that must and only are the same... *)
+       Some chosen_must_obj,Some chosen_must_rel,Some chosen_must_sort
+      else
+       None,None,None
+     )
+  else
+   raise NoChoice
+;;
+
+let completeSearchPattern () =
+ let inputt = ((rendering_window ())#inputt : TermEditor.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
+   let metasenv,expr = inputt#get_metasenv_and_term ~context:[] ~metasenv:[] in
+   let must = MQueryLevels2.get_constraints expr in
+   let must',only = refine_constraints must in
+   let results = MQueryGenerator.searchPattern must' only in 
+    show_query_results results
+  with
+   e ->
+    output_html outputhtml
+     ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+;;
+
+let insertQuery () =
+ let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+  try
+   let chosen = ref None in
+   let window =
+    GWindow.window
+     ~modal:true ~title:"Insert Query (Experts Only)" ~border_width:2 () in
+   let vbox = GPack.vbox ~packing:window#add () in
+   let label =
+    GMisc.label ~text:"Insert Query. For Experts Only."
+     ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+   let scrolled_window =
+    GBin.scrolled_window ~border_width:10 ~height:400 ~width:600
+     ~packing:(vbox#pack ~expand:true ~fill:true ~padding:5) () in
+   let input = GEdit.text ~editable:true
+    ~packing:scrolled_window#add () 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 loadb =
+    GButton.button ~label:"Load from file..."
+     ~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
+   ignore (window#connect#destroy GMain.Main.quit) ;
+   ignore (cancelb#connect#clicked window#destroy) ;
+   ignore
+    (okb#connect#clicked
+      (function () ->
+        chosen := Some (input#get_chars 0 input#length) ; window#destroy ())) ;
+   ignore
+    (loadb#connect#clicked
+      (function () ->
+        match
+         GToolbox.select_file ~title:"Select Query File" ()
         with
-         _ -> get_level ~last_invalid:true ()
-   in
-    let level = get_level () in
+           None -> ()
+         | Some filename ->
+            let inch = open_in filename in
+             let rec read_file () =
+              try
+               let line = input_line inch in
+                line ^ "\n" ^ read_file ()
+              with
+               End_of_file -> ""
+             in
+              let text = read_file () in
+               input#delete_text 0 input#length ;
+               ignore (input#insert_text text ~pos:0))) ;
+   window#set_position `CENTER ;
+   window#show () ;
+   GMain.Main.main () ;
+   match !chosen with
+      None -> ()
+    | Some q ->
+       let results =
+        Mqint.execute (MQueryUtil.query_of_text (Lexing.from_string q))
+       in
+        show_query_results results
+  with
+   e ->
+    output_html outputhtml
+     ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+;;
+
+let choose_must list_of_must only =
+ 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 only + 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
+      ) only
+    ) ;
+   clist#columns_autosize () ;
+   ignore
+    (clist#connect#select_row
+      (fun ~row ~column ~event ->
+        user_constraints := (List.nth only row)::!user_constraints)) ;
+   ignore
+    (clist#connect#unselect_row
+      (fun ~row ~column ~event ->
+        user_constraints :=
+         List.filter
+          (function uri -> uri != (List.nth only 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 : TermEditor.term_editor) in
+ let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+  try
     let metasenv =
      match !ProofEngine.proof with
         None -> assert false
@@ -2008,17 +2712,29 @@ let searchPattern () =
         None -> ()
       | Some metano ->
          let (_, ey ,ty) = List.find (function (m,_,_) -> m=metano) metasenv in
-          let result = MQueryGenerator.searchPattern metasenv ey ty level in
+          let list_of_must,only = MQueryLevels.out_restr metasenv ey ty in
+         let must = choose_must list_of_must only 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_only = Some (List.map torigth_restriction only) in
+         let result =
+           MQueryGenerator.searchPattern
+            (rigth_must,[],[]) (rigth_only,None,None) in 
           let uris =
            List.map
             (function uri,_ ->
-              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>" ^
-           " <h2>Levels: </h2> " ^
-           MQueryGenerator.string_of_levels
-            (MQueryGenerator.levels_of_term metasenv ey ty) "<br>" ^
           " <pre>" ^ get_last_query result ^ "</pre>"
           in
            output_html outputhtml html ;
@@ -2032,7 +2748,7 @@ let searchPattern () =
                    if
                     ProofEngine.can_apply
                      (term_of_cic_textual_parser_uri
-                      (cic_textual_parser_uri_of_string uri))
+                      (Misc.cic_textual_parser_uri_of_string uri))
                    then
                     uri::tl',exc
                    else
@@ -2070,23 +2786,26 @@ let searchPattern () =
      ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
 ;;
       
-let choose_selection
-     (mmlwidget : GMathView.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)
    else
+    try
       match element#get_parentNode with
          None -> assert false
        (*CSC: OCAML DIVERGES!
        | Some p -> aux (new G.element_of_node p)
        *)
        | Some p -> aux (new Gdome.element_of_node p)
+    with
+       GdomeInit.DOMCastException _ ->
+        prerr_endline
+         "******* trying to select above the document root ********"
   in
    match element with
      Some x -> aux x
@@ -2097,7 +2816,7 @@ let choose_selection
 
 (* Stuff for the widget settings *)
 
-let export_to_postscript (output : GMathView.math_view) =
+let export_to_postscript (output : GMathViewAux.single_selection_math_view) =
  let lastdir = ref (Unix.getcwd ()) in
   function () ->
    match
@@ -2109,8 +2828,8 @@ let export_to_postscript (output : GMathView.math_view) =
        output#export_to_postscript ~filename:filename ();
 ;;
 
-let activate_t1 (output : GMathView.math_view) button_set_anti_aliasing
- button_set_kerning button_set_transparency export_to_postscript_menu_item
+let activate_t1 (output : GMathViewAux.single_selection_math_view) button_set_anti_aliasing
+ button_set_transparency export_to_postscript_menu_item
  button_t1 ()
 =
  let is_set = button_t1#active in
@@ -2119,14 +2838,12 @@ let activate_t1 (output : GMathView.math_view) button_set_anti_aliasing
   if is_set then
    begin
     button_set_anti_aliasing#misc#set_sensitive true ;
-    button_set_kerning#misc#set_sensitive true ;
     button_set_transparency#misc#set_sensitive true ;
     export_to_postscript_menu_item#misc#set_sensitive true ;
    end
   else
    begin
     button_set_anti_aliasing#misc#set_sensitive false ;
-    button_set_kerning#misc#set_sensitive false ;
     button_set_transparency#misc#set_sensitive false ;
     export_to_postscript_menu_item#misc#set_sensitive false ;
    end
@@ -2136,10 +2853,6 @@ let set_anti_aliasing output button_set_anti_aliasing () =
  output#set_anti_aliasing button_set_anti_aliasing#active
 ;;
 
-let set_kerning output button_set_kerning () =
- output#set_kerning button_set_kerning#active
-;;
-
 let set_transparency output button_set_transparency () =
  output#set_transparency button_set_transparency#active
 ;;
@@ -2152,7 +2865,7 @@ let set_log_verbosity output log_verbosity_spinb () =
  output#set_log_verbosity log_verbosity_spinb#value_as_int
 ;;
 
-class settings_window (output : GMathView.math_view) sw
+class settings_window (output : GMathViewAux.single_selection_math_view) sw
  export_to_postscript_menu_item selection_changed_callback
 =
  let settings_window = GWindow.window ~title:"GtkMathView settings" () in
@@ -2168,9 +2881,6 @@ class settings_window (output : GMathView.math_view) sw
  let button_set_anti_aliasing =
   GButton.toggle_button ~label:"set_anti_aliasing"
    ~packing:(table#attach ~left:0 ~top:1) () in
- let button_set_kerning =
-  GButton.toggle_button ~label:"set_kerning"
-   ~packing:(table#attach ~left:1 ~top:1) () in
  let button_set_transparency =
   GButton.toggle_button ~label:"set_transparency"
    ~packing:(table#attach ~left:2 ~top:1) () in
@@ -2205,17 +2915,14 @@ object(self)
  method show = settings_window#show
  initializer
   button_set_anti_aliasing#misc#set_sensitive false ;
-  button_set_kerning#misc#set_sensitive false ;
   button_set_transparency#misc#set_sensitive false ;
   (* Signals connection *)
   ignore(button_t1#connect#clicked
-   (activate_t1 output button_set_anti_aliasing button_set_kerning
+   (activate_t1 output button_set_anti_aliasing
     button_set_transparency export_to_postscript_menu_item button_t1)) ;
   ignore(font_size_spinb#connect#changed (changefont output font_size_spinb)) ;
   ignore(button_set_anti_aliasing#connect#toggled
    (set_anti_aliasing output button_set_anti_aliasing));
-  ignore(button_set_kerning#connect#toggled
-   (set_kerning output button_set_kerning)) ;
   ignore(button_set_transparency#connect#toggled
    (set_transparency output button_set_transparency)) ;
   ignore(log_verbosity_spinb#connect#changed
@@ -2245,7 +2952,7 @@ class scratch_window =
   GBin.scrolled_window ~border_width:10
    ~packing:(vbox#pack ~expand:true ~padding:5) () in
  let mmlwidget =
-  GMathView.math_view
+  GMathViewAux.multi_selection_math_view
    ~packing:(scrolled_window#add) ~width:400 ~height:280 () in
 object(self)
  method mmlwidget = mmlwidget
@@ -2258,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)
@@ -2280,112 +3021,164 @@ object(self)
     GBin.scrolled_window ~border_width:10
      ~packing:(vbox1#pack ~expand:true ~padding:5) () in
    let proofw =
-    GMathView.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"
-     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let elimsimplintrosb =
-    GButton.button ~label:"ElimSimplIntros"
-     ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let elimtypeb =
-    GButton.button ~label:"ElimType"
+   let ringb =
+    GButton.button ~label:"Ring"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let whdb =
-    GButton.button ~label:"Whd"
+   let fourierb =
+    GButton.button ~label:"Fourier"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let reduceb =
-    GButton.button ~label:"Reduce"
+   let reflexivityb =
+    GButton.button ~label:"Reflexivity"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let simplb =
-    GButton.button ~label:"Simpl"
+   let symmetryb =
+    GButton.button ~label:"Symmetry"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let foldb =
-    GButton.button ~label:"Fold"
+   let assumptionb =
+    GButton.button ~label:"Assumption"
      ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
-   let cutb =
-    GButton.button ~label:"Cut"
+   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 changeb =
-    GButton.button ~label:"Change"
-     ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let letinb =
-    GButton.button ~label:"Let ... In"
-     ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let ringb =
-    GButton.button ~label:"Ring"
-     ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let clearbodyb =
-    GButton.button ~label:"ClearBody"
+   let existsb =
+    GButton.button ~label:"Exists"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let clearb =
-    GButton.button ~label:"Clear"
+   let splitb =
+    GButton.button ~label:"Split"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let fourierb =
-    GButton.button ~label:"Fourier"
+   let leftb =
+    GButton.button ~label:"Left"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let rewritesimplb =
-    GButton.button ~label:"RewriteSimpl ->"
+   let rightb =
+    GButton.button ~label:"Right"
      ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
-   let reflexivityb =
-    GButton.button ~label:"Reflexivity"
+   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 symmetryb =
-    GButton.button ~label:"Symmetry"
+   let exactb =
+    GButton.button ~label:"Exact"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let transitivityb =
-    GButton.button ~label:"Transitivity"
+   let introsb =
+    GButton.button ~label:"Intros"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let leftb =
-    GButton.button ~label:"Left"
+   let applyb =
+    GButton.button ~label:"Apply"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let rightb =
-    GButton.button ~label:"Right"
+   let elimintrossimplb =
+    GButton.button ~label:"ElimIntrosSimpl"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let assumptionb =
-    GButton.button ~label:"Assumption"
+   let elimtypeb =
+    GButton.button ~label:"ElimType"
      ~packing:(hbox5#pack ~expand:false ~fill:false ~padding:5) () in
-   let searchpatternb =
-    GButton.button ~label:"SearchPattern_Apply"
+   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 foldsimplb =
+    GButton.button ~label:"Fold_simpl"
+     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
+   let cutb =
+    GButton.button ~label:"Cut"
+     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
+   let changeb =
+    GButton.button ~label:"Change"
+     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
+   let letinb =
+    GButton.button ~label:"Let ... In"
+     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
+   let rewritesimplb =
+    GButton.button ~label:"RewriteSimpl ->"
+     ~packing:(hbox6#pack ~expand:false ~fill:false ~padding:5) () in
+   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 absurdb =
+    GButton.button ~label:"Absurd"
+     ~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(elimsimplintrosb#connect#clicked elimsimplintros) ;
+   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(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) ;
    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) ;
+   ignore(replaceb#connect#clicked replace) ;
    ignore(reflexivityb#connect#clicked reflexivity) ;
    ignore(symmetryb#connect#clicked symmetry) ;
    ignore(transitivityb#connect#clicked transitivity) ;
+   ignore(existsb#connect#clicked exists) ;
+   ignore(splitb#connect#clicked split) ;
    ignore(leftb#connect#clicked left) ;
    ignore(rightb#connect#clicked right) ;
    ignore(assumptionb#connect#clicked assumption) ;
+   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
 ;;
@@ -2396,10 +3189,10 @@ class empty_page =
   GBin.scrolled_window ~border_width:10
    ~packing:(vbox1#pack ~expand:true ~padding:5) () in
  let proofw =
-  GMathView.math_view ~width:400 ~height:275
+  GMathViewAux.single_selection_math_view ~width:400 ~height:275
    ~packing:(scrolled_window1#add) () in
 object(self)
- method proofw = (assert false : GMathView.math_view)
+ method proofw = (assert false : GMathViewAux.single_selection_math_view)
  method content = vbox1
  method compute = (assert false : unit)
 end
@@ -2479,6 +3272,10 @@ class rendering_window output (notebook : notebook) =
  let factory1 = new GMenu.factory file_menu ~accel_group in
  let export_to_postscript_menu_item =
   begin
+   let _ =
+    factory1#add_item "New Block of (Co)Inductive Definitions..."
+     ~key:GdkKeysyms._B ~callback:new_inductive
+   in
    let _ =
     factory1#add_item "New Proof or Definition..." ~key:GdkKeysyms._N
      ~callback:new_proof
@@ -2542,9 +3339,16 @@ class rendering_window output (notebook : notebook) =
  let _ =
   factory4#add_item "Locate..." ~key:GdkKeysyms._T
    ~callback:locate in
+ let searchPattern_menu_item =
+  factory4#add_item "SearchPattern..." ~key:GdkKeysyms._D
+   ~callback:completeSearchPattern in
+ let _ = searchPattern_menu_item#misc#set_sensitive false in
  let show_menu_item =
   factory4#add_item "Show..." ~key:GdkKeysyms._H ~callback:show
  in
+ let insert_query_item =
+  factory4#add_item "Insert Query (Experts Only)..." ~key:GdkKeysyms._U
+   ~callback:insertQuery in
  (* settings menu *)
  let settings_menu = factory0#add_submenu "Settings" in
  let factory3 = new GMenu.factory settings_menu ~accel_group in
@@ -2574,8 +3378,12 @@ 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 ()
-   ~isnotempty_callback:check_menu_item#misc#set_sensitive in
+  TermEditor'.term_editor
+   ~width:400 ~height:100 ~packing:scrolled_window1#add ()
+   ~isnotempty_callback:
+    (function b ->
+      check_menu_item#misc#set_sensitive b ;
+      searchPattern_menu_item#misc#set_sensitive b) in
  let vboxl =
   GPack.vbox ~packing:(hbox0#pack ~expand:true ~fill:true ~padding:5) () in
  let _ =
@@ -2593,7 +3401,7 @@ class rendering_window output (notebook : notebook) =
 object
  method outputhtml = outputhtml
  method inputt = inputt
- method output = (output : GMathView.math_view)
+ method output = (output : GMathViewAux.single_selection_math_view)
  method notebook = notebook
  method show = window#show
  initializer
@@ -2607,7 +3415,7 @@ object
      choose_selection output elem ;
      !focus_and_proveit_set_sensitive true
    )) ;
-  ignore (output#connect#clicked (show_in_show_window_callback output)) ;
+  ignore (output#connect#click (show_in_show_window_callback output)) ;
   let settings_window = new settings_window output scrolled_window0
    export_to_postscript_menu_item (choose_selection output) in
   set_settings_window settings_window ;
@@ -2621,7 +3429,7 @@ end;;
 
 let initialize_everything () =
  let module U = Unix in
-  let output = GMathView.math_view ~width:350 ~height:280 () in
+  let output = GMathViewAux.single_selection_math_view ~width:350 ~height:280 () in
   let notebook = new notebook in
    let rendering_window' = new rendering_window output notebook in
     set_rendering_window rendering_window' ;
@@ -2632,8 +3440,10 @@ let initialize_everything () =
 
 let _ =
  if !usedb then
- Mqint.init "dbname=helm_mowgli" ; 
-(* Mqint.init "host=mowgli.cs.unibo.it dbname=helm_mowgli user=helm" ; *)
+  begin
+   Mqint.set_database Mqint.postgres_db ;
+   Mqint.init postgresqlconnectionstring ;
+  end ;
  ignore (GtkMain.Main.init ()) ;
  initialize_everything () ;
  if !usedb then Mqint.close ();