]> matita.cs.unibo.it Git - helm.git/blob - matita/components/grafite_engine/grafiteEngine.ml
- Print/Set commands removed
[helm.git] / matita / components / grafite_engine / grafiteEngine.ml
1 (* Copyright (C) 2005, HELM Team.
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 (* mo file name, ma file name *)
29 exception NMacro of GrafiteAst.loc * GrafiteAst.nmacro
30
31 type 'a disambiguator_input = string * int * 'a
32
33 type options = { 
34   do_heavy_checks: bool ; 
35 }
36
37 let basic_eval_unification_hint (t,n) status =
38  NCicUnifHint.add_user_provided_hint status t n
39 ;;
40
41 let inject_unification_hint =
42  let basic_eval_unification_hint (t,n) 
43    ~refresh_uri_in_universe 
44    ~refresh_uri_in_term
45  =
46   let t = refresh_uri_in_term t in basic_eval_unification_hint (t,n)
47  in
48   GrafiteTypes.Serializer.register#run "unification_hints"
49    basic_eval_unification_hint
50 ;;
51
52 let eval_unification_hint status t n = 
53  let metasenv,subst,status,t =
54   GrafiteDisambiguate.disambiguate_nterm None status [] [] [] ("",0,t) in
55  assert (metasenv=[]);
56  let t = NCicUntrusted.apply_subst subst [] t in
57  let status = basic_eval_unification_hint (t,n) status in
58  let dump = inject_unification_hint (t,n)::status#dump in
59  let status = status#set_dump dump in
60   status
61 ;;
62
63 let basic_index_obj l status =
64   status#set_auto_cache 
65     (List.fold_left
66       (fun t (ks,v) -> 
67          List.fold_left (fun t k ->
68            NDiscriminationTree.DiscriminationTree.index t k v)
69           t ks) 
70     status#auto_cache l) 
71 ;;     
72
73 let record_index_obj = 
74  let aux l 
75    ~refresh_uri_in_universe 
76    ~refresh_uri_in_term
77  =
78     basic_index_obj
79       (List.map 
80         (fun ks,v -> List.map refresh_uri_in_term ks, refresh_uri_in_term v) 
81       l)
82  in
83   GrafiteTypes.Serializer.register#run "index_obj" aux
84 ;;
85
86 let compute_keys status uri height kind = 
87  let mk_item ty spec =
88    let orig_ty = NTacStatus.mk_cic_term [] ty in
89    let status,keys = NnAuto.keys_of_type status orig_ty in
90    let keys =  
91      List.map 
92        (fun t -> 
93           snd (NTacStatus.term_of_cic_term status t (NTacStatus.ctx_of t)))
94        keys
95    in
96    keys,NCic.Const(NReference.reference_of_spec uri spec)
97  in
98  let data = 
99   match kind with
100   | NCic.Fixpoint (ind,ifl,_) -> 
101      HExtlib.list_mapi 
102        (fun (_,_,rno,ty,_) i -> 
103           if ind then mk_item ty (NReference.Fix (i,rno,height)) 
104           else mk_item ty (NReference.CoFix height)) ifl
105   | NCic.Inductive (b,lno,itl,_) -> 
106      HExtlib.list_mapi 
107        (fun (_,_,ty,_) i -> mk_item ty (NReference.Ind (b,i,lno))) itl 
108      @
109      List.map (fun ((_,_,ty),i,j) -> mk_item ty (NReference.Con (i,j+1,lno)))
110        (List.flatten (HExtlib.list_mapi 
111          (fun (_,_,_,cl) i -> HExtlib.list_mapi (fun x j-> x,i,j) cl)
112          itl))
113   | NCic.Constant (_,_,Some _, ty, _) -> 
114      [ mk_item ty (NReference.Def height) ]
115   | NCic.Constant (_,_,None, ty, _) ->
116      [ mk_item ty NReference.Decl ]
117  in
118   HExtlib.filter_map
119    (fun (keys, t) ->
120      let keys = List.filter
121        (function 
122          | (NCic.Meta _) 
123          | (NCic.Appl (NCic.Meta _::_)) -> false 
124          | _ -> true) 
125        keys
126      in
127      if keys <> [] then 
128       begin
129         HLog.debug ("Indexing:" ^ 
130           NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] t);
131         HLog.debug ("With keys:" ^ String.concat "\n" (List.map (fun t ->
132           NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] t) keys));
133         Some (keys,t) 
134       end
135      else 
136       begin
137         HLog.debug ("Not indexing:" ^ 
138           NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] t);
139         None
140       end)
141     data
142 ;;
143
144 let index_obj_for_auto status (uri, height, _, _, kind) = 
145  (*prerr_endline (string_of_int height);*)
146   let data = compute_keys status uri height kind in
147   let status = basic_index_obj data status in
148   let dump = record_index_obj data :: status#dump in   
149   status#set_dump dump
150 ;; 
151
152 let index_eq uri status =
153   let eq_status = status#eq_cache in
154   let eq_status1 = NCicParamod.index_obj eq_status uri in
155     status#set_eq_cache eq_status1
156 ;;
157
158 let record_index_eq =
159  let basic_index_eq uri
160    ~refresh_uri_in_universe 
161    ~refresh_uri_in_term 
162    = index_eq (NCicLibrary.refresh_uri uri) 
163  in
164   GrafiteTypes.Serializer.register#run "index_eq" basic_index_eq
165 ;;
166
167 let index_eq_for_auto status uri =
168  if NnAuto.is_a_fact_obj status uri then
169    let newstatus = index_eq uri status in
170      if newstatus#eq_cache == status#eq_cache then status 
171      else
172        ((*prerr_endline ("recording " ^ (NUri.string_of_uri uri));*)
173         let dump = record_index_eq uri :: newstatus#dump 
174         in newstatus#set_dump dump)
175  else 
176    ((*prerr_endline "Not a fact";*)
177    status)
178 ;; 
179
180 let basic_eval_add_constraint (u1,u2) status =
181  NCicLibrary.add_constraint status u1 u2
182 ;;
183
184 let inject_constraint =
185  let basic_eval_add_constraint (u1,u2) 
186        ~refresh_uri_in_universe 
187        ~refresh_uri_in_term
188  =
189   let u1 = refresh_uri_in_universe u1 in 
190   let u2 = refresh_uri_in_universe u2 in 
191   basic_eval_add_constraint (u1,u2)
192  in
193   GrafiteTypes.Serializer.register#run "constraints" basic_eval_add_constraint 
194 ;;
195
196 let eval_add_constraint status u1 u2 = 
197  let status = basic_eval_add_constraint (u1,u2) status in
198  let dump = inject_constraint (u1,u2)::status#dump in
199  let status = status#set_dump dump in
200   status
201 ;;
202
203 let eval_ng_tac tac =
204  let rec aux f (text, prefix_len, tac) =
205   match tac with
206   | GrafiteAst.NApply (_loc, t) -> NTactics.apply_tac (text,prefix_len,t) 
207   | GrafiteAst.NSmartApply (_loc, t) -> 
208       NnAuto.smart_apply_tac (text,prefix_len,t) 
209   | GrafiteAst.NAssert (_loc, seqs) ->
210      NTactics.assert_tac
211       ((List.map
212         (function (hyps,concl) ->
213           List.map
214            (function
215               (id,`Decl t) -> id,`Decl (text,prefix_len,t)
216              |(id,`Def (b,t))->id,`Def((text,prefix_len,b),(text,prefix_len,t))
217            ) hyps,
218           (text,prefix_len,concl))
219        ) seqs)
220   | GrafiteAst.NAuto (_loc, (None,a)) -> 
221       NnAuto.auto_tac ~params:(None,a) ?trace_ref:None
222   | GrafiteAst.NAuto (_loc, (Some l,a)) ->
223       NnAuto.auto_tac
224         ~params:(Some List.map (fun x -> "",0,x) l,a) ?trace_ref:None
225   | GrafiteAst.NBranch _ -> NTactics.branch_tac ~force:false
226   | GrafiteAst.NCases (_loc, what, where) ->
227       NTactics.cases_tac 
228         ~what:(text,prefix_len,what)
229         ~where:(text,prefix_len,where)
230   | GrafiteAst.NCase1 (_loc,n) -> NTactics.case1_tac n
231   | GrafiteAst.NChange (_loc, pat, ww) -> 
232       NTactics.change_tac 
233        ~where:(text,prefix_len,pat) ~with_what:(text,prefix_len,ww) 
234   | GrafiteAst.NConstructor (_loc,num,args) -> 
235      NTactics.constructor_tac 
236        ?num ~args:(List.map (fun x -> text,prefix_len,x) args)
237   | GrafiteAst.NCut (_loc, t) -> NTactics.cut_tac (text,prefix_len,t) 
238 (*| GrafiteAst.NDiscriminate (_,what) -> NDestructTac.discriminate_tac ~what:(text,prefix_len,what)
239   | GrafiteAst.NSubst (_,what) -> NDestructTac.subst_tac ~what:(text,prefix_len,what)*)
240   | GrafiteAst.NDestruct (_,dom,skip) -> NDestructTac.destruct_tac dom skip
241   | GrafiteAst.NDot _ -> NTactics.dot_tac 
242   | GrafiteAst.NElim (_loc, what, where) ->
243       NTactics.elim_tac 
244         ~what:(text,prefix_len,what)
245         ~where:(text,prefix_len,where)
246   | GrafiteAst.NFocus (_,l) -> NTactics.focus_tac l
247   | GrafiteAst.NGeneralize (_loc, where) -> 
248       NTactics.generalize_tac ~where:(text,prefix_len,where)
249   | GrafiteAst.NId _ -> (fun x -> x)
250   | GrafiteAst.NIntro (_loc,n) -> NTactics.intro_tac n
251   | GrafiteAst.NIntros (_loc,ns) -> NTactics.intros_tac ns
252   | GrafiteAst.NInversion (_loc, what, where) ->
253       NTactics.inversion_tac 
254         ~what:(text,prefix_len,what)
255         ~where:(text,prefix_len,where)
256   | GrafiteAst.NLApply (_loc, t) -> NTactics.lapply_tac (text,prefix_len,t) 
257   | GrafiteAst.NLetIn (_loc,where,what,name) ->
258       NTactics.letin_tac ~where:(text,prefix_len,where) 
259         ~what:(text,prefix_len,what) name
260   | GrafiteAst.NMerge _ -> NTactics.merge_tac 
261   | GrafiteAst.NPos (_,l) -> NTactics.pos_tac l
262   | GrafiteAst.NPosbyname (_,s) -> NTactics.case_tac s
263   | GrafiteAst.NReduce (_loc, reduction, where) ->
264       NTactics.reduce_tac ~reduction ~where:(text,prefix_len,where)
265   | GrafiteAst.NRewrite (_loc,dir,what,where) ->
266      NTactics.rewrite_tac ~dir ~what:(text,prefix_len,what)
267       ~where:(text,prefix_len,where)
268   | GrafiteAst.NSemicolon _ -> fun x -> x
269   | GrafiteAst.NShift _ -> NTactics.shift_tac 
270   | GrafiteAst.NSkip _ -> NTactics.skip_tac
271   | GrafiteAst.NUnfocus _ -> NTactics.unfocus_tac
272   | GrafiteAst.NWildcard _ -> NTactics.wildcard_tac 
273   | GrafiteAst.NTry (_,tac) -> NTactics.try_tac
274       (aux f (text, prefix_len, tac))
275   | GrafiteAst.NAssumption _ -> NTactics.assumption_tac
276   | GrafiteAst.NBlock (_,l) -> 
277       NTactics.block_tac (List.map (fun x -> aux f (text,prefix_len,x)) l)
278   |GrafiteAst.NRepeat (_,tac) ->
279       NTactics.repeat_tac (f f (text, prefix_len, tac))
280  in
281   aux aux tac (* trick for non uniform recursion call *)
282 ;;
283       
284 let subst_metasenv_and_fix_names status =
285   let u,h,metasenv, subst,o = status#obj in
286   let o = 
287     NCicUntrusted.map_obj_kind ~skip_body:true 
288      (NCicUntrusted.apply_subst subst []) o
289   in
290    status#set_obj(u,h,NCicUntrusted.apply_subst_metasenv subst metasenv,subst,o)
291 ;;
292
293
294 let rec eval_ncommand ~include_paths opts status (text,prefix_len,cmd) =
295   match cmd with
296   | GrafiteAst.Include (loc, mode, fname) ->
297            let _root, baseuri, _fullpath, _rrelpath = 
298        Librarian.baseuri_of_script ~include_paths fname in
299      let status,obj =
300        GrafiteTypes.Serializer.require ~baseuri:(NUri.uri_of_string baseuri)
301         status in
302      let status = status#set_dump (obj::status#dump) in
303      assert false; (* mode must be passed to GrafiteTypes.Serializer.require
304      somehow *)
305        status
306   | GrafiteAst.UnificationHint (loc, t, n) -> eval_unification_hint status t n
307   | GrafiteAst.NCoercion (loc, name, t, ty, source, target) ->
308      let status, composites =
309       NCicCoercDeclaration.eval_ncoercion status name t ty source target
310      in
311       LexiconSync.add_aliases_for_objs status composites
312   | GrafiteAst.NQed loc ->
313      if status#ng_mode <> `ProofMode then
314       raise (GrafiteTypes.Command_error "Not in proof mode")
315      else
316       let uri,height,menv,subst,obj_kind = status#obj in
317        if menv <> [] then
318         raise
319          (GrafiteTypes.Command_error"You can't Qed an incomplete theorem")
320        else
321         let obj_kind =
322          NCicUntrusted.map_obj_kind 
323           (NCicUntrusted.apply_subst subst []) obj_kind in
324         let height = NCicTypeChecker.height_of_obj_kind uri [] obj_kind in
325         (* fix the height inside the object *)
326         let rec fix () = function 
327           | NCic.Const (NReference.Ref (u,spec)) when NUri.eq u uri -> 
328              NCic.Const (NReference.reference_of_spec u
329               (match spec with
330               | NReference.Def _ -> NReference.Def height
331               | NReference.Fix (i,j,_) -> NReference.Fix(i,j,height)
332               | NReference.CoFix _ -> NReference.CoFix height
333               | NReference.Ind _ | NReference.Con _
334               | NReference.Decl as s -> s))
335           | t -> NCicUtils.map (fun _ () -> ()) () fix t
336         in
337         let obj_kind = 
338           match obj_kind with
339           | NCic.Fixpoint _ -> 
340               NCicUntrusted.map_obj_kind (fix ()) obj_kind 
341           | _ -> obj_kind
342         in
343         let obj = uri,height,[],[],obj_kind in
344         let old_status = status in
345         let status = NCicLibrary.add_obj status obj in
346         let index_obj =
347          match obj_kind with
348             NCic.Constant (_,_,_,_,(_,`Example,_))
349           | NCic.Fixpoint (_,_,(_,`Example,_)) -> false
350           | _ -> true
351         in
352         let status =
353          if index_obj then
354           let status = index_obj_for_auto status obj in
355            (try index_eq_for_auto status uri
356            with _ -> status)
357          else
358           status in
359 (*
360           try 
361             index_eq uri status
362           with _ -> prerr_endline "got an exception"; status
363         in *)
364 (*         prerr_endline (NCicPp.ppobj obj); *)
365         HLog.message ("New object: " ^ NUri.string_of_uri uri);
366          (try
367        (*prerr_endline (NCicPp.ppobj obj);*)
368            let boxml = NCicElim.mk_elims obj in
369            let boxml = boxml @ NCicElim.mk_projections obj in
370 (*
371            let objs = [] in
372            let timestamp,uris_rev =
373              List.fold_left
374               (fun (status,uris_rev) (uri,_,_,_,_) as obj ->
375                 let status = NCicLibrary.add_obj status obj in
376                  status,uri::uris_rev
377               ) (status,[]) objs in
378            let uris = uri::List.rev uris_rev in
379 *)
380            let status = status#set_ng_mode `CommandMode in
381            let status = LexiconSync.add_aliases_for_objs status [uri] in
382            let status =
383             List.fold_left
384              (fun status boxml ->
385                try
386                 let nstatus =
387                  eval_ncommand ~include_paths opts status
388                   ("",0,GrafiteAst.NObj (HExtlib.dummy_floc,boxml))
389                 in
390                 if nstatus#ng_mode <> `CommandMode then
391                   begin
392                     (*HLog.warn "error in generating projection/eliminator";*)
393                     assert(status#ng_mode = `CommandMode);
394                     status
395                   end
396                 else
397                   nstatus
398                with
399                | MultiPassDisambiguator.DisambiguationError _
400                | NCicTypeChecker.TypeCheckerFailure _ ->
401                   (*HLog.warn "error in generating projection/eliminator";*)
402                   status
403              ) status boxml in             
404            let _,_,_,_,nobj = obj in 
405            let status = match nobj with
406                NCic.Inductive (is_ind,leftno,[it],_) ->
407                  let _,ind_name,ty,cl = it in
408                  List.fold_left 
409                    (fun status outsort ->
410                       let status = status#set_ng_mode `ProofMode in
411                       try
412                        (let status,invobj =
413                          NInversion.mk_inverter 
414                           (ind_name ^ "_inv_" ^
415                             (snd (NCicElim.ast_of_sort outsort)))
416                           is_ind it leftno outsort status status#baseuri in
417                        let _,_,menv,_,_ = invobj in
418                         (match menv with
419                              [] -> eval_ncommand ~include_paths opts status
420                                     ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
421                            | _ -> status))
422                        (* XXX *)
423                       with _ -> (*HLog.warn "error in generating inversion principle"; *)
424                                 let status = status#set_ng_mode `CommandMode in status)
425                   status
426                   (NCic.Prop::
427                     List.map (fun s -> NCic.Type s) (NCicEnvironment.get_universes ()))
428               | _ -> status
429            in
430            let coercions =
431             match obj with
432               _,_,_,_,NCic.Inductive
433                (true,leftno,[_,_,_,[_,_,_]],(_,`Record fields))
434                ->
435                 HExtlib.filter_map
436                  (fun (name,is_coercion,arity) ->
437                    if is_coercion then Some(name,leftno,arity) else None) fields
438             | _ -> [] in
439            let status =
440             List.fold_left
441              (fun status (name,cpos,arity) ->
442                try
443                  let metasenv,subst,status,t =
444                   GrafiteDisambiguate.disambiguate_nterm None status [] [] []
445                    ("",0,NotationPt.Ident (name,None)) in
446                  assert (metasenv = [] && subst = []);
447                  let status, nuris = 
448                    NCicCoercDeclaration.
449                      basic_eval_and_record_ncoercion_from_t_cpos_arity 
450                       status (name,t,cpos,arity)
451                  in
452                   LexiconSync.add_aliases_for_objs status nuris
453                with MultiPassDisambiguator.DisambiguationError _-> 
454                  HLog.warn ("error in generating coercion: "^name);
455                  status) 
456              status coercions
457            in
458             status
459           with
460            exn ->
461             NCicLibrary.time_travel old_status;
462             raise exn)
463   | GrafiteAst.NCopy (log,tgt,src_uri, map) ->
464      if status#ng_mode <> `CommandMode then
465       raise (GrafiteTypes.Command_error "Not in command mode")
466      else
467        let tgt_uri_ext, old_ok = 
468          match NCicEnvironment.get_checked_obj src_uri with
469          | _,_,[],[], (NCic.Inductive _ as ok) -> ".ind", ok
470          | _,_,[],[], (NCic.Fixpoint _ as ok) -> ".con", ok
471          | _,_,[],[], (NCic.Constant _ as ok) -> ".con", ok
472          | _ -> assert false
473        in
474        let tgt_uri = NUri.uri_of_string (status#baseuri^"/"^tgt^tgt_uri_ext) in
475        let map = (src_uri, tgt_uri) :: map in
476        let ok = 
477          let rec subst () = function
478            | NCic.Meta _ -> assert false
479            | NCic.Const (NReference.Ref (u,spec)) as t ->
480                (try NCic.Const 
481                  (NReference.reference_of_spec (List.assoc u map)spec)
482                with Not_found -> t)
483            | t -> NCicUtils.map (fun _ _ -> ()) () subst t
484          in
485          NCicUntrusted.map_obj_kind ~skip_body:false (subst ()) old_ok
486        in
487        let ninitial_stack = Continuationals.Stack.of_nmetasenv [] in
488        let status = status#set_obj (tgt_uri,0,[],[],ok) in
489        (*prerr_endline (NCicPp.ppobj (tgt_uri,0,[],[],ok));*)
490        let status = status#set_stack ninitial_stack in
491        let status = subst_metasenv_and_fix_names status in
492        let status = status#set_ng_mode `ProofMode in
493        eval_ncommand ~include_paths opts status ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
494   | GrafiteAst.NObj (loc,obj) ->
495      if status#ng_mode <> `CommandMode then
496       raise (GrafiteTypes.Command_error "Not in command mode")
497      else
498       let status,obj =
499        GrafiteDisambiguate.disambiguate_nobj status
500         ~baseuri:status#baseuri (text,prefix_len,obj) in
501       let uri,height,nmenv,nsubst,nobj = obj in
502       let ninitial_stack = Continuationals.Stack.of_nmetasenv nmenv in
503       let status = status#set_obj obj in
504       let status = status#set_stack ninitial_stack in
505       let status = subst_metasenv_and_fix_names status in
506       let status = status#set_ng_mode `ProofMode in
507       (match nmenv with
508           [] ->
509            eval_ncommand ~include_paths opts status ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
510         | _ -> status)
511   | GrafiteAst.NDiscriminator (_,_) -> assert false (*(loc, indty) ->
512       if status#ng_mode <> `CommandMode then
513         raise (GrafiteTypes.Command_error "Not in command mode")
514       else
515         let status = status#set_ng_mode `ProofMode in
516         let metasenv,subst,status,indty =
517           GrafiteDisambiguate.disambiguate_nterm None status [] [] [] (text,prefix_len,indty) in
518         let indtyno, (_,_,tys,_,_) = match indty with
519             NCic.Const ((NReference.Ref (_,NReference.Ind (_,indtyno,_))) as r) ->
520               indtyno, NCicEnvironment.get_checked_indtys r
521           | _ -> prerr_endline ("engine: indty expected... (fix this error message)"); assert false in
522         let it = List.nth tys indtyno in
523         let status,obj =  NDestructTac.mk_discriminator it status in
524         let _,_,menv,_,_ = obj in
525           (match menv with
526                [] -> eval_ncommand ~include_paths opts status ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
527              | _ -> prerr_endline ("Discriminator: non empty metasenv");
528                     status, []) *)
529   | GrafiteAst.NInverter (loc, name, indty, selection, sort) ->
530      if status#ng_mode <> `CommandMode then
531       raise (GrafiteTypes.Command_error "Not in command mode")
532      else
533       let metasenv,subst,status,sort = match sort with
534         | None -> [],[],status,NCic.Sort NCic.Prop
535         | Some s -> GrafiteDisambiguate.disambiguate_nterm None status [] [] []
536                       (text,prefix_len,s) 
537       in
538       assert (metasenv = []);
539       let sort = NCicReduction.whd ~subst [] sort in
540       let sort = match sort with 
541           NCic.Sort s -> s
542         | _ ->  raise (Invalid_argument (Printf.sprintf "ninverter: found target %s, which is not a sort" 
543                                            (NCicPp.ppterm ~metasenv ~subst ~context:[] sort)))
544       in
545       let status = status#set_ng_mode `ProofMode in
546       let metasenv,subst,status,indty =
547        GrafiteDisambiguate.disambiguate_nterm None status [] [] subst (text,prefix_len,indty) in
548       let indtyno,(_,leftno,tys,_,_) = match indty with
549           NCic.Const ((NReference.Ref (_,NReference.Ind (_,indtyno,_))) as r) -> 
550             indtyno, NCicEnvironment.get_checked_indtys r
551         | _ -> prerr_endline ("engine: indty ="  ^ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] indty) ; assert false in
552       let it = List.nth tys indtyno in
553      let status,obj = NInversion.mk_inverter name true it leftno ?selection sort 
554                         status status#baseuri in
555      let _,_,menv,_,_ = obj in
556      (match menv with
557         [] ->
558           eval_ncommand ~include_paths opts status ("",0,GrafiteAst.NQed Stdpp.dummy_loc)
559       | _ -> assert false)
560   | GrafiteAst.NUnivConstraint (loc,u1,u2) ->
561       eval_add_constraint status [`Type,u1] [`Type,u2]
562   (* ex lexicon commands *)
563   | GrafiteAst.Interpretation (loc, dsc, (symbol, args), cic_appl_pattern) ->
564      let rec disambiguate =
565       function
566          NotationPt.ApplPattern l ->
567           NotationPt.ApplPattern (List.map disambiguate l)
568        | NotationPt.VarPattern id
569           when not
570            (List.exists
571             (function (NotationPt.IdentArg (_,id')) -> id'=id) args)
572           ->
573            let item = DisambiguateTypes.Id id in
574             begin try
575               match DisambiguateTypes.Environment.find item status#lstatus.LexiconTypes.aliases with
576                  GrafiteAst.Ident_alias (_, uri) ->
577                   NotationPt.NRefPattern (NReference.reference_of_string uri)
578                | _ -> assert false
579              with Not_found -> 
580               prerr_endline
581                ("LexiconEngine.eval_command: domain item not found: " ^ 
582                (DisambiguateTypes.string_of_domain_item item));
583               LexiconEngine.dump_aliases prerr_endline "" status;
584               raise 
585                (Failure
586                 ((DisambiguateTypes.string_of_domain_item item) ^ " not found"))
587                   end
588        | p -> p
589      in
590      let cic_appl_pattern = disambiguate cic_appl_pattern in
591      let status =
592       Interpretations.add_interpretation status
593        dsc (symbol, args) cic_appl_pattern in
594      let mode = GrafiteAst.WithPreferences (*assert false*) in (* VEDI SOTTO *)
595      let diff =
596       [DisambiguateTypes.Symbol (symbol, 0),
597         GrafiteAst.Symbol_alias (symbol,0,dsc)] in
598      let status =
599       LexiconEngine.set_proof_aliases status ~implicit_aliases:false mode diff
600      in
601      status
602      (*assert false*) (* MANCA SALVATAGGIO SU DISCO CHE DEVE TENERE IN CONTO
603       IL MODE WithPreference/WithOutPreferences*)
604   | GrafiteAst.Notation (loc, dir, l1, associativity, precedence, l2) ->
605       let l1 = 
606         CicNotationParser.check_l1_pattern
607          l1 (dir = Some `RightToLeft) precedence associativity
608       in
609       let status =
610         if dir <> Some `RightToLeft then
611           GrafiteParser.extend status l1 
612             (fun env loc ->
613               NotationPt.AttributedTerm
614                (`Loc loc,TermContentPres.instantiate_level2 env l2)) 
615         else status
616       in
617       let status =
618         if dir <> Some `LeftToRight then
619          let status = TermContentPres.add_pretty_printer status l2 l1 in
620           status
621         else
622           status
623       in
624 (*        assert false (* MANCA SALVATAGGIO SU DISCO *) *)
625       status (* capire [] XX *)
626   | GrafiteAst.Alias (loc, spec) -> 
627      let diff =
628       (*CSC: Warning: this code should be factorized with the corresponding
629              code in DisambiguatePp *)
630       match spec with
631       | GrafiteAst.Ident_alias (id,uri) -> 
632          [DisambiguateTypes.Id id,spec]
633       | GrafiteAst.Symbol_alias (symb, instance, desc) ->
634          [DisambiguateTypes.Symbol (symb,instance),spec]
635       | GrafiteAst.Number_alias (instance,desc) ->
636          [DisambiguateTypes.Num instance,spec]
637      in
638       let mode = assert false in (* VEDI SOPRA *)
639       LexiconEngine.set_proof_aliases status ~implicit_aliases:false mode diff;
640       assert false (* MANCA SALVATAGGIO SU DISCO *)
641 ;;
642
643 let eval_comment opts status (text,prefix_len,c) = status
644
645 let rec eval_executable ~include_paths opts status (text,prefix_len,ex) =
646   match ex with
647   | GrafiteAst.NTactic (_(*loc*), tacl) ->
648       if status#ng_mode <> `ProofMode then
649        raise (GrafiteTypes.Command_error "Not in proof mode")
650       else
651        let status =
652         List.fold_left 
653           (fun status tac ->
654             let status = eval_ng_tac (text,prefix_len,tac) status in
655             subst_metasenv_and_fix_names status)
656           status tacl
657        in
658         status
659   | GrafiteAst.NCommand (_, cmd) ->
660       eval_ncommand ~include_paths opts status (text,prefix_len,cmd)
661   | GrafiteAst.NMacro (loc, macro) ->
662      raise (NMacro (loc,macro))
663
664 and eval_ast ~include_paths ?(do_heavy_checks=false) status (text,prefix_len,st)
665 =
666   let opts = { do_heavy_checks = do_heavy_checks ; } in
667   match st with
668   | GrafiteAst.Executable (_,ex) ->
669      eval_executable ~include_paths opts status (text,prefix_len,ex)
670   | GrafiteAst.Comment (_,c) -> 
671       eval_comment opts status (text,prefix_len,c) 
672 ;;