]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/tactics/autoTactic.ml
ready for 0.1.1 release
[helm.git] / helm / ocaml / tactics / autoTactic.ml
index ea29499a4b198ffaf95f326b4d578e1aa1e31202..85c5c54be30300beb690e0d20a7c946afe11925a 100644 (file)
@@ -23,7 +23,7 @@
  * http://cs.unibo.it/helm/.
  *)
 
- let debug_print = ignore (*prerr_endline *)
+ let debug_print = (* ignore *) prerr_endline
 
 (* let debug_print = fun _ -> () *)
 
@@ -32,137 +32,11 @@ let new_experimental_hint =
  fun ~dbd ~facts ?signature ~universe status ->
   profile (MetadataQuery.new_experimental_hint ~dbd ~facts ?signature ~universe) status
 
-let search_theorems_in_context status =
-  let (proof, goal) = status in
-  let module C = Cic in
-  let module R = CicReduction in
-  let module S = CicSubstitution in
-  let module PET = ProofEngineTypes in 
-  let module PT = PrimitiveTactics in 
-  let _,metasenv,_,_ = proof in
-  let _,context,ty = CicUtil.lookup_meta goal metasenv in
-  let rec find n = function 
-      [] -> []
-    | hd::tl ->
-       let res =
-         try 
-            Some (PET.apply_tactic
-                   (PT.apply_tac ~term:(C.Rel n)) status ) 
-         with 
-           PET.Fail _ -> None in
-       (match res with
-         Some res -> res::(find (n+1) tl)
-       | None -> find (n+1) tl)
-  in
-  try 
-    find 1 context
-  with Failure s -> 
-    []
-;;     
-
-let depth = 5;;
-let width = 3;;
-
-let new_search_theorems f proof goal depth gtl sign =
-  let choices = f (proof,goal)
-  in 
-  List.map 
-    (function (proof, goallist) ->
-       (proof,(List.map (function g -> (g,depth)) goallist)@gtl, sign))
-    choices 
-;;
-
-exception NoOtherChoices;;
-let rec auto dbd = function
-    [] -> []
-  | (proof, [], sign)::tl -> (proof, [], sign)::tl
-  | (proof, (goal,0)::_, _)::tl -> auto dbd tl
-  | (proof, (((goal,depth)::gtl) as allg), sign)::tl -> 
-      (* first we check if the metavariable has not been already
-         closed as a side effect by some other application *)
-      let facts = (depth = 1) in 
-      let name,metasenv,p,statement = proof in
-      let meta_inf = 
-       (try 
-          let (_, ey ,ty) = CicUtil.lookup_meta goal metasenv in
-            Some (ey, ty)
-        with _ -> None) in
-      match meta_inf with
-         Some (ey, ty) ->
-            (* the goal is still there *)
-            (*
-           debug_print ("CURRENT GOAL = " ^ CicPp.ppterm ty);
-           debug_print ("CURRENT PROOF = " ^ CicPp.ppterm p);
-           debug_print ("CURRENT HYP = " ^ CicPp.ppcontext ey);
-            *)
-            (* if the goal contains metavariables we use the input
-               signature for at_most constraints *)
-            let is_meta_closed = CicUtil.is_meta_closed ty in
-           let sign, new_sign =
-             if is_meta_closed then
-               None, Some (MetadataConstraints.signature_of ty)
-             else sign,sign in (* maybe the union ? *)
-           let local_choices =
-             new_search_theorems 
-               search_theorems_in_context 
-               proof goal (depth-1) [] new_sign in
-           let global_choices =
-             new_search_theorems 
-               (fun status -> 
-                  List.map snd 
-                  (MetadataQuery.hint 
-                     ~dbd ~facts:facts ?signature:sign status))
-               proof goal (depth-1) [] new_sign in
-            (* we proceed depth-first on the current goal. This is
-               a MAJOR optimization, since in case of success, and
-               if the goal is meta_closed, we may just drop the alternatives
-              tl1, avoiding useless backtracking. *)
-           let all_choices =
-             local_choices@global_choices in
-             (match (auto dbd all_choices) 
-              with
-                  [] -> auto dbd tl
-                | (proof,[],_)::tl1 -> 
-                    let all_choices =
-                      let gtl' = List.map fst gtl in
-                        if (gtl = [] || is_meta_closed) then 
-                          (proof,gtl,sign)::tl
-                        else
-                          let tl2 = 
-                            (List.map 
-                               (function (p,l,s) -> (p,l@gtl,s)) tl1)
-                          in                    
-                            (proof,gtl,sign)::tl2@tl in
-                      auto dbd all_choices
-                | _ -> assert false)
-       | None -> auto dbd ((proof,gtl,sign)::tl) 
-;; 
-
-
-let auto_tac ?num dbd =
-  let auto_tac dbh (proof,goal) =
-  debug_print "Entro in Auto";
-  match (auto dbd [(proof, [(goal,depth)],None)]) with
-      [] ->  debug_print("Auto failed");
-       raise (ProofEngineTypes.Fail "No Applicable theorem")
-    | (proof,[],_)::_ ->  
-       debug_print "AUTO_TAC HA FINITO";
-       (proof,[])
-    | _ -> assert false
-  in
-  ProofEngineTypes.mk_tactic (auto_tac dbd)
-;;
-
-
-(************************** EXPERIMENTAL VERSION ****************************)
-
 (* In this versions of auto_tac we maintain an hash table of all inspected
    goals. We assume that the context is invariant for application. 
    To this aim, it is essential to sall hint_verbose, that in turns calls
    apply_verbose. *)
 
