diff options
Diffstat (limited to 'plugins/cc/ccalgo.ml')
-rw-r--r-- | plugins/cc/ccalgo.ml | 390 |
1 files changed, 195 insertions, 195 deletions
diff --git a/plugins/cc/ccalgo.ml b/plugins/cc/ccalgo.ml index 418980c54..9cc6f9de9 100644 --- a/plugins/cc/ccalgo.ml +++ b/plugins/cc/ccalgo.ml @@ -22,45 +22,45 @@ open Proof_type let init_size=5 -let cc_verbose=ref false +let cc_verbose=ref false -let debug f x = +let debug f x = if !cc_verbose then f x let _= let gdopt= { optsync=true; optname="Congruence Verbose"; - optkey=["Congruence";"Verbose"]; - optread=(fun ()-> !cc_verbose); - optwrite=(fun b -> cc_verbose := b)} + optkey=["Congruence";"Verbose"]; + optread=(fun ()-> !cc_verbose); + optwrite=(fun b -> cc_verbose := b)} in declare_bool_option gdopt (* Signature table *) module ST=struct - + (* l: sign -> term r: term -> sign *) - + type t = {toterm:(int*int,int) Hashtbl.t; tosign:(int,int*int) Hashtbl.t} - + let empty ()= {toterm=Hashtbl.create init_size; tosign=Hashtbl.create init_size} - + let enter t sign st= - if Hashtbl.mem st.toterm sign then + if Hashtbl.mem st.toterm sign then anomaly "enter: signature already entered" - else + else Hashtbl.replace st.toterm sign t; Hashtbl.replace st.tosign t sign - + let query sign st=Hashtbl.find st.toterm sign let rev_query term st=Hashtbl.find st.tosign term - + let delete st t= try let sign=Hashtbl.find st.tosign t in Hashtbl.remove st.toterm sign; @@ -69,7 +69,7 @@ module ST=struct Not_found -> () let rec delete_set st s = Intset.iter (delete st) s - + end type pa_constructor= @@ -85,11 +85,11 @@ type pa_mark= Fmark of pa_fun | Cmark of pa_constructor -module PacMap=Map.Make(struct - type t=pa_constructor - let compare=Pervasives.compare end) +module PacMap=Map.Make(struct + type t=pa_constructor + let compare=Pervasives.compare end) -module PafMap=Map.Make(struct +module PafMap=Map.Make(struct type t=pa_fun let compare=Pervasives.compare end) @@ -107,11 +107,11 @@ type term= type ccpattern = PApp of term * ccpattern list (* arguments are reversed *) - | PVar of int + | PVar of int type rule= Congruence - | Axiom of constr * bool + | Axiom of constr * bool | Injection of int * pa_constructor * int * pa_constructor * int type from= @@ -127,7 +127,7 @@ type equality = rule eq type disequality = from eq type patt_kind = - Normal + Normal | Trivial of types | Creates_variables @@ -146,7 +146,7 @@ let swap eq : equality = | Injection (i,pi,j,pj,k) -> Injection (j,pj,i,pi,k) | Axiom (id,reversed) -> Axiom (id,not reversed) in {lhs=eq.rhs;rhs=eq.lhs;rule=swap_rule} - + type inductive_status = Unknown | Partial of pa_constructor @@ -163,15 +163,15 @@ type representative= mutable constructors: int PacMap.t} (*pac -> term = app(constr,t) *) type cl = Rep of representative| Eqto of int*equality - -type vertex = Leaf| Node of (int*int) -type node = +type vertex = Leaf| Node of (int*int) + +type node = {mutable clas:cl; - mutable cpath: int; + mutable cpath: int; vertex:vertex; term:term} - + type forest= {mutable max_size:int; mutable size:int; @@ -180,11 +180,11 @@ type forest= mutable epsilons: pa_constructor list; syms:(term,int) Hashtbl.t} -type state = +type state = {uf: forest; sigtable:ST.t; - mutable terms: Intset.t; - combine: equality Queue.t; + mutable terms: Intset.t; + combine: equality Queue.t; marks: (int * pa_mark) Queue.t; mutable diseq: disequality list; mutable quant: quant_eq list; @@ -222,17 +222,17 @@ let empty depth gls:state = changed=false; gls=gls} -let forest state = state.uf - +let forest state = state.uf + let compress_path uf i j = uf.map.(j).cpath<-i - -let rec find_aux uf visited i= - let j = uf.map.(i).cpath in + +let rec find_aux uf visited i= + let j = uf.map.(i).cpath in if j<0 then let _ = List.iter (compress_path uf i) visited in i else find_aux uf (i::visited) j - + let find uf i= find_aux uf [] i - + let get_representative uf i= match uf.map.(i).clas with Rep r -> r @@ -245,7 +245,7 @@ let get_constructor_info uf i= match uf.map.(i).term with Constructor cinfo->cinfo | _ -> anomaly "get_constructor: not a constructor" - + let size uf i= (get_representative uf i).weight @@ -264,36 +264,36 @@ let add_rfather uf i t= r.weight<-r.weight+1; r.fathers <-Intset.add t r.fathers -exception Discriminable of int * pa_constructor * int * pa_constructor +exception Discriminable of int * pa_constructor * int * pa_constructor let append_pac t p = - {p with arity=pred p.arity;args=t::p.args} + {p with arity=pred p.arity;args=t::p.args} let tail_pac p= {p with arity=succ p.arity;args=List.tl p.args} let fsucc paf = {paf with fnargs=succ paf.fnargs} - + let add_pac rep pac t = if not (PacMap.mem pac rep.constructors) then rep.constructors<-PacMap.add pac t rep.constructors let add_paf rep paf t = - let already = + let already = try PafMap.find paf rep.functions with Not_found -> Intset.empty in rep.functions<- PafMap.add paf (Intset.add t already) rep.functions let term uf i=uf.map.(i).term - + let subterms uf i= match uf.map.(i).vertex with Node(j,k) -> (j,k) | _ -> anomaly "subterms: not a node" - + let signature uf i= let j,k=subterms uf i in (find uf j,find uf k) - + let next uf= let size=uf.size in let nsize= succ size in @@ -304,11 +304,11 @@ let next uf= uf.max_size<-newmax; Array.blit uf.map 0 newmap 0 size; uf.map<-newmap - end + end else (); - uf.size<-nsize; + uf.size<-nsize; size - + let new_representative typ = {weight=0; lfathers=Intset.empty; @@ -317,14 +317,14 @@ let new_representative typ = class_type=typ; functions=PafMap.empty; constructors=PacMap.empty} - + (* rebuild a constr from an applicative term *) - + let _A_ = Name (id_of_string "A") let _B_ = Name (id_of_string "A") let _body_ = mkProd(Anonymous,mkRel 2,mkRel 2) -let cc_product s1 s2 = +let cc_product s1 s2 = mkLambda(_A_,mkSort(Termops.new_sort_in_family s1), mkLambda(_B_,mkSort(Termops.new_sort_in_family s2),_body_)) @@ -332,27 +332,27 @@ let rec constr_of_term = function Symb s->s | Product(s1,s2) -> cc_product s1 s2 | Eps id -> mkVar id - | Constructor cinfo -> mkConstruct cinfo.ci_constr + | Constructor cinfo -> mkConstruct cinfo.ci_constr | Appli (s1,s2)-> make_app [(constr_of_term s2)] s1 and make_app l=function - Appli (s1,s2)->make_app ((constr_of_term s2)::l) s1 - | other -> applistc (constr_of_term other) l + Appli (s1,s2)->make_app ((constr_of_term s2)::l) s1 + | other -> applistc (constr_of_term other) l (* rebuild a term from a pattern and a substitution *) let build_subst uf subst = - Array.map (fun i -> - try term uf i + Array.map (fun i -> + try term uf i with _ -> anomaly "incomplete matching") subst let rec inst_pattern subst = function - PVar i -> - subst.(pred i) - | PApp (t, args) -> + PVar i -> + subst.(pred i) + | PApp (t, args) -> List.fold_right (fun spat f -> Appli (f,inst_pattern subst spat)) - args t + args t let pr_idx_term state i = str "[" ++ int i ++ str ":=" ++ Termops.print_constr (constr_of_term (term state.uf i)) ++ str "]" @@ -360,9 +360,9 @@ let pr_idx_term state i = str "[" ++ int i ++ str ":=" ++ let pr_term t = str "[" ++ Termops.print_constr (constr_of_term t) ++ str "]" -let rec add_term state t= +let rec add_term state t= let uf=state.uf in - try Hashtbl.find uf.syms t with + try Hashtbl.find uf.syms t with Not_found -> let b=next uf in let typ = pf_type_of state.gls (constr_of_term t) in @@ -377,12 +377,12 @@ let rec add_term state t= cpath= -1; vertex= Leaf; term= t} - | Eps id -> + | Eps id -> {clas= Rep (new_representative typ); cpath= -1; vertex= Leaf; term= t} - | Appli (t1,t2) -> + | Appli (t1,t2) -> let i1=add_term state t1 and i2=add_term state t2 in add_lfather uf (find uf i1) b; add_rfather uf (find uf i2) b; @@ -408,9 +408,9 @@ let rec add_term state t= in uf.map.(b)<-new_node; Hashtbl.add uf.syms t b; - Hashtbl.replace state.by_type typ - (Intset.add b - (try Hashtbl.find state.by_type typ with + Hashtbl.replace state.by_type typ + (Intset.add b + (try Hashtbl.find state.by_type typ with Not_found -> Intset.empty)); b @@ -436,22 +436,22 @@ let add_quant state id pol (nvars,valid1,patt1,valid2,patt2) = qe_rhs_valid=valid2}::state.quant let is_redundant state id args = - try + try let norm_args = Array.map (find state.uf) args in let prev_args = Hashtbl.find_all state.q_history id in - List.exists - (fun old_args -> - Util.array_for_all2 (fun i j -> i = find state.uf j) - norm_args old_args) + List.exists + (fun old_args -> + Util.array_for_all2 (fun i j -> i = find state.uf j) + norm_args old_args) prev_args with Not_found -> false -let add_inst state (inst,int_subst) = +let add_inst state (inst,int_subst) = check_for_interrupt (); if state.rew_depth > 0 then if is_redundant state inst.qe_hyp_id int_subst then debug msgnl (str "discarding redundant (dis)equality") - else + else begin Hashtbl.add state.q_history inst.qe_hyp_id int_subst; let subst = build_subst (forest state) int_subst in @@ -459,149 +459,149 @@ let add_inst state (inst,int_subst) = let args = Array.map constr_of_term subst in let _ = array_rev args in (* highest deBruijn index first *) let prf= mkApp(prfhead,args) in - let s = inst_pattern subst inst.qe_lhs + let s = inst_pattern subst inst.qe_lhs and t = inst_pattern subst inst.qe_rhs in state.changed<-true; state.rew_depth<-pred state.rew_depth; if inst.qe_pol then begin - debug (fun () -> - msgnl + debug (fun () -> + msgnl (str "Adding new equality, depth="++ int state.rew_depth); - msgnl (str " [" ++ Termops.print_constr prf ++ str " : " ++ + msgnl (str " [" ++ Termops.print_constr prf ++ str " : " ++ pr_term s ++ str " == " ++ pr_term t ++ str "]")) (); add_equality state prf s t end else begin - debug (fun () -> - msgnl + debug (fun () -> + msgnl (str "Adding new disequality, depth="++ int state.rew_depth); - msgnl (str " [" ++ Termops.print_constr prf ++ str " : " ++ + msgnl (str " [" ++ Termops.print_constr prf ++ str " : " ++ pr_term s ++ str " <> " ++ pr_term t ++ str "]")) (); - add_disequality state (Hyp prf) s t + add_disequality state (Hyp prf) s t end end let link uf i j eq = (* links i -> j *) - let node=uf.map.(i) in + let node=uf.map.(i) in node.clas<-Eqto (j,eq); node.cpath<-j - + let rec down_path uf i l= match uf.map.(i).clas with Eqto(j,t)->down_path uf j (((i,j),t)::l) | Rep _ ->l - + let rec min_path=function ([],l2)->([],l2) | (l1,[])->(l1,[]) - | (((c1,t1)::q1),((c2,t2)::q2)) when c1=c2 -> min_path (q1,q2) + | (((c1,t1)::q1),((c2,t2)::q2)) when c1=c2 -> min_path (q1,q2) | cpl -> cpl - + let join_path uf i j= assert (find uf i=find uf j); min_path (down_path uf i [],down_path uf j []) let union state i1 i2 eq= - debug (fun () -> msgnl (str "Linking " ++ pr_idx_term state i1 ++ + debug (fun () -> msgnl (str "Linking " ++ pr_idx_term state i1 ++ str " and " ++ pr_idx_term state i2 ++ str ".")) (); - let r1= get_representative state.uf i1 + let r1= get_representative state.uf i1 and r2= get_representative state.uf i2 in link state.uf i1 i2 eq; - Hashtbl.replace state.by_type r1.class_type - (Intset.remove i1 - (try Hashtbl.find state.by_type r1.class_type with + Hashtbl.replace state.by_type r1.class_type + (Intset.remove i1 + (try Hashtbl.find state.by_type r1.class_type with Not_found -> Intset.empty)); let f= Intset.union r1.fathers r2.fathers in r2.weight<-Intset.cardinal f; r2.fathers<-f; r2.lfathers<-Intset.union r1.lfathers r2.lfathers; ST.delete_set state.sigtable r1.fathers; - state.terms<-Intset.union state.terms r1.fathers; - PacMap.iter - (fun pac b -> Queue.add (b,Cmark pac) state.marks) + state.terms<-Intset.union state.terms r1.fathers; + PacMap.iter + (fun pac b -> Queue.add (b,Cmark pac) state.marks) r1.constructors; - PafMap.iter - (fun paf -> Intset.iter - (fun b -> Queue.add (b,Fmark paf) state.marks)) + PafMap.iter + (fun paf -> Intset.iter + (fun b -> Queue.add (b,Fmark paf) state.marks)) r1.functions; - match r1.inductive_status,r2.inductive_status with + match r1.inductive_status,r2.inductive_status with Unknown,_ -> () - | Partial pac,Unknown -> + | Partial pac,Unknown -> r2.inductive_status<-Partial pac; state.pa_classes<-Intset.remove i1 state.pa_classes; state.pa_classes<-Intset.add i2 state.pa_classes - | Partial _ ,(Partial _ |Partial_applied) -> + | Partial _ ,(Partial _ |Partial_applied) -> state.pa_classes<-Intset.remove i1 state.pa_classes - | Partial_applied,Unknown -> - r2.inductive_status<-Partial_applied - | Partial_applied,Partial _ -> + | Partial_applied,Unknown -> + r2.inductive_status<-Partial_applied + | Partial_applied,Partial _ -> state.pa_classes<-Intset.remove i2 state.pa_classes; r2.inductive_status<-Partial_applied | Total cpl,Unknown -> r2.inductive_status<-Total cpl; - | Total (i,pac),Total _ -> Queue.add (i,Cmark pac) state.marks - | _,_ -> () - + | Total (i,pac),Total _ -> Queue.add (i,Cmark pac) state.marks + | _,_ -> () + let merge eq state = (* merge and no-merge *) - debug (fun () -> msgnl - (str "Merging " ++ pr_idx_term state eq.lhs ++ + debug (fun () -> msgnl + (str "Merging " ++ pr_idx_term state eq.lhs ++ str " and " ++ pr_idx_term state eq.rhs ++ str ".")) (); let uf=state.uf in - let i=find uf eq.lhs + let i=find uf eq.lhs and j=find uf eq.rhs in - if i<>j then + if i<>j then if (size uf i)<(size uf j) then union state i j eq else union state j i (swap eq) let update t state = (* update 1 and 2 *) - debug (fun () -> msgnl + debug (fun () -> msgnl (str "Updating term " ++ pr_idx_term state t ++ str ".")) (); let (i,j) as sign = signature state.uf t in let (u,v) = subterms state.uf t in let rep = get_representative state.uf i in begin - match rep.inductive_status with + match rep.inductive_status with Partial _ -> rep.inductive_status <- Partial_applied; state.pa_classes <- Intset.remove i state.pa_classes | _ -> () end; - PacMap.iter - (fun pac _ -> Queue.add (t,Cmark (append_pac v pac)) state.marks) - rep.constructors; - PafMap.iter - (fun paf _ -> Queue.add (t,Fmark (fsucc paf)) state.marks) - rep.functions; - try - let s = ST.query sign state.sigtable in + PacMap.iter + (fun pac _ -> Queue.add (t,Cmark (append_pac v pac)) state.marks) + rep.constructors; + PafMap.iter + (fun paf _ -> Queue.add (t,Fmark (fsucc paf)) state.marks) + rep.functions; + try + let s = ST.query sign state.sigtable in Queue.add {lhs=t;rhs=s;rule=Congruence} state.combine - with + with Not_found -> ST.enter t sign state.sigtable let process_function_mark t rep paf state = add_paf rep paf t; state.terms<-Intset.union rep.lfathers state.terms - + let process_constructor_mark t i rep pac state = match rep.inductive_status with Total (s,opac) -> - if pac.cnode <> opac.cnode then (* Conflict *) - raise (Discriminable (s,opac,t,pac)) + if pac.cnode <> opac.cnode then (* Conflict *) + raise (Discriminable (s,opac,t,pac)) else (* Match *) let cinfo = get_constructor_info state.uf pac.cnode in let rec f n oargs args= - if n > 0 then + if n > 0 then match (oargs,args) with s1::q1,s2::q2-> - Queue.add + Queue.add {lhs=s1;rhs=s2;rule=Injection(s,opac,t,pac,n)} state.combine; - f (n-1) q1 q2 - | _-> anomaly - "add_pacs : weird error in injection subterms merge" + f (n-1) q1 q2 + | _-> anomaly + "add_pacs : weird error in injection subterms merge" in f cinfo.ci_nhyps opac.args pac.args | Partial_applied | Partial _ -> add_pac rep pac t; @@ -617,8 +617,8 @@ let process_constructor_mark t i rep pac state = state.pa_classes<- Intset.add i state.pa_classes end -let process_mark t m state = - debug (fun () -> msgnl +let process_mark t m state = + debug (fun () -> msgnl (str "Processing mark for term " ++ pr_idx_term state t ++ str ".")) (); let i=find state.uf t in let rep=get_representative state.uf i in @@ -634,15 +634,15 @@ type explanation = let check_disequalities state = let uf=state.uf in let rec check_aux = function - dis::q -> - debug (fun () -> msg - (str "Checking if " ++ pr_idx_term state dis.lhs ++ str " = " ++ - pr_idx_term state dis.rhs ++ str " ... ")) (); - if find uf dis.lhs=find uf dis.rhs then - begin debug msgnl (str "Yes");Some dis end + dis::q -> + debug (fun () -> msg + (str "Checking if " ++ pr_idx_term state dis.lhs ++ str " = " ++ + pr_idx_term state dis.rhs ++ str " ... ")) (); + if find uf dis.lhs=find uf dis.rhs then + begin debug msgnl (str "Yes");Some dis end else begin debug msgnl (str "No");check_aux q end - | [] -> None + | [] -> None in check_aux state.diseq @@ -651,8 +651,8 @@ let one_step state = let eq = Queue.take state.combine in merge eq state; true - with Queue.Empty -> - try + with Queue.Empty -> + try let (t,m) = Queue.take state.marks in process_mark t m state; true @@ -664,40 +664,40 @@ let one_step state = true with Not_found -> false -let __eps__ = id_of_string "_eps_" +let __eps__ = id_of_string "_eps_" let new_state_var typ state = let id = pf_get_new_id __eps__ state.gls in state.gls<- {state.gls with it = - {state.gls.it with evar_hyps = - Environ.push_named_context_val (id,None,typ) + {state.gls.it with evar_hyps = + Environ.push_named_context_val (id,None,typ) state.gls.it.evar_hyps}}; id let complete_one_class state i= match (get_representative state.uf i).inductive_status with Partial pac -> - let rec app t typ n = + let rec app t typ n = if n<=0 then t else let _,etyp,rest= destProd typ in let id = new_state_var etyp state in app (Appli(t,Eps id)) (substl [mkVar id] rest) (n-1) in let _c = pf_type_of state.gls (constr_of_term (term state.uf pac.cnode)) in - let _args = - List.map (fun i -> constr_of_term (term state.uf i)) + let _args = + List.map (fun i -> constr_of_term (term state.uf i)) pac.args in - let typ = prod_applist _c (List.rev _args) in + let typ = prod_applist _c (List.rev _args) in let ct = app (term state.uf i) typ pac.arity in - state.uf.epsilons <- pac :: state.uf.epsilons; + state.uf.epsilons <- pac :: state.uf.epsilons; ignore (add_term state ct) - | _ -> anomaly "wrong incomplete class" + | _ -> anomaly "wrong incomplete class" let complete state = Intset.iter (complete_one_class state) state.pa_classes -type matching_problem = +type matching_problem = {mp_subst : int array; mp_inst : quant_eq; mp_stack : (ccpattern*int) list } @@ -705,31 +705,31 @@ type matching_problem = let make_fun_table state = let uf= state.uf in let funtab=ref PafMap.empty in - Array.iteri + Array.iteri (fun i inode -> if i < uf.size then match inode.clas with Rep rep -> - PafMap.iter - (fun paf _ -> - let elem = - try PafMap.find paf !funtab + PafMap.iter + (fun paf _ -> + let elem = + try PafMap.find paf !funtab with Not_found -> Intset.empty in - funtab:= PafMap.add paf (Intset.add i elem) !funtab) + funtab:= PafMap.add paf (Intset.add i elem) !funtab) rep.functions | _ -> ()) state.uf.map; !funtab - + let rec do_match state res pb_stack = let mp=Stack.pop pb_stack in match mp.mp_stack with - [] -> + [] -> res:= (mp.mp_inst,mp.mp_subst) :: !res | (patt,cl)::remains -> let uf=state.uf in match patt with - PVar i -> - if mp.mp_subst.(pred i)<0 then + PVar i -> + if mp.mp_subst.(pred i)<0 then begin mp.mp_subst.(pred i)<- cl; (* no aliasing problem here *) Stack.push {mp with mp_stack=remains} pb_stack @@ -746,18 +746,18 @@ let rec do_match state res pb_stack = with Not_found -> () end | PApp(f, ((last_arg::rem_args) as args)) -> - try - let j=Hashtbl.find uf.syms f in + try + let j=Hashtbl.find uf.syms f in let paf={fsym=j;fnargs=List.length args} in let rep=get_representative uf cl in let good_terms = PafMap.find paf rep.functions in - let aux i = + let aux i = let (s,t) = signature state.uf i in - Stack.push - {mp with + Stack.push + {mp with mp_subst=Array.copy mp.mp_subst; mp_stack= - (PApp(f,rem_args),s) :: + (PApp(f,rem_args),s) :: (last_arg,t) :: remains} pb_stack in Intset.iter aux good_terms with Not_found -> () @@ -768,7 +768,7 @@ let paf_of_patt syms = function {fsym=Hashtbl.find syms f; fnargs=List.length args} -let init_pb_stack state = +let init_pb_stack state = let syms= state.uf.syms in let pb_stack = Stack.create () in let funtab = make_fun_table state in @@ -778,51 +778,51 @@ let init_pb_stack state = match inst.qe_lhs_valid with Creates_variables -> Intset.empty | Normal -> - begin - try + begin + try let paf= paf_of_patt syms inst.qe_lhs in PafMap.find paf funtab with Not_found -> Intset.empty end - | Trivial typ -> - begin - try + | Trivial typ -> + begin + try Hashtbl.find state.by_type typ with Not_found -> Intset.empty end in - Intset.iter (fun i -> - Stack.push - {mp_subst = Array.make inst.qe_nvars (-1); + Intset.iter (fun i -> + Stack.push + {mp_subst = Array.make inst.qe_nvars (-1); mp_inst=inst; mp_stack=[inst.qe_lhs,i]} pb_stack) good_classes end; - begin + begin let good_classes = match inst.qe_rhs_valid with Creates_variables -> Intset.empty | Normal -> - begin - try + begin + try let paf= paf_of_patt syms inst.qe_rhs in PafMap.find paf funtab with Not_found -> Intset.empty end - | Trivial typ -> - begin - try + | Trivial typ -> + begin + try Hashtbl.find state.by_type typ with Not_found -> Intset.empty end in - Intset.iter (fun i -> - Stack.push - {mp_subst = Array.make inst.qe_nvars (-1); + Intset.iter (fun i -> + Stack.push + {mp_subst = Array.make inst.qe_nvars (-1); mp_inst=inst; mp_stack=[inst.qe_rhs,i]} pb_stack) good_classes end in List.iter aux state.quant; pb_stack -let find_instances state = +let find_instances state = let pb_stack= init_pb_stack state in let res =ref [] in let _ = @@ -830,7 +830,7 @@ let find_instances state = try while true do check_for_interrupt (); - do_match state res pb_stack + do_match state res pb_stack done; anomaly "get out of here !" with Stack.Empty -> () in @@ -839,34 +839,34 @@ let find_instances state = let rec execute first_run state = debug msgnl (str "Executing ... "); try - while + while check_for_interrupt (); one_step state do () done; match check_disequalities state with - None -> + None -> if not(Intset.is_empty state.pa_classes) then - begin + begin debug msgnl (str "First run was incomplete, completing ... "); complete state; execute false state end - else + else if state.rew_depth>0 then let l=find_instances state in List.iter (add_inst state) l; - if state.changed then + if state.changed then begin state.changed <- false; execute true state end else - begin + begin debug msgnl (str "Out of instances ... "); None end - else - begin + else + begin debug msgnl (str "Out of depth ... "); None end |