]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gTopLevel/gTopLevel.ml
mquery.ml now really call the execution of the query.
[helm.git] / helm / gTopLevel / gTopLevel.ml
index 905de741041dc586772fbac7fa5f6c5224a53031..083bbc7ebac6ccfc279d69cd00911210519ae7c6 100644 (file)
@@ -181,19 +181,25 @@ let refresh_proof (output : GMathView.math_view) =
      output#load_tree mml ;
      current_cic_infos := Some (ids_to_terms,ids_to_father_ids)
  with
-  e -> raise (RefreshProofException e)
+  e ->
+ match !ProofEngine.proof with
+    None -> assert false
+  | Some (uri,metasenv,bo,ty) ->
+prerr_endline ("Offending proof: " ^ CicPp.ppobj (Cic.CurrentProof ("questa",metasenv,bo,ty))) ; flush stderr ;
+   raise (RefreshProofException e)
 ;;
 
 let refresh_sequent (proofw : GMathView.math_view) =
  try
   match !ProofEngine.goal with
      None -> proofw#unload
-   | Some (_,currentsequent) ->
+   | Some metano ->
       let metasenv =
        match !ProofEngine.proof with
           None -> assert false
         | Some (_,metasenv,_,_) -> metasenv
       in
+      let currentsequent = List.find (function (m,_,_) -> m=metano) metasenv in
        let sequent_gdome,ids_to_terms,ids_to_father_ids =
         SequentPp.XmlPp.print_sequent metasenv currentsequent
        in
@@ -206,7 +212,20 @@ let refresh_sequent (proofw : GMathView.math_view) =
           proofw#load_tree ~dom:sequent_mml ;
           current_goal_infos := Some (ids_to_terms,ids_to_father_ids)
  with
-  e -> raise (RefreshSequentException e)
+  e ->
+let metano =
+  match !ProofEngine.goal with
+     None -> assert false
+   | Some m -> m
+in
+let metasenv =
+ match !ProofEngine.proof with
+    None -> assert false
+  | Some (_,metasenv,_,_) -> metasenv
+in
+let currentsequent = List.find (function (m,_,_) -> m=metano) metasenv in
+prerr_endline ("Offending sequent: " ^ SequentPp.TextualPp.print_sequent currentsequent) ; flush stderr ;
+   raise (RefreshSequentException e)
 ;;
 
 (*
@@ -214,19 +233,23 @@ ignore(domImpl#saveDocumentToFile ~doc:sequent_doc
  ~name:"/public/sacerdot/guruguru1" ~indent:true ()) ;
 *)
 
-let mml_of_cic_term term =
+let mml_of_cic_term metano term =
+ let metasenv =
+  match !ProofEngine.proof with
+     None -> []
+   | Some (_,metasenv,_,_) -> metasenv
+ in
  let context =
   match !ProofEngine.goal with
      None -> []
-   | Some (_,(context,_)) -> context
+   | Some metano ->
+      let (_,canonical_context,_) =
+       List.find (function (m,_,_) -> m=metano) metasenv
+      in
+       canonical_context
  in
-  let metasenv =
-   match !ProofEngine.proof with
-      None -> []
-    | Some (_,metasenv,_,_) -> metasenv
-  in
    let sequent_gdome,ids_to_terms,ids_to_father_ids =
-    SequentPp.XmlPp.print_sequent metasenv (context,term)
+    SequentPp.XmlPp.print_sequent metasenv (metano,context,term)
    in
     let sequent_doc =
      Xml2Gdome.document_of_xml domImpl sequent_gdome
@@ -299,14 +322,23 @@ let call_tactic_with_input tactic rendering_window () =
        None -> assert false
      | Some (curi,_,_,_) -> curi
    in
