X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_disambiguation%2FdisambiguateChoices.ml;h=b7f2410366dbf783059c0449ba2b068087d58862;hb=97c2d258a5c524eb5c4b85208899d80751a2c82f;hp=aa203f8be3c4b9e6ac01c0673d8cd9c29cd364c4;hpb=6459acbd4bb69475cfaa0b37a9771ced94193667;p=helm.git diff --git a/helm/ocaml/cic_disambiguation/disambiguateChoices.ml b/helm/ocaml/cic_disambiguation/disambiguateChoices.ml index aa203f8be..b7f241036 100644 --- a/helm/ocaml/cic_disambiguation/disambiguateChoices.ml +++ b/helm/ocaml/cic_disambiguation/disambiguateChoices.ml @@ -27,39 +27,41 @@ open Printf open DisambiguateTypes -exception Invalid_choice -exception Choice_not_found of string +exception Choice_not_found of string Lazy.t -let symbol_choices = Hashtbl.create 1023 let num_choices = ref [] -let add_symbol_choice symbol codomain_item = - let current_choices = - try - Hashtbl.find symbol_choices symbol - with Not_found -> [] - in - Hashtbl.replace symbol_choices symbol (codomain_item :: current_choices) - let add_num_choice choice = num_choices := choice :: !num_choices -let lookup_symbol_choices symbol = - try - Hashtbl.find symbol_choices symbol - with Not_found -> [] - -let lookup_num_choices () = !num_choices - let has_description dsc = (fun x -> fst x = dsc) -let lookup_symbol_by_dsc symb dsc = - try - List.find (has_description dsc) (Hashtbl.find symbol_choices symb) - with Not_found -> - raise (Choice_not_found (sprintf "Symbol %s, dsc %s" symb dsc)) +let lookup_num_choices () = !num_choices let lookup_num_by_dsc dsc = try List.find (has_description dsc) !num_choices - with Not_found -> raise (Choice_not_found ("Num with dsc " ^ dsc)) + with Not_found -> raise (Choice_not_found (lazy ("Num with dsc " ^ dsc))) + +let mk_choice (dsc, args, appl_pattern) = + dsc, + (fun env _ cic_args -> + let env' = + let names = + List.map (function CicNotationPt.IdentArg (_, name) -> name) args + in + try + List.combine names cic_args + with Invalid_argument _ -> + raise (Invalid_choice (lazy "The notation expects a different number of arguments")) + in + CicNotationFwd.instantiate_appl_pattern env' appl_pattern) + +let lookup_symbol_by_dsc symbol dsc = + try + mk_choice + (List.find + (fun (dsc', _, _) -> dsc = dsc') + (CicNotationRew.lookup_interpretations symbol)) + with CicNotationRew.Interpretation_not_found | Not_found -> + raise (Choice_not_found (lazy (sprintf "Symbol %s, dsc %s" symbol dsc)))