]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/binaries/matitaprover/matitaprover.ml
...
[helm.git] / helm / software / components / binaries / matitaprover / matitaprover.ml
index 5a438c7b6fa700d9a139669b32765db58530bb60..2e69e08d73f54398f54fbf4e56c5fac294187426 100644 (file)
@@ -1,45 +1,99 @@
+(*
+    ||M||  This file is part of HELM, an Hypertextual, Electronic        
+    ||A||  Library of Mathematics, developed at the Computer Science     
+    ||T||  Department, University of Bologna, Italy.                     
+    ||I||                                                                
+    ||T||  HELM is free software; you can redistribute it and/or         
+    ||A||  modify it under the terms of the GNU General Public License   
+    \   /  version 2 or (at your option) any later version.      
+     \ /   This software is distributed as is, NO WARRANTY.     
+      V_______________________________________________________________ *)
+
+(* $Id: orderings.ml 9869 2009-06-11 22:52:38Z denes $ *)
+
+module OT = struct type t = string  let compare = Pervasives.compare end 
+module HC = Map.Make(OT)
+
+type leaf = int * string
+
+let cache = ref HC.empty 
+let num = ref 100
+
+let hash s = 
+  try HC.find s !cache
+  with Not_found ->
+          cache := HC.add s (!num,s) !cache;
+          decr num;
+          HC.find s !cache
+;;
+
+hash "==";;
+hash "_";;
+
+let problem_file = ref "no-file-given";;
+let tptppath = ref "/";;
+let seconds = ref 300;;
+
+let fail_msg () =
+      print_endline ("% SZS status Timeout for " ^ 
+        Filename.basename !problem_file)
+;;
+
 let main () =
-  let problem_file = ref "no-file-given" in
-  let tptppath = ref "./" in
+  let _ =
+    Sys.signal 24 (Sys.Signal_handle (fun _ -> fail_msg (); exit 1)) in
+  let _ =
+    Sys.signal Sys.sigalrm 
+      (Sys.Signal_handle (fun _ -> fail_msg (); exit 1)) in
   Arg.parse [
-   "--tptppath", Arg.String (fun p -> tptppath := p), "[path]  TPTP lib root"
-   ] (fun x -> problem_file := x) "matitaprover [problemfile]";
+   "--tptppath", Arg.String (fun p -> tptppath := p), 
+     ("[path]  TPTP lib root, default " ^ !tptppath);
+   "--timeout", Arg.Int (fun p -> seconds := p), 
+     ("[seconds]  timeout, default " ^ string_of_int !seconds);
+   ] (fun x -> problem_file := x) "
+Matitaprover is the first order automatic prover that equips the 
+Matita interactive theorem prover (http://matita.cs.unibo.it).
+
+Developed by A.Asperti, M.Denes and E.Tassi, released under GPL-2.1
+
+If --tptppath is given, instead of the problem file you can just give the 
+problem name with the .p suffix (e.g. BOO001-1.p)
+
+If --tptppath is not given, included files (i.e. axiom sets) are searched 
+in the current directory only.
+
+usage: matitaprover [options] problemfile";
   let hypotheses, goals = Tptp_cnf.parse ~tptppath:!tptppath !problem_file in
   let goal = match goals with [x] -> x | _ -> assert false in
-  let module B : Terms.Blob with type t = Ast.term = struct
-        type t = Ast.term
-        let eq a b = a = b
-        let compare = Pervasives.compare
-        let eqP = Ast.Constant "=="
-        let pp = function
-          | Ast.Constant x -> x
-          | Ast.Variable _ -> assert false
-          | Ast.Function _ -> assert false
-        ;;
-        let embed x = 
-          let rec aux m = function
+  let module B : Terms.Blob 
+  with type t = leaf and type input = Ast.term = struct
+        type t = leaf
+        let eq a b = a == b
+        let compare (a,_) (b,_) = Pervasives.compare a b
+        let eqP = hash "=="
+        let pp (_,a) =  a 
+        type input = Ast.term
+        let rec embed m = function
             | Ast.Variable name ->
                 (try m, List.assoc name m
                  with Not_found -> 
-                    let t = Terms.Var (List.length m) in
+                    let t = Terms.Var ~-(List.length m) in
                     (name,t)::m, t)
-            | Ast.Constant _ as t -> m, Terms.Leaf t
+            | Ast.Constant name -> m, Terms.Leaf (hash name)
             | Ast.Function (name,args) -> 
                 let m, args = 
                   HExtlib.list_mapi_acc 
-                    (fun x _ m -> aux m x) m args
+                    (fun x _ m -> embed m x) m args
                 in
-                m, Terms.Node (Terms.Leaf (Ast.Constant name):: args) 
-          in
-            aux [] x
+                m, Terms.Node (Terms.Leaf (hash name):: args) 
         ;;
         let saturate bo ty = 
-          let vars, ty = embed ty in
-          let _, bo = embed bo in
+          let vars, ty = embed [] ty in
+          let _, bo = embed vars bo in
           let bo = Terms.Node (bo :: List.map snd (List.rev vars)) in
           bo, ty
         ;;
-        let embed t = snd(embed t);;
+        let embed t = snd(embed [] t);;
 
   end
   in
@@ -50,12 +104,27 @@ let main () =
   let bag, passives = 
     HExtlib.list_mapi_acc (fun x _ b -> P.mk_passive b x) bag hypotheses 
   in
+  prerr_endline "Order";
+  HC.iter 
+    (fun _ (w,x) -> prerr_endline (" " ^ x ^ " is " ^ string_of_int w)) !cache;
   prerr_endline "Facts";
-  prerr_endline (String.concat "\n" (List.map Pp.pp_unit_clause passives));
+  List.iter (fun x -> prerr_endline (" " ^ Pp.pp_unit_clause x)) passives;
   prerr_endline "Goal";
-  prerr_endline (Pp.pp_unit_clause g_passives);
-  ignore(P.paramod bag ~g_passives:[g_passives] ~passives);
-  ()
+  prerr_endline (" " ^ Pp.pp_unit_clause g_passives);
+  (* let _ = Unix.alarm !seconds in *)
+  match P.paramod ~timeout:(Unix.gettimeofday () +. float_of_int !seconds) ~max_steps:max_int bag ~g_passives:[g_passives] ~passives with
+  | [] -> fail_msg ()
+  | (bag,_,l)::_ ->
+      print_endline ("% SZS status Unsatisfiable for " ^ 
+        Filename.basename !problem_file);
+      print_endline ("% SZS output start CNFRefutation for " ^ 
+        Filename.basename !problem_file);
+      flush stdout;
+      List.iter (fun x ->
+        print_endline (Pp.pp_unit_clause ~margin:max_int 
+          (fst(Terms.M.find x bag)))) l;
+      print_endline ("% SZS output end CNFRefutation for " ^ 
+        Filename.basename !problem_file);
 ;;
 
 main ()