+   let metasenv =
+    match !ProofEngine.proof with
+       None -> assert false
+     | Some (_,metasenv,_,_) -> metasenv
+   in
    let context =
     List.map
      (function
-         ProofEngine.Definition (n,_)
-       | ProofEngine.Declaration (n,_) -> n)
+         Some (n,_) -> Some n
+       | None -> None)
      (match !ProofEngine.goal with
          None -> assert false
-       | Some (_,(ctx,_)) -> ctx
+       | Some metano ->
+          let (_,canonical_context,_) =
+           List.find (function (m,_,_) -> m=metano) metasenv
+          in
+           canonical_context
      )
    in
     try
@@ -430,14 +462,23 @@ let call_tactic_with_input_and_goal_input tactic rendering_window () =
                     None -> assert false
                   | Some (curi,_,_,_) -> curi
                 in
+                let metasenv =
+                 match !ProofEngine.proof with
+                    None -> assert false
+                  | Some (_,metasenv,_,_) -> metasenv
+                in
                 let context =
                  List.map
                   (function
-                      ProofEngine.Definition (n,_)
-                    | ProofEngine.Declaration (n,_) -> n)
+                      Some (n,_) -> Some n
+                    | None -> None)
                   (match !ProofEngine.goal with
                       None -> assert false
-                    | Some (_,(ctx,_)) -> ctx
+                    | Some metano ->
+                       let (_,canonical_context,_) =
+                        List.find (function (m,_,_) -> m=metano) metasenv
+                       in
+                        canonical_context
                   )
                 in
                  begin
@@ -509,7 +550,7 @@ let call_tactic_with_goal_input_in_scratch tactic scratch_window () =
              Some (term,ids_to_terms, ids_to_father_ids) ->
               let id = xpath in
                let expr = tactic term (Hashtbl.find ids_to_terms id) in
-                let mml = mml_of_cic_term expr in
+                let mml = mml_of_cic_term 111 expr in
                  scratch_window#show () ;
                  scratch_window#mmlwidget#load_tree ~dom:mml
            | None -> assert false (* "ERROR: No current term!!!" *)
@@ -530,8 +571,8 @@ let exact rendering_window =
 let apply rendering_window =
  call_tactic_with_input ProofEngine.apply rendering_window
 ;;
-let elimintros rendering_window =
- call_tactic_with_input ProofEngine.elim_intros rendering_window
+let elimintrossimpl rendering_window =
+ call_tactic_with_input ProofEngine.elim_intros_simpl rendering_window
 ;;
 let whd rendering_window =
  call_tactic_with_goal_input ProofEngine.whd rendering_window
@@ -578,11 +619,14 @@ let simpl_in_scratch scratch_window =
 exception OpenConjecturesStillThere;;
 exception WrongProof;;
 
-let save rendering_window () =
+let qed rendering_window () =
  match !ProofEngine.proof with
     None -> assert false
   | Some (uri,[],bo,ty) ->
