]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/matita/applyTransformation.ml
some improvements
[helm.git] / helm / software / matita / applyTransformation.ml
index f27da2caa64d3765b76cffa30f2bf310def03a7e..4883deaf8665ba06816412cc121d04e5fdd7b323 100644 (file)
@@ -35,6 +35,8 @@
 
 (* $Id$ *)
 
+module G = GrafiteAst
+
 let mpres_document pres_box =
   Xml.add_xml_declaration (CicNotationPres.print_box pres_box)
 
@@ -70,7 +72,7 @@ let mml_of_cic_object obj =
    (ids_to_terms, ids_to_father_ids, ids_to_conjectures, ids_to_hypotheses,
   ids_to_inner_sorts,ids_to_inner_types)))
 
-let txt_of_cic_sequent size metasenv sequent =
+let txt_of_cic_sequent ?map_unicode_to_tex size metasenv sequent =
   let unsh_sequent,(asequent,ids_to_terms,
     ids_to_father_ids,ids_to_inner_sorts,ids_to_hypotheses)
   =
@@ -81,10 +83,10 @@ let txt_of_cic_sequent size metasenv sequent =
    CicNotationPres.mpres_of_box
     (Sequent2pres.sequent2pres ~ids_to_inner_sorts content_sequent)
   in
-  BoxPp.render_to_string (function x::_ -> x | _ -> assert false) size
-   pres_sequent
+  BoxPp.render_to_string ?map_unicode_to_tex
+    (function x::_ -> x | _ -> assert false) size pres_sequent
 
-let txt_of_cic_sequent_conclusion size metasenv sequent = 
+let txt_of_cic_sequent_conclusion ?map_unicode_to_tex size metasenv sequent =
   let _,(asequent,_,_,ids_to_inner_sorts,_) = 
     Cic2acic.asequent_of_sequent metasenv sequent 
   in
@@ -92,8 +94,111 @@ let txt_of_cic_sequent_conclusion size metasenv sequent =
   let t, ids_to_uris = TermAcicContent.ast_of_acic ids_to_inner_sorts t in
   let t = TermContentPres.pp_ast t in
   let t = CicNotationPres.render ids_to_uris t in
-  BoxPp.render_to_string (function x::_ -> x | _ -> assert false) size t
+  BoxPp.render_to_string ?map_unicode_to_tex
+    (function x::_ -> x | _ -> assert false) size t
 
-let txt_of_cic_term size metasenv context t = 
+let txt_of_cic_term ?map_unicode_to_tex size metasenv context t = 
   let fake_sequent = (-1,context,t) in
-  txt_of_cic_sequent_conclusion size metasenv fake_sequent 
+  txt_of_cic_sequent_conclusion ?map_unicode_to_tex size metasenv fake_sequent 
+;;
+
+ignore (
+ CicMetaSubst.set_ppterm_in_context
+  (fun ~metasenv subst term context ->
+    try
+     let context' = CicMetaSubst.apply_subst_context subst context in
+     let metasenv = CicMetaSubst.apply_subst_metasenv subst metasenv in
+     let term' = CicMetaSubst.apply_subst subst term in
+     let res = txt_of_cic_term 30 metasenv context' term' in
+      if String.contains res '\n' then
+       "\n" ^ res ^ "\n"
+      else
+       res
+    with
+       Sys.Break as exn -> raise exn
+     | exn ->
+        "[[ Exception raised during pretty-printing: " ^
+         (try
+           Printexc.to_string exn
+          with
+             Sys.Break as exn -> raise exn
+           | _ -> "<<exception raised pretty-printing the exception>>"
+         ) ^ " ]] " ^
+        (CicMetaSubst.use_low_level_ppterm_in_context := true;
+         try
+          let res =
+           CicMetaSubst.ppterm_in_context ~metasenv subst term context
+          in
+           CicMetaSubst.use_low_level_ppterm_in_context := false;
+           res
+         with
+          exc -> 
+           CicMetaSubst.use_low_level_ppterm_in_context := false;
+           raise exc))
+);;
+
+(****************************************************************************)
+(* txt_of_cic_object: IMPROVE ME *)
+
+let remove_closed_substs s =
+    Pcre.replace ~pat:"{...}" ~templ:"" s
+
+let term2pres ?map_unicode_to_tex n ids_to_inner_sorts annterm = 
+   let ast, ids_to_uris = 
+      TermAcicContent.ast_of_acic ids_to_inner_sorts annterm
+   in
+   let bobj =
+      CicNotationPres.box_of_mpres (
+         CicNotationPres.render ~prec:90 ids_to_uris 
+           (TermContentPres.pp_ast ast)
+      )
+   in
+   let render = function _::x::_ -> x | _ -> assert false in
+   let mpres = CicNotationPres.mpres_of_box bobj in
+   let s = BoxPp.render_to_string ?map_unicode_to_tex render n mpres in
+   remove_closed_substs s
+
+let txt_of_cic_object ?map_unicode_to_tex n style prefix obj =
+  let get_aobj obj = 
+     try   
+        let aobj,_,_,ids_to_inner_sorts,ids_to_inner_types,_,_ =
+            Cic2acic.acic_object_of_cic_object obj
+        in
+       aobj, ids_to_inner_sorts, ids_to_inner_types
+     with e -> 
+        let msg = "txt_of_cic_object: " ^ Printexc.to_string e in
+       failwith msg
+  in
+  match style with
+     | G.Declarative      ->
+        let aobj, ids_to_inner_sorts, ids_to_inner_types = get_aobj obj in
+       let cobj = Acic2content.annobj2content ids_to_inner_sorts ids_to_inner_types aobj in
+        let bobj = Content2pres.content2pres ids_to_inner_sorts cobj in
+        remove_closed_substs ("\n\n" ^
+          BoxPp.render_to_string ?map_unicode_to_tex
+            (function _::x::_ -> x | _ -> assert false) n
+            (CicNotationPres.mpres_of_box bobj)
+       )
+     | G.Procedural depth ->
+        let obj = ProceduralOptimizer.optimize_obj obj in
+       let aobj, ids_to_inner_sorts, ids_to_inner_types = get_aobj obj in
+        let term_pp = term2pres (n - 8) ids_to_inner_sorts in
+        let lazy_term_pp = term_pp in
+        let obj_pp = CicNotationPp.pp_obj term_pp in
+        let aux = GrafiteAstPp.pp_statement ~term_pp ~lazy_term_pp ~obj_pp in
+       let script = Acic2Procedural.acic2procedural 
+          ~ids_to_inner_sorts ~ids_to_inner_types ?depth prefix aobj in
+       String.concat "" (List.map aux script) ^ "\n\n"
+
+let txt_of_inline_macro style suri prefix =
+   let dbd = LibraryDb.instance () in   
+   let sorted_uris = MetadataDeps.sorted_uris_of_baseuri ~dbd suri in
+   let map uri =
+      try txt_of_cic_object 78 style prefix (* FG: mi pare meglio 78 *)
+                            (fst (CicEnvironment.get_obj CicUniv.empty_ugraph uri))
+      with
+         | e -> 
+           Printf.sprintf "\n(* ERRORE IN STAMPA DI %s\nEXCEPTION: %s *)\n" 
+           (UriManager.string_of_uri uri) (Printexc.to_string e)
+   in
+   String.concat "" (List.map map sorted_uris)