X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Flibrary%2FcoercGraph.ml;h=06d7a12d3ea3a5e250ae595dc747d906e75b0857;hb=27b3610b7add7ee75eb25f8f01e0f1426c278f52;hp=cd958a8f62074aa5ba4ac76fb023043b2478587e;hpb=7f2444c2670cadafddd8785b687ef312158376b0;p=helm.git diff --git a/components/library/coercGraph.ml b/components/library/coercGraph.ml index cd958a8f6..06d7a12d3 100644 --- a/components/library/coercGraph.ml +++ b/components/library/coercGraph.ml @@ -38,34 +38,61 @@ let debug_print s = if debug then prerr_endline (Lazy.force s) else () (* searches a coercion fron src to tgt in the !coercions list *) let look_for_coercion src tgt = + let arity_of con = + try + let ty,_ = CicTypeChecker.type_of_aux' [] [] con CicUniv.empty_ugraph in + let rec count_pi = function + | Cic.Prod (_,_,t) -> 1 + count_pi t + | _ -> 0 + in + count_pi ty + with Invalid_argument _ -> assert false (* all coercions have an uri *) + in + let rec mk_implicits = function + | 0 -> [] + | n -> Cic.Implicit None :: mk_implicits (n-1) + in try let l = CoercDb.find_coercion - (fun (s,t) -> CoercDb.eq_carr s src && CoercDb.eq_carr t tgt) + (fun (s,t) -> CoercDb.eq_carr s src && CoercDb.eq_carr t tgt) in + let uri = + match l with + | [] -> + debug_print + (lazy + (sprintf ":-( coercion non trovata da %s a %s" + (CoercDb.name_of_carr src) + (CoercDb.name_of_carr tgt))); + None + | [u] -> + debug_print (lazy ( + sprintf ":-) TROVATA 1 coercion da %s a %s: %s" + (CoercDb.name_of_carr src) + (CoercDb.name_of_carr tgt) + (UriManager.name_of_uri u))); + Some u + | u::_ -> + debug_print (lazy ( + sprintf ":-/ TROVATE %d coercion(s) da %s a %s, prendo la prima: %s" + (List.length l) + (CoercDb.name_of_carr src) + (CoercDb.name_of_carr tgt) + (UriManager.name_of_uri u))); + Some u in - match l with - | [] -> - debug_print - (lazy - (sprintf ":-( coercion non trovata da %s a %s" - (CoercDb.name_of_carr src) - (CoercDb.name_of_carr tgt))); - NoCoercion - | [u] -> - debug_print (lazy ( - sprintf ":-) TROVATA 1 coercion da %s a %s: %s" - (CoercDb.name_of_carr src) - (CoercDb.name_of_carr tgt) - (UriManager.name_of_uri u))); - SomeCoercion (CicUtil.term_of_uri u) - | u::_ -> - debug_print (lazy ( - sprintf ":-/ TROVATE %d coercion(s) da %s a %s, prendo la prima: %s" - (List.length l) - (CoercDb.name_of_carr src) - (CoercDb.name_of_carr tgt) - (UriManager.name_of_uri u))); - SomeCoercion (CicUtil.term_of_uri u) + (match uri with + None -> NoCoercion + | Some u -> + let c = CicUtil.term_of_uri u in + let arity = arity_of c in + let args = mk_implicits (arity - 1) in + let newt = + match args with + [] -> c + | _ -> Cic.Appl (c::args) + in + SomeCoercion newt) with | CoercDb.EqCarrNotImplemented s -> NotHandled s | CoercDb.EqCarrOnNonMetaClosed -> NotMetaClosed @@ -94,4 +121,21 @@ let target_of t = CoercDb.term_of_carr (snd (CoercDb.get_carr uri)) with Invalid_argument _ -> assert false (* t must be a coercion *) +let generate_dot_file () = + let l = CoercDb.to_list () in + let preamble = " + digraph pippo { + node [fontsize=9, width=.4, height=.4]; + edge [fontsize=10]; + \n" + in + let conclusion = " } \n" in + let data = List.fold_left + (fun acc (src,tgt,c) -> + acc ^ CoercDb.name_of_carr src ^ " -> " ^ + CoercDb.name_of_carr tgt ^ "[label=\"" ^ UriManager.name_of_uri c ^ + "\"];\n") "" l + in + preamble ^ data ^ conclusion + (* EOF *)