let len,names = aux [] 0 t in
let len = len - arity in
List.fold_left
- (fun (n,l) x -> if n <= len then n+1,l@[x] else n,l) (0,[])
+ (fun (n,l) x -> if n < len then n+1,l@[x] else n,l) (0,[])
names
in
let compose c1 nc1 c2 nc2 =
debug_print (lazy ("\nCOMPOSING"));
debug_print (lazy (" c1= "^CicPp.ppterm c1 ^" : "^ CicPp.ppterm c1_ty));
debug_print (lazy (" c2= "^CicPp.ppterm c2 ^" : "^ CicPp.ppterm c2_ty));
- let saturations_for_c1, names_c1 = count_saturations_needed c1_ty arity in
- let saturations_for_c2, names_c2 = count_saturations_needed c2_ty 0 in
+ let saturations_for_c1, names_c1 = count_saturations_needed c1_ty 0 in
+ let saturations_for_c2, names_c2 = count_saturations_needed c2_ty arity in
let c = compose c1 saturations_for_c1 c2 saturations_for_c2 in
let spline_len = saturations_for_c1 + saturations_for_c2 in
let c = mk_lambda_spline c (namer (names_c1 @ names_c2)) spline_len in
with Invalid_argument _ -> false
;;
+let uniq = HExtlib.list_uniq ~eq:(fun (a,_) (b,_) -> CoercDb.eq_carr a b);;
+
+let splat e l = List.map (fun x -> e, x) l;;
+
+let get_coercions_to carr =
+ let l = CoercDb.to_list () in
+ List.flatten
+ (HExtlib.filter_map
+ (fun (src,tgt,cl) ->
+ if CoercDb.eq_carr tgt carr then Some (splat src cl) else None)
+ l)
+;;
+
+let get_coercions_from carr =
+ let l = CoercDb.to_list () in
+ List.flatten
+ (HExtlib.filter_map
+ (fun (src,tgt,cl) ->
+ if CoercDb.eq_carr src carr then Some (splat tgt cl) else None)
+ l)
+;;
+
+let intersect l1 l2 =
+ let is_in_l1 (x,_) = List.exists (fun (src,_) -> CoercDb.eq_carr x src) l1 in
+ uniq (List.filter is_in_l1 l2)
+;;
+
+let grow s =
+ uniq (List.flatten (List.map (fun (x,_) -> get_coercions_to x) s) @ s)
+;;
+
+let lb c =
+ let l = get_coercions_from c in
+ function x -> List.exists (fun (y,_) -> CoercDb.eq_carr x y) l
+;;
+
+let rec min acc = function
+ | c::tl ->
+ if List.exists (lb c) (tl@acc) then min acc tl else min (c::acc) tl
+ | [] -> acc
+;;
+
+let meets left right =
+ let u = UriManager.uri_of_string "cic:/foo.con" in
+ min [] (List.map fst (intersect (grow [left,u]) (grow [right,u])))
+;;
+
(* EOF *)
* a constant applyed that is marked with (`Class `Coercion) *)
val is_composite: Cic.term -> bool
-
val source_of: Cic.term -> Cic.term
val generate_dot_file: unit -> string
+val meets :
+ CoercDb.coerc_carr -> CoercDb.coerc_carr ->
+ (CoercDb.coerc_carr * UriManager.uri * UriManager.uri) list
+