]> matita.cs.unibo.it Git - helm.git/blobdiff - components/grafite_parser/grafiteDisambiguator.ml
compose tactic restore and added nocomposites keyword
[helm.git] / components / grafite_parser / grafiteDisambiguator.ml
index 2803c88f6add6484bbf1ca31da4c658d5aa1fd21..8827e709b42328072edcb01591e9422ef73ba9e1 100644 (file)
 
 open Printf
 
+let debug = false;;
+let debug_print s =
+ if debug then prerr_endline (Lazy.force s);;
+
 exception Ambiguous_input
 (* the integer is an offset to be added to each location *)
 exception DisambiguationError of
- int * (Token.flocation option * string Lazy.t) list list
+ int *
+ ((Stdpp.location list * string * string) list *
+  (DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
+  Stdpp.location option * string Lazy.t * bool) list list
   (** parameters are: option name, error message *)
 exception Unbound_identifier of string
 
 type choose_uris_callback =
   id:string -> UriManager.uri list -> UriManager.uri list
 
-type choose_interp_callback = (string * string) list list -> int list
+type choose_interp_callback = 
+  string -> int -> 
+    (Stdpp.location list * string * string) list list -> int list
 
 let mono_uris_callback ~id =
  if Helm_registry.get_opt_default Helm_registry.get_bool ~default:true
@@ -47,7 +56,7 @@ let mono_uris_callback ~id =
  else
   raise Ambiguous_input
 
-let mono_interp_callback _ = raise Ambiguous_input
+let mono_interp_callback _ _ _ = raise Ambiguous_input
 
 let _choose_uris_callback = ref mono_uris_callback
 let _choose_interp_callback = ref mono_interp_callback
@@ -63,18 +72,18 @@ module Callbacks =
     let interactive_interpretation_choice interp =
       !_choose_interp_callback interp
 
-    let input_or_locate_uri ~(title:string) ?id =
+    let input_or_locate_uri ~(title:string) ?id () = None
       (* Zack: I try to avoid using this callback. I therefore assume that
       * the presence of an identifier that can't be resolved via "locate"
       * query is a syntax error *)
-      let msg = match id with Some id -> id | _ -> "_" in
-      raise (Unbound_identifier msg)
   end
   
 module Disambiguator = Disambiguate.Make (Callbacks)
 
 (* implement module's API *)
 
+let only_one_pass = ref false;;
+
 let disambiguate_thing ~aliases ~universe
   ~(f:?fresh_instances:bool ->
       aliases:DisambiguateTypes.environment ->
@@ -88,13 +97,16 @@ let disambiguate_thing ~aliases ~universe
   let library = false, DisambiguateTypes.Environment.empty, None in
   let multi_aliases = false, DisambiguateTypes.Environment.empty, universe in
   let mono_aliases = true, aliases, Some DisambiguateTypes.Environment.empty in
-  let passes =  (* <fresh_instances?, aliases, coercions?> *)
-    [ (false, mono_aliases, false);
-      (false, multi_aliases, false);
-      (true, mono_aliases, false);
+  let passes = (* <fresh_instances?, aliases, coercions?> *)
+   if !only_one_pass then
+    [ (true, mono_aliases, false) ]
+   else
+    [ (true, mono_aliases, false);
       (true, multi_aliases, false);
       (true, mono_aliases, true);
       (true, multi_aliases, true);
+      (true, library, false); 
+        (* for demo to reduce the number of interpretations *)
       (true, library, true);
     ]
   in
@@ -103,16 +115,17 @@ let disambiguate_thing ~aliases ~universe
     f ~fresh_instances ~aliases ~universe thing
   in
   let set_aliases (instances,(use_mono_aliases,_,_),_) (_, user_asked as res) =
-   if use_mono_aliases && not instances then
-    drop_aliases res
+   if use_mono_aliases then
+    drop_aliases ~minimize_instances:true res (* one shot aliases *)
    else if user_asked then
     drop_aliases ~minimize_instances:true res (* one shot aliases *)
    else
     drop_aliases_and_clear_diff res
   in
-  let rec aux errors =
-    function
-    | [ pass ] ->
+  let rec aux i errors passes =
+  debug_print (lazy ("Pass: " ^ string_of_int i));
+   match passes with
+      [ pass ] ->
         (try
           set_aliases pass (try_pass pass)
          with Disambiguate.NoWellTypedInterpretation (offset,newerrors) ->
@@ -121,12 +134,12 @@ let disambiguate_thing ~aliases ~universe
         (try
           set_aliases hd (try_pass hd)
         with Disambiguate.NoWellTypedInterpretation (_offset,newerrors) ->
-         aux (errors @ [newerrors]) tl)
+         aux (i+1) (errors @ [newerrors]) tl)
     | [] -> assert false
   in
   let saved_insert_coercions = !CicRefine.insert_coercions in
   try
-    let res = aux [] passes in
+    let res = aux [] passes in
     CicRefine.insert_coercions := saved_insert_coercions;
     res
   with exn ->