else
`Continue p
-let instantiate p x n =
+let instantiate p x perm n =
(if hd_of_i_var (cast_to_i_var !bomb) = x
then failwithProblem p ("BOMB (" ^ string_of_nf !bomb ^ ") cannot be instantiated!"));
let arity_of_x = max_arity_tms x (all_terms p) in
(if arity_of_x = None then failwithProblem p "step on var non occurring in problem");
- (if Util.option_get(arity_of_x) = min_int then failwithProblem p "step on fake variable");
- (if Util.option_get(arity_of_x) <= 0 then failwithProblem p "step on var of non-positive arity");
+ let arity_of_x = Util.option_get(arity_of_x) in
+ (if arity_of_x = min_int then failwithProblem p "step on fake variable");
+ (if arity_of_x <= 0 then failwithProblem p "step on var of non-positive arity");
+ (if perm < 1 || perm > arity_of_x then
+ failwithProblem p ("Tried to permutate variable "^ string_of_var x ^" beyond its max arity"));
let n = (prerr_endline "WARNING: using constant initialSpecialK"); p.initialSpecialK in
- (* AC: Once upon a time, it was:
- let arities = Num.compute_arities x (n+1) (all_terms p :> nf list) in *)
- (* let arities = Array.to_list (Array.make (n+1) 0) in *)
let arities = Array.to_list (Array.make (n+1) min_int) in
let p,vars = make_fresh_vars p arities in
let args = Listx.from_list (vars :> nf list) in
let bs = ref [] in
+ (* AC FIXME:
+ 1) what is arity of other_vars?
+ 2) are lambdas true or false?
+ *)
+ (* other_vars are the variables which are delayed and re-applied to the match *)
+ let other_vars = Array.mapi (fun n () -> `Var(n+1,-666)) (Array.make (perm-1) ()) in
+ let other_vars = Array.to_list other_vars in
(* 666, since it will be replaced anyway during subst: *)
- let inst = `Lam(false,`Match(`I((0,min_int),Listx.map (lift 1) args),(x,666),1,bs,[])) in
+ let inst = `Match(`I((0,min_int),Listx.map (lift perm) args),(x,-666),perm,bs,other_vars) in
+ (* Add a number of 'perm' leading lambdas *)
+ let inst = Array.fold_left (fun t () -> `Lam(false, t)) inst (Array.make perm ()) in
let p = {p with deltas=bs::p.deltas} in
subst_in_problem x inst p
;;
compute_special_k (Listx.from_list (all_terms p :> nf list) )in
if special_k < n then
prerr_endline ("@@@@ NEW INSTANTIATE PHASE (" ^ string_of_int special_k ^ ") @@@@");
- let p = instantiate p x special_k in
+ let p = instantiate p x 1 special_k in
special_k,p
| `DoneWith -> assert false (*aux (eat p) n l*) (* CSC: TODO *)
| `Step x ->
let x = var_of_string x in
- aux (instantiate p x n) n l
+ aux (instantiate p x 1 n) n l
| `Auto -> aux (auto p n) n l
in
List.iter