-
-
 type exitus = 
     No of int 
   | Yes of Cic.term * int 
@@ -180,27 +54,32 @@ let search_theorems_in_context status =
   let _,metasenv,_,_ = proof in
   let _,context,ty = CicUtil.lookup_meta goal metasenv in
   let rec find n = function 
-      [] -> []
+    | [] -> []
     | hd::tl ->
-       let res =
-         try
-           let (subst,(proof, goal_list)) =
-              PT.apply_tac_verbose ~term:(C.Rel n) status  in
-            (* 
-           let goal_list =
-              List.stable_sort (compare_goal_list proof) goal_list in 
-            *)
-           Some (subst,(proof, goal_list))
-         with 
-           PET.Fail _ -> None in
-       (match res with
-         Some res -> res::(find (n+1) tl)
-       | None -> find (n+1) tl)
+        let res =
+          (* we should check that the hypothesys has not been cleared *)
+          if List.nth context (n-1) = None then
+            None
+          else
+            try
+              let (subst,(proof, goal_list)) =
+                PT.apply_tac_verbose ~term:(C.Rel n) status  
+              in
+              (* 
+                 let goal_list =
+                   List.stable_sort (compare_goal_list proof) goal_list in 
+              *)
+              Some (subst,(proof, goal_list))
+            with 
+             PET.Fail _ -> None 
+        in
+        (match res with
+        | Some res -> res::(find (n+1) tl)
+        | None -> find (n+1) tl)
   in
   try 
     find 1 context
-  with Failure s -> 
-    []
+  with Failure s -> []
 ;;     
 
 
@@ -243,7 +122,7 @@ let is_in_metasenv goal metasenv =
     let (_, ey ,ty) =
       CicUtil.lookup_meta goal metasenv in
       true
-  with _ -> false 
+  with CicUtil.Meta_not_found _ -> false 
 
 let rec auto_single dbd proof goal ey ty depth width sign already_seen_goals
  universe
@@ -349,21 +228,21 @@ let rec auto_single dbd proof goal ey ty depth width sign already_seen_goals
     end
       
 and auto_new dbd width already_seen_goals universe = function
-    [] -> []
+  | [] -> []
   | (subst,(proof, goals, sign))::tl ->
       let _,metasenv,_,_ = proof in
       let is_in_metasenv (goal, _) =
-       try
-         let (_, ey ,ty) =
-           CicUtil.lookup_meta goal metasenv in
-           true
-       with _ -> false in
+        try
+          let (_, ey ,ty) = CicUtil.lookup_meta goal metasenv in
+          true
+        with CicUtil.Meta_not_found _ -> false 
+      in
       let goals'= List.filter is_in_metasenv goals in
