X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=matitaB%2Fcomponents%2Fng_disambiguation%2FgrafiteDisambiguate.ml;h=b1dc98a1e23e46cde8c3e265fed0061327a2af2b;hb=0e3d8e00433a9a4dd72310c1e889814848a96c10;hp=30bd9b83497417ef9e3737827620de485e3b0ba2;hpb=6c702f5054d7975f76911ba62da9bfa33d3ed0fa;p=helm.git diff --git a/matitaB/components/ng_disambiguation/grafiteDisambiguate.ml b/matitaB/components/ng_disambiguation/grafiteDisambiguate.ml index 30bd9b834..b1dc98a1e 100644 --- a/matitaB/components/ng_disambiguation/grafiteDisambiguate.ml +++ b/matitaB/components/ng_disambiguation/grafiteDisambiguate.ml @@ -48,18 +48,24 @@ let initial_status = { class type g_status = object inherit Interpretations.g_status + inherit NCicLibrary.g_status method disambiguate_db: db end class virtual status uid = object (self) inherit Interpretations.status uid + inherit NCicLibrary.status uid val disambiguate_db = initial_status method disambiguate_db = disambiguate_db method set_disambiguate_db v = {< disambiguate_db = v >} + method reset_disambiguate_db () = + {< disambiguate_db = { self#disambiguate_db with interpr = + DisambiguateTypes.InterprEnv.empty } >} method set_disambiguate_status : 'status. #g_status as 'status -> 'self - = fun o -> ((self#set_interp_status o)#set_disambiguate_db o#disambiguate_db) + = fun o -> ((self#set_interp_status o)#set_disambiguate_db + o#disambiguate_db)#set_lib_status o end (* let eval_with_new_aliases status f = @@ -70,6 +76,9 @@ class virtual status uid = new_aliases,res ;;*) +(* reports the first source of ambiguity and its possible interpretations *) +exception Ambiguous_input of (Stdpp.location * GrafiteAst.alias_spec list) + let dump_aliases out msg status = out (if msg = "" then "aliases dump:" else msg ^ ": aliases dump:"); DisambiguateTypes.InterprEnv.iter (fun _ x -> out (GrafiteAstPp.pp_alias x)) @@ -101,15 +110,6 @@ let add_to_disambiguation_univ status new_aliases = exception BaseUriNotSetYet -let singleton msg = function - | [x], _ -> x - | l, _ -> - let debug = - Printf.sprintf "GrafiteDisambiguate.singleton (%s): %u interpretations" - msg (List.length l) - in - prerr_endline debug; assert false - let __Implicit = "__Implicit__" let __Closed_Implicit = "__Closed_Implicit__" @@ -155,13 +155,13 @@ let mk_implicit b = GrafiteAst.Symbol_alias (__Closed_Implicit,None,"Fake Closed Implicit") ;; -let nlookup_in_library +let nlookup_in_library status interactive_user_uri_choice input_or_locate_uri item = match item with | DisambiguateTypes.Id id -> (try - let references = NCicLibrary.resolve id in + let references = NCicLibrary.resolve status id in List.map (fun u -> GrafiteAst.Ident_alias (id,NReference.string_of_reference u) @@ -291,29 +291,50 @@ let diff_obj loc o1 o2 = match o1,o2 with | _ -> assert false ;; +(* this function, called on a list of choices that must + * be different, never fails and returns the location of + * the first ambiguity (and its possible interpretations) *) +let rec find_diffs l = + let loc,_ = List.hd (List.hd l) in + let hds = List.map (fun x -> snd (List.hd x)) l in + let uniq_hds = HExtlib.list_uniq hds in + + if List.length uniq_hds > 1 + then loc, uniq_hds + else + let tls = List.map List.tl l in + find_diffs tls +;; + let disambiguate_nterm status expty context metasenv subst thing = - let newast, metasenv, subst, cic = - singleton "first" - (NCicDisambiguate.disambiguate_term + let choices, _ = NCicDisambiguate.disambiguate_term status ~aliases:status#disambiguate_db.interpr ~expty ~universe:(status#disambiguate_db.multi_aliases) - ~lookup_in_library:nlookup_in_library + ~lookup_in_library:(nlookup_in_library status) ~mk_choice:(ncic_mk_choice status) ~mk_implicit ~fix_instance ~description_of_alias:GrafiteAst.description_of_alias - ~context ~metasenv ~subst thing) + ~context ~metasenv ~subst thing in let _,_,thing' = thing in - let diff = diff_term Stdpp.dummy_loc thing' newast in - let status = add_to_interpr status diff - in - metasenv, subst, status, cic + match choices with + | [newast, metasenv, subst, cic] -> + let diff = diff_term Stdpp.dummy_loc thing' newast in + let status = add_to_interpr status diff + in + metasenv, subst, status, cic + | [] -> assert false + | _ -> + let diffs = + List.map (fun (ast,_,_,_) -> + diff_term Stdpp.dummy_loc thing' ast) choices + in + raise (Ambiguous_input (find_diffs diffs)) ;; - type pattern = NotationPt.term Disambiguate.disambiguator_input option * (string * NCic.term) list * NCic.term option @@ -361,7 +382,7 @@ let disambiguate_just disambiguate_term context metasenv = metasenv, `Auto params ;; -let disambiguate_nobj status ?baseuri (text,prefix_len,obj) = +let disambiguate_nobj status ?baseuri (text,prefix_len,obj as obj') = let uri = let baseuri = match baseuri with Some x -> x | None -> raise BaseUriNotSetYet @@ -375,21 +396,30 @@ let disambiguate_nobj status ?baseuri (text,prefix_len,obj) = in NUri.uri_of_string (baseuri ^ "/" ^ name) in - let ast, _, _, cic = - singleton "third" - (NCicDisambiguate.disambiguate_obj + + let choices, _ = NCicDisambiguate.disambiguate_obj status - ~lookup_in_library:nlookup_in_library + ~lookup_in_library:(nlookup_in_library status) ~description_of_alias:GrafiteAst.description_of_alias ~mk_choice:(ncic_mk_choice status) ~mk_implicit ~fix_instance ~uri ~aliases:status#disambiguate_db.interpr ~universe:(status#disambiguate_db.multi_aliases) - (text,prefix_len,obj)) in - let diff = diff_obj Stdpp.dummy_loc obj ast in - let status = add_to_interpr status diff + obj' in - status, cic + match choices with + | [ast, _, _, cic] -> + let diff = diff_obj Stdpp.dummy_loc obj ast in + let status = add_to_interpr status diff + in + status, cic + | [] -> assert false + | _ -> + let diffs = + List.map (fun (ast,_,_,_) -> + diff_obj Stdpp.dummy_loc obj ast) choices + in + raise (Ambiguous_input (find_diffs diffs)) ;; let disambiguate_cic_appl_pattern status args = @@ -432,7 +462,7 @@ let aliases_for_objs status refs = List.concat (List.map (fun nref -> - let references = NCicLibrary.aliases_of nref in + let references = NCicLibrary.aliases_of status nref in List.map (fun u -> let name = NCicPp.r2s status true u in