]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_paramodulation/paramod.ml
Fixed nasty bug in maxvar updating
[helm.git] / helm / software / components / ng_paramodulation / paramod.ml
index 36adca45413def9a1fa5214571a84c92edcbfbca..d0129279065f1ec620d4aa9d824a6fa978f301b0 100644 (file)
@@ -1,16 +1,19 @@
-let debug s = ()
-(*  prerr_endline s *)
+(* LOOPING : COL057-1.ma *)
+
+let debug s =
+  () (* prerr_endline s *)
 ;;
 
 let nparamod rdb metasenv subst context t table =
-  let nb_iter = ref 100 in
-  prerr_endline "========================================";
+  let max_nb_iter = 999999999 in
+  let amount_of_time = 300.0 in
   let module C = struct
     let metasenv = metasenv
     let subst = subst
     let context = context
   end
   in
+  let nb_iter = ref 0 in
   let module B = NCicBlob.NCicBlob(C) in
   let module Pp = Pp.Pp (B) in
   let module FU = FoUnif.Founif(B) in
@@ -30,6 +33,7 @@ let nparamod rdb metasenv subst context t table =
   let add_passive_clause passives cl =
     PassiveSet.add (Utils.mk_passive_clause cl) passives
   in
+  let timeout = Unix.gettimeofday () +. amount_of_time in 
     (* TODO : fairness condition *)
   let select passives =
     if PassiveSet.is_empty passives then None
@@ -38,20 +42,18 @@ let nparamod rdb metasenv subst context t table =
   in
   let rec given_clause bag maxvar actives      
       passives g_actives g_passives =
-    
-    decr nb_iter; if !nb_iter = 0 then raise (Failure "Timeout !");
+    (* prerr_endline "Bag :"; prerr_endline (Pp.pp_bag bag);
+      prerr_endline "Active table :"; 
+       (List.iter (fun x -> prerr_endline (Pp.pp_unit_clause x))
+         (fst actives)); *)
+    incr nb_iter; if !nb_iter = max_nb_iter then       
+      raise (Failure "No iterations left !");
+    if Unix.gettimeofday () > timeout then
+      raise (Failure "Timeout !");
+
 
-    (* keep goals demodulated w.r.t. actives and check if solved *)
-    (* we may move this at the end of infer_right *) 
-    let bag, g_actives = 
-      List.fold_left 
-        (fun (bag,acc) c -> 
-           let bag, c = Sup.simplify_goal maxvar (snd actives) bag c in
-             bag, c::acc) 
-        (bag,[]) g_actives 
-    in
       
-      (* superposition left, simplifications on goals *)
+    (* superposition left, simplifications on goals *)
       debug "infer_left step...";
       let bag, maxvar, g_actives, g_passives =
        match select g_passives with
@@ -61,19 +63,21 @@ let nparamod rdb metasenv subst context t table =
           let bag, g_current = 
             Sup.simplify_goal maxvar (snd actives) bag g_current
           in
+           debug "Simplified goal";
           let bag, maxvar, new_goals = 
             Sup.infer_left bag maxvar g_current actives 
           in
+           debug "Performed infer_left step";
          let new_goals = List.fold_left add_passive_clause
            PassiveSet.empty new_goals
          in
           bag, maxvar, g_current::g_actives,
          (PassiveSet.union new_goals g_passives)
     in
-      prerr_endline
+      debug
        (Printf.sprintf "Number of active goals : %d"
           (List.length g_actives));
-      prerr_endline
+      debug
        (Printf.sprintf "Number of passive goals : %d"
           (PassiveSet.cardinal g_passives));
   
@@ -94,22 +98,32 @@ let nparamod rdb metasenv subst context t table =
          | None -> assert false
          | Some (current, passives) -> 
              debug ("Selected fact : " ^ Pp.pp_unit_clause current);
-              match Sup.keep_simplified current actives bag with
+                match Sup.keep_simplified current actives bag maxvar with
+(*  match Sup.one_pass_simplification current actives bag maxvar with*)
                | None -> aux_simplify passives
-               | Some x -> x
+               | Some x -> x,passives
       in
-      let (current, bag, actives) = aux_simplify passives
+      let (current, bag, actives),passives = aux_simplify passives
       in                   
        debug ("Fact after simplification :"
               ^ Pp.pp_unit_clause current);
        let bag, maxvar, actives, new_clauses = 
           Sup.infer_right bag maxvar current actives 
        in
