new_coercions_obj
;;
+let coercion_hashtbl = UriManager.UriHashtbl.create 3
+
+let add_coercion ~basedir ~add_composites uri =
+ let coer_ty,_ =
+ CicTypeChecker.type_of_aux' [] [] (CicUtil.term_of_uri uri)
+ CicUniv.empty_ugraph
+ in
+ (* we have to get the source and the tgt type uri
+ * in Coq syntax we have already their names, but
+ * since we don't support Funclass and similar I think
+ * all the coercion should be of the form
+ * (A:?)(B:?)T1->T2
+ * So we should be able to extract them from the coercion type
+ *)
+ let extract_last_two_p ty =
+ let rec aux = function
+ | Cic.Prod( _, src, Cic.Prod (n,t1,t2)) -> aux (Cic.Prod(n,t1,t2))
+ | Cic.Prod( _, src, tgt) -> src, tgt
+ | _ -> assert false
+ in
+ aux ty
+ in
+ let ty_src,ty_tgt = extract_last_two_p coer_ty in
+ let src_uri = CoercDb.coerc_carr_of_term (CicReduction.whd [] ty_src) in
+ let tgt_uri = CoercDb.coerc_carr_of_term (CicReduction.whd [] ty_tgt) in
+ let new_coercions = close_coercion_graph src_uri tgt_uri uri in
+ let uris = ref [] in
+ if add_composites then
+ try
+ let lemmas =
+ List.fold_left
+ (fun lemmas (uri,o,_) ->
+ let lemmas' = LibrarySync.add_obj ~basedir uri o in
+ uris := uri :: !uris;
+ uri::lemmas'@lemmas
+ ) [] new_coercions;
+ in
+ UriManager.UriHashtbl.add coercion_hashtbl uri !uris;
+ lemmas
+ with
+ exn ->
+ List.iter LibrarySync.remove_obj !uris;
+ raise exn
+ else
+ []
+
+let remove_coercion uri =
+ let uris =
+ try
+ let res = UriManager.UriHashtbl.find coercion_hashtbl uri in
+ UriManager.UriHashtbl.remove coercion_hashtbl uri;
+ res
+ with
+ Not_found -> assert false
+ in
+ List.iter LibrarySync.remove_obj uris
+
(* EOF *)