@@ -12,7 +12,6 @@ module System : sig
1212 nb_atom : int ; (* Number of atoms in each equation *)
1313 assoc_type : Type .t array ; (* Map from indices to the associated terms *)
1414 nb_non_var : int ; (* Non variables are at the beginning of the array, Variables at the end. *)
15- nb_non_tuple : int ; (* Among the variable, first we have the non tuple variables *)
1615 system : int array array ;
1716 }
1817
@@ -40,13 +39,12 @@ end = struct
4039 nb_atom : int ; (* Number of atoms in each equation *)
4140 assoc_type : Type .t array ; (* Map from indices to the associated types *)
4241 nb_non_var : int ; (* Constants are at the beginning of the array, Variables at the end. *)
43- nb_non_tuple : int ; (* Among the variable, first we have the non tuple variables *)
4442 system : int array array ;
4543 }
4644
47- let pp ppf {system; assoc_type; nb_atom; nb_non_var; nb_non_tuple } =
48- Format. fprintf ppf " @[<v>{nb_atom: %i@ nb_non_var: %i@ nb_non_tuple: %i@ assoc: %a@ system: %a}@]"
49- nb_atom nb_non_var nb_non_tuple
45+ let pp ppf {system; assoc_type; nb_atom; nb_non_var} =
46+ Format. fprintf ppf " @[<v>{nb_atom: %i@ nb_non_var: %i@ assoc: %a@ system: %a}@]"
47+ nb_atom nb_non_var
5048 Fmt. (vbox (array ~sep: (any " ," ) Type. pp)) assoc_type
5149 Fmt. (vbox (array ~sep: cut @@ array ~sep: (any " , " ) int )) system
5250
@@ -91,12 +89,6 @@ end = struct
9189 let m = Type.Set. fold (f part count) all_types Type.Map. empty in
9290 (! count, m)
9391 in
94- let nb_non_tuple_var = Type.Set. fold (function
95- | Type. Var v ->
96- if Variable. is_non_tuple v then (+ ) 1 else Fun. id
97- | _ -> Fun. id) all_types 0
98- in
99- nb_non_tuple_var,
10092 {
10193 S. variable = aux shape_partition.variable;
10294 shapes = List. map aux shape_partition.shapes;
@@ -114,7 +106,7 @@ end = struct
114106 TODO: is it true that equal type up to iso in the current substitution will be equal here?
115107 *)
116108 let make problems : t * t List.t =
117- let nb_non_tuple, mapping = make_mapping problems in
109+ let mapping = make_mapping problems in
118110 let nb_vars, vars = mapping.variable in
119111 let shape_partition = mapping.shapes in
120112 let get_index map t =
@@ -130,16 +122,13 @@ end = struct
130122 let var_system =
131123 let nb_atom = nb_vars in
132124 let assoc_type = Array. make nb_atom Type. dummy in
133- Type.Map. iter (fun k i ->
134- assert (if i < nb_non_tuple then Type. is_non_tuple_var k
135- else not (Type. is_non_tuple_var k));
136- assoc_type.(i) < - k) vars ;
125+ Type.Map. iter (fun k i -> assoc_type.(i) < - k) vars ;
137126 let nb_non_var = 0 in
138127 let system =
139128 List. map (add_problem (get_index vars) nb_atom) problems
140129 |> Array. of_list
141130 in
142- { nb_atom ; assoc_type ; nb_non_var; nb_non_tuple ; system }
131+ { nb_atom ; assoc_type ; nb_non_var ; system }
143132 in
144133
145134 let gen_shape_system nb_frees types_map =
@@ -154,7 +143,7 @@ end = struct
154143 (get_index_shape vars types_map nb_frees) nb_atom) problems
155144 |> Array. of_list
156145 in
157- { nb_atom ; assoc_type ; nb_non_var; nb_non_tuple ; system }
146+ { nb_atom ; assoc_type ; nb_non_var ; system }
158147 in
159148 let shape_systems = List. map
160149 (fun (n , tm ) -> gen_shape_system n tm)
@@ -231,45 +220,32 @@ end = struct
231220 in
232221 aux env Bitv. empty (Array. length solutions - 1 )
233222
234- let iterate_var_subsets_acu system solutions bitvars_cover =
223+ let iterate_var_subsets_acu _system solutions _bitvars_cover =
235224 (* TODO: this could be faster because we only deal with partial, therefore, we don't need to
236225 merge anything in the quasi solved. *)
237- let mask = Bitv. all_until (system.System. nb_non_tuple - 1 ) in
238- let non_tuples_sols, pure_sols =
239- List. combine (Array. to_list bitvars_cover) (Array. to_list solutions)
240- |> List. partition (fun (b , _ ) -> not Bitv. (is_empty (b && mask)))
241- in
242226 let pure_var_env =
243- match pure_sols with
244- | [] -> None
245- | [ _, env ] -> Some env
246- | (_ , hd ) :: tl -> Some (List. fold_left (fun acc (_ , env ) -> merge_env acc env) hd tl)
227+ match Array. length solutions with
228+ | 0 -> None
229+ | _ ->
230+ let env = ref solutions.(0 ) in
231+ for i = 1 to Array. length solutions - 1 do
232+ env := merge_env ! env solutions.(i)
233+ done ;
234+ Some ! env
247235 in
248- fun env shape_coverage k ->
249- let rec aux env coverage = function
250- | [] -> (
251- let merged_env = match pure_var_env with None -> env | Some pure_var_env -> merge_env env pure_var_env in
252- let final_env, stack = Env. commit merged_env in
253- match
254- let * _ =
255- if List. is_empty stack then Done
256- else Syntactic. process_stack final_env (Stack. of_list stack)
257- in
258- Syntactic. occur_check final_env
259- with
260- | Syntactic. FailUnif _ | FailedOccurCheck _ -> ()
261- | Done ->
262- k final_env )
263- | (cover , var_env ):: t ->
264- aux env coverage t;
265- if Bitv. (is_empty (coverage && cover && mask)) then
266- match merge_env env var_env with
267- | env ->
268- let coverage = Bitv. (coverage || cover) in
269- aux env coverage t
270- | exception Bail -> ()
271- in
272- aux env shape_coverage non_tuples_sols
236+ fun env _shape_coverage k ->
237+ let merged_env = match pure_var_env with None -> env | Some pure_var_env -> merge_env env pure_var_env in
238+ let final_env, stack = Env. commit merged_env in
239+ match
240+ let * _ =
241+ if List. is_empty stack then Done
242+ else Syntactic. process_stack final_env (Stack. of_list stack)
243+ in
244+ Syntactic. occur_check final_env
245+ with
246+ | Syntactic. FailUnif _ | FailedOccurCheck _ -> ()
247+ | Done ->
248+ k final_env
273249
274250 let iterate_var_subsets_ac system solutions bitvars_cover env shape_coverage k =
275251 let mask = Bitv. all_until (system.System. nb_atom - 1 ) in
@@ -443,7 +419,7 @@ let solve_systems env (var_system, shape_systems) =
443419 in
444420
445421 let var_sols =
446- System. solve (cut var_system.nb_non_tuple ) var_system
422+ System. solve (fun _ -> false ) var_system
447423 |> Iter. filter (fun sol ->
448424 exists (fun x -> x > 0 ) sol 0 var_system.nb_atom)
449425 (* TODO: Maybe a bug in the solver.
@@ -463,7 +439,7 @@ let solve_systems env (var_system, shape_systems) =
463439 let shapes_sols = List. map (fun (system : System.t ) ->
464440 assert (system.nb_non_var > 0 );
465441 ( system,
466- System. solve (cut (system.nb_non_var + system.nb_non_tuple )) system
442+ System. solve (cut (system.nb_non_var)) system
467443 |> Iter. filter (fun sol ->
468444 exists (fun x -> x > 0 ) sol 0 system.nb_non_var)
469445 )
@@ -478,4 +454,3 @@ let solve env problems =
478454 Logs. debug (fun m -> m " Solving AC system: @,@[%a@]" (CCList. pp ACTerm. pp_problem) problems);
479455 make_systems env problems
480456 |> solve_systems env
481-
0 commit comments