]> matita.cs.unibo.it Git - helm.git/blob - helm/software/components/grafite_parser/grafiteDisambiguate.ml
new disambiguator almost attached
[helm.git] / helm / software / components / grafite_parser / grafiteDisambiguate.ml
1 (*
2  * 
3  * This file is part of HELM, an Hypertextual, Electronic
4  * Library of Mathematics, developed at the Computer Science
5  * Department, University of Bologna, Italy.
6  * 
7  * HELM is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * 
12  * HELM is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with HELM; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20  * MA  02111-1307, USA.
21  * 
22  * For details, see the HELM World-Wide-Web page,
23  * http://helm.cs.unibo.it/
24  *)
25
26 (* $Id$ *)
27
28 exception BaseUriNotSetYet
29
30 type tactic = 
31  (CicNotationPt.term, CicNotationPt.term, 
32   CicNotationPt.term GrafiteAst.reduction, string) 
33    GrafiteAst.tactic
34    
35 type lazy_tactic = 
36   (Cic.term, Cic.lazy_term, Cic.lazy_term GrafiteAst.reduction, string) 
37     GrafiteAst.tactic
38
39 let singleton msg = function
40   | [x], _ -> x
41   | l, _   ->
42       let debug = 
43          Printf.sprintf "GrafiteDisambiguate.singleton (%s): %u interpretations"
44          msg (List.length l)
45       in
46       HLog.debug debug; assert false
47
48 let cic_codomain_of_uri uri =
49   (UriManager.string_of_uri uri,
50    let term =
51      try
52        CicUtil.term_of_uri uri
53      with exn ->
54        assert false
55     in
56    fun _ _ _ -> term)
57 ;;
58    
59 let cic_num_choices = DisambiguateChoices.lookup_num_choices;;
60
61 let cic_mk_choice = 
62   DisambiguateChoices.mk_choice
63   ~mk_implicit:(function 
64      | true -> Cic.Implicit (Some `Type)
65      | false -> Cic.Implicit None)
66   ~mk_appl:(function (Cic.Appl l)::tl -> Cic.Appl (l@tl) | l -> Cic.Appl l)
67   ~term_of_uri:CicUtil.term_of_uri
68 ;;
69
70 let ncic_codomain_of_uri uri =
71   (UriManager.string_of_uri uri,
72    let term =
73      try
74        fst (OCic2NCic.convert_term uri (CicUtil.term_of_uri uri))
75      with exn ->
76        assert false
77     in
78    fun _ _ _ -> term)
79 ;;
80    
81 let ncic_num_choices _ = assert false;;
82
83 let ncic_mk_choice = 
84   DisambiguateChoices.mk_choice
85   ~mk_implicit:(function 
86      | true -> NCic.Implicit `Closed
87      | false -> NCic.Implicit `Term)
88   ~mk_appl:(function (NCic.Appl l)::tl -> NCic.Appl (l@tl) | l -> NCic.Appl l)
89   ~term_of_uri:(fun uri ->
90        fst (OCic2NCic.convert_term uri (CicUtil.term_of_uri uri)))
91 ;;
92
93 let lookup_in_library 
94   codomain_of_uri mk_choice num_choices
95   interactive_user_uri_choice input_or_locate_uri item 
96 =
97   let dbd = LibraryDb.instance () in
98   let choices_of_id id =
99     let uris = Whelp.locate ~dbd id in
100      match uris with
101       | [] ->
102          (match 
103            (input_or_locate_uri 
104              ~title:("URI matching \"" ^ id ^ "\" unknown.") 
105              ?id:(Some id) ()) 
106          with
107          | None -> []
108          | Some uri -> [uri])
109       | [uri] -> [uri]
110       | _ ->
111           interactive_user_uri_choice ~selection_mode:`MULTIPLE
112            ?ok:(Some "Try selected.") 
113            ?enable_button_for_non_vars:(Some true)
114            ~title:"Ambiguous input."
115            ~msg: ("Ambiguous input \"" ^ id ^
116               "\". Please, choose one or more interpretations:")
117            ~id
118            uris
119   in
120   match item with
121   | DisambiguateTypes.Id id -> 
122       let uris = choices_of_id id in
123       List.map codomain_of_uri uris
124   | DisambiguateTypes.Symbol (symb, _) ->
125    (try
126      List.map mk_choice (TermAcicContent.lookup_interpretations symb)
127     with
128      TermAcicContent.Interpretation_not_found -> [])
129   | DisambiguateTypes.Num instance -> num_choices ()
130 ;;
131
132   (** @param term not meaningful when context is given *)
133 let disambiguate_term goal text prefix_len lexicon_status_ref context metasenv
134 term =
135   let lexicon_status = !lexicon_status_ref in
136   let (diff, metasenv, subst, cic, _) =
137     singleton "first"
138       (CicDisambiguate.disambiguate_term
139         ~aliases:lexicon_status.LexiconEngine.aliases
140         ?goal ~universe:(Some lexicon_status.LexiconEngine.multi_aliases)
141         ~lookup_in_library:(lookup_in_library cic_codomain_of_uri cic_mk_choice
142         cic_num_choices)
143         ~context ~metasenv ~subst:[] (text,prefix_len,term))
144   in
145   let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
146   lexicon_status_ref := lexicon_status;
147   metasenv,(*subst,*) cic
148 ;;
149
150   (** disambiguate_lazy_term (circa): term -> (unit -> status) * lazy_term
151    * rationale: lazy_term will be invoked in different context to obtain a term,
152    * each invocation will disambiguate the term and can add aliases. Once all
153    * disambiguations have been performed, the first returned function can be
154    * used to obtain the resulting aliases *)
155 let disambiguate_lazy_term goal text prefix_len lexicon_status_ref term =
156   (fun context metasenv ugraph ->
157     let lexicon_status = !lexicon_status_ref in
158     let (diff, metasenv, _, cic, ugraph) =
159       singleton "second"
160         (CicDisambiguate.disambiguate_term 
161           ~lookup_in_library:(lookup_in_library cic_codomain_of_uri
162           cic_mk_choice cic_num_choices)
163           ~initial_ugraph:ugraph ~aliases:lexicon_status.LexiconEngine.aliases
164           ~universe:(Some lexicon_status.LexiconEngine.multi_aliases)
165           ~context ~metasenv ~subst:[] ?goal
166           (text,prefix_len,term)) in
167     let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
168     lexicon_status_ref := lexicon_status;
169     cic, metasenv, ugraph)
170 ;;
171
172 let disambiguate_pattern 
173   text prefix_len lexicon_status_ref (wanted, hyp_paths, goal_path) 
174 =
175   let interp path =CicDisambiguate.interpretate_path [] path in
176   let goal_path = HExtlib.map_option interp goal_path in
177   let hyp_paths = List.map (fun (name, path) -> name, interp path) hyp_paths in
178   let wanted =
179    match wanted with
180       None -> None
181     | Some wanted ->
182        let wanted = 
183          disambiguate_lazy_term None text prefix_len lexicon_status_ref wanted 
184        in
185        Some wanted
186   in
187   (wanted, hyp_paths, goal_path)
188 ;;
189
190 let disambiguate_reduction_kind text prefix_len lexicon_status_ref = function
191   | `Unfold (Some t) ->
192       let t = 
193          disambiguate_lazy_term None text prefix_len lexicon_status_ref t in
194       `Unfold (Some t)
195   | `Normalize
196   | `Simpl
197   | `Unfold None
198   | `Whd as kind -> kind
199 ;;
200
201 let disambiguate_auto_params 
202   disambiguate_term metasenv context (terms, params) 
203 =
204     let metasenv, terms = 
205       List.fold_right 
206        (fun t (metasenv, terms) ->
207          let metasenv,t = disambiguate_term context metasenv t in
208          metasenv,t::terms) terms (metasenv, [])
209     in
210     metasenv, (terms, params)
211 ;;
212
213 let disambiguate_just disambiguate_term context metasenv =
214  function
215     `Term t ->
216       let metasenv,t = disambiguate_term context metasenv t in
217        metasenv, `Term t
218   | `Auto params ->
219       let metasenv,params = disambiguate_auto_params disambiguate_term metasenv
220        context params
221       in
222        metasenv, `Auto params
223 ;;
224       
225 let rec disambiguate_tactic 
226   lexicon_status_ref context metasenv goal (text,prefix_len,tactic) 
227 =
228   let disambiguate_term_hint = 
229     disambiguate_term goal text prefix_len lexicon_status_ref in
230   let disambiguate_term = 
231     disambiguate_term None text prefix_len lexicon_status_ref in
232   let disambiguate_pattern = 
233     disambiguate_pattern text prefix_len lexicon_status_ref in
234   let disambiguate_reduction_kind = 
235     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
236   let disambiguate_lazy_term = 
237     disambiguate_lazy_term None text prefix_len lexicon_status_ref in
238   let disambiguate_tactic metasenv tac =
239    disambiguate_tactic lexicon_status_ref context metasenv goal (text,prefix_len,tac)
240   in
241   let disambiguate_auto_params m p = 
242     disambiguate_auto_params disambiguate_term m context p
243   in
244    match tactic with
245     (* Higher  order tactics *)
246     | GrafiteAst.Progress (loc,tac) ->
247         let metasenv,tac = disambiguate_tactic metasenv tac in
248         metasenv,GrafiteAst.Progress (loc,tac)
249     | GrafiteAst.Solve (loc,tacl) ->
250         let metasenv,tacl =
251          List.fold_right
252           (fun tac (metasenv,tacl) ->
253             let metasenv,tac = disambiguate_tactic metasenv tac in
254              metasenv,tac::tacl
255           ) tacl (metasenv,[])
256         in
257          metasenv,GrafiteAst.Solve (loc,tacl)
258     | GrafiteAst.Try (loc,tac) ->
259         let metasenv,tac = disambiguate_tactic metasenv tac in
260         metasenv,GrafiteAst.Try (loc,tac)
261     | GrafiteAst.First (loc,tacl) ->
262         let metasenv,tacl =
263          List.fold_right
264           (fun tac (metasenv,tacl) ->
265             let metasenv,tac = disambiguate_tactic metasenv tac in
266              metasenv,tac::tacl
267           ) tacl (metasenv,[])
268         in
269          metasenv,GrafiteAst.First (loc,tacl)
270     | GrafiteAst.Seq (loc,tacl) ->
271         let metasenv,tacl =
272          List.fold_right
273           (fun tac (metasenv,tacl) ->
274             let metasenv,tac = disambiguate_tactic metasenv tac in
275              metasenv,tac::tacl
276           ) tacl (metasenv,[])
277         in
278          metasenv,GrafiteAst.Seq (loc,tacl)
279     | GrafiteAst.Repeat (loc,tac) ->
280         let metasenv,tac = disambiguate_tactic metasenv tac in
281         metasenv,GrafiteAst.Repeat (loc,tac)
282     | GrafiteAst.Do (loc,n,tac) ->
283         let metasenv,tac = disambiguate_tactic metasenv tac in
284         metasenv,GrafiteAst.Do (loc,n,tac)
285     | GrafiteAst.Then (loc,tac,tacl) ->
286         let metasenv,tac = disambiguate_tactic metasenv tac in
287         let metasenv,tacl =
288          List.fold_right
289           (fun tac (metasenv,tacl) ->
290             let metasenv,tac = disambiguate_tactic metasenv tac in
291              metasenv,tac::tacl
292           ) tacl (metasenv,[])
293         in
294          metasenv,GrafiteAst.Then (loc,tac,tacl)
295     (* First order tactics *)
296     | GrafiteAst.Absurd (loc, term) -> 
297         let metasenv,cic = disambiguate_term context metasenv term in
298         metasenv,GrafiteAst.Absurd (loc, cic)
299     | GrafiteAst.Apply (loc, term) ->
300         let metasenv,cic = disambiguate_term context metasenv term in
301         metasenv,GrafiteAst.Apply (loc, cic)
302     | GrafiteAst.ApplyRule (loc, term) ->
303         let metasenv,cic = disambiguate_term_hint context metasenv term in
304         metasenv,GrafiteAst.ApplyRule (loc, cic)
305     | GrafiteAst.ApplyP (loc, term) ->
306         let metasenv,cic = disambiguate_term context metasenv term in
307         metasenv,GrafiteAst.ApplyP (loc, cic)
308     | GrafiteAst.ApplyS (loc, term, params) ->
309         let metasenv, params = disambiguate_auto_params metasenv params in
310         let metasenv,cic = disambiguate_term context metasenv term in
311         metasenv,GrafiteAst.ApplyS (loc, cic, params)
312     | GrafiteAst.Assumption loc ->
313         metasenv,GrafiteAst.Assumption loc
314     | GrafiteAst.AutoBatch (loc,params) ->
315         let metasenv, params = disambiguate_auto_params metasenv params in
316         metasenv,GrafiteAst.AutoBatch (loc,params)
317     | GrafiteAst.Cases (loc, what, pattern, idents) ->
318         let metasenv,what = disambiguate_term context metasenv what in
319         let pattern = disambiguate_pattern pattern in
320         metasenv,GrafiteAst.Cases (loc, what, pattern, idents)
321     | GrafiteAst.Change (loc, pattern, with_what) -> 
322         let with_what = disambiguate_lazy_term with_what in
323         let pattern = disambiguate_pattern pattern in
324         metasenv,GrafiteAst.Change (loc, pattern, with_what)
325     | GrafiteAst.Clear (loc,id) ->
326         metasenv,GrafiteAst.Clear (loc,id)
327     | GrafiteAst.ClearBody (loc,id) ->
328        metasenv,GrafiteAst.ClearBody (loc,id)
329     | GrafiteAst.Compose (loc, t1, t2, times, spec) ->
330         let metasenv,t1 = disambiguate_term context metasenv t1 in
331         let metasenv,t2 = 
332           match t2 with
333           | None -> metasenv, None
334           | Some t2 -> 
335               let m, t2 = disambiguate_term context metasenv t2 in
336               m, Some t2
337         in
338         metasenv,   GrafiteAst.Compose (loc, t1, t2, times, spec)
339     | GrafiteAst.Constructor (loc,n) ->
340         metasenv,GrafiteAst.Constructor (loc,n)
341     | GrafiteAst.Contradiction loc ->
342         metasenv,GrafiteAst.Contradiction loc
343     | GrafiteAst.Cut (loc, ident, term) -> 
344         let metasenv,cic = disambiguate_term context metasenv term in
345         metasenv,GrafiteAst.Cut (loc, ident, cic)
346     | GrafiteAst.Decompose (loc, names) ->
347          metasenv,GrafiteAst.Decompose (loc, names)
348     | GrafiteAst.Demodulate (loc, params) ->
349         let metasenv, params = disambiguate_auto_params metasenv params in
350         metasenv,GrafiteAst.Demodulate (loc, params)
351     | GrafiteAst.Destruct (loc, Some terms) ->
352         let map term (metasenv, terms) =
353            let metasenv, term = disambiguate_term context metasenv term in
354            metasenv, term :: terms
355         in
356         let metasenv, terms = List.fold_right map terms (metasenv, []) in 
357         metasenv, GrafiteAst.Destruct(loc, Some terms)
358     | GrafiteAst.Destruct (loc, None) ->
359         metasenv,GrafiteAst.Destruct(loc,None)
360     | GrafiteAst.Exact (loc, term) -> 
361         let metasenv,cic = disambiguate_term context metasenv term in
362         metasenv,GrafiteAst.Exact (loc, cic)
363     | GrafiteAst.Elim (loc, what, Some using, pattern, specs) ->
364         let metasenv,what = disambiguate_term context metasenv what in
365         let metasenv,using = disambiguate_term context metasenv using in
366         let pattern = disambiguate_pattern pattern in
367         metasenv,GrafiteAst.Elim (loc, what, Some using, pattern, specs)
368     | GrafiteAst.Elim (loc, what, None, pattern, specs) ->
369         let metasenv,what = disambiguate_term context metasenv what in
370         let pattern = disambiguate_pattern pattern in
371         metasenv,GrafiteAst.Elim (loc, what, None, pattern, specs)
372     | GrafiteAst.ElimType (loc, what, Some using, specs) ->
373         let metasenv,what = disambiguate_term context metasenv what in
374         let metasenv,using = disambiguate_term context metasenv using in
375         metasenv,GrafiteAst.ElimType (loc, what, Some using, specs)
376     | GrafiteAst.ElimType (loc, what, None, specs) ->
377         let metasenv,what = disambiguate_term context metasenv what in
378         metasenv,GrafiteAst.ElimType (loc, what, None, specs)
379     | GrafiteAst.Exists loc ->
380         metasenv,GrafiteAst.Exists loc 
381     | GrafiteAst.Fail loc ->
382         metasenv,GrafiteAst.Fail loc
383     | GrafiteAst.Fold (loc,red_kind, term, pattern) ->
384         let pattern = disambiguate_pattern pattern in
385         let term = disambiguate_lazy_term term in
386         let red_kind = disambiguate_reduction_kind red_kind in
387         metasenv,GrafiteAst.Fold (loc, red_kind, term, pattern)
388     | GrafiteAst.FwdSimpl (loc, hyp, names) ->
389        metasenv,GrafiteAst.FwdSimpl (loc, hyp, names)  
390     | GrafiteAst.Fourier loc ->
391        metasenv,GrafiteAst.Fourier loc
392     | GrafiteAst.Generalize (loc,pattern,ident) ->
393         let pattern = disambiguate_pattern pattern in
394         metasenv,GrafiteAst.Generalize (loc,pattern,ident)
395     | GrafiteAst.IdTac loc ->
396         metasenv,GrafiteAst.IdTac loc
397     | GrafiteAst.Intros (loc, specs) ->
398         metasenv,GrafiteAst.Intros (loc, specs)
399     | GrafiteAst.Inversion (loc, term) ->
400        let metasenv,term = disambiguate_term context metasenv term in
401         metasenv,GrafiteAst.Inversion (loc, term)
402     | GrafiteAst.LApply (loc, linear, depth, to_what, what, ident) ->
403        let f term (metasenv, to_what) =
404           let metasenv, term = disambiguate_term context metasenv term in
405           metasenv, term :: to_what
406        in
407        let metasenv, to_what = List.fold_right f to_what (metasenv, []) in 
408        let metasenv, what = disambiguate_term context metasenv what in
409        metasenv,GrafiteAst.LApply (loc, linear, depth, to_what, what, ident)
410     | GrafiteAst.Left loc ->
411        metasenv,GrafiteAst.Left loc
412     | GrafiteAst.LetIn (loc, term, name) ->
413         let metasenv,term = disambiguate_term context metasenv term in
414         metasenv,GrafiteAst.LetIn (loc,term,name)
415     | GrafiteAst.Reduce (loc, red_kind, pattern) ->
416         let pattern = disambiguate_pattern pattern in
417         let red_kind = disambiguate_reduction_kind red_kind in
418         metasenv,GrafiteAst.Reduce(loc, red_kind, pattern)
419     | GrafiteAst.Reflexivity loc ->
420         metasenv,GrafiteAst.Reflexivity loc
421     | GrafiteAst.Replace (loc, pattern, with_what) -> 
422         let pattern = disambiguate_pattern pattern in
423         let with_what = disambiguate_lazy_term with_what in
424         metasenv,GrafiteAst.Replace (loc, pattern, with_what)
425     | GrafiteAst.Rewrite (loc, dir, t, pattern, names) ->
426         let metasenv,term = disambiguate_term context metasenv t in
427         let pattern = disambiguate_pattern pattern in
428         metasenv,GrafiteAst.Rewrite (loc, dir, term, pattern, names)
429     | GrafiteAst.Right loc ->
430         metasenv,GrafiteAst.Right loc
431     | GrafiteAst.Ring loc ->
432         metasenv,GrafiteAst.Ring loc
433     | GrafiteAst.Split loc ->
434         metasenv,GrafiteAst.Split loc
435     | GrafiteAst.Symmetry loc ->
436         metasenv,GrafiteAst.Symmetry loc
437     | GrafiteAst.Transitivity (loc, term) -> 
438         let metasenv,cic = disambiguate_term context metasenv term in
439         metasenv,GrafiteAst.Transitivity (loc, cic)
440       (* Nuovi casi *)
441     | GrafiteAst.Assume (loc, id, term) -> 
442         let metasenv,cic = disambiguate_term context metasenv term in
443         metasenv,GrafiteAst.Assume (loc, id, cic)
444     | GrafiteAst.Suppose (loc, term, id, term') ->
445         let metasenv,cic = disambiguate_term context metasenv term in
446         let metasenv,cic' =
447            match term' with
448               None -> metasenv,None
449             | Some t ->
450                   let metasenv,t = disambiguate_term context metasenv t in
451                   metasenv,Some t in
452         metasenv,GrafiteAst.Suppose (loc, cic, id, cic')
453     | GrafiteAst.Bydone (loc,just) ->
454         let metasenv,just =
455          disambiguate_just disambiguate_term context metasenv just
456         in
457          metasenv,GrafiteAst.Bydone (loc, just)
458     | GrafiteAst.We_need_to_prove (loc,term,id,term') ->
459         let metasenv,cic = disambiguate_term context metasenv term in
460         let metasenv,cic' = 
461             match term' with
462               None -> metasenv,None
463             | Some t ->
464                   let metasenv,t = disambiguate_term context metasenv t in
465                   metasenv,Some t in
466         metasenv,GrafiteAst.We_need_to_prove (loc,cic,id,cic')
467     | GrafiteAst.By_just_we_proved (loc,just,term',id,term'') ->
468         let metasenv,just =
469          disambiguate_just disambiguate_term context metasenv just in
470         let metasenv,cic' = disambiguate_term context metasenv term' in
471         let metasenv,cic'' = 
472             match term'' with
473               None -> metasenv,None
474            |  Some t ->  
475                     let metasenv,t = disambiguate_term context metasenv t in
476                      metasenv,Some t in
477         metasenv,GrafiteAst.By_just_we_proved (loc,just,cic',id,cic'')
478     | GrafiteAst.We_proceed_by_cases_on (loc, term, term') ->
479         let metasenv,cic = disambiguate_term context metasenv term in
480         let metasenv,cic' = disambiguate_term context metasenv term' in
481         metasenv,GrafiteAst.We_proceed_by_cases_on (loc, cic, cic')
482     | GrafiteAst.We_proceed_by_induction_on (loc, term, term') ->
483         let metasenv,cic = disambiguate_term context metasenv term in
484         let metasenv,cic' = disambiguate_term context metasenv term' in
485         metasenv,GrafiteAst.We_proceed_by_induction_on (loc, cic, cic')
486    | GrafiteAst.Byinduction (loc, term, id) ->
487         let metasenv,cic = disambiguate_term context metasenv term in
488         metasenv,GrafiteAst.Byinduction(loc, cic, id)
489    | GrafiteAst.Thesisbecomes (loc, term) ->
490         let metasenv,cic = disambiguate_term context metasenv term in
491         metasenv,GrafiteAst.Thesisbecomes (loc, cic)
492    | GrafiteAst.ExistsElim (loc, just, id1, term1, id2, term2) ->
493         let metasenv,just =
494          disambiguate_just disambiguate_term context metasenv just in
495         let metasenv,cic' = disambiguate_term context metasenv term1 in
496         let cic''= disambiguate_lazy_term term2 in
497         metasenv,GrafiteAst.ExistsElim(loc, just, id1, cic', id2, cic'')
498    | GrafiteAst.AndElim (loc, just, id, term1, id1, term2) ->
499         let metasenv,just =
500          disambiguate_just disambiguate_term context metasenv just in
501         let metasenv,cic'= disambiguate_term context metasenv term1 in
502         let metasenv,cic''= disambiguate_term context metasenv term2 in
503         metasenv,GrafiteAst.AndElim(loc, just, id, cic', id1, cic'')   
504    | GrafiteAst.Case (loc, id, params) ->
505         let metasenv,params' =
506          List.fold_right
507           (fun (id,term) (metasenv,params) ->
508             let metasenv,cic = disambiguate_term context metasenv term in
509              metasenv,(id,cic)::params
510           ) params (metasenv,[])
511         in
512         metasenv,GrafiteAst.Case(loc, id, params')   
513    | GrafiteAst.RewritingStep (loc, term1, term2, term3, cont) ->
514         let metasenv,cic =
515          match term1 with
516             None -> metasenv,None
517           | Some (start,t) -> 
518              let metasenv,t = disambiguate_term context metasenv t in
519               metasenv,Some (start,t) in
520         let metasenv,cic'= disambiguate_term context metasenv term2 in
521         let metasenv,cic'' =
522          match term3 with
523           | `SolveWith term ->
524              let metasenv,term = disambiguate_term context metasenv term in
525              metasenv, `SolveWith term
526           | `Auto params -> 
527               let metasenv, params = disambiguate_auto_params metasenv params in
528               metasenv,`Auto params
529           | `Term t -> 
530              let metasenv,t = disambiguate_term context metasenv t in
531               metasenv,`Term t
532           | `Proof as t -> metasenv,t in
533         metasenv,GrafiteAst.RewritingStep (loc, cic, cic', cic'', cont)   
534
535 let disambiguate_obj lexicon_status ?baseuri metasenv (text,prefix_len,obj) =
536   let uri =
537    match obj with
538     | CicNotationPt.Inductive (_,(name,_,_,_)::_)
539     | CicNotationPt.Record (_,name,_,_) ->
540        (match baseuri with
541          | Some baseuri ->
542             Some (UriManager.uri_of_string (baseuri ^ "/" ^ name ^ ".ind"))
543          | None -> raise BaseUriNotSetYet)
544     | CicNotationPt.Inductive _ -> assert false
545     | CicNotationPt.Theorem _ -> None in
546 (*
547   (match obj with
548       CicNotationPt.Theorem (_,_,ty,_) ->
549        (try
550          (match 
551           NCicDisambiguate.disambiguate_term
552            ~lookup_in_library:(lookup_in_library ncic_codomain_of_uri
553            ncic_mk_choice ncic_num_choices)
554            ~context:[] ~metasenv:[] ~subst:[]
555            ~aliases:DisambiguateTypes.Environment.empty
556            ~universe:(Some DisambiguateTypes.Environment.empty)
557            ("",0,ty)
558          with
559          | [_,metasenv,subst,ty],_ ->
560           prerr_endline ("NUOVA DISAMBIGUAZIONE OK!!!!!!!!!  " ^
561            NCicPp.ppterm ~metasenv ~subst ~context:[] ty)
562          | _ ->
563           prerr_endline ("NUOVA DISAMBIGUAZIONE AMBIGUO!!!!!!!!!  "))
564        with 
565        | MultiPassDisambiguator.DisambiguationError (_,s) ->
566         prerr_endline ("ERRORE NUOVA DISAMBIGUAZIONE:\n" ^
567          String.concat "\n" 
568           (List.map (fun _,_,x,_ -> snd (Lazy.force x)) (List.flatten s)))
569 (*        | exn -> prerr_endline (Printexc.to_string exn) *)
570        )
571     | _ -> ()
572   ); 
573 *)
574   let (diff, metasenv, _, cic, _) =
575     singleton "third"
576       (CicDisambiguate.disambiguate_obj 
577         ~lookup_in_library:(lookup_in_library cic_codomain_of_uri cic_mk_choice
578         cic_num_choices)
579         ~aliases:lexicon_status.LexiconEngine.aliases
580         ~universe:(Some lexicon_status.LexiconEngine.multi_aliases) ~uri 
581         (text,prefix_len,obj)) in
582   let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
583   lexicon_status, metasenv, cic
584   
585 let disambiguate_command lexicon_status ?baseuri metasenv (text,prefix_len,cmd)=
586   match cmd with
587    | GrafiteAst.Index(loc,key,uri) ->
588        let lexicon_status_ref = ref lexicon_status in 
589        let disambiguate_term =
590          disambiguate_term None text prefix_len lexicon_status_ref [] in
591        let disambiguate_term_option metasenv =
592          function
593              None -> metasenv,None
594            | Some t ->
595                let metasenv,t = disambiguate_term metasenv t in
596                  metasenv, Some t
597        in
598        let metasenv,key = disambiguate_term_option metasenv key in
599        !lexicon_status_ref, metasenv,GrafiteAst.Index(loc,key,uri)
600    | GrafiteAst.Coercion (loc,t,b,a,s) -> 
601        let lexicon_status_ref = ref lexicon_status in 
602        let disambiguate_term =
603          disambiguate_term None text prefix_len lexicon_status_ref [] in
604       let metasenv,t = disambiguate_term metasenv t in
605       !lexicon_status_ref, metasenv, GrafiteAst.Coercion (loc,t,b,a,s)
606    | GrafiteAst.Default _
607    | GrafiteAst.Drop _
608    | GrafiteAst.Include _
609    | GrafiteAst.Print _
610    | GrafiteAst.Qed _
611    | GrafiteAst.Set _ as cmd ->
612        lexicon_status,metasenv,cmd
613    | GrafiteAst.Obj (loc,obj) ->
614        let lexicon_status,metasenv,obj =
615         disambiguate_obj lexicon_status ?baseuri metasenv (text,prefix_len,obj)in
616        lexicon_status, metasenv, GrafiteAst.Obj (loc,obj)
617    | GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans) ->
618       let lexicon_status_ref = ref lexicon_status in 
619       let disambiguate_term =
620        disambiguate_term None text prefix_len lexicon_status_ref [] in
621       let disambiguate_term_option metasenv =
622        function
623           None -> metasenv,None
624        | Some t ->
625           let metasenv,t = disambiguate_term metasenv t in
626            metasenv, Some t
627       in
628       let metasenv,a = disambiguate_term metasenv a in
629       let metasenv,aeq = disambiguate_term metasenv aeq in
630       let metasenv,refl = disambiguate_term_option metasenv refl in
631       let metasenv,sym = disambiguate_term_option metasenv sym in
632       let metasenv,trans = disambiguate_term_option metasenv trans in
633        !lexicon_status_ref, metasenv,
634         GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans)
635
636 let disambiguate_macro 
637   lexicon_status_ref metasenv context (text,prefix_len, macro) 
638 =
639  let disambiguate_term = disambiguate_term None text prefix_len lexicon_status_ref in
640   let disambiguate_reduction_kind = 
641     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
642   match macro with
643    | GrafiteAst.WMatch (loc,term) ->
644       let metasenv,term = disambiguate_term context metasenv term in
645        metasenv,GrafiteAst.WMatch (loc,term)
646    | GrafiteAst.WInstance (loc,term) ->
647       let metasenv,term = disambiguate_term context metasenv term in
648        metasenv,GrafiteAst.WInstance (loc,term)
649    | GrafiteAst.WElim (loc,term) ->
650       let metasenv,term = disambiguate_term context metasenv term in
651        metasenv,GrafiteAst.WElim (loc,term)
652    | GrafiteAst.WHint (loc,term) ->
653       let metasenv,term = disambiguate_term context metasenv term in
654        metasenv,GrafiteAst.WHint (loc,term)
655    | GrafiteAst.Check (loc,term) ->
656       let metasenv,term = disambiguate_term context metasenv term in
657        metasenv,GrafiteAst.Check (loc,term)
658    | GrafiteAst.Eval (loc,kind,term) ->
659       let metasenv, term = disambiguate_term context metasenv term in
660       let kind = disambiguate_reduction_kind kind in
661        metasenv,GrafiteAst.Eval (loc,kind,term)
662    | GrafiteAst.AutoInteractive (loc, params) -> 
663       let metasenv, params = 
664         disambiguate_auto_params disambiguate_term metasenv context params in
665       metasenv, GrafiteAst.AutoInteractive (loc, params)
666    | GrafiteAst.Hint _
667    | GrafiteAst.WLocate _
668    | GrafiteAst.Inline _ as macro ->
669       metasenv,macro