]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gTopLevel/topLevel/topLevel.ml
some small improvements: command line sintax changed, -MB added
[helm.git] / helm / gTopLevel / topLevel / topLevel.ml
index 21663939990419ee98e69990c5f63849a678c1af..32ae4d1cb8c015ce481c737aedfc30a52c475ef0 100644 (file)
@@ -3,14 +3,30 @@ let get_terms () =
    let lexbuf = Lexing.from_channel stdin in
    try
       while true do
-         match CicTextualParser.main CicTextualLexer.token lexbuf with
-            | None -> ()
-            | Some expr -> terms := expr :: ! terms
+         match CicTextualParserContext.main  
+           (UriManager.uri_of_string "cic:/dummy") [] []
+           CicTextualLexer.token lexbuf
+           with
+            | None           -> ()
+            | Some (_, expr) -> terms := expr :: ! terms
       done;
       ! terms
    with
       CicTextualParser0.Eof -> ! terms
 
+let pp_type_of uri = 
+   let u = UriManager.uri_of_string uri in  
+   let s = match (CicEnvironment.get_obj u) with
+      | Cic.Definition (_, _, ty, _) -> CicPp.ppterm ty
+      | Cic.Axiom (_, ty, _)         -> CicPp.ppterm ty
+      | Cic.Variable (_, _, ty)      -> CicPp.ppterm ty
+      | _                            -> "Current proof or inductive definition."      
+(*
+      | Cic.CurrentProof (_,conjs,te,ty) ->
+      | C.InductiveDefinition _ ->
+*)
+   in print_endline s; flush stdout
+
 let locate name = 
    print_endline (MQueryGenerator.locate name);
    flush stdout
@@ -22,44 +38,64 @@ let rec display = function
       print_endline ("? " ^ CicPp.ppterm term ^ "<p>");
       flush stdout
 
-let rec levels level = function
+let rec levels = function
    | []           -> ()
    | term :: tail -> 
-      levels level tail;
+      levels tail;
       print_endline ("? " ^ CicPp.ppterm term ^ "<p>");
-      print_endline (MQueryGenerator.levels [] [] term level);
+      print_endline (MQueryGenerator.levels [] [] term);
       flush stdout
 
-let rec backward level = function
-   | []           -> ()
-   | term :: tail -> 
-      backward level tail;
-      print_endline ("? " ^ CicPp.ppterm term ^ "<p>");
-      print_endline (MQueryGenerator.backward [] [] term level);
-      flush stdout
-      
+let mbackward n m l =
+   let queries = ref [] in
+   let issue query = 
+      if List.mem query ! queries then false
+      else begin queries := query :: ! queries; true end
+   in
+   let rec backward level = function
+      | []           -> ()
+      | term :: tail -> 
+         backward level tail;
+         print_endline ("? " ^ CicPp.ppterm term ^ "<p>");
+         print_endline (MQueryGenerator.backward [] [] term level);
+         flush stdout
+   in
+   MQueryGenerator.call_back issue;
+   for level = max m n downto min m n do
+      prerr_endline ("toplevel: backward: trying level " ^
+                     string_of_int level);
+      backward level l
+   done;
+   prerr_endline ("toplevel: backward: " ^ 
+                  string_of_int (List.length ! queries) ^
+                  " queries issued");
+   MQueryGenerator.call_back (fun _ -> true)
+   
 let parse_args () =
    let rec parse = function
       | [] -> ()
-      | ("-l"|"-locate") :: arg :: rem -> 
-         locate arg; parse rem
-      | ("-d"|"-display") :: rem -> 
-         display (get_terms ())
-      | ("-t"|"-test") :: arg :: rem -> 
-        levels (int_of_string arg) (get_terms ())
-      | ("-b"|"-backward") :: arg :: rem -> 
-         backward (int_of_string arg) (get_terms ())
+      | ("-d"|"-display") :: rem -> display (get_terms ())
+      | ("-t"|"-typeof") :: arg :: rem -> pp_type_of arg; parse rem
+      | ("-l"|"-levels") :: rem -> levels (get_terms ())
+      | ("-L"|"-locate") :: arg :: rem -> locate arg; parse rem
+      | ("-B"|"-backward") :: arg :: rem ->
+         let m = (int_of_string arg) in
+         mbackward m m (get_terms ())
+      | ("-MB"|"-mbackward") :: arg :: rem ->
+         let m = (int_of_string arg) in
+         mbackward m 0 (get_terms ())
       | _ :: rem -> parse rem
    in  
       parse (List.tl (Array.to_list Sys.argv))
 
 let _ =
-   CicCooking.init () ;
+   CicCooking.init () ; 
    Logger.log_callback :=
       (Logger.log_to_html
       ~print_and_flush:(function s -> print_string s ; flush stdout)) ;
    MQueryGenerator.init ();
    parse_args ();
    MQueryGenerator.close ();
+   prerr_endline ("toplevel: done in " ^ string_of_float (Sys.time ()) ^
+                  " seconds");
    exit 0
-;;