X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Ftactics%2Fauto.ml;h=4cd6bf62ff477db6033aafcd9eeb9e82871fbbe8;hb=ac2c05500dd7c9df5ddf43d809fdd56722beef00;hp=ae2ecd21bee13519bcf64e0c9ce0f7c95dc762e9;hpb=5e029a748c53fde142de1b0ee08a0fd100c01f06;p=helm.git diff --git a/components/tactics/auto.ml b/components/tactics/auto.ml index ae2ecd21b..4cd6bf62f 100644 --- a/components/tactics/auto.ml +++ b/components/tactics/auto.ml @@ -831,9 +831,13 @@ let pause b = in_pause := b;; let cond = Condition.create ();; let mutex = Mutex.create ();; let hint = ref None;; +let prune_hint = ref [];; let step _ = Condition.signal cond;; let give_hint n = hint := Some n;; +let give_prune_hint hint = + prune_hint := hint :: !prune_hint +;; let check_pause _ = if !in_pause then @@ -1217,34 +1221,58 @@ let prunable ty todo = let prunable menv subst ty todo = let rec aux = function | (S(_,k,_,_))::tl -> - (match Equality.meta_convertibility_subst k ty menv with + (match Equality.meta_convertibility_subst k ty menv with | None -> aux tl - | Some variant -> no_progress variant tl (* || aux tl)*) ) + | Some variant -> + no_progress variant tl (* || aux tl*)) | (D (_,_,T))::tl -> aux tl | _ -> false and no_progress variant = function | [] -> prerr_endline "++++++++++++++++++++++++ no_progress"; true | D ((n,_,P) as g)::tl -> (match calculate_goal_ty g subst menv with - | None -> no_progress subst tl + | None -> no_progress variant tl | Some (_, gty) -> (match calculate_goal_ty g variant menv with | None -> assert false - | Some (_, gty') -> + | Some (_, gty') -> if gty = gty' then - no_progress variant tl + no_progress variant tl else false)) - | _::tl -> no_progress subst tl + | _::tl -> no_progress variant tl in aux todo ;; - +let condition_for_prune_hint prune (m, s, size, don, todo, fl) = + let s = + HExtlib.filter_map (function S (_,_,(c,_),_) -> Some c | _ -> None) todo + in + List.for_all (fun i -> List.for_all (fun j -> i<>j) prune) s +;; +let filter_prune_hint l = + let prune = !prune_hint in + prune_hint := []; (* possible race... *) + if prune = [] then l + else List.filter (condition_for_prune_hint prune) l +;; let auto_main tables maxm context flags universe cache elems = auto_context := context; let rec aux tables maxm flags cache (elems : status) = (* pp_status context elems; *) +(* DEBUGGING CODE: uncomment these two lines to stop execution at each iteration + auto_status := elems; + check_pause (); +*) + let elems = filter_prune_hint elems in match elems with + | (m, s, size, don, todo, fl)::orlist when !hint <> None -> + (match !hint with + | Some i when condition_for_hint i todo -> + aux tables maxm flags cache orlist + | _ -> + hint := None; + aux tables maxm flags cache elems) | [] -> (* complete failure *) Gaveup (tables, cache, maxm) @@ -1318,11 +1346,7 @@ let auto_main tables maxm context flags universe cache elems = aux tables maxm flags cache ((m, s, size, don,todo, fl)::orlist) | Notfound | Failed_in _ when depth > 0 -> - (match !hint with - | Some i when condition_for_hint i todo -> - aux tables maxm flags cache orlist - | _ -> hint := None; - (* more depth or is the first time we see the goal *) + ( (* more depth or is the first time we see the goal *) if prunable m s gty todo then (debug_print (lazy( "FAIL: LOOP: one father is equal")); @@ -1747,3 +1771,4 @@ let demodulate_tac ~dbd ~universe = let pp_proofterm = Equality.pp_proofterm;; let revision = "$Revision$";; +let size_and_depth context metasenv t = 100, 100