- ; deltas: (int * nf) list ref list (* collection of all branches *)
- }
-
-
-(* let heads = Util.sort_uniq (List.map hd_of_i_var p.ps) in
-for all head
- List.map (fun (_, bs) -> List.map (fun (x,_) -> List.nth p.ps x) !bs) p.deltas *)
-
-(* let ($) f x = f x;; *)
-
-(* let subterms tms freshno =
- let apply_var =
- let no = ref freshno in
- function t -> incr no; mk_app t (`Var !no) in
- let applicative hd args = snd (
- List.fold_left (fun (hd, acc) t -> let hd = mk_app hd t in hd, hd::acc) (hd, []) args) in
- let rec aux t = match t with
- | `Var _ -> []
- | `I(v,ts) ->
- (* applicative (`Var v) (Listx.to_list ts) @ *)
- Util.concat_map aux (Listx.to_list ts) @ List.map apply_var (Listx.to_list ts)
- | `Lam(_,_,t) -> aux (lift ~-1 t)
- | `Match(u,_,bs_lift,bs,args) ->
- aux (u :> nf) @
- (* applicative (`Match(u,bs_lift,bs,[])) args @ *)
- Util.concat_map aux args @ List.map apply_var args
- (* @ Util.concat_map (aux ++ (lift bs_lift) ++ snd) !bs *)
- | `N _ -> []
- in let tms' = (* Util.sort_uniq ~compare:eta_compare*) (Util.concat_map aux tms) in
- tms @ tms'
- (* List.map (fun (t, v) -> match t with `N _ -> t | _ -> mk_app t v) (List.combine tms (List.mapi (fun i _ -> `Var(freshno+i)) tms)) *)
-;; *)
+ ; deltas: discriminating_set ref list (* collection of all branches *)
+ ; initialSpecialK: int
+
+ ; trail: discriminating_set list list
+};;
+
+(* exceptions *)
+exception Pacman
+exception Bottom
+exception Backtrack of string
+
+let first bound p var f =
+ let p = {p with trail = (List.map (!) p.deltas)::p.trail} in
+ let rec aux i =
+ if i > bound then
+ raise (Backtrack ("no more alternatives for " ^ string_of_var var))
+ else
+ try
+ f p i
+ with Backtrack s ->
+prerr_endline ("!!BACKTRACK!! " ^ s);
+ List.iter (fun (r,l) -> r := l) (List.combine p.deltas (List.hd p.trail)) ;
+prerr_endline("Now trying var="^string_of_var var^" i="^string_of_int i);
+ aux (i+1)
+ in
+ aux 1
+