open DisambiguateTypes
open UriManager
-exception NoWellTypedInterpretation of string Lazy.t list
+exception NoWellTypedInterpretation of
+ (Token.flocation option * string Lazy.t) list
exception PathNotWellFormed
(** raised when an environment is not enough informative to decide *)
type 'a test_result =
| Ok of 'a * Cic.metasenv
- | Ko of string Lazy.t
- | Uncertain of string Lazy.t
+ | Ko of Token.flocation option * string Lazy.t
+ | Uncertain of Token.flocation option * string Lazy.t
-let refine_term metasenv context uri term ugraph =
+let refine_term metasenv context uri term ugraph ~localization_tbl =
(* if benchmark then incr actual_refinements; *)
assert (uri=None);
debug_print (lazy (sprintf "TEST_INTERPRETATION: %s" (CicPp.ppterm term)));
try
let term', _, metasenv',ugraph1 =
- CicRefine.type_of_aux' metasenv context term ugraph in
+ CicRefine.type_of_aux' metasenv context term ugraph ~localization_tbl in
(Ok (term', metasenv')),ugraph1
with
- | CicRefine.Uncertain msg ->
- debug_print (lazy ("UNCERTAIN!!! [" ^ (Lazy.force msg) ^ "] " ^ CicPp.ppterm term)) ;
- Uncertain (msg (*lazy ("Uncertain trying to refine: " ^ CicMetaSubst.ppterm_in_context [] term context ^ "\n" ^ Lazy.force msg)*)),ugraph
- | CicRefine.RefineFailure msg ->
- debug_print (lazy (sprintf "PRUNED!!!\nterm%s\nmessage:%s"
- (CicPp.ppterm term) (Lazy.force msg)));
- Ko (msg (*lazy ("Error trying to refine: " ^ CicMetaSubst.ppterm_in_context [] term context ^ "\n" ^ Lazy.force msg)*)),ugraph
+ exn ->
+ let rec process_exn loc =
+ function
+ HExtlib.Localized (loc,exn) -> process_exn (Some loc) exn
+ | CicRefine.Uncertain msg ->
+ debug_print (lazy ("UNCERTAIN!!! [" ^ (Lazy.force msg) ^ "] " ^ CicPp.ppterm term)) ;
+ Uncertain (loc,msg),ugraph
+ | CicRefine.RefineFailure msg ->
+ debug_print (lazy (sprintf "PRUNED!!!\nterm%s\nmessage:%s"
+ (CicPp.ppterm term) (Lazy.force msg)));
+ Ko (loc,msg),ugraph
+ | exn -> raise exn
+ in
+ process_exn None exn
-let refine_obj metasenv context uri obj ugraph =
+let refine_obj metasenv context uri obj ugraph ~localization_tbl =
assert (context = []);
debug_print (lazy (sprintf "TEST_INTERPRETATION: %s" (CicPp.ppobj obj))) ;
try
- let obj', metasenv,ugraph = CicRefine.typecheck metasenv uri obj in
+ let obj', metasenv,ugraph =
+ CicRefine.typecheck metasenv uri obj ~localization_tbl
+ in
(Ok (obj', metasenv)),ugraph
with
- | CicRefine.Uncertain msg ->
- debug_print (lazy ("UNCERTAIN!!! [" ^ (Lazy.force msg) ^ "] " ^ CicPp.ppobj obj)) ;
- Uncertain (msg (*lazy ("Uncertain trying to refine: " ^ CicPp.ppobj obj ^ "\n" ^ Lazy.force msg)*)),ugraph
- | CicRefine.RefineFailure msg ->
- debug_print (lazy (sprintf "PRUNED!!!\nterm%s\nmessage:%s"
- (CicPp.ppobj obj) (Lazy.force msg))) ;
- Ko (msg (*lazy ("Error trying to refine: " ^ CicPp.ppobj obj ^ "\n" ^ Lazy.force msg)*)),ugraph
+ exn ->
+ let rec process_exn loc =
+ function
+ HExtlib.Localized (loc,exn) -> process_exn (Some loc) exn
+ | CicRefine.Uncertain msg ->
+ debug_print (lazy ("UNCERTAIN!!! [" ^ (Lazy.force msg) ^ "] " ^ CicPp.ppobj obj)) ;
+ Uncertain (loc,msg),ugraph
+ | CicRefine.RefineFailure msg ->
+ debug_print (lazy (sprintf "PRUNED!!!\nterm%s\nmessage:%s"
+ (CicPp.ppobj obj) (Lazy.force msg))) ;
+ Ko (loc,msg),ugraph
+ | exn -> raise exn
+ in
+ process_exn None exn
let resolve (env: codomain_item Environment.t) (item: domain_item) ?(num = "") ?(args = []) () =
try
in
aux 1 context
-let interpretate_term ~(context: Cic.name list) ~env ~uri ~is_path ast =
+let interpretate_term ~(context: Cic.name list) ~env ~uri ~is_path ast
+ ~localization_tbl
+=
assert (uri = None);
let rec aux loc (context: Cic.name list) = function
| CicNotationPt.AttributedTerm (`Loc loc, term) ->
- aux loc context term
+ let res = aux loc context term in
+ Cic.CicHash.add localization_tbl res loc;
+ res
| CicNotationPt.AttributedTerm (_, term) -> aux loc context term
| CicNotationPt.Appl (CicNotationPt.Symbol (symb, i) :: args) ->
let cic_args = List.map (aux loc context) args in
| None -> Cic.Implicit annotation
| Some term -> aux loc context term
in
- match ast with
- | CicNotationPt.AttributedTerm (`Loc loc, term) -> aux loc context term
- | term -> aux dummy_floc context term
+ aux dummy_floc context ast
let interpretate_path ~context path =
- interpretate_term ~context ~env:Environment.empty ~uri:None ~is_path:true path
+ let localization_tbl = Cic.CicHash.create 23 in
+ (* here we are throwing away useful localization informations!!! *)
+ fst (
+ interpretate_term ~context ~env:Environment.empty ~uri:None ~is_path:true
+ path ~localization_tbl, localization_tbl)
-let interpretate_obj ~context ~env ~uri ~is_path obj =
+let interpretate_obj ~context ~env ~uri ~is_path obj ~localization_tbl =
assert (context = []);
assert (is_path = false);
+ let interpretate_term = interpretate_term ~localization_tbl in
match obj with
| CicNotationPt.Inductive (params,tyl) ->
let uri = match uri with Some uri -> uri | None -> assert false in
aliases todo_dom
in
try
+ let localization_tbl = Cic.CicHash.create 503 in
let cic_thing =
interpretate_thing ~context:disambiguate_context ~env:filled_env
- ~uri ~is_path:false thing
+ ~uri ~is_path:false thing ~localization_tbl
in
let foo () =
- let k,ugraph1 = refine_thing metasenv context uri cic_thing ugraph in
+ let k,ugraph1 =
+ refine_thing metasenv context uri cic_thing ugraph ~localization_tbl
+ in
(k , ugraph1 )
in refine_profiler.HExtlib.profile foo ()
with
- | Try_again msg -> Uncertain msg, ugraph
- | Invalid_choice msg -> Ko msg, ugraph
+ | Try_again msg -> Uncertain (None,msg), ugraph
+ | Invalid_choice msg -> Ko (None,msg), ugraph
in
(* (4) build all possible interpretations *)
let (@@) (l1,l2) (l1',l2') = l1@l1', l2@l2' in
(match test_env aliases [] base_univ with
| Ok (thing, metasenv),new_univ ->
[ aliases, diff, metasenv, thing, new_univ ], []
- | Ko msg,_ | Uncertain msg,_ -> [],[msg])
+ | Ko (loc,msg),_ | Uncertain (loc,msg),_ -> [],[loc,msg])
| item :: remaining_dom ->
debug_print (lazy (sprintf "CHOOSED ITEM: %s"
(string_of_domain_item item)));
None -> lookup_choices item
| Some choices -> choices in
match choices with
- [] -> [], [lazy ("No choices for " ^ string_of_domain_item item)]
+ [] ->
+ [], [None,lazy ("No choices for " ^ string_of_domain_item item)]
| [codomain_item] ->
(* just one choice. We perform a one-step look-up and
if the next set of choices is also a singleton we
| _ ->
aux new_env new_diff lookup_in_todo_dom
remaining_dom new_univ)
- | Uncertain msg,new_univ ->
+ | Uncertain (loc,msg),new_univ ->
(match remaining_dom with
- | [] -> [], [msg]
+ | [] -> [], [loc,msg]
| _ ->
aux new_env new_diff lookup_in_todo_dom
remaining_dom new_univ)
- | Ko msg,_ -> [], [msg])
+ | Ko (loc,msg),_ -> [], [loc,msg])
| _::_ ->
let rec filter univ = function
| [] -> [],[]
| _ -> aux new_env new_diff None remaining_dom new_univ
) @@
filter univ tl
- | Uncertain msg,new_univ ->
+ | Uncertain (loc,msg),new_univ ->
(match remaining_dom with
- | [] -> [],[msg]
+ | [] -> [],[loc,msg]
| _ -> aux new_env new_diff None remaining_dom new_univ
) @@
filter univ tl
- | Ko msg,_ -> ([],[msg]) @@ filter univ tl)
+ | Ko (loc,msg),_ -> ([],[loc,msg]) @@ filter univ tl)
in
filter base_univ choices
in
| (CicUnification.Uncertain msg) -> raise (Uncertain msg)
;;
-let enrich f =
- function
- RefineFailure msg -> raise (RefineFailure (f msg))
- | Uncertain msg -> raise (Uncertain (f msg))
- | _ -> assert false
+let enrich loc f exn =
+ let exn' =
+ match exn with
+ RefineFailure msg -> RefineFailure (f msg)
+ | Uncertain msg -> Uncertain (f msg)
+ | _ -> assert false
+ in
+ match loc with
+ None -> raise exn'
+ | Some loc -> raise (HExtlib.Localized (loc,exn'))
+
+let relocalize localization_tbl oldt newt =
+ try
+ let infos = Cic.CicHash.find localization_tbl oldt in
+ Cic.CicHash.remove localization_tbl oldt;
+ Cic.CicHash.add localization_tbl newt infos;
+ with
+ Not_found -> ()
+;;
let rec split l n =
match (l,n) with
| (_,_) -> raise (AssertFailure (lazy "split: list too short"))
;;
-let exp_impl metasenv subst context term =
- let rec aux metasenv context = function
- | (Cic.Rel _) as t -> metasenv, t
- | (Cic.Sort _) as t -> metasenv, t
- | Cic.Const (uri, subst) ->
- let metasenv', subst' = do_subst metasenv context subst in
- metasenv', Cic.Const (uri, subst')
- | Cic.Var (uri, subst) ->
- let metasenv', subst' = do_subst metasenv context subst in
- metasenv', Cic.Var (uri, subst')
- | Cic.MutInd (uri, i, subst) ->
- let metasenv', subst' = do_subst metasenv context subst in
- metasenv', Cic.MutInd (uri, i, subst')
- | Cic.MutConstruct (uri, i, j, subst) ->
- let metasenv', subst' = do_subst metasenv context subst in
- metasenv', Cic.MutConstruct (uri, i, j, subst')
- | Cic.Meta (n,l) ->
- let metasenv', l' = do_local_context metasenv context l in
- metasenv', Cic.Meta (n, l')
- | Cic.Implicit (Some `Type) ->
+let exp_impl metasenv subst context =
+ function
+ | Some `Type ->
let (metasenv', idx) = CicMkImplicit.mk_implicit_type metasenv subst context in
let irl = CicMkImplicit.identity_relocation_list_for_metavariable context in
metasenv', Cic.Meta (idx, irl)
- | Cic.Implicit (Some `Closed) ->
+ | Some `Closed ->
let (metasenv', idx) = CicMkImplicit.mk_implicit metasenv subst [] in
metasenv', Cic.Meta (idx, [])
- | Cic.Implicit None ->
+ | None ->
let (metasenv', idx) = CicMkImplicit.mk_implicit metasenv subst context in
let irl = CicMkImplicit.identity_relocation_list_for_metavariable context in
metasenv', Cic.Meta (idx, irl)
- | Cic.Implicit _ -> assert false
- | Cic.Cast (te, ty) ->
- let metasenv', ty' = aux metasenv context ty in
- let metasenv'', te' = aux metasenv' context te in
- metasenv'', Cic.Cast (te', ty')
- | Cic.Prod (name, s, t) ->
- let metasenv', s' = aux metasenv context s in
- metasenv', Cic.Prod (name, s', t)
- | Cic.Lambda (name, s, t) ->
- let metasenv', s' = aux metasenv context s in
- metasenv', Cic.Lambda (name, s', t)
- | Cic.LetIn (name, s, t) ->
- let metasenv', s' = aux metasenv context s in
- metasenv', Cic.LetIn (name, s', t)
- | Cic.Appl l when List.length l > 1 ->
- let metasenv', l' =
- List.fold_right
- (fun term (metasenv, terms) ->
- let new_metasenv, term = aux metasenv context term in
- new_metasenv, term :: terms)
- l (metasenv, [])
- in
- metasenv', Cic.Appl l'
- | Cic.Appl _ -> assert false
- | Cic.MutCase (uri, i, outtype, term, patterns) ->
- let metasenv', l' =
- List.fold_right
- (fun term (metasenv, terms) ->
- let new_metasenv, term = aux metasenv context term in
- new_metasenv, term :: terms)
- (outtype :: term :: patterns) (metasenv, [])
- in
- let outtype', term', patterns' =
- match l' with
- | outtype' :: term' :: patterns' -> outtype', term', patterns'
- | _ -> assert false
- in
- metasenv', Cic.MutCase (uri, i, outtype', term', patterns')
- | Cic.Fix (i, funs) ->
- let metasenv', types =
- List.fold_right
- (fun (name, _, typ, _) (metasenv, types) ->
- let new_metasenv, new_type = aux metasenv context typ in
- (new_metasenv, (name, new_type) :: types))
- funs (metasenv, [])
- in
- let rec combine = function
- | ((name, index, _, body) :: funs_tl),
- ((_, typ) :: typ_tl) ->
- (name, index, typ, body) :: combine (funs_tl, typ_tl)
- | [], [] -> []
- | _ -> assert false
- in
- let funs' = combine (funs, types) in
- metasenv', Cic.Fix (i, funs')
- | Cic.CoFix (i, funs) ->
- let metasenv', types =
- List.fold_right
- (fun (name, typ, _) (metasenv, types) ->
- let new_metasenv, new_type = aux metasenv context typ in
- (new_metasenv, (name, new_type) :: types))
- funs (metasenv, [])
- in
- let rec combine = function
- | ((name, _, body) :: funs_tl),
- ((_, typ) :: typ_tl) ->
- (name, typ, body) :: combine (funs_tl, typ_tl)
- | [], [] -> []
- | _ -> assert false
- in
- let funs' = combine (funs, types) in
- metasenv', Cic.CoFix (i, funs')
- and do_subst metasenv context subst =
- List.fold_right
- (fun (uri, term) (metasenv, substs) ->
- let metasenv', term' = aux metasenv context term in
- (metasenv', (uri, term') :: substs))
- subst (metasenv, [])
- and do_local_context metasenv context local_context =
- List.fold_right
- (fun term (metasenv, local_context) ->
- let metasenv', term' =
- match term with
- | None -> metasenv, None
- | Some term ->
- let metasenv', term' = aux metasenv context term in
- metasenv', Some term'
- in
- metasenv', term' :: local_context)
- local_context (metasenv, [])
- in
- aux metasenv context term
+ | _ -> assert false
;;
let rec type_of_constant uri ugraph =
| _ -> raise (AssertFailure (lazy "Wrong number of arguments")))
| _ -> raise (AssertFailure (lazy "Prod or MutInd expected"))
-and type_of_aux' metasenv context t ugraph =
- let metasenv, t = exp_impl metasenv [] context t in
+and type_of_aux' ?(localization_tbl = Cic.CicHash.create 1) metasenv context t
+ ugraph
+=
let rec type_of_aux subst metasenv context t ugraph =
let module C = Cic in
let module S = CicSubstitution in
t,(C.Sort (C.Type tno')),subst,metasenv,ugraph1
| C.Sort _ ->
t,C.Sort (C.Type (CicUniv.fresh())),subst,metasenv,ugraph
- | C.Implicit _ -> raise (AssertFailure (lazy "21"))
+ | C.Implicit infos ->
+ let metasenv',t' = exp_impl metasenv subst context infos in
+ type_of_aux subst metasenv' context t' ugraph
| C.Cast (te,ty) ->
let ty',_,subst',metasenv',ugraph1 =
type_of_aux subst metasenv context ty ugraph
s' sort1 subst' context metasenv' ugraph1
in
let context_for_t = ((Some (name,(C.Decl s')))::context) in
- let metasenv',t = exp_impl metasenv' subst' context_for_t t in
let t',sort2,subst'',metasenv'',ugraph2 =
type_of_aux subst' metasenv'
context_for_t t ugraph1
"Not well-typed lambda-abstraction: the source %s should be a type; instead it is a term of type %s" (CicPp.ppterm s) (CicPp.ppterm sort1))))
in
let context_for_t = ((Some (n,(C.Decl s')))::context) in
- let metasenv',t = exp_impl metasenv' subst' context_for_t t in
let t',type2,subst'',metasenv'',ugraph2 =
type_of_aux subst' metasenv' context_for_t t ugraph1
in
type_of_aux subst metasenv context s ugraph
in
let context_for_t = ((Some (n,(C.Def (s',Some ty))))::context) in
- let metasenv',t = exp_impl metasenv' subst' context_for_t t in
let t',inferredty,subst'',metasenv'',ugraph2 =
type_of_aux subst' metasenv'
let x',ty,subst',metasenv',ugraph1 =
type_of_aux subst metasenv context x ugraph
in
- (x', ty)::res,subst',metasenv',ugraph1
+ relocalize localization_tbl x x';
+ (x', ty)::res,subst',metasenv',ugraph1
) tl ([],subst',metasenv',ugraph1)
in
let tl',applty,subst''',metasenv''',ugraph3 =
- try
eat_prods true subst'' metasenv'' context
hetype tlbody_and_type ugraph2
- with
- exn ->
- enrich
- (fun msg ->
- lazy ("The application " ^
- CicMetaSubst.ppterm_in_context subst'' t context ^
- " is not well typed:\n" ^ Lazy.force msg)) exn
in
C.Appl (he'::tl'), applty,subst''',metasenv''',ugraph3
| C.Appl _ -> raise (RefineFailure (lazy "Appl: no arguments"))
let fl_bo',subst,metasenv,ugraph2 =
List.fold_left
(fun (fl,subst,metasenv,ugraph) ((name,x,_,bo),ty) ->
- let metasenv, bo = exp_impl metasenv subst context' bo in
let bo',ty_of_bo,subst,metasenv,ugraph1 =
type_of_aux subst metasenv context' bo ugraph
in
let fl_bo',subst,metasenv,ugraph2 =
List.fold_left
(fun (fl,subst,metasenv,ugraph) ((name,_,bo),ty) ->
- let metasenv, bo = exp_impl metasenv subst context' bo in
let bo',ty_of_bo,subst,metasenv,ugraph1 =
type_of_aux subst metasenv context' bo ugraph
in
CicMetaSubst.ppterm_in_context subst s context
(* "\nReason: " ^ Lazy.force e*))
in
- enrich msg exn
+ enrich
+ (try Some (Cic.CicHash.find localization_tbl hete) with Not_found -> prerr_endline ("!!! NOT LOCALIZED: " ^ CicPp.ppterm hete); None)
+ msg exn
| CoercGraph.NotMetaClosed ->
raise (Uncertain (lazy "Coercions on meta"))
| CoercGraph.SomeCoercion c ->
(cleaned_t,cleaned_ty,cleaned_metasenv,ugraph1)
;;
-let type_of_aux' metasenv context term ugraph =
+let type_of_aux' ?localization_tbl metasenv context term ugraph =
try
- type_of_aux' metasenv context term ugraph
+ type_of_aux' ?localization_tbl metasenv context term ugraph
with
CicUniv.UniverseInconsistency msg -> raise (RefineFailure (lazy msg))
in
metasenv,ugraph,substituted_tys
-let typecheck metasenv uri obj =
+let typecheck metasenv uri obj ~localization_tbl =
let ugraph = CicUniv.empty_ugraph in
match obj with
Cic.Constant (name,Some bo,ty,args,attrs) ->
- let bo',boty,metasenv,ugraph = type_of_aux' metasenv [] bo ugraph in
- let ty',_,metasenv,ugraph = type_of_aux' metasenv [] ty ugraph in
+ let bo',boty,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] bo ugraph in
+ let ty',_,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] ty ugraph in
let subst,metasenv,ugraph = fo_unif_subst [] [] metasenv boty ty' ugraph in
let bo' = CicMetaSubst.apply_subst subst bo' in
let ty' = CicMetaSubst.apply_subst subst ty' in
let metasenv = CicMetaSubst.apply_subst_metasenv subst metasenv in
Cic.Constant (name,Some bo',ty',args,attrs),metasenv,ugraph
| Cic.Constant (name,None,ty,args,attrs) ->
- let ty',_,metasenv,ugraph = type_of_aux' metasenv [] ty ugraph in
+ let ty',_,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] ty ugraph
+ in
Cic.Constant (name,None,ty',args,attrs),metasenv,ugraph
| Cic.CurrentProof (name,metasenv',bo,ty,args,attrs) ->
assert (metasenv' = metasenv);
(* Here we do not check the metasenv for correctness *)
- let bo',boty,metasenv,ugraph = type_of_aux' metasenv [] bo ugraph in
- let ty',sort,metasenv,ugraph = type_of_aux' metasenv [] ty ugraph in
+ let bo',boty,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] bo ugraph in
+ let ty',sort,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] ty ugraph in
begin
match sort with
Cic.Sort _
let metasenv,ugraph,tys =
List.fold_right
(fun (name,b,ty,cl) (metasenv,ugraph,res) ->
- let ty',_,metasenv,ugraph = type_of_aux' metasenv [] ty ugraph in
+ let ty',_,metasenv,ugraph =
+ type_of_aux' ~localization_tbl metasenv [] ty ugraph
+ in
metasenv,ugraph,(name,b,ty',cl)::res
) tys (metasenv,ugraph,[]) in
let con_context =
(fun (name,ty) (metasenv,ugraph,res) ->
let ty = CicTypeChecker.debrujin_constructor uri typesno ty in
let ty',_,metasenv,ugraph =
- type_of_aux' metasenv con_context ty ugraph in
+ type_of_aux' ~localization_tbl metasenv con_context ty ugraph in
let ty' = undebrujin uri typesno tys ty' in
metasenv,ugraph,(name,ty')::res
) cl (metasenv,ugraph,[])
let profiler2 = HExtlib.profile "CicRefine"
-let type_of_aux' metasenv context term ugraph =
- profiler2.HExtlib.profile (type_of_aux' metasenv context term) ugraph
+let type_of_aux' ?localization_tbl metasenv context term ugraph =
+ profiler2.HExtlib.profile
+ (type_of_aux' ?localization_tbl metasenv context term) ugraph
-let typecheck metasenv uri obj =
- profiler2.HExtlib.profile (typecheck metasenv uri) obj
+let typecheck ~localization_tbl metasenv uri obj =
+ profiler2.HExtlib.profile (typecheck ~localization_tbl metasenv uri) obj