+  debug "Demodulating goals with actives...";
+         (* keep goals demodulated w.r.t. actives and check if solved *)
+       let bag, g_actives = 
+         List.fold_left 
+            (fun (bag,acc) c -> 
+               let bag, c = Sup.simplify_goal maxvar (snd actives) bag c in
+                bag, c::acc) 
+            (bag,[]) g_actives 
+       in
        let ctable = IDX.index_unit_clause IDX.DT.empty current in
        let bag, maxvar, new_goals = 
          List.fold_left 
            (fun (bag,m,acc) g -> 
-              let bag, m, ng = Sup.infer_left bag maxvar g
+              let bag, m, ng = Sup.infer_left bag m g
                 ([current],ctable) in
                 bag,m,ng@acc) 
            (bag,maxvar,[]) g_actives 
@@ -122,9 +136,9 @@ let nparamod rdb metasenv subst context t table =
       PassiveSet.union new_clauses passives,
       PassiveSet.union new_goals g_passives
     in
-      prerr_endline
+      debug
        (Printf.sprintf "Number of actives : %d" (List.length (fst actives)));
-      prerr_endline
+      debug
        (Printf.sprintf "Number of passives : %d"
           (PassiveSet.cardinal passives));
       given_clause bag maxvar actives passives g_actives g_passives
@@ -151,34 +165,48 @@ let nparamod rdb metasenv subst context t table =
   with 
   | Sup.Success (bag, _, (i,_,_,_)) ->
       let l =
-        let module S  = 
-          HTopoSort.Make(struct type t=int let compare=Pervasives.compare end)
-        in
-        let module C : Set.S with type elt = int = 
-          Set.Make(struct type t=int let compare=Pervasives.compare end)
+       let rec traverse ongoal (accg,acce) i =
+         match Terms.M.find i bag with
+           | (id,_,_,Terms.Exact _) ->
+               if ongoal then [i],acce else
+                 if (List.mem i acce) then accg,acce else accg,acce@[i]
+           | (_,_,_,Terms.Step (_,i1,i2,_,_,_)) ->
+               if (not ongoal) && (List.mem i acce) then accg,acce
+               else
+                  let accg,acce = 
+                   traverse false (traverse ongoal (accg,acce) i1) i2
+                 in
+                   if ongoal then i::accg,acce else accg,i::acce
         in
-        let all id = 
-          let rec traverse acc i =
-            match Terms.M.find i bag with
-            | (_,_,_,Terms.Exact _) -> acc
-            | (_,_,_,Terms.Step (_,i1,i2,_,_,_)) -> 
-               traverse (traverse (C.add i1 (C.add i2 acc)) i1) i2    
-          in
-           C.elements (traverse C.empty id)
+       let gsteps,esteps = traverse true ([],[]) i in
+         (List.rev esteps)@gsteps
+      in
+       prerr_endline (Printf.sprintf "Found proof in %d iterations, %fs"
+                        !nb_iter
+                        (Unix.gettimeofday() -. timeout +. amount_of_time));
+      (* prerr_endline "Proof:"; 
+      List.iter (fun x -> prerr_endline (string_of_int x);
+              prerr_endline (Pp.pp_unit_clause (Terms.M.find x bag))) l;*)
+      let proofterm = B.mk_proof bag i l in
+       prerr_endline (Printf.sprintf "Got proof term, %fs"
+                        (Unix.gettimeofday() -. timeout +. amount_of_time));
+      let metasenv, proofterm = 
+        let rec aux k metasenv = function
+          | NCic.Meta _ as t -> metasenv, t
+          | NCic.Implicit _ -> 
+              let metasenv,i,_,_=NCicMetaSubst.mk_meta metasenv context `Term in
+              metasenv, NCic.Meta (i,(k,NCic.Irl (List.length context)))
+          | t -> NCicUntrusted.map_term_fold_a 
+                  (fun _ k -> k+1) k aux metasenv t                 
         in
-        S.topological_sort (all i) all
+         aux 0 metasenv proofterm
       in
-      prerr_endline "YES!";
-      prerr_endline "Proof:"; 
-      List.iter (fun x -> 
-              prerr_endline (Pp.pp_unit_clause (Terms.M.find x bag))) l;
-      let proofterm = B.mk_proof bag l in
-      prerr_endline
-       (NCicPp.ppterm ~metasenv:C.metasenv ~subst:C.subst ~context:C.context
-         proofterm); 
-      let _metasenv, _subst, _proofterm, _prooftype = 
-        NCicRefiner.typeof rdb C.metasenv C.subst C.context proofterm None
+      let metasenv, subst, proofterm, _prooftype = 
+        NCicRefiner.typeof 
+          (rdb#set_coerc_db NCicCoercion.empty_db) 
+          metasenv subst context proofterm None
       in
-      ()
-  | Failure _ -> prerr_endline "FAILURE";
+      proofterm, metasenv, subst
+  | Failure _ -> prerr_endline
+      (Printf.sprintf "FAILURE in %d iterations" !nb_iter); assert false
 ;;