X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FvariousTactics.ml;h=daf461c5ba78ade83739de5cb180c79fccf9cc85;hb=e76b78d1d80796de1b8f6a469741cbd26cd4d822;hp=f8c9cfa94dd409b67f65cbbfe332681473978eef;hpb=6150b8ef905aaea17b47ff466c067054f976cd8f;p=helm.git diff --git a/helm/ocaml/tactics/variousTactics.ml b/helm/ocaml/tactics/variousTactics.ml index f8c9cfa94..daf461c5b 100644 --- a/helm/ocaml/tactics/variousTactics.ml +++ b/helm/ocaml/tactics/variousTactics.ml @@ -85,6 +85,7 @@ exception MaxDepth;; let depth = 3;; +(* let rec auto_tac_aux mqi_handle level proof goal = prerr_endline ("Entro in Auto_rec; level = " ^ (string_of_int level)); if level = 0 then @@ -105,18 +106,7 @@ else Some (ey, ty) -> prerr_endline ("CURRENT GOAL = " ^ (CicPp.ppterm ty)); prerr_endline ("CURRENT HYP = " ^ (fst (print_context ey))); - (* - let time1 = Unix.gettimeofday() in - let _, all_paths = NewConstraints.prefixes 5 ty in - let time2 = Unix.gettimeofday() in - prerr_endline - (Printf.sprintf "TEMPO DI CALCOLO = %1.3f" (time2 -. time1) ); - prerr_endline - ("ALL PATHS: n = " ^ string_of_int - (List.length all_paths)); - prerr_endline (NewConstraints.pp_prefixes all_paths); - *) - (* if the goal does not have a sort Prop we return the + (* if the goal does not have a sort Prop we return the current proof and a list containing the goal *) let ty_sort = CicTypeChecker.type_of_aux' metasenv ey ty in if CicReduction.are_convertible @@ -168,6 +158,69 @@ prerr_endline "AUTO_TAC HA FINITO"; | NotApplicableTheorem -> prerr_endline("No applicable theorem"); raise (ProofEngineTypes.Fail "No Applicable theorem");; +*) + +(**** ESPERIMENTO ************************) + +let new_search_theorems f proof goal depth gtl = + let local_choices = f (proof,goal) + in + List.map + (function (proof, goallist) -> + (proof, (List.map (function g -> (g,depth)) goallist)@gtl)) + local_choices +;; + +exception NoOtherChoices;; + +let rec auto_new mqi_handle = function + [] -> raise NoOtherChoices + | (proof, [])::tl -> (proof, [])::tl + | (proof, (goal,0)::gtl)::tl -> auto_new mqi_handle tl + | (proof, (goal,depth)::gtl)::tl -> + let _,metasenv,_,_ = 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) -> + prerr_endline ("CURRENT GOAL = " ^ (CicPp.ppterm ty)); + prerr_endline ("CURRENT HYP = " ^ (fst (print_context ey))); + let local_choices = + new_search_theorems + search_theorems_in_context proof goal (depth-1) gtl in + let global_choices = + new_search_theorems + (TacticChaser.searchTheorems mqi_handle) + proof goal (depth-1) gtl in + let all_choices = + local_choices@global_choices@tl in + let sorting_list (_,g1) (_,g2) = + let l1 = List.length g1 in + let l2 = List.length g2 in + if (l1 = l2 && not(l1 = 0)) then + (snd(List.nth g2 0)) - (snd(List.nth g1 0)) + else l1 - l2 in + let reorder = + List.stable_sort sorting_list all_choices + in + auto_new mqi_handle reorder + | None -> auto_new mqi_handle ((proof,gtl)::tl) +;; + + +let auto_tac mqi_handle (proof,goal) = + prerr_endline "Entro in Auto"; + try + let (proof,_)::_ = auto_new mqi_handle [(proof, [(goal,depth)])] in +prerr_endline "AUTO_TAC HA FINITO"; + (proof,[]) + with + | NoOtherChoices -> + prerr_endline("Auto failed"); + raise (ProofEngineTypes.Fail "No Applicable theorem");; (* TODO se ce n'e' piu' di una, prende la prima che trova... sarebbe meglio chiedere: find dovrebbe restituire una lista di hyp (?) da passare all'utonto con una