NCicSubstitution.subst (NCic.Meta (-1,(0,NCic.Irl 0))) t
| _ -> assert false)
pair' context in
+ prerr_endline ("INDEXING: " ^
+ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] src ^ " |==> " ^
+ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] data);
DB.index hdb src data
;;
let empty_db = DB.empty ;;
+let user_db = ref empty_db ;;
+
+let add_user_provided_hint t =
+ let u = UriManager.uri_of_string "cic:/foo/bar.con" in
+ let c, a, b =
+ let rec aux ctx = function
+ | NCic.Appl l ->
+ (match List.rev l with
+ | b::a::_ -> ctx, a, b
+ | _ -> assert false)
+ | NCic.Prod (n,s,t) ->
+ aux ((n, NCic.Decl s) :: ctx) t
+ | _ -> assert false
+ in
+ aux [] (fst (OCic2NCic.convert_term u t))
+ in
+ user_db := index_hint !user_db c a b
+;;
+
let db () =
- let _,_,_,x,_,_ = NCicEnvironment.get_checked_def
- (NReference.reference_of_string "cic:/matita/tests/pullback/xxx.def(0)")
+ let combine f cmp l1 l2 =
+ List.flatten
+ (List.map
+ (fun u1 ->
+ HExtlib.filter_map
+ (fun u2 -> if cmp u1 u2 then None else Some (f u1 u2)) l2)
+ l1)
in
- let rec decontextualize ctx = function
- | NCic.Prod (n,s,t) -> decontextualize ((n,NCic.Decl s)::ctx) t
- | t -> ctx, t
+ let mk_hint (u1,_,_) (u2,_,_) =
+ let l = OCic2NCic.convert_obj u1
+ (fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph u1)) in
+ let r = OCic2NCic.convert_obj u2
+ (fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph u2)) in
+ match List.hd l,List.hd r with
+ | (_,_,_,_,NCic.Constant (_,_,Some l,_,_)),
+ (_,_,_,_,NCic.Constant (_,_,Some r,_,_)) ->
+ let rec aux ctx t1 t2 =
+ match t1, t2 with
+ | NCic.Lambda (n1,s1,b1), NCic.Lambda(_,s2,b2) ->
+ if NCicReduction.are_convertible ~subst:[] ~metasenv:[] ctx s1 s2
+ then aux ((n1, NCic.Decl s1) :: ctx) b1 b2
+ else None
+ | b1,b2 ->
+ if NCicReduction.are_convertible ~subst:[] ~metasenv:[] ctx b1 b2
+ then begin
+(*
+ prerr_endline ("hint: " ^ NCicPp.ppterm ~metasenv:[] ~subst:[]
+ ~context:ctx b1 ^ " === " ^ NCicPp.ppterm ~metasenv:[]
+ ~subst:[] ~context:ctx b2);
+*)
+ Some (ctx,b1,b2)
+ end else None
+ in
+ aux [] l r
+ | _ -> None
+ in
+ let hints =
+ List.fold_left
+ (fun acc (_,_,l) ->
+ acc @
+ if List.length l > 1 then
+ combine mk_hint (fun (u1,_,_) (u2,_,_) -> UriManager.eq u1 u2) l l
+ else [])
+ [] (CoercDb.to_list ())
in
- match (decontextualize [] x) with
- | ctx, NCic.Appl [_;_;a;b] -> index_hint empty_db ctx a b
- | _ -> assert false
+ List.fold_left
+ (fun db -> function
+ | None -> db
+ | Some (ctx,b1,b2) -> index_hint db ctx b1 b2)
+ !user_db hints
;;