-       auto_new_aux dbd width already_seen_goals universe
-         ((subst,(proof, goals', sign))::tl)
+       auto_new_aux dbd 
+        width already_seen_goals universe ((subst,(proof, goals', sign))::tl)
 
 and auto_new_aux dbd width already_seen_goals universe = function
-  [] -> []
+  [] -> []
   | (subst,(proof, [], sign))::tl -> (subst,(proof, [], sign))::tl
   | (subst,(proof, (goal,0)::_, _))::tl -> 
       auto_new dbd width already_seen_goals universe tl
@@ -396,7 +275,8 @@ and auto_new_aux dbd width already_seen_goals universe = function
 let default_depth = 5
 let default_width = 3
 
-let auto_tac_new ?(depth=default_depth) ?(width=default_width) ~(dbd:Mysql.dbd)
+(*
+let auto_tac ?(depth=default_depth) ?(width=default_width) ~(dbd:Mysql.dbd)
   ()
 =
   let auto_tac dbd (proof,goal) =
@@ -404,17 +284,68 @@ let auto_tac_new ?(depth=default_depth) ?(width=default_width) ~(dbd:Mysql.dbd)
   Hashtbl.clear inspected_goals;
   debug_print "Entro in Auto";
   let id t = t in
+  let t1 = Unix.gettimeofday () in
   match auto_new dbd width [] universe [id,(proof, [(goal,depth)],None)] with
       [] ->  debug_print("Auto failed");
        raise (ProofEngineTypes.Fail "No Applicable theorem")
-    | (_,(proof,[],_))::_ ->  
+    | (_,(proof,[],_))::_ ->
+        let t2 = Unix.gettimeofday () in
        debug_print "AUTO_TAC HA FINITO";
        let _,_,p,_ = proof in
        debug_print (CicPp.ppterm p);
+        Printf.printf "tempo: %.9f\n" (t2 -. t1);
        (proof,[])
     | _ -> assert false
   in
   ProofEngineTypes.mk_tactic (auto_tac dbd)
 ;;
+*)
+
+let paramodulation_tactic = ref
+  (fun dbd status -> raise (ProofEngineTypes.Fail "Not Ready yet..."));;
+
+let term_is_equality = ref
+  (fun term -> debug_print "term_is_equality E` DUMMY!!!!"; false);;
 
 
+let auto_tac ?(depth=default_depth) ?(width=default_width) ?paramodulation ~(dbd:Mysql.dbd) () =
+  let auto_tac dbd (proof, goal) =
+    let normal_auto () = 
+      let universe = MetadataQuery.signature_of_goal ~dbd (proof, goal) in
+      Hashtbl.clear inspected_goals;
+      debug_print "Entro in Auto";
+      let id t = t in
+      let t1 = Unix.gettimeofday () in
+      match
+        auto_new dbd width [] universe [id, (proof, [(goal, depth)], None)]
+      with
+        [] ->  debug_print("Auto failed");
+         raise (ProofEngineTypes.Fail "No Applicable theorem")
+      | (_,(proof,[],_))::_ ->
+          let t2 = Unix.gettimeofday () in
+         debug_print "AUTO_TAC HA FINITO";
+         let _,_,p,_ = proof in
+         debug_print (CicPp.ppterm p);
+          debug_print (Printf.sprintf "tempo: %.9f\n" (t2 -. t1));
+         (proof,[])
+      | _ -> assert false
+    in
+    let paramodulation_ok =
+      match paramodulation with
+      | None -> false
+      | Some _ ->
+          let _, metasenv, _, _ = proof in
+          let _, _, meta_goal = CicUtil.lookup_meta goal metasenv in
+          !term_is_equality meta_goal
+    in
+    if paramodulation_ok then (
+      debug_print "USO PARAMODULATION...";
+(*       try *)
+        !paramodulation_tactic dbd (proof, goal)
+(*       with ProofEngineTypes.Fail _ -> *)
+(*         normal_auto () *)
+    ) else
+      normal_auto () 
+  in
+  ProofEngineTypes.mk_tactic (auto_tac dbd)
+;;