X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fgrafite_engine%2FgrafiteEngine.ml;h=5c418ac9d22eb54e1d14134d888f3e9c2f0abe02;hb=05b509909ee5b61dbfca46d1239d64556af5ba2e;hp=99414f63c917ce11e6e1a0b0e28261adb20e0714;hpb=72b4799ea220bc54dc27b34fdb863f1ee6fc9e08;p=helm.git diff --git a/helm/software/components/grafite_engine/grafiteEngine.ml b/helm/software/components/grafite_engine/grafiteEngine.ml index 99414f63c..5c418ac9d 100644 --- a/helm/software/components/grafite_engine/grafiteEngine.ml +++ b/helm/software/components/grafite_engine/grafiteEngine.ml @@ -702,6 +702,12 @@ let src_tgt_cpos_arity_of_ty_id_src_tgt status ty id src tgt = status, src, tgt, cpos, arity ;; +let basic_eval_and_inject_ncoercion infos status = + let status = basic_eval_ncoercion infos status in + let dump = inject_ncoercion infos::status#dump in + status#set_dump dump +;; + let eval_ncoercion status name t ty (id,src) tgt = let metasenv,subst,status,ty = @@ -714,12 +720,10 @@ let eval_ncoercion status name t ty (id,src) tgt = let t = NCicUntrusted.apply_subst subst [] t in let status, src, tgt, cpos, arity = - src_tgt_cpos_arity_of_ty_id_src_tgt status ty id src tgt + src_tgt_cpos_arity_of_ty_id_src_tgt status ty id src tgt in + let status = + basic_eval_and_inject_ncoercion (name,t,src,tgt,cpos,arity) status in - - let status = basic_eval_ncoercion (name,t,src,tgt,cpos,arity) status in - let dump = inject_ncoercion (name,t,src,tgt,cpos,arity)::status#dump in - let status = status#set_dump dump in status,`New [] ;; @@ -981,22 +985,46 @@ let rec eval_ncommand opts status (text,prefix_len,cmd) = *) let status = status#set_ng_mode `CommandMode in let status = LexiconSync.add_aliases_for_objs status (`New [uri]) in - List.fold_left - (fun (status,uris) boxml -> - try - let status,nuris = - eval_ncommand opts status - ("",0,GrafiteAst.NObj (HExtlib.dummy_floc,boxml)) - in - match uris,nuris with - `New uris, `New nuris -> status,`New (nuris@uris) - | _ -> assert false - with - NCicTypeChecker.TypeCheckerFailure msg - when Lazy.force msg = - "Sort elimination not allowed" -> - status,uris - ) (status,`New [] (* uris *)) boxml + let status,uris = + List.fold_left + (fun (status,uris) boxml -> + try + let status,nuris = + eval_ncommand opts status + ("",0,GrafiteAst.NObj (HExtlib.dummy_floc,boxml)) + in + match uris,nuris with + `New uris, `New nuris -> status,`New (nuris@uris) + | _ -> assert false + with + NCicTypeChecker.TypeCheckerFailure msg + when Lazy.force msg = + "Sort elimination not allowed" -> + status,uris + ) (status,`New [] (* uris *)) boxml in + let coercions = + match obj with + _,_,_,_,NCic.Inductive + (true,leftno,[_,_,_,[_,_,_]],(_,`Record fields)) + -> + HExtlib.filter_map + (fun (name,is_coercion,arity) -> + if is_coercion then Some(name,leftno,arity) else None) fields + | _ -> [] in + let status = + List.fold_left + (fun status (name,cpos,arity) -> + let metasenv,subst,status,t = + GrafiteDisambiguate.disambiguate_nterm None status [] [] [] + ("",0,CicNotationPt.Ident (name,None)) in + assert (metasenv = [] && subst = []); + let ty = NCicTypeChecker.typeof ~subst ~metasenv [] t in + let src,tgt = src_tgt_of_ty_cpos_arity ty cpos arity in + basic_eval_and_inject_ncoercion (name,t,src,tgt,cpos,arity) + status + ) status coercions + in + status,uris with exn -> NCicLibrary.time_travel old_status;