]> matita.cs.unibo.it Git - helm.git/blob - helm/software/components/grafite_parser/grafiteDisambiguate.ml
disambiguation even more abstracted
[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
49 let lookup_in_library interactive_user_uri_choice input_or_locate_uri item =
50   let dbd = LibraryDb.instance () in
51   let choices_of_id id =
52     let uris = Whelp.locate ~dbd id in
53     let uris =
54      match uris with
55       | [] ->
56          (match 
57            (input_or_locate_uri 
58              ~title:("URI matching \"" ^ id ^ "\" unknown.") 
59              ?id:(Some id) ()) 
60          with
61          | None -> []
62          | Some uri -> [uri])
63       | [uri] -> [uri]
64       | _ ->
65           interactive_user_uri_choice ~selection_mode:`MULTIPLE
66            ?ok:(Some "Try selected.") 
67            ?enable_button_for_non_vars:(Some true)
68            ~title:"Ambiguous input."
69            ~msg: ("Ambiguous input \"" ^ id ^
70               "\". Please, choose one or more interpretations:")
71            ~id
72            uris
73     in
74     List.map
75       (fun uri ->
76         (UriManager.string_of_uri uri,
77          let term =
78            try
79              CicUtil.term_of_uri uri
80            with exn ->
81              assert false
82           in
83          fun _ _ _ -> term))
84       uris
85   in
86   match item with
87   | DisambiguateTypes.Id id -> choices_of_id id
88   | DisambiguateTypes.Symbol (symb, _) ->
89    (try
90      List.map DisambiguateChoices.mk_choice
91       (TermAcicContent.lookup_interpretations symb)
92     with
93      TermAcicContent.Interpretation_not_found -> [])
94   | DisambiguateTypes.Num instance ->
95     DisambiguateChoices.lookup_num_choices ()
96 ;;
97
98   (** @param term not meaningful when context is given *)
99 let disambiguate_term goal text prefix_len lexicon_status_ref context metasenv
100 term =
101   let lexicon_status = !lexicon_status_ref in
102   let (diff, metasenv, subst, cic, _) =
103     singleton "first"
104       (GrafiteDisambiguator.disambiguate_term
105         ~aliases:lexicon_status.LexiconEngine.aliases
106         ?goal ~universe:(Some lexicon_status.LexiconEngine.multi_aliases)
107         ~lookup_in_library
108         ~context ~metasenv ~subst:[] (text,prefix_len,term))
109   in
110   let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
111   lexicon_status_ref := lexicon_status;
112   metasenv,(*subst,*) cic
113 ;;
114
115   (** disambiguate_lazy_term (circa): term -> (unit -> status) * lazy_term
116    * rationale: lazy_term will be invoked in different context to obtain a term,
117    * each invocation will disambiguate the term and can add aliases. Once all
118    * disambiguations have been performed, the first returned function can be
119    * used to obtain the resulting aliases *)
120 let disambiguate_lazy_term goal text prefix_len lexicon_status_ref term =
121   (fun context metasenv ugraph ->
122     let lexicon_status = !lexicon_status_ref in
123     let (diff, metasenv, _, cic, ugraph) =
124       singleton "second"
125         (GrafiteDisambiguator.disambiguate_term ~lookup_in_library 
126           ~initial_ugraph:ugraph ~aliases:lexicon_status.LexiconEngine.aliases
127           ~universe:(Some lexicon_status.LexiconEngine.multi_aliases)
128           ~context ~metasenv ~subst:[] ?goal
129           (text,prefix_len,term)) in
130     let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
131     lexicon_status_ref := lexicon_status;
132     cic, metasenv, ugraph)
133 ;;
134
135 let disambiguate_pattern 
136   text prefix_len lexicon_status_ref (wanted, hyp_paths, goal_path) 
137 =
138   let interp path = Disambiguate.interpretate_path [] path in
139   let goal_path = HExtlib.map_option interp goal_path in
140   let hyp_paths = List.map (fun (name, path) -> name, interp path) hyp_paths in
141   let wanted =
142    match wanted with
143       None -> None
144     | Some wanted ->
145        let wanted = 
146          disambiguate_lazy_term None text prefix_len lexicon_status_ref wanted 
147        in
148        Some wanted
149   in
150   (wanted, hyp_paths, goal_path)
151 ;;
152
153 let disambiguate_reduction_kind text prefix_len lexicon_status_ref = function
154   | `Unfold (Some t) ->
155       let t = 
156          disambiguate_lazy_term None text prefix_len lexicon_status_ref t in
157       `Unfold (Some t)
158   | `Normalize
159   | `Simpl
160   | `Unfold None
161   | `Whd as kind -> kind
162 ;;
163
164 let disambiguate_auto_params 
165   disambiguate_term metasenv context (terms, params) 
166 =
167     let metasenv, terms = 
168       List.fold_right 
169        (fun t (metasenv, terms) ->
170          let metasenv,t = disambiguate_term context metasenv t in
171          metasenv,t::terms) terms (metasenv, [])
172     in
173     metasenv, (terms, params)
174 ;;
175
176 let disambiguate_just disambiguate_term context metasenv =
177  function
178     `Term t ->
179       let metasenv,t = disambiguate_term context metasenv t in
180        metasenv, `Term t
181   | `Auto params ->
182       let metasenv,params = disambiguate_auto_params disambiguate_term metasenv
183        context params
184       in
185        metasenv, `Auto params
186 ;;
187       
188 let rec disambiguate_tactic 
189   lexicon_status_ref context metasenv goal (text,prefix_len,tactic) 
190 =
191   let disambiguate_term_hint = 
192     disambiguate_term goal text prefix_len lexicon_status_ref in
193   let disambiguate_term = 
194     disambiguate_term None text prefix_len lexicon_status_ref in
195   let disambiguate_pattern = 
196     disambiguate_pattern text prefix_len lexicon_status_ref in
197   let disambiguate_reduction_kind = 
198     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
199   let disambiguate_lazy_term = 
200     disambiguate_lazy_term None text prefix_len lexicon_status_ref in
201   let disambiguate_tactic metasenv tac =
202    disambiguate_tactic lexicon_status_ref context metasenv goal (text,prefix_len,tac)
203   in
204   let disambiguate_auto_params m p = 
205     disambiguate_auto_params disambiguate_term m context p
206   in
207    match tactic with
208     (* Higher  order tactics *)
209     | GrafiteAst.Progress (loc,tac) ->
210         let metasenv,tac = disambiguate_tactic metasenv tac in
211         metasenv,GrafiteAst.Progress (loc,tac)
212     | GrafiteAst.Solve (loc,tacl) ->
213         let metasenv,tacl =
214          List.fold_right
215           (fun tac (metasenv,tacl) ->
216             let metasenv,tac = disambiguate_tactic metasenv tac in
217              metasenv,tac::tacl
218           ) tacl (metasenv,[])
219         in
220          metasenv,GrafiteAst.Solve (loc,tacl)
221     | GrafiteAst.Try (loc,tac) ->
222         let metasenv,tac = disambiguate_tactic metasenv tac in
223         metasenv,GrafiteAst.Try (loc,tac)
224     | GrafiteAst.First (loc,tacl) ->
225         let metasenv,tacl =
226          List.fold_right
227           (fun tac (metasenv,tacl) ->
228             let metasenv,tac = disambiguate_tactic metasenv tac in
229              metasenv,tac::tacl
230           ) tacl (metasenv,[])
231         in
232          metasenv,GrafiteAst.First (loc,tacl)
233     | GrafiteAst.Seq (loc,tacl) ->
234         let metasenv,tacl =
235          List.fold_right
236           (fun tac (metasenv,tacl) ->
237             let metasenv,tac = disambiguate_tactic metasenv tac in
238              metasenv,tac::tacl
239           ) tacl (metasenv,[])
240         in
241          metasenv,GrafiteAst.Seq (loc,tacl)
242     | GrafiteAst.Repeat (loc,tac) ->
243         let metasenv,tac = disambiguate_tactic metasenv tac in
244         metasenv,GrafiteAst.Repeat (loc,tac)
245     | GrafiteAst.Do (loc,n,tac) ->
246         let metasenv,tac = disambiguate_tactic metasenv tac in
247         metasenv,GrafiteAst.Do (loc,n,tac)
248     | GrafiteAst.Then (loc,tac,tacl) ->
249         let metasenv,tac = disambiguate_tactic metasenv tac in
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.Then (loc,tac,tacl)
258     (* First order tactics *)
259     | GrafiteAst.Absurd (loc, term) -> 
260         let metasenv,cic = disambiguate_term context metasenv term in
261         metasenv,GrafiteAst.Absurd (loc, cic)
262     | GrafiteAst.Apply (loc, term) ->
263         let metasenv,cic = disambiguate_term context metasenv term in
264         metasenv,GrafiteAst.Apply (loc, cic)
265     | GrafiteAst.ApplyRule (loc, term) ->
266         let metasenv,cic = disambiguate_term_hint context metasenv term in
267         metasenv,GrafiteAst.ApplyRule (loc, cic)
268     | GrafiteAst.ApplyP (loc, term) ->
269         let metasenv,cic = disambiguate_term context metasenv term in
270         metasenv,GrafiteAst.ApplyP (loc, cic)
271     | GrafiteAst.ApplyS (loc, term, params) ->
272         let metasenv, params = disambiguate_auto_params metasenv params in
273         let metasenv,cic = disambiguate_term context metasenv term in
274         metasenv,GrafiteAst.ApplyS (loc, cic, params)
275     | GrafiteAst.Assumption loc ->
276         metasenv,GrafiteAst.Assumption loc
277     | GrafiteAst.AutoBatch (loc,params) ->
278         let metasenv, params = disambiguate_auto_params metasenv params in
279         metasenv,GrafiteAst.AutoBatch (loc,params)
280     | GrafiteAst.Cases (loc, what, pattern, idents) ->
281         let metasenv,what = disambiguate_term context metasenv what in
282         let pattern = disambiguate_pattern pattern in
283         metasenv,GrafiteAst.Cases (loc, what, pattern, idents)
284     | GrafiteAst.Change (loc, pattern, with_what) -> 
285         let with_what = disambiguate_lazy_term with_what in
286         let pattern = disambiguate_pattern pattern in
287         metasenv,GrafiteAst.Change (loc, pattern, with_what)
288     | GrafiteAst.Clear (loc,id) ->
289         metasenv,GrafiteAst.Clear (loc,id)
290     | GrafiteAst.ClearBody (loc,id) ->
291        metasenv,GrafiteAst.ClearBody (loc,id)
292     | GrafiteAst.Compose (loc, t1, t2, times, spec) ->
293         let metasenv,t1 = disambiguate_term context metasenv t1 in
294         let metasenv,t2 = 
295           match t2 with
296           | None -> metasenv, None
297           | Some t2 -> 
298               let m, t2 = disambiguate_term context metasenv t2 in
299               m, Some t2
300         in
301         metasenv,   GrafiteAst.Compose (loc, t1, t2, times, spec)
302     | GrafiteAst.Constructor (loc,n) ->
303         metasenv,GrafiteAst.Constructor (loc,n)
304     | GrafiteAst.Contradiction loc ->
305         metasenv,GrafiteAst.Contradiction loc
306     | GrafiteAst.Cut (loc, ident, term) -> 
307         let metasenv,cic = disambiguate_term context metasenv term in
308         metasenv,GrafiteAst.Cut (loc, ident, cic)
309     | GrafiteAst.Decompose (loc, names) ->
310          metasenv,GrafiteAst.Decompose (loc, names)
311     | GrafiteAst.Demodulate (loc, params) ->
312         let metasenv, params = disambiguate_auto_params metasenv params in
313         metasenv,GrafiteAst.Demodulate (loc, params)
314     | GrafiteAst.Destruct (loc, Some terms) ->
315         let map term (metasenv, terms) =
316            let metasenv, term = disambiguate_term context metasenv term in
317            metasenv, term :: terms
318         in
319         let metasenv, terms = List.fold_right map terms (metasenv, []) in 
320         metasenv, GrafiteAst.Destruct(loc, Some terms)
321     | GrafiteAst.Destruct (loc, None) ->
322         metasenv,GrafiteAst.Destruct(loc,None)
323     | GrafiteAst.Exact (loc, term) -> 
324         let metasenv,cic = disambiguate_term context metasenv term in
325         metasenv,GrafiteAst.Exact (loc, cic)
326     | GrafiteAst.Elim (loc, what, Some using, pattern, specs) ->
327         let metasenv,what = disambiguate_term context metasenv what in
328         let metasenv,using = disambiguate_term context metasenv using in
329         let pattern = disambiguate_pattern pattern in
330         metasenv,GrafiteAst.Elim (loc, what, Some using, pattern, specs)
331     | GrafiteAst.Elim (loc, what, None, pattern, specs) ->
332         let metasenv,what = disambiguate_term context metasenv what in
333         let pattern = disambiguate_pattern pattern in
334         metasenv,GrafiteAst.Elim (loc, what, None, pattern, specs)
335     | GrafiteAst.ElimType (loc, what, Some using, specs) ->
336         let metasenv,what = disambiguate_term context metasenv what in
337         let metasenv,using = disambiguate_term context metasenv using in
338         metasenv,GrafiteAst.ElimType (loc, what, Some using, specs)
339     | GrafiteAst.ElimType (loc, what, None, specs) ->
340         let metasenv,what = disambiguate_term context metasenv what in
341         metasenv,GrafiteAst.ElimType (loc, what, None, specs)
342     | GrafiteAst.Exists loc ->
343         metasenv,GrafiteAst.Exists loc 
344     | GrafiteAst.Fail loc ->
345         metasenv,GrafiteAst.Fail loc
346     | GrafiteAst.Fold (loc,red_kind, term, pattern) ->
347         let pattern = disambiguate_pattern pattern in
348         let term = disambiguate_lazy_term term in
349         let red_kind = disambiguate_reduction_kind red_kind in
350         metasenv,GrafiteAst.Fold (loc, red_kind, term, pattern)
351     | GrafiteAst.FwdSimpl (loc, hyp, names) ->
352        metasenv,GrafiteAst.FwdSimpl (loc, hyp, names)  
353     | GrafiteAst.Fourier loc ->
354        metasenv,GrafiteAst.Fourier loc
355     | GrafiteAst.Generalize (loc,pattern,ident) ->
356         let pattern = disambiguate_pattern pattern in
357         metasenv,GrafiteAst.Generalize (loc,pattern,ident)
358     | GrafiteAst.IdTac loc ->
359         metasenv,GrafiteAst.IdTac loc
360     | GrafiteAst.Intros (loc, specs) ->
361         metasenv,GrafiteAst.Intros (loc, specs)
362     | GrafiteAst.Inversion (loc, term) ->
363        let metasenv,term = disambiguate_term context metasenv term in
364         metasenv,GrafiteAst.Inversion (loc, term)
365     | GrafiteAst.LApply (loc, linear, depth, to_what, what, ident) ->
366        let f term (metasenv, to_what) =
367           let metasenv, term = disambiguate_term context metasenv term in
368           metasenv, term :: to_what
369        in
370        let metasenv, to_what = List.fold_right f to_what (metasenv, []) in 
371        let metasenv, what = disambiguate_term context metasenv what in
372        metasenv,GrafiteAst.LApply (loc, linear, depth, to_what, what, ident)
373     | GrafiteAst.Left loc ->
374        metasenv,GrafiteAst.Left loc
375     | GrafiteAst.LetIn (loc, term, name) ->
376         let metasenv,term = disambiguate_term context metasenv term in
377         metasenv,GrafiteAst.LetIn (loc,term,name)
378     | GrafiteAst.Reduce (loc, red_kind, pattern) ->
379         let pattern = disambiguate_pattern pattern in
380         let red_kind = disambiguate_reduction_kind red_kind in
381         metasenv,GrafiteAst.Reduce(loc, red_kind, pattern)
382     | GrafiteAst.Reflexivity loc ->
383         metasenv,GrafiteAst.Reflexivity loc
384     | GrafiteAst.Replace (loc, pattern, with_what) -> 
385         let pattern = disambiguate_pattern pattern in
386         let with_what = disambiguate_lazy_term with_what in
387         metasenv,GrafiteAst.Replace (loc, pattern, with_what)
388     | GrafiteAst.Rewrite (loc, dir, t, pattern, names) ->
389         let metasenv,term = disambiguate_term context metasenv t in
390         let pattern = disambiguate_pattern pattern in
391         metasenv,GrafiteAst.Rewrite (loc, dir, term, pattern, names)
392     | GrafiteAst.Right loc ->
393         metasenv,GrafiteAst.Right loc
394     | GrafiteAst.Ring loc ->
395         metasenv,GrafiteAst.Ring loc
396     | GrafiteAst.Split loc ->
397         metasenv,GrafiteAst.Split loc
398     | GrafiteAst.Symmetry loc ->
399         metasenv,GrafiteAst.Symmetry loc
400     | GrafiteAst.Transitivity (loc, term) -> 
401         let metasenv,cic = disambiguate_term context metasenv term in
402         metasenv,GrafiteAst.Transitivity (loc, cic)
403       (* Nuovi casi *)
404     | GrafiteAst.Assume (loc, id, term) -> 
405         let metasenv,cic = disambiguate_term context metasenv term in
406         metasenv,GrafiteAst.Assume (loc, id, cic)
407     | GrafiteAst.Suppose (loc, term, id, term') ->
408         let metasenv,cic = disambiguate_term context metasenv term in
409         let metasenv,cic' =
410            match term' with
411               None -> metasenv,None
412             | Some t ->
413                   let metasenv,t = disambiguate_term context metasenv t in
414                   metasenv,Some t in
415         metasenv,GrafiteAst.Suppose (loc, cic, id, cic')
416     | GrafiteAst.Bydone (loc,just) ->
417         let metasenv,just =
418          disambiguate_just disambiguate_term context metasenv just
419         in
420          metasenv,GrafiteAst.Bydone (loc, just)
421     | GrafiteAst.We_need_to_prove (loc,term,id,term') ->
422         let metasenv,cic = disambiguate_term context metasenv term in
423         let metasenv,cic' = 
424             match term' with
425               None -> metasenv,None
426             | Some t ->
427                   let metasenv,t = disambiguate_term context metasenv t in
428                   metasenv,Some t in
429         metasenv,GrafiteAst.We_need_to_prove (loc,cic,id,cic')
430     | GrafiteAst.By_just_we_proved (loc,just,term',id,term'') ->
431         let metasenv,just =
432          disambiguate_just disambiguate_term context metasenv just in
433         let metasenv,cic' = disambiguate_term context metasenv term' in
434         let metasenv,cic'' = 
435             match term'' with
436               None -> metasenv,None
437            |  Some t ->  
438                     let metasenv,t = disambiguate_term context metasenv t in
439                      metasenv,Some t in
440         metasenv,GrafiteAst.By_just_we_proved (loc,just,cic',id,cic'')
441     | GrafiteAst.We_proceed_by_cases_on (loc, term, term') ->
442         let metasenv,cic = disambiguate_term context metasenv term in
443         let metasenv,cic' = disambiguate_term context metasenv term' in
444         metasenv,GrafiteAst.We_proceed_by_cases_on (loc, cic, cic')
445     | GrafiteAst.We_proceed_by_induction_on (loc, term, term') ->
446         let metasenv,cic = disambiguate_term context metasenv term in
447         let metasenv,cic' = disambiguate_term context metasenv term' in
448         metasenv,GrafiteAst.We_proceed_by_induction_on (loc, cic, cic')
449    | GrafiteAst.Byinduction (loc, term, id) ->
450         let metasenv,cic = disambiguate_term context metasenv term in
451         metasenv,GrafiteAst.Byinduction(loc, cic, id)
452    | GrafiteAst.Thesisbecomes (loc, term) ->
453         let metasenv,cic = disambiguate_term context metasenv term in
454         metasenv,GrafiteAst.Thesisbecomes (loc, cic)
455    | GrafiteAst.ExistsElim (loc, just, id1, term1, id2, term2) ->
456         let metasenv,just =
457          disambiguate_just disambiguate_term context metasenv just in
458         let metasenv,cic' = disambiguate_term context metasenv term1 in
459         let cic''= disambiguate_lazy_term term2 in
460         metasenv,GrafiteAst.ExistsElim(loc, just, id1, cic', id2, cic'')
461    | GrafiteAst.AndElim (loc, just, id, term1, id1, term2) ->
462         let metasenv,just =
463          disambiguate_just disambiguate_term context metasenv just in
464         let metasenv,cic'= disambiguate_term context metasenv term1 in
465         let metasenv,cic''= disambiguate_term context metasenv term2 in
466         metasenv,GrafiteAst.AndElim(loc, just, id, cic', id1, cic'')   
467    | GrafiteAst.Case (loc, id, params) ->
468         let metasenv,params' =
469          List.fold_right
470           (fun (id,term) (metasenv,params) ->
471             let metasenv,cic = disambiguate_term context metasenv term in
472              metasenv,(id,cic)::params
473           ) params (metasenv,[])
474         in
475         metasenv,GrafiteAst.Case(loc, id, params')   
476    | GrafiteAst.RewritingStep (loc, term1, term2, term3, cont) ->
477         let metasenv,cic =
478          match term1 with
479             None -> metasenv,None
480           | Some (start,t) -> 
481              let metasenv,t = disambiguate_term context metasenv t in
482               metasenv,Some (start,t) in
483         let metasenv,cic'= disambiguate_term context metasenv term2 in
484         let metasenv,cic'' =
485          match term3 with
486           | `SolveWith term ->
487              let metasenv,term = disambiguate_term context metasenv term in
488              metasenv, `SolveWith term
489           | `Auto params -> 
490               let metasenv, params = disambiguate_auto_params metasenv params in
491               metasenv,`Auto params
492           | `Term t -> 
493              let metasenv,t = disambiguate_term context metasenv t in
494               metasenv,`Term t
495           | `Proof as t -> metasenv,t in
496         metasenv,GrafiteAst.RewritingStep (loc, cic, cic', cic'', cont)   
497
498
499 let disambiguate_obj lexicon_status ?baseuri metasenv (text,prefix_len,obj) =
500   let uri =
501    match obj with
502     | CicNotationPt.Inductive (_,(name,_,_,_)::_)
503     | CicNotationPt.Record (_,name,_,_) ->
504        (match baseuri with
505          | Some baseuri ->
506             Some (UriManager.uri_of_string (baseuri ^ "/" ^ name ^ ".ind"))
507          | None -> raise BaseUriNotSetYet)
508     | CicNotationPt.Inductive _ -> assert false
509     | CicNotationPt.Theorem _ -> None in
510   let (diff, metasenv, _, cic, _) =
511     singleton "third"
512       (GrafiteDisambiguator.disambiguate_obj ~lookup_in_library
513         ~aliases:lexicon_status.LexiconEngine.aliases
514         ~universe:(Some lexicon_status.LexiconEngine.multi_aliases) ~uri 
515         (text,prefix_len,obj)) in
516   let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
517   lexicon_status, metasenv, cic
518   
519 let disambiguate_command lexicon_status ?baseuri metasenv (text,prefix_len,cmd)=
520   match cmd with
521    | GrafiteAst.Index(loc,key,uri) ->
522        let lexicon_status_ref = ref lexicon_status in 
523        let disambiguate_term =
524          disambiguate_term None text prefix_len lexicon_status_ref [] in
525        let disambiguate_term_option metasenv =
526          function
527              None -> metasenv,None
528            | Some t ->
529                let metasenv,t = disambiguate_term metasenv t in
530                  metasenv, Some t
531        in
532        let metasenv,key = disambiguate_term_option metasenv key in
533        !lexicon_status_ref, metasenv,GrafiteAst.Index(loc,key,uri)
534    | GrafiteAst.Coercion (loc,t,b,a,s) -> 
535        let lexicon_status_ref = ref lexicon_status in 
536        let disambiguate_term =
537          disambiguate_term None text prefix_len lexicon_status_ref [] in
538       let metasenv,t = disambiguate_term metasenv t in
539       !lexicon_status_ref, metasenv, GrafiteAst.Coercion (loc,t,b,a,s)
540    | GrafiteAst.Default _
541    | GrafiteAst.Drop _
542    | GrafiteAst.Include _
543    | GrafiteAst.Print _
544    | GrafiteAst.Qed _
545    | GrafiteAst.Set _ as cmd ->
546        lexicon_status,metasenv,cmd
547    | GrafiteAst.Obj (loc,obj) ->
548        let lexicon_status,metasenv,obj =
549         disambiguate_obj lexicon_status ?baseuri metasenv (text,prefix_len,obj)in
550        lexicon_status, metasenv, GrafiteAst.Obj (loc,obj)
551    | GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans) ->
552       let lexicon_status_ref = ref lexicon_status in 
553       let disambiguate_term =
554        disambiguate_term None text prefix_len lexicon_status_ref [] in
555       let disambiguate_term_option metasenv =
556        function
557           None -> metasenv,None
558        | Some t ->
559           let metasenv,t = disambiguate_term metasenv t in
560            metasenv, Some t
561       in
562       let metasenv,a = disambiguate_term metasenv a in
563       let metasenv,aeq = disambiguate_term metasenv aeq in
564       let metasenv,refl = disambiguate_term_option metasenv refl in
565       let metasenv,sym = disambiguate_term_option metasenv sym in
566       let metasenv,trans = disambiguate_term_option metasenv trans in
567        !lexicon_status_ref, metasenv,
568         GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans)
569
570 let disambiguate_macro 
571   lexicon_status_ref metasenv context (text,prefix_len, macro) 
572 =
573  let disambiguate_term = disambiguate_term None text prefix_len lexicon_status_ref in
574   let disambiguate_reduction_kind = 
575     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
576   match macro with
577    | GrafiteAst.WMatch (loc,term) ->
578       let metasenv,term = disambiguate_term context metasenv term in
579        metasenv,GrafiteAst.WMatch (loc,term)
580    | GrafiteAst.WInstance (loc,term) ->
581       let metasenv,term = disambiguate_term context metasenv term in
582        metasenv,GrafiteAst.WInstance (loc,term)
583    | GrafiteAst.WElim (loc,term) ->
584       let metasenv,term = disambiguate_term context metasenv term in
585        metasenv,GrafiteAst.WElim (loc,term)
586    | GrafiteAst.WHint (loc,term) ->
587       let metasenv,term = disambiguate_term context metasenv term in
588        metasenv,GrafiteAst.WHint (loc,term)
589    | GrafiteAst.Check (loc,term) ->
590       let metasenv,term = disambiguate_term context metasenv term in
591        metasenv,GrafiteAst.Check (loc,term)
592    | GrafiteAst.Eval (loc,kind,term) ->
593       let metasenv, term = disambiguate_term context metasenv term in
594       let kind = disambiguate_reduction_kind kind in
595        metasenv,GrafiteAst.Eval (loc,kind,term)
596    | GrafiteAst.AutoInteractive (loc, params) -> 
597       let metasenv, params = 
598         disambiguate_auto_params disambiguate_term metasenv context params in
599       metasenv, GrafiteAst.AutoInteractive (loc, params)
600    | GrafiteAst.Hint _
601    | GrafiteAst.WLocate _
602    | GrafiteAst.Inline _ as macro ->
603       metasenv,macro