-     if CicReduction.are_convertible (CicTypeChecker.type_of_aux' [] [] bo) ty then
+     if
+      CicReduction.are_convertible []
+       (CicTypeChecker.type_of_aux' [] [] bo) ty
+     then
       begin
        (*CSC: Wrong: [] is just plainly wrong *)
        let proof = Cic.Definition (UriManager.name_of_uri uri,bo,ty,[]) in
@@ -603,6 +647,71 @@ let save rendering_window () =
   | _ -> raise OpenConjecturesStillThere
 ;;
 
+(*????
+let dtdname = "http://www.cs.unibo.it/helm/dtd/cic.dtd";;
+*)
+let dtdname = "/projects/helm/V7/dtd/cic.dtd";;
+
+let save rendering_window () =
+ let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+  match !ProofEngine.proof with
+     None -> assert false
+   | Some (uri, metasenv, bo, ty) ->
+      let currentproof =
+       Cic.CurrentProof (UriManager.name_of_uri uri,metasenv,bo,ty)
+      in
+       let (acurrentproof,_,_,ids_to_inner_sorts,_) =
+        Cic2acic.acic_object_of_cic_object currentproof
+       in
+        let xml = Cic2Xml.print_object uri ids_to_inner_sorts acurrentproof in
+         let xml' =
+          [< Xml.xml_cdata "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" ;
+             Xml.xml_cdata
+              ("<!DOCTYPE CurrentProof SYSTEM \"" ^ dtdname ^ "\">\n\n") ;
+             xml
+          >]
+         in
+          Xml.pp ~quiet:true xml' (Some "/public/sacerdot/currentproof") ;
+          output_html outputhtml
+           ("<h1 color=\"Green\">Current proof saved to " ^
+             "/public/sacerdot/currentproof</h1>")
+;;
+
+let load rendering_window () =
+ let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+ let output = (rendering_window#output : GMathView.math_view) in
+ let proofw = (rendering_window#proofw : GMathView.math_view) in
+  try
+   let uri = UriManager.uri_of_string "cic:/dummy.con" in
+    match CicParser.obj_of_xml "/public/sacerdot/currentproof" uri with
+       Cic.CurrentProof (_,metasenv,bo,ty) ->
+        ProofEngine.proof :=
+         Some (uri, metasenv, bo, ty) ;
+        ProofEngine.goal :=
+         (match metasenv with
+             [] -> None
+           | (metano,_,_)::_ -> Some metano
+         ) ;
+        refresh_proof output ;
+        refresh_sequent proofw ;
+         output_html outputhtml
+          ("<h1 color=\"Green\">Current proof loaded from " ^
+            "/public/sacerdot/currentproof</h1>")
+     | _ -> assert false
+  with
+     RefreshSequentException e ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+        "sequent: " ^ Printexc.to_string e ^ "</h1>")
+   | RefreshProofException e ->
+      output_html outputhtml
+       ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+        "proof: " ^ Printexc.to_string e ^ "</h1>")
+   | e ->
+      output_html outputhtml
+       ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+;;
+
 let proveit rendering_window () =
  let module L = LogicalOperations in
  let module G = Gdome in
@@ -624,8 +733,8 @@ let proveit rendering_window () =
          match !current_cic_infos with
             Some (ids_to_terms, ids_to_father_ids) ->
              let id = xpath in
-              if L.to_sequent id ids_to_terms ids_to_father_ids then
-               refresh_proof rendering_window#output ;
+              L.to_sequent id ids_to_terms ids_to_father_ids ;
+              refresh_proof rendering_window#output ;
               refresh_sequent rendering_window#proofw
           | None -> assert false (* "ERROR: No current term!!!" *)
         with
@@ -644,6 +753,98 @@ let proveit rendering_window () =
   | None -> assert false (* "ERROR: No selection!!!" *)
 ;;
 
+let focus rendering_window () =
+ let module L = LogicalOperations in
+ let module G = Gdome in
+ let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+  match rendering_window#output#get_selection with
+    Some node ->
+     let xpath =
+      ((node : Gdome.element)#getAttributeNS
+      (*CSC: OCAML DIVERGE
+      ((element : G.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_cic_infos with
+            Some (ids_to_terms, ids_to_father_ids) ->
+             let id = xpath in
+              L.focus id ids_to_terms ids_to_father_ids ;
+              refresh_sequent rendering_window#proofw
+          | 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>")
+         | RefreshProofException e ->
+            output_html outputhtml
+             ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+              "proof: " ^ Printexc.to_string e ^ "</h1>")
+         | e ->
+            output_html outputhtml
+             ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
+       end
+  | None -> assert false (* "ERROR: No selection!!!" *)
+;;
+
+exception NoPrevGoal;;
+exception NoNextGoal;;
+
+let prevgoal metasenv metano =
+ let rec aux =
+  function
+     [] -> assert false
+   | [(m,_,_)] -> raise NoPrevGoal
+   | (n,_,_)::(m,_,_)::_ when m=metano -> n
+   | _::tl -> aux tl
+ in
+  aux metasenv
+;;
+
+let nextgoal metasenv metano =
+ let rec aux =
+  function
+     [] -> assert false
+   | [(m,_,_)] when m = metano -> raise NoNextGoal
+   | (m,_,_)::(n,_,_)::_ when m=metano -> n
+   | _::tl -> aux tl
+ in
+  aux metasenv
+;;
+
+let prev_or_next_goal select_goal rendering_window () =
+ let module L = LogicalOperations in
+ let module G = Gdome in
+ let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+  let metasenv =
+   match !ProofEngine.proof with
+      None -> assert false
+    | Some (_,metasenv,_,_) -> metasenv
+  in
+  let metano =
+   match !ProofEngine.goal with
+      None -> assert false
+    | Some m -> m
+  in
+   try
+    ProofEngine.goal := Some (select_goal metasenv metano) ;
+    refresh_sequent rendering_window#proofw
+   with
+      RefreshSequentException e ->
+       output_html outputhtml
+        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
+         "sequent: " ^ Printexc.to_string e ^ "</h1>")
+    | e ->
+       output_html outputhtml
+        ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
+;;
+
 exception NotADefinition;;
 
 let open_ rendering_window () =
@@ -705,8 +906,8 @@ let state rendering_window () =
           let _  = CicTypeChecker.type_of_aux' [] [] expr in
            ProofEngine.proof :=
             Some (UriManager.uri_of_string "cic:/dummy.con",
-                   [1,expr], Cic.Meta 1, expr) ;
-           ProofEngine.goal := Some (1,([],expr)) ;
+                   [1,[],expr], Cic.Meta (1,[]), expr) ;
+           ProofEngine.goal := Some 1 ;
            refresh_sequent proofw ;
            refresh_proof output ;
      done
@@ -739,18 +940,22 @@ let check rendering_window scratch_window () =
       None -> UriManager.uri_of_string "cic:/dummy.con", []
     | Some (curi,metasenv,_,_) -> curi,metasenv
   in
-  let ciccontext,names_context =
+  let context,names_context =
    let context =
     match !ProofEngine.goal with
        None -> []
-     | Some (_,(ctx,_)) -> ctx
+     | Some metano ->
+        let (_,canonical_context,_) =
+         List.find (function (m,_,_) -> m=metano) metasenv
+        in
+         canonical_context
    in
-    ProofEngine.cic_context_of_named_context context,
-     List.map
-      (function
-          ProofEngine.Declaration (n,_)
-        | ProofEngine.Definition (n,_) -> n
-      ) context
+    context,
+    List.map
+     (function
+         Some (n,_) -> Some n
+       | None -> None
+     ) context
   in
    (* Do something interesting *)
    let lexbuf = Lexing.from_string input in
@@ -764,8 +969,8 @@ let check rendering_window scratch_window () =
          None -> ()
        | Some expr ->
           try
-           let ty  = CicTypeChecker.type_of_aux' metasenv ciccontext expr in
-            let mml = mml_of_cic_term (Cic.Cast (expr,ty)) in
+           let ty  = CicTypeChecker.type_of_aux' metasenv context expr in
+            let mml = mml_of_cic_term 111 (Cic.Cast (expr,ty)) in
              scratch_window#show () ;
              scratch_window#mmlwidget#load_tree ~dom:mml
           with
@@ -780,6 +985,38 @@ let check rendering_window scratch_window () =
         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
 ;;
 
+let locate rendering_window () =
+ let inputt = (rendering_window#inputt : GEdit.text) in
+ let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+  let inputlen = inputt#length in
+  let input = inputt#get_chars 0 inputlen in
+   try   
+    output_html outputhtml (Mquery.locate input) ;
+    inputt#delete_text 0 inputlen 
+   with
+    e -> 
+     output_html outputhtml
+      ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
+;;
+
+let backward rendering_window () =
+   let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
+   let metasenv =
+    match !ProofEngine.proof with
+       None -> assert false
+     | Some (_,metasenv,_,_) -> metasenv
+   in
+   let result =
+      match !ProofEngine.goal with
+         | None -> ""
+         | Some metano ->
+            let (_,_,ty) =
+             List.find (function (m,_,_) -> m=metano) metasenv
+            in
+             Mquery.backward ty
+      in 
+   output_html outputhtml result
+      
 let choose_selection
      (mmlwidget : GMathView.math_view) (element : Gdome.element option)
 =
@@ -983,9 +1220,15 @@ class rendering_window output proofw (label : GMisc.label) =
  let button_export_to_postscript =
   GButton.button ~label:"export_to_postscript"
   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let qedb =
+  GButton.button ~label:"Qed"
+   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
  let saveb =
   GButton.button ~label:"Save"
    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let loadb =
+  GButton.button ~label:"Load"
+   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
  let closeb =
   GButton.button ~label:"Close"
    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
@@ -994,6 +1237,15 @@ class rendering_window output proofw (label : GMisc.label) =
  let proveitb =
   GButton.button ~label:"Prove It"
    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
+ let focusb =
+  GButton.button ~label:"Focus"
+   ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
+ let prevgoalb =
+  GButton.button ~label:"<"
+   ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
+ let nextgoalb =
+  GButton.button ~label:">"
+   ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
  let oldinputt = GEdit.text ~editable:false ~width:400 ~height:180
    ~packing:(vbox#pack ~padding:5) () in
  let hbox4 =
@@ -1007,6 +1259,12 @@ class rendering_window output proofw (label : GMisc.label) =
  let checkb =
   GButton.button ~label:"Check"
    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ let locateb =
+  GButton.button ~label:"Locate"
+   ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
+ let backwardb =
+  GButton.button ~label:"Backward"
+   ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
  let inputt = GEdit.text ~editable:true ~width:400 ~height: 100
    ~packing:(vbox#pack ~padding:5) () in
  let vbox1 =
@@ -1026,8 +1284,8 @@ class rendering_window output proofw (label : GMisc.label) =
  let applyb =
   GButton.button ~label:"Apply"
    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
- let elimintrosb =
-  GButton.button ~label:"ElimIntros"
+ let elimintrossimplb =
+  GButton.button ~label:"ElimIntrosSimpl"
    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
  let whdb =
   GButton.button ~label:"Whd"
@@ -1076,15 +1334,22 @@ object(self)
    button_export_to_postscript (choose_selection output) in
   ignore(settingsb#connect#clicked settings_window#show) ;
   ignore(button_export_to_postscript#connect#clicked (export_to_postscript output)) ;
+  ignore(qedb#connect#clicked (qed self)) ;
   ignore(saveb#connect#clicked (save self)) ;
+  ignore(loadb#connect#clicked (load self)) ;
   ignore(proveitb#connect#clicked (proveit self)) ;
+  ignore(focusb#connect#clicked (focus self)) ;
+  ignore(prevgoalb#connect#clicked (prev_or_next_goal prevgoal self)) ;
+  ignore(nextgoalb#connect#clicked (prev_or_next_goal nextgoal self)) ;
   ignore(window#event#connect#delete (fun _ -> GMain.Main.quit () ; true )) ;
   ignore(stateb#connect#clicked (state self)) ;
   ignore(openb#connect#clicked (open_ self)) ;
   ignore(checkb#connect#clicked (check self scratch_window)) ;
+  ignore(locateb#connect#clicked (locate self)) ;
+  ignore(backwardb#connect#clicked (backward self)) ;
   ignore(exactb#connect#clicked (exact self)) ;
   ignore(applyb#connect#clicked (apply self)) ;
-  ignore(elimintrosb#connect#clicked (elimintros self)) ;
+  ignore(elimintrossimplb#connect#clicked (elimintrossimpl self)) ;
   ignore(whdb#connect#clicked (whd self)) ;
   ignore(reduceb#connect#clicked (reduce self)) ;
   ignore(simplb#connect#clicked (simpl self)) ;
@@ -1113,6 +1378,8 @@ let initialize_everything () =
 
 let _ =
  CicCooking.init () ;
+ Mquery.init () ;
  ignore (GtkMain.Main.init ()) ;
- initialize_everything ()
+ initialize_everything () ;
+ Mquery.close ()
 ;;