X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_unification%2FcoercGraph.ml;h=57274e616446b3dab7b416c8db8f71f3aace8441;hb=e5014674aed0dab6f3aa43773c8caeffcfe0ac32;hp=00cfa90daea8859fadec8266f1f7946508060b9e;hpb=46f19eadce5f3a11c0ae26934fd8d1b597906416;p=helm.git diff --git a/helm/ocaml/cic_unification/coercGraph.ml b/helm/ocaml/cic_unification/coercGraph.ml index 00cfa90da..57274e616 100644 --- a/helm/ocaml/cic_unification/coercGraph.ml +++ b/helm/ocaml/cic_unification/coercGraph.ml @@ -25,49 +25,30 @@ open Printf;; -let debug_print = fun _ -> () - -type coercions = (UriManager.uri * UriManager.uri * UriManager.uri) list - -(* the list of known coercions (MUST be transitively closed) *) -let coercions = ref [ - (UriManager.uri_of_string "cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1)", - UriManager.uri_of_string "cic:/Coq/Reals/Rdefinitions/R.con", - UriManager.uri_of_string "cic:/Coq/Reals/Raxioms/INR.con") ; - - ( - UriManager.uri_of_string "cic:/CoRN/algebra/CFields/CField.ind#xpointer(1/1)", - UriManager.uri_of_string "cic:/CoRN/algebra/CRings/CRing.ind#xpointer(1/1)", - UriManager.uri_of_string "cic:/CoRN/algebra/CFields/cf_crr.con" - - ); - ( - UriManager.uri_of_string "cic:/CoRN/algebra/CAbGroups/CAbGroup.ind#xpointer(1/1)", - UriManager.uri_of_string "cic:/CoRN/algebra/CGroups/CGroup.ind#xpointer(1/1)", - UriManager.uri_of_string "cic:/CoRN/algebra/CAbGroups/cag_crr.con" - - ); - -] -;; +let debug = false +let debug_print = if debug then prerr_endline else ignore (* searches a coercion fron src to tgt in the !coercions list *) let look_for_coercion src tgt = - try - let s,t,u = - List.find (fun (s,t,_) -> - UriManager.eq s src && - UriManager.eq t tgt) - !coercions - in - debug_print (sprintf ":) TROVATA la coercion %s %s" - (UriManager.name_of_uri src) - (UriManager.name_of_uri tgt)); - Some (CicUtil.term_of_uri (UriManager.string_of_uri u)) - with - Not_found -> - debug_print (sprintf ":( NON TROVATA la coercion %s %s" - (UriManager.name_of_uri src) (UriManager.name_of_uri tgt)); + try + let src = CicUtil.uri_of_term src in + let tgt = CicUtil.uri_of_term tgt in + let l = + CoercDb.find_coercion + (fun (s,t) -> UriManager.eq s src && UriManager.eq t tgt) + in + match l with + | [] -> debug_print ":( coercion non trovata"; None + | u::_ -> + debug_print ( + sprintf ":) TROVATE %d coercion(s) da %s a %s, prendo la prima: %s" + (List.length l) + (UriManager.name_of_uri src) + (UriManager.name_of_uri tgt) + (UriManager.name_of_uri u)); + Some (CicUtil.term_of_uri u) + with Invalid_argument s -> + debug_print (":( coercion non trovata (fallita la uri_of_term): " ^ s); None ;; @@ -75,17 +56,9 @@ let look_for_coercion src tgt = * of new coercions to create. hte list elements are * (source, list of coercions to follow, target) *) -let get_closure_coercions src tgt uri = - let c_from_tgt = - List.filter (fun (f,_,_) -> - UriManager.eq f tgt) - !coercions - in - let c_to_src = - List.filter (fun (_,t,_) -> - UriManager.eq t src) - !coercions - in +let get_closure_coercions src tgt uri coercions = + let c_from_tgt = List.filter (fun (f,_,_) -> UriManager.eq f tgt) coercions in + let c_to_src = List.filter (fun (_,t,_) -> UriManager.eq t src) coercions in (List.map (fun (_,t,u) -> src,[uri; u],t) c_from_tgt) @ (List.map (fun (s,_,u) -> s,[u; uri],tgt) c_to_src) @ (List.fold_left ( @@ -136,13 +109,13 @@ let generate_composite_closure c1 c2 univ = ;; (* removes from l the coercions that are in !coercions *) -let filter_duplicates l = +let filter_duplicates l coercions = List.filter ( fun (src,_,tgt) -> not (List.exists (fun (s,t,u) -> UriManager.eq s src && UriManager.eq t tgt) - !coercions)) + coercions)) l (* given a new coercion uri from src to tgt returns @@ -150,8 +123,9 @@ let filter_duplicates l = *) let close_coercion_graph src tgt uri = (* check if the coercion already exists *) - let todo_list = get_closure_coercions src tgt uri in - let todo_list = filter_duplicates todo_list in + let coercions = CoercDb.to_list () in + let todo_list = get_closure_coercions src tgt uri coercions in + let todo_list = filter_duplicates todo_list coercions in let new_coercions, new_coercions_obj = List.split ( List.map ( @@ -159,9 +133,7 @@ let close_coercion_graph src tgt uri = match l with | [] -> assert false | he :: tl -> - let term_of_uri' uri = - CicUtil.term_of_uri (UriManager.string_of_uri uri) - in + let term_of_uri' uri = CicUtil.term_of_uri uri in let first_step = Cic.Constant ("", Some (term_of_uri' he), Cic.Sort Cic.Prop, [], obj_attrs) @@ -190,12 +162,8 @@ let close_coercion_graph src tgt uri = ((src,tgt,c_uri),(c_uri,named_obj,u)) ) todo_list) in - coercions := !coercions @ new_coercions @ [src,tgt,uri]; + List.iter CoercDb.add_coercion (new_coercions @ [src,tgt,uri]); new_coercions_obj ;; -let get_coercions_list () = - !coercions - - (* EOF *)