]> matita.cs.unibo.it Git - helm.git/blobdiff - components/library/coercDb.ml
COERCIONS: tentative addition of an equivalence relation over coercion source
[helm.git] / components / library / coercDb.ml
index ac57aa40a82b3f4fde03e07e588646ab10f40871..aec6dd5795bb9051adf78ce7336cc5f34cef6193 100644 (file)
@@ -66,9 +66,20 @@ let rec name_of_carr = function
   | Fun i -> "FunClass_" ^ string_of_int i   
 ;;
 
-let eq_carr src tgt =
+let eq_carr ?(exact=false) src tgt =
   match src, tgt with
-  | Uri src, Uri tgt -> UriManager.eq src tgt
+  | Uri src, Uri tgt -> 
+      let coarse_eq = UriManager.eq src tgt in
+      let src_noxpointer = UriManager.strip_xpointer src in
+      if exact && coarse_eq && UriManager.uri_is_ind src_noxpointer then
+        match 
+          fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph src_noxpointer)
+        with
+        | Cic.InductiveDefinition (_,[],m,_) when m = 0 -> true
+        | Cic.Constant _ -> true
+        | _ -> false
+      else
+        coarse_eq
   | Sort (Cic.Type _), Sort (Cic.Type _) -> true
   | Sort src, Sort tgt when src = tgt -> true
   | Term t1, Term t2 ->
@@ -82,6 +93,8 @@ let eq_carr src tgt =
       else raise EqCarrOnNonMetaClosed
   | Fun _,Fun _ -> true (* only one Funclass? *)
 (*   | Fun i,Fun j when i=j -> true *)
+  | Term t, _
+  | _, Term t when not (CicUtil.is_meta_closed t) -> raise EqCarrOnNonMetaClosed
   | _, _ -> false
 ;;
 
@@ -116,12 +129,6 @@ let find_coercion f =
     (HExtlib.filter_map (fun (s,t,l) -> if f (s,t) then Some l else None) !db))
 ;;
 
-let is_a_coercion u = 
-  List.exists 
-    (fun (_,_,xl) -> List.exists (fun (x,_) -> UriManager.eq u x) xl) 
-    !db
-;;
-
 let get_carr uri =
   try
     let src, tgt, _ = 
@@ -133,6 +140,28 @@ let get_carr uri =
   with Not_found -> assert false (* uri must be a coercion *)
 ;;
 
+let is_a_coercion u = 
+  List.exists 
+    (fun (_,_,xl) -> List.exists (fun (x,_) -> UriManager.eq u x) xl) 
+    !db
+;;
+
+let is_a_coercion' t = 
+  try
+    let uri = CicUtil.uri_of_term t in
+     is_a_coercion uri
+  with Invalid_argument _ -> false
+;;
+
+let is_a_coercion_to_funclass t =
+  try
+    let uri = CicUtil.uri_of_term t in
+    match snd (get_carr uri) with
+    | Fun i -> Some i
+    | _ -> None
+  with Invalid_argument _ -> None
+  
+
 let term_of_carr = function
   | Uri u -> CicUtil.term_of_uri u
   | Sort s -> Cic.Sort s