]> matita.cs.unibo.it Git - helm.git/blob - helm/software/components/grafite_parser/grafiteDisambiguate.ml
Stricter type: the type now shows that disambiguation only alter the lexicon.
[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 __Implicit = "__Implicit__"
49 let __Closed_Implicit = "__Closed_Implicit__"
50
51 let cic_mk_choice = function
52   | LexiconAst.Symbol_alias (name, _, dsc) ->
53      if name = __Implicit then
54        dsc, `Sym_interp (fun _ -> Cic.Implicit None)
55      else if name = __Closed_Implicit then 
56        dsc, `Sym_interp (fun _ -> Cic.Implicit (Some `Closed))
57      else
58        DisambiguateChoices.cic_lookup_symbol_by_dsc name dsc
59   | LexiconAst.Number_alias (_, dsc) ->
60      DisambiguateChoices.lookup_num_by_dsc dsc
61   | LexiconAst.Ident_alias (name, uri) -> 
62      uri, `Sym_interp 
63       (fun l->assert(l = []);CicUtil.term_of_uri (UriManager.uri_of_string uri))
64 ;;
65
66 let ncic_mk_choice = function
67   | LexiconAst.Symbol_alias (name, _, dsc) ->
68      if name = __Implicit then
69        dsc, `Sym_interp (fun _ -> NCic.Implicit `Term)
70      else if name = __Closed_Implicit then 
71        dsc, `Sym_interp (fun _ -> NCic.Implicit `Closed)
72      else
73        DisambiguateChoices.lookup_symbol_by_dsc 
74         ~mk_implicit:(function 
75            | true -> NCic.Implicit `Closed
76            | false -> NCic.Implicit `Term)
77         ~mk_appl:(function 
78            (NCic.Appl l)::tl -> NCic.Appl (l@tl) | l -> NCic.Appl l)
79         ~term_of_uri:(fun uri ->
80            fst (OCic2NCic.convert_term uri (CicUtil.term_of_uri uri)))
81         ~term_of_nref:(fun nref -> NCic.Const nref)
82        name dsc
83   | LexiconAst.Number_alias (_, dsc) -> 
84        let desc,f = DisambiguateChoices.lookup_num_by_dsc dsc in
85        desc, `Num_interp
86          (fun num -> 
87             fst (OCic2NCic.convert_term 
88               (UriManager.uri_of_string "cic:/xxx/x.con") 
89               (match f with `Num_interp f -> f num | _ -> assert false)))
90   | LexiconAst.Ident_alias (name, uri) -> 
91      uri, `Sym_interp 
92       (fun l->assert(l = []);
93         try
94          let nref = NReference.reference_of_string uri in
95           NCic.Const nref
96         with
97          NReference.IllFormedReference _ ->
98           let uri = UriManager.uri_of_string uri in
99            fst (OCic2NCic.convert_term uri (CicUtil.term_of_uri uri)))
100 ;;
101
102
103 let mk_implicit b =
104   match b with
105   | false -> 
106       LexiconAst.Symbol_alias (__Implicit,-1,"Fake Implicit")
107   | true -> 
108       LexiconAst.Symbol_alias (__Closed_Implicit,-1,"Fake Closed Implicit")
109 ;;
110
111 let lookup_in_library 
112   interactive_user_uri_choice input_or_locate_uri item 
113 =
114   let mk_ident_alias id u =
115     LexiconAst.Ident_alias (id,UriManager.string_of_uri u)
116   in
117   let mk_num_alias instance = 
118     List.map 
119      (fun dsc,_ -> LexiconAst.Number_alias (instance,dsc)) 
120      (DisambiguateChoices.lookup_num_choices())
121   in
122   let mk_symbol_alias symb ino (dsc, _,_) =
123      LexiconAst.Symbol_alias (symb,ino,dsc)
124   in
125   let dbd = LibraryDb.instance () in
126   let choices_of_id id =
127     let uris = Whelp.locate ~dbd id in
128      match uris with
129       | [] ->
130          (match 
131            (input_or_locate_uri 
132              ~title:("URI matching \"" ^ id ^ "\" unknown.") 
133              ?id:(Some id) ()) 
134          with
135          | None -> []
136          | Some uri -> [uri])
137       | [uri] -> [uri]
138       | _ ->
139           interactive_user_uri_choice ~selection_mode:`MULTIPLE
140            ?ok:(Some "Try selected.") 
141            ?enable_button_for_non_vars:(Some true)
142            ~title:"Ambiguous input."
143            ~msg: ("Ambiguous input \"" ^ id ^
144               "\". Please, choose one or more interpretations:")
145            ~id
146            uris
147   in
148   match item with
149   | DisambiguateTypes.Id id -> 
150       let uris = choices_of_id id in
151       List.map (mk_ident_alias id) uris
152   | DisambiguateTypes.Symbol (symb, ino) ->
153    (try
154      List.map (mk_symbol_alias symb ino) 
155       (TermAcicContent.lookup_interpretations symb)
156     with
157      TermAcicContent.Interpretation_not_found -> [])
158   | DisambiguateTypes.Num instance -> mk_num_alias instance
159 ;;
160
161 let nlookup_in_library 
162   interactive_user_uri_choice input_or_locate_uri item 
163 =
164   match item with
165   | DisambiguateTypes.Id id -> 
166      (try
167        let references = NCicLibrary.resolve id in
168         List.map
169          (fun u -> LexiconAst.Ident_alias (id,NReference.string_of_reference u)
170          ) references @
171         lookup_in_library interactive_user_uri_choice input_or_locate_uri item
172       with
173        NCicEnvironment.ObjectNotFound _ ->
174         lookup_in_library interactive_user_uri_choice input_or_locate_uri item)
175   | _ -> lookup_in_library interactive_user_uri_choice input_or_locate_uri item 
176 ;;
177
178   (** @param term not meaningful when context is given *)
179 let disambiguate_term expty text prefix_len lexicon_status_ref context metasenv
180 term =
181   let lexicon_status = !lexicon_status_ref in
182   let (diff, metasenv, subst, cic, _) =
183     singleton "first"
184       (CicDisambiguate.disambiguate_term
185         ~aliases:lexicon_status#lstatus.LexiconEngine.aliases
186         ~expty ~universe:(Some lexicon_status#lstatus.LexiconEngine.multi_aliases)
187         ~lookup_in_library
188         ~mk_choice:cic_mk_choice
189         ~mk_implicit
190         ~description_of_alias:LexiconAst.description_of_alias
191         ~context ~metasenv ~subst:[] (text,prefix_len,term))
192   in
193   let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
194   lexicon_status_ref := lexicon_status;
195   metasenv,(*subst,*) cic
196 ;;
197
198 let disambiguate_nterm expty estatus context metasenv subst thing
199 =
200   let diff, metasenv, subst, cic =
201     singleton "first"
202       (NCicDisambiguate.disambiguate_term
203         ~rdb:estatus
204         ~aliases:estatus#lstatus.LexiconEngine.aliases
205         ~expty 
206         ~universe:(Some estatus#lstatus.LexiconEngine.multi_aliases)
207         ~lookup_in_library:nlookup_in_library
208         ~mk_choice:ncic_mk_choice
209         ~mk_implicit
210         ~description_of_alias:LexiconAst.description_of_alias
211         ~context ~metasenv ~subst thing)
212   in
213   let estatus = LexiconEngine.set_proof_aliases estatus diff in
214    metasenv, subst, estatus, cic
215 ;;
216
217
218   (** disambiguate_lazy_term (circa): term -> (unit -> status) * lazy_term
219    * rationale: lazy_term will be invoked in different context to obtain a term,
220    * each invocation will disambiguate the term and can add aliases. Once all
221    * disambiguations have been performed, the first returned function can be
222    * used to obtain the resulting aliases *)
223 let disambiguate_lazy_term expty text prefix_len lexicon_status_ref term =
224   (fun context metasenv ugraph ->
225     let lexicon_status = !lexicon_status_ref in
226     let (diff, metasenv, _, cic, ugraph) =
227       singleton "second"
228         (CicDisambiguate.disambiguate_term 
229           ~lookup_in_library
230           ~mk_choice:cic_mk_choice
231           ~mk_implicit
232           ~description_of_alias:LexiconAst.description_of_alias
233           ~initial_ugraph:ugraph ~aliases:lexicon_status#lstatus.LexiconEngine.aliases
234           ~universe:(Some lexicon_status#lstatus.LexiconEngine.multi_aliases)
235           ~context ~metasenv ~subst:[] 
236           (text,prefix_len,term) ~expty) in
237     let lexicon_status = LexiconEngine.set_proof_aliases lexicon_status diff in
238     lexicon_status_ref := lexicon_status;
239     cic, metasenv, ugraph)
240 ;;
241
242 let disambiguate_pattern 
243   text prefix_len lexicon_status_ref (wanted, hyp_paths, goal_path) 
244 =
245   let interp path =CicDisambiguate.interpretate_path [] path in
246   let goal_path = HExtlib.map_option interp goal_path in
247   let hyp_paths = List.map (fun (name, path) -> name, interp path) hyp_paths in
248   let wanted =
249    match wanted with
250       None -> None
251     | Some wanted ->
252        let wanted = 
253          disambiguate_lazy_term None text prefix_len lexicon_status_ref wanted 
254        in
255        Some wanted
256   in
257   (wanted, hyp_paths, goal_path)
258 ;;
259
260 type pattern = 
261   CicNotationPt.term Disambiguate.disambiguator_input option * 
262   (string * NCic.term) list * NCic.term option
263
264 let disambiguate_npattern (text, prefix_len, (wanted, hyp_paths, goal_path)) =
265   let interp path = NCicDisambiguate.disambiguate_path path in
266   let goal_path = HExtlib.map_option interp goal_path in
267   let hyp_paths = List.map (fun (name, path) -> name, interp path) hyp_paths in
268   let wanted = 
269     match wanted with None -> None | Some x -> Some (text,prefix_len,x)
270   in
271    (wanted, hyp_paths, goal_path)
272 ;;
273
274 let disambiguate_reduction_kind text prefix_len lexicon_status_ref = function
275   | `Unfold (Some t) ->
276       let t = 
277          disambiguate_lazy_term None text prefix_len lexicon_status_ref t in
278       `Unfold (Some t)
279   | `Normalize
280   | `Simpl
281   | `Unfold None
282   | `Whd as kind -> kind
283 ;;
284
285 let disambiguate_auto_params 
286   disambiguate_term metasenv context (terms, params) 
287 =
288     let metasenv, terms = 
289       List.fold_right 
290        (fun t (metasenv, terms) ->
291          let metasenv,t = disambiguate_term context metasenv t in
292          metasenv,t::terms) terms (metasenv, [])
293     in
294     metasenv, (terms, params)
295 ;;
296
297 let disambiguate_just disambiguate_term context metasenv =
298  function
299     `Term t ->
300       let metasenv,t = disambiguate_term context metasenv t in
301        metasenv, `Term t
302   | `Auto params ->
303       let metasenv,params = disambiguate_auto_params disambiguate_term metasenv
304        context params
305       in
306        metasenv, `Auto params
307 ;;
308       
309 let rec disambiguate_tactic 
310   lexicon_status_ref context metasenv goal (text,prefix_len,tactic) 
311 =
312   let disambiguate_term_hint = 
313     let _,_,expty = 
314       List.find (fun (x,_,_) -> Some x = goal) metasenv
315     in
316     disambiguate_term (Some expty) text prefix_len lexicon_status_ref in
317   let disambiguate_term = 
318     disambiguate_term None text prefix_len lexicon_status_ref in
319   let disambiguate_pattern = 
320     disambiguate_pattern text prefix_len lexicon_status_ref in
321   let disambiguate_reduction_kind = 
322     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
323   let disambiguate_lazy_term = 
324     disambiguate_lazy_term None text prefix_len lexicon_status_ref in
325   let disambiguate_tactic metasenv tac =
326    disambiguate_tactic lexicon_status_ref context metasenv goal (text,prefix_len,tac)
327   in
328   let disambiguate_auto_params m p = 
329     disambiguate_auto_params disambiguate_term m context p
330   in
331    match tactic with
332     (* Higher  order tactics *)
333     | GrafiteAst.Progress (loc,tac) ->
334         let metasenv,tac = disambiguate_tactic metasenv tac in
335         metasenv,GrafiteAst.Progress (loc,tac)
336     | GrafiteAst.Solve (loc,tacl) ->
337         let metasenv,tacl =
338          List.fold_right
339           (fun tac (metasenv,tacl) ->
340             let metasenv,tac = disambiguate_tactic metasenv tac in
341              metasenv,tac::tacl
342           ) tacl (metasenv,[])
343         in
344          metasenv,GrafiteAst.Solve (loc,tacl)
345     | GrafiteAst.Try (loc,tac) ->
346         let metasenv,tac = disambiguate_tactic metasenv tac in
347         metasenv,GrafiteAst.Try (loc,tac)
348     | GrafiteAst.First (loc,tacl) ->
349         let metasenv,tacl =
350          List.fold_right
351           (fun tac (metasenv,tacl) ->
352             let metasenv,tac = disambiguate_tactic metasenv tac in
353              metasenv,tac::tacl
354           ) tacl (metasenv,[])
355         in
356          metasenv,GrafiteAst.First (loc,tacl)
357     | GrafiteAst.Seq (loc,tacl) ->
358         let metasenv,tacl =
359          List.fold_right
360           (fun tac (metasenv,tacl) ->
361             let metasenv,tac = disambiguate_tactic metasenv tac in
362              metasenv,tac::tacl
363           ) tacl (metasenv,[])
364         in
365          metasenv,GrafiteAst.Seq (loc,tacl)
366     | GrafiteAst.Repeat (loc,tac) ->
367         let metasenv,tac = disambiguate_tactic metasenv tac in
368         metasenv,GrafiteAst.Repeat (loc,tac)
369     | GrafiteAst.Do (loc,n,tac) ->
370         let metasenv,tac = disambiguate_tactic metasenv tac in
371         metasenv,GrafiteAst.Do (loc,n,tac)
372     | GrafiteAst.Then (loc,tac,tacl) ->
373         let metasenv,tac = disambiguate_tactic metasenv tac in
374         let metasenv,tacl =
375          List.fold_right
376           (fun tac (metasenv,tacl) ->
377             let metasenv,tac = disambiguate_tactic metasenv tac in
378              metasenv,tac::tacl
379           ) tacl (metasenv,[])
380         in
381          metasenv,GrafiteAst.Then (loc,tac,tacl)
382     (* First order tactics *)
383     | GrafiteAst.Absurd (loc, term) -> 
384         let metasenv,cic = disambiguate_term context metasenv term in
385         metasenv,GrafiteAst.Absurd (loc, cic)
386     | GrafiteAst.Apply (loc, term) ->
387         let metasenv,cic = disambiguate_term context metasenv term in
388         metasenv,GrafiteAst.Apply (loc, cic)
389     | GrafiteAst.ApplyRule (loc, term) ->
390         let metasenv,cic = disambiguate_term_hint context metasenv term in
391         metasenv,GrafiteAst.ApplyRule (loc, cic)
392     | GrafiteAst.ApplyP (loc, term) ->
393         let metasenv,cic = disambiguate_term context metasenv term in
394         metasenv,GrafiteAst.ApplyP (loc, cic)
395     | GrafiteAst.ApplyS (loc, term, params) ->
396         let metasenv, params = disambiguate_auto_params metasenv params in
397         let metasenv,cic = disambiguate_term context metasenv term in
398         metasenv,GrafiteAst.ApplyS (loc, cic, params)
399     | GrafiteAst.Assumption loc ->
400         metasenv,GrafiteAst.Assumption loc
401     | GrafiteAst.AutoBatch (loc,params) ->
402         let metasenv, params = disambiguate_auto_params metasenv params in
403         metasenv,GrafiteAst.AutoBatch (loc,params)
404     | GrafiteAst.Cases (loc, what, pattern, idents) ->
405         let metasenv,what = disambiguate_term context metasenv what in
406         let pattern = disambiguate_pattern pattern in
407         metasenv,GrafiteAst.Cases (loc, what, pattern, idents)
408     | GrafiteAst.Change (loc, pattern, with_what) -> 
409         let with_what = disambiguate_lazy_term with_what in
410         let pattern = disambiguate_pattern pattern in
411         metasenv,GrafiteAst.Change (loc, pattern, with_what)
412     | GrafiteAst.Clear (loc,id) ->
413         metasenv,GrafiteAst.Clear (loc,id)
414     | GrafiteAst.ClearBody (loc,id) ->
415        metasenv,GrafiteAst.ClearBody (loc,id)
416     | GrafiteAst.Compose (loc, t1, t2, times, spec) ->
417         let metasenv,t1 = disambiguate_term context metasenv t1 in
418         let metasenv,t2 = 
419           match t2 with
420           | None -> metasenv, None
421           | Some t2 -> 
422               let m, t2 = disambiguate_term context metasenv t2 in
423               m, Some t2
424         in
425         metasenv,   GrafiteAst.Compose (loc, t1, t2, times, spec)
426     | GrafiteAst.Constructor (loc,n) ->
427         metasenv,GrafiteAst.Constructor (loc,n)
428     | GrafiteAst.Contradiction loc ->
429         metasenv,GrafiteAst.Contradiction loc
430     | GrafiteAst.Cut (loc, ident, term) -> 
431         let metasenv,cic = disambiguate_term context metasenv term in
432         metasenv,GrafiteAst.Cut (loc, ident, cic)
433     | GrafiteAst.Decompose (loc, names) ->
434          metasenv,GrafiteAst.Decompose (loc, names)
435     | GrafiteAst.Demodulate (loc, params) ->
436         let metasenv, params = disambiguate_auto_params metasenv params in
437         metasenv,GrafiteAst.Demodulate (loc, params)
438     | GrafiteAst.Destruct (loc, Some terms) ->
439         let map term (metasenv, terms) =
440            let metasenv, term = disambiguate_term context metasenv term in
441            metasenv, term :: terms
442         in
443         let metasenv, terms = List.fold_right map terms (metasenv, []) in 
444         metasenv, GrafiteAst.Destruct(loc, Some terms)
445     | GrafiteAst.Destruct (loc, None) ->
446         metasenv,GrafiteAst.Destruct(loc,None)
447     | GrafiteAst.Exact (loc, term) -> 
448         let metasenv,cic = disambiguate_term context metasenv term in
449         metasenv,GrafiteAst.Exact (loc, cic)
450     | GrafiteAst.Elim (loc, what, Some using, pattern, specs) ->
451         let metasenv,what = disambiguate_term context metasenv what in
452         let metasenv,using = disambiguate_term context metasenv using in
453         let pattern = disambiguate_pattern pattern in
454         metasenv,GrafiteAst.Elim (loc, what, Some using, pattern, specs)
455     | GrafiteAst.Elim (loc, what, None, pattern, specs) ->
456         let metasenv,what = disambiguate_term context metasenv what in
457         let pattern = disambiguate_pattern pattern in
458         metasenv,GrafiteAst.Elim (loc, what, None, pattern, specs)
459     | GrafiteAst.ElimType (loc, what, Some using, specs) ->
460         let metasenv,what = disambiguate_term context metasenv what in
461         let metasenv,using = disambiguate_term context metasenv using in
462         metasenv,GrafiteAst.ElimType (loc, what, Some using, specs)
463     | GrafiteAst.ElimType (loc, what, None, specs) ->
464         let metasenv,what = disambiguate_term context metasenv what in
465         metasenv,GrafiteAst.ElimType (loc, what, None, specs)
466     | GrafiteAst.Exists loc ->
467         metasenv,GrafiteAst.Exists loc 
468     | GrafiteAst.Fail loc ->
469         metasenv,GrafiteAst.Fail loc
470     | GrafiteAst.Fold (loc,red_kind, term, pattern) ->
471         let pattern = disambiguate_pattern pattern in
472         let term = disambiguate_lazy_term term in
473         let red_kind = disambiguate_reduction_kind red_kind in
474         metasenv,GrafiteAst.Fold (loc, red_kind, term, pattern)
475     | GrafiteAst.FwdSimpl (loc, hyp, names) ->
476        metasenv,GrafiteAst.FwdSimpl (loc, hyp, names)  
477     | GrafiteAst.Fourier loc ->
478        metasenv,GrafiteAst.Fourier loc
479     | GrafiteAst.Generalize (loc,pattern,ident) ->
480         let pattern = disambiguate_pattern pattern in
481         metasenv,GrafiteAst.Generalize (loc,pattern,ident)
482     | GrafiteAst.IdTac loc ->
483         metasenv,GrafiteAst.IdTac loc
484     | GrafiteAst.Intros (loc, specs) ->
485         metasenv,GrafiteAst.Intros (loc, specs)
486     | GrafiteAst.Inversion (loc, term) ->
487        let metasenv,term = disambiguate_term context metasenv term in
488         metasenv,GrafiteAst.Inversion (loc, term)
489     | GrafiteAst.LApply (loc, linear, depth, to_what, what, ident) ->
490        let f term (metasenv, to_what) =
491           let metasenv, term = disambiguate_term context metasenv term in
492           metasenv, term :: to_what
493        in
494        let metasenv, to_what = List.fold_right f to_what (metasenv, []) in 
495        let metasenv, what = disambiguate_term context metasenv what in
496        metasenv,GrafiteAst.LApply (loc, linear, depth, to_what, what, ident)
497     | GrafiteAst.Left loc ->
498        metasenv,GrafiteAst.Left loc
499     | GrafiteAst.LetIn (loc, term, name) ->
500         let metasenv,term = disambiguate_term context metasenv term in
501         metasenv,GrafiteAst.LetIn (loc,term,name)
502     | GrafiteAst.Reduce (loc, red_kind, pattern) ->
503         let pattern = disambiguate_pattern pattern in
504         let red_kind = disambiguate_reduction_kind red_kind in
505         metasenv,GrafiteAst.Reduce(loc, red_kind, pattern)
506     | GrafiteAst.Reflexivity loc ->
507         metasenv,GrafiteAst.Reflexivity loc
508     | GrafiteAst.Replace (loc, pattern, with_what) -> 
509         let pattern = disambiguate_pattern pattern in
510         let with_what = disambiguate_lazy_term with_what in
511         metasenv,GrafiteAst.Replace (loc, pattern, with_what)
512     | GrafiteAst.Rewrite (loc, dir, t, pattern, names) ->
513         let metasenv,term = disambiguate_term context metasenv t in
514         let pattern = disambiguate_pattern pattern in
515         metasenv,GrafiteAst.Rewrite (loc, dir, term, pattern, names)
516     | GrafiteAst.Right loc ->
517         metasenv,GrafiteAst.Right loc
518     | GrafiteAst.Ring loc ->
519         metasenv,GrafiteAst.Ring loc
520     | GrafiteAst.Split loc ->
521         metasenv,GrafiteAst.Split loc
522     | GrafiteAst.Symmetry loc ->
523         metasenv,GrafiteAst.Symmetry loc
524     | GrafiteAst.Transitivity (loc, term) -> 
525         let metasenv,cic = disambiguate_term context metasenv term in
526         metasenv,GrafiteAst.Transitivity (loc, cic)
527       (* Nuovi casi *)
528     | GrafiteAst.Assume (loc, id, term) -> 
529         let metasenv,cic = disambiguate_term context metasenv term in
530         metasenv,GrafiteAst.Assume (loc, id, cic)
531     | GrafiteAst.Suppose (loc, term, id, term') ->
532         let metasenv,cic = disambiguate_term context metasenv term in
533         let metasenv,cic' =
534            match term' with
535               None -> metasenv,None
536             | Some t ->
537                   let metasenv,t = disambiguate_term context metasenv t in
538                   metasenv,Some t in
539         metasenv,GrafiteAst.Suppose (loc, cic, id, cic')
540     | GrafiteAst.Bydone (loc,just) ->
541         let metasenv,just =
542          disambiguate_just disambiguate_term context metasenv just
543         in
544          metasenv,GrafiteAst.Bydone (loc, just)
545     | GrafiteAst.We_need_to_prove (loc,term,id,term') ->
546         let metasenv,cic = disambiguate_term context metasenv term in
547         let metasenv,cic' = 
548             match term' with
549               None -> metasenv,None
550             | Some t ->
551                   let metasenv,t = disambiguate_term context metasenv t in
552                   metasenv,Some t in
553         metasenv,GrafiteAst.We_need_to_prove (loc,cic,id,cic')
554     | GrafiteAst.By_just_we_proved (loc,just,term',id,term'') ->
555         let metasenv,just =
556          disambiguate_just disambiguate_term context metasenv just in
557         let metasenv,cic' = disambiguate_term context metasenv term' in
558         let metasenv,cic'' = 
559             match term'' with
560               None -> metasenv,None
561            |  Some t ->  
562                     let metasenv,t = disambiguate_term context metasenv t in
563                      metasenv,Some t in
564         metasenv,GrafiteAst.By_just_we_proved (loc,just,cic',id,cic'')
565     | GrafiteAst.We_proceed_by_cases_on (loc, term, term') ->
566         let metasenv,cic = disambiguate_term context metasenv term in
567         let metasenv,cic' = disambiguate_term context metasenv term' in
568         metasenv,GrafiteAst.We_proceed_by_cases_on (loc, cic, cic')
569     | GrafiteAst.We_proceed_by_induction_on (loc, term, term') ->
570         let metasenv,cic = disambiguate_term context metasenv term in
571         let metasenv,cic' = disambiguate_term context metasenv term' in
572         metasenv,GrafiteAst.We_proceed_by_induction_on (loc, cic, cic')
573    | GrafiteAst.Byinduction (loc, term, id) ->
574         let metasenv,cic = disambiguate_term context metasenv term in
575         metasenv,GrafiteAst.Byinduction(loc, cic, id)
576    | GrafiteAst.Thesisbecomes (loc, term) ->
577         let metasenv,cic = disambiguate_term context metasenv term in
578         metasenv,GrafiteAst.Thesisbecomes (loc, cic)
579    | GrafiteAst.ExistsElim (loc, just, id1, term1, id2, term2) ->
580         let metasenv,just =
581          disambiguate_just disambiguate_term context metasenv just in
582         let metasenv,cic' = disambiguate_term context metasenv term1 in
583         let cic''= disambiguate_lazy_term term2 in
584         metasenv,GrafiteAst.ExistsElim(loc, just, id1, cic', id2, cic'')
585    | GrafiteAst.AndElim (loc, just, id, term1, id1, term2) ->
586         let metasenv,just =
587          disambiguate_just disambiguate_term context metasenv just in
588         let metasenv,cic'= disambiguate_term context metasenv term1 in
589         let metasenv,cic''= disambiguate_term context metasenv term2 in
590         metasenv,GrafiteAst.AndElim(loc, just, id, cic', id1, cic'')   
591    | GrafiteAst.Case (loc, id, params) ->
592         let metasenv,params' =
593          List.fold_right
594           (fun (id,term) (metasenv,params) ->
595             let metasenv,cic = disambiguate_term context metasenv term in
596              metasenv,(id,cic)::params
597           ) params (metasenv,[])
598         in
599         metasenv,GrafiteAst.Case(loc, id, params')   
600    | GrafiteAst.RewritingStep (loc, term1, term2, term3, cont) ->
601         let metasenv,cic =
602          match term1 with
603             None -> metasenv,None
604           | Some (start,t) -> 
605              let metasenv,t = disambiguate_term context metasenv t in
606               metasenv,Some (start,t) in
607         let metasenv,cic'= disambiguate_term context metasenv term2 in
608         let metasenv,cic'' =
609          match term3 with
610           | `SolveWith term ->
611              let metasenv,term = disambiguate_term context metasenv term in
612              metasenv, `SolveWith term
613           | `Auto params -> 
614               let metasenv, params = disambiguate_auto_params metasenv params in
615               metasenv,`Auto params
616           | `Term t -> 
617              let metasenv,t = disambiguate_term context metasenv t in
618               metasenv,`Term t
619           | `Proof as t -> metasenv,t in
620         metasenv,GrafiteAst.RewritingStep (loc, cic, cic', cic'', cont)   
621
622 let disambiguate_obj estatus ?baseuri metasenv (text,prefix_len,obj) =
623   let uri =
624    let baseuri = 
625      match baseuri with Some x -> x | None -> raise BaseUriNotSetYet
626    in
627    let name = 
628      match obj with
629      | CicNotationPt.Inductive (_,(name,_,_,_)::_)
630      | CicNotationPt.Record (_,name,_,_) -> name ^ ".ind"
631      | CicNotationPt.Theorem (_,name,_,_) -> name ^ ".con"
632      | CicNotationPt.Inductive _ -> assert false
633    in
634      UriManager.uri_of_string (baseuri ^ "/" ^ name)
635   in
636 (*
637  let _try_new cic =
638   (NCicLibrary.clear_cache ();
639    NCicEnvironment.invalidate ();
640    OCic2NCic.clear ();
641    let graph = 
642      match cic with
643      | Some (Cic.CurrentProof (_,metasenv, _, ty,_,_)) ->
644          let _, ugraph = 
645            CicTypeChecker.type_of_aux' metasenv [] ty CicUniv.empty_ugraph
646          in
647            ugraph
648      | Some (Cic.Constant (_,_, ty,_,_)) ->
649          let _, ugraph = 
650                  CicTypeChecker.type_of_aux' [] [] ty CicUniv.empty_ugraph
651          in
652            ugraph
653      | _ -> CicUniv.empty_ugraph
654    in
655
656 (*
657    prerr_endline "PRIMA COERCIONS";
658    let _,l = CicUniv.do_rank graph in
659    List.iter (fun k -> 
660      prerr_endline (CicUniv.string_of_universe k ^ " = " ^ string_of_int
661      (CicUniv.get_rank k))) l;
662 *)
663
664    let graph =
665        List.fold_left 
666          (fun graph (_,_,l) ->
667            List.fold_left
668              (fun graph (uri,_,_) ->
669                 let _,g = CicTypeChecker.typecheck uri in
670                 CicUniv.merge_ugraphs ~base_ugraph:graph ~increment:(g,uri))
671              graph l)
672        graph (CoercDb.to_list (CoercDb.dump ()))
673    in
674    ignore(CicUniv.do_rank graph);
675
676
677 (*
678    prerr_endline "DOPO COERCIONS";
679    let _,l = CicUniv.do_rank graph in
680    List.iter (fun k -> 
681      prerr_endline (CicUniv.string_of_universe k ^ " = " ^ string_of_int
682      (CicUniv.get_rank k))) l;
683 *)
684
685
686    prerr_endline "INIZIO NUOVA DISAMBIGUAZIONE";
687    let time = Unix.gettimeofday () in
688        (try
689          (match 
690           NCicDisambiguate.disambiguate_obj
691            ~rdb:estatus
692            ~lookup_in_library:nlookup_in_library
693            ~description_of_alias:LexiconAst.description_of_alias
694            ~mk_choice:ncic_mk_choice
695            ~mk_implicit
696            ~uri:(OCic2NCic.nuri_of_ouri uri)
697            ~aliases:estatus#lstatus.LexiconEngine.aliases
698            ~universe:(Some estatus#lstatus.LexiconEngine.multi_aliases)
699            (text,prefix_len,obj)
700          with
701          | [_,_,_,obj],_ ->
702           let time = Unix.gettimeofday () -. time in
703 (*           NCicTypeChecker.typecheck_obj obj; *)
704           prerr_endline ("NUOVA DISAMBIGUAZIONE OK: "^ string_of_float time);
705 (*
706           let obj = 
707             let u,i,m,_,o = obj in
708             u,i,m,[],o
709           in
710 *)
711           prerr_endline (NCicPp.ppobj obj)
712          | _ ->
713           prerr_endline ("NUOVA DISAMBIGUAZIONE AMBIGUO!!!!!!!!!  "))
714        with 
715        | MultiPassDisambiguator.DisambiguationError (_,s) ->
716         prerr_endline ("ERRORE NUOVA DISAMBIGUAZIONE ("
717           ^UriManager.string_of_uri uri^
718           "):\n" ^
719          String.concat "\n" 
720           (List.map (fun _,_,x,_ -> snd (Lazy.force x)) (List.flatten s)))
721 (*        | exn -> prerr_endline (Printexc.to_string exn) *)
722        )
723   )
724  in 
725 *)
726
727
728  try
729 (*   let time = Unix.gettimeofday () in  *)
730
731
732   let (diff, metasenv, _, cic, _) =
733     singleton "third"
734       (CicDisambiguate.disambiguate_obj 
735         ~lookup_in_library 
736         ~mk_choice:cic_mk_choice
737         ~mk_implicit
738         ~description_of_alias:LexiconAst.description_of_alias
739         ~aliases:estatus#lstatus.LexiconEngine.aliases
740         ~universe:(Some estatus#lstatus.LexiconEngine.multi_aliases) 
741         ~uri:(Some uri)
742         (text,prefix_len,obj)) 
743   in
744
745
746 (*
747   let time = Unix.gettimeofday () -. time in
748   prerr_endline ("VECCHIA DISAMBIGUAZIONE ("^
749     UriManager.string_of_uri uri ^"): " ^ string_of_float time);
750 *)
751 (*    try_new (Some cic);   *)
752
753
754   let estatus = LexiconEngine.set_proof_aliases estatus diff in
755    estatus, metasenv, cic
756
757  with 
758  | Sys.Break as exn -> raise exn
759  | exn ->
760 (*    try_new None; *)
761    raise exn
762 ;;
763
764 let disambiguate_nobj estatus ?baseuri (text,prefix_len,obj) =
765   let uri =
766    let baseuri = 
767      match baseuri with Some x -> x | None -> raise BaseUriNotSetYet
768    in
769    let name = 
770      match obj with
771      | CicNotationPt.Inductive (_,(name,_,_,_)::_)
772      | CicNotationPt.Record (_,name,_,_) -> name ^ ".ind"
773      | CicNotationPt.Theorem (_,name,_,_) -> name ^ ".con"
774      | CicNotationPt.Inductive _ -> assert false
775    in
776      UriManager.uri_of_string (baseuri ^ "/" ^ name)
777   in
778   let diff, _, _, cic =
779    singleton "third"
780     (NCicDisambiguate.disambiguate_obj
781       ~lookup_in_library:nlookup_in_library
782       ~description_of_alias:LexiconAst.description_of_alias
783       ~mk_choice:ncic_mk_choice
784       ~mk_implicit
785       ~uri:(OCic2NCic.nuri_of_ouri uri)
786       ~rdb:estatus
787       ~aliases:estatus#lstatus.LexiconEngine.aliases
788       ~universe:(Some estatus#lstatus.LexiconEngine.multi_aliases) 
789       (text,prefix_len,obj)) in
790   let estatus = LexiconEngine.set_proof_aliases estatus diff in
791    estatus, cic
792 ;;
793   
794 let disambiguate_command estatus ?baseuri metasenv (text,prefix_len,cmd)=
795   match cmd with
796    | GrafiteAst.Index(loc,key,uri) ->
797        let lexicon_status_ref = ref estatus in 
798        let disambiguate_term =
799          disambiguate_term None text prefix_len lexicon_status_ref [] in
800        let disambiguate_term_option metasenv =
801          function
802              None -> metasenv,None
803            | Some t ->
804                let metasenv,t = disambiguate_term metasenv t in
805                  metasenv, Some t
806        in
807        let metasenv,key = disambiguate_term_option metasenv key in
808         !lexicon_status_ref,metasenv,GrafiteAst.Index(loc,key,uri)
809    | GrafiteAst.Select (loc,uri) -> 
810         estatus, metasenv, GrafiteAst.Select(loc,uri)
811    | GrafiteAst.Pump(loc,i) -> 
812         estatus, metasenv, GrafiteAst.Pump(loc,i)
813    | GrafiteAst.PreferCoercion (loc,t) -> 
814        let lexicon_status_ref = ref estatus in 
815        let disambiguate_term =
816          disambiguate_term None text prefix_len lexicon_status_ref [] in
817       let metasenv,t = disambiguate_term metasenv t in
818        !lexicon_status_ref, metasenv, GrafiteAst.PreferCoercion (loc,t)
819    | GrafiteAst.Coercion (loc,t,b,a,s) -> 
820        let lexicon_status_ref = ref estatus in 
821        let disambiguate_term =
822          disambiguate_term None text prefix_len lexicon_status_ref [] in
823       let metasenv,t = disambiguate_term metasenv t in
824        !lexicon_status_ref, metasenv, GrafiteAst.Coercion (loc,t,b,a,s)
825    | GrafiteAst.Inverter (loc,n,indty,params) ->
826        let lexicon_status_ref = ref estatus in
827        let disambiguate_term = 
828          disambiguate_term None text prefix_len lexicon_status_ref [] in
829        let metasenv,indty = disambiguate_term metasenv indty in
830         !lexicon_status_ref, metasenv, GrafiteAst.Inverter (loc,n,indty,params)
831    | GrafiteAst.Default _
832    | GrafiteAst.Drop _
833    | GrafiteAst.Include _
834    | GrafiteAst.Print _
835    | GrafiteAst.Qed _
836    | GrafiteAst.Set _ as cmd ->
837        estatus,metasenv,cmd
838    | GrafiteAst.Obj (loc,obj) ->
839        let estatus,metasenv,obj =
840         disambiguate_obj estatus ?baseuri metasenv (text,prefix_len,obj)in
841        estatus, metasenv, GrafiteAst.Obj (loc,obj)
842    | GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans) ->
843       let lexicon_status_ref = ref estatus in 
844       let disambiguate_term =
845        disambiguate_term None text prefix_len lexicon_status_ref [] in
846       let disambiguate_term_option metasenv =
847        function
848           None -> metasenv,None
849        | Some t ->
850           let metasenv,t = disambiguate_term metasenv t in
851            metasenv, Some t
852       in
853       let metasenv,a = disambiguate_term metasenv a in
854       let metasenv,aeq = disambiguate_term metasenv aeq in
855       let metasenv,refl = disambiguate_term_option metasenv refl in
856       let metasenv,sym = disambiguate_term_option metasenv sym in
857       let metasenv,trans = disambiguate_term_option metasenv trans in
858        !lexicon_status_ref, metasenv,
859         GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans)
860
861 let disambiguate_macro 
862   lexicon_status_ref metasenv context (text,prefix_len, macro) 
863 =
864  let disambiguate_term = disambiguate_term None text prefix_len lexicon_status_ref in
865   let disambiguate_reduction_kind = 
866     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
867   match macro with
868    | GrafiteAst.WMatch (loc,term) ->
869       let metasenv,term = disambiguate_term context metasenv term in
870        metasenv,GrafiteAst.WMatch (loc,term)
871    | GrafiteAst.WInstance (loc,term) ->
872       let metasenv,term = disambiguate_term context metasenv term in
873        metasenv,GrafiteAst.WInstance (loc,term)
874    | GrafiteAst.WElim (loc,term) ->
875       let metasenv,term = disambiguate_term context metasenv term in
876        metasenv,GrafiteAst.WElim (loc,term)
877    | GrafiteAst.WHint (loc,term) ->
878       let metasenv,term = disambiguate_term context metasenv term in
879        metasenv,GrafiteAst.WHint (loc,term)
880    | GrafiteAst.Check (loc,term) ->
881       let metasenv,term = disambiguate_term context metasenv term in
882        metasenv,GrafiteAst.Check (loc,term)
883    | GrafiteAst.Eval (loc,kind,term) ->
884       let metasenv, term = disambiguate_term context metasenv term in
885       let kind = disambiguate_reduction_kind kind in
886        metasenv,GrafiteAst.Eval (loc,kind,term)
887    | GrafiteAst.AutoInteractive (loc, params) -> 
888       let metasenv, params = 
889         disambiguate_auto_params disambiguate_term metasenv context params in
890       metasenv, GrafiteAst.AutoInteractive (loc, params)
891    | GrafiteAst.Hint _
892    | GrafiteAst.WLocate _
893    | GrafiteAst.Inline _ as macro ->
894       metasenv,macro