]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/content_pres/content2pres.ml
many changes:
[helm.git] / helm / software / components / content_pres / content2pres.ml
index a15200b16a14aea39ea6bc2d991fa94ca2ff2615..a41ccc99158a73562218887d2d786e57d903121e 100644 (file)
@@ -97,13 +97,13 @@ let make_args_for_apply term2pres args =
           Some "xlink", "href", lemma.Con.lemma_uri ]
         in
         (B.b_object (P.Mi(lemma_attrs,lemma.Con.lemma_name)))::row 
-    | Con.Term t -> 
-        if is_first then
+    | Con.Term (b,t) -> 
+        if is_first || (not b) then
           (term2pres t)::row
-        else (B.b_object (P.Mi([],"_")))::row
+        else (B.b_object (P.Mi([],"?")))::row
     | Con.ArgProof _ 
     | Con.ArgMethod _ -> 
-       (B.b_object (P.Mi([],"_")))::row
+       (B.b_object (P.Mi([],"?")))::row
   in
    if is_first then res else B.skip::res
  in
@@ -112,6 +112,7 @@ let make_args_for_apply term2pres args =
       make_arg_for_apply true hd 
         (List.fold_right (make_arg_for_apply false) tl [])
   | _ -> assert false
+
 let get_name = function
   | Some s -> s
   | None -> "_"
@@ -131,10 +132,10 @@ let rec justification term2pres p =
       (B.b_kw "by")::B.b_space::
       B.Text([],"(")::pres_args@[B.Text([],")")]), None 
   else (B.b_kw "by"),
-    Some (B.b_toggle [B.b_kw "proof";proof2pres term2pres p])
+    Some (B.b_toggle [B.b_kw "proof";proof2pres true term2pres p])
      
-and proof2pres term2pres p =
-  let rec proof2pres p =
+and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
+  let rec proof2pres ?skip_initial_lambdas_internal is_top_down p omit_dot =
     let indent = 
       let is_decl e = 
         (match e with 
@@ -149,10 +150,27 @@ and proof2pres term2pres p =
        | Some t -> Some (term2pres t)) in
     let body =
         let presconclude = 
-          conclude2pres p.Con.proof_conclude indent omit_conclusion in
+          conclude2pres
+           ?skip_initial_lambdas_internal:
+             (match skip_initial_lambdas_internal with
+                 Some (`Later s) -> Some (`Now s)
+               | _ -> None)
+             is_top_down
+             p.Con.proof_name p.Con.proof_conclude indent omit_conclusion
+           omit_dot in
         let presacontext = 
-          acontext2pres p.Con.proof_apply_context presconclude indent in
-        context2pres p.Con.proof_context presacontext in
+          acontext2pres
+           (p.Con.proof_conclude.Con.conclude_method = "BU_Conversion")
+            p.Con.proof_apply_context
+            presconclude indent
+           (p.Con.proof_conclude.Con.conclude_method = "BU_Conversion")
+        in
+        context2pres 
+         (match skip_initial_lambdas_internal with
+             Some (`Now n) -> snd (HExtlib.split_nth n p.Con.proof_context)
+           | _ -> p.Con.proof_context)
+          presacontext
+    in
     match p.Con.proof_name with
       None -> body
     | Some name ->
@@ -163,11 +181,11 @@ and proof2pres term2pres p =
              let concl =
                make_concl ~attrs:[ Some "helm", "xref", p.Con.proof_id ]
                  "proof of" ac in
-             B.b_toggle [ concl; body ]
+             B.b_toggle [ B.H ([], [concl; B.skip ; B.Text([],"(");
+                      B.Object ([], P.Mi ([],name));
+                      B.Text([],")") ]) ; body ]
         in
-        B.V ([],
-          [B.Text ([],"(" ^ name ^ ")");
-           B.indent action])
+         B.indent action
 
   and context2pres c continuation =
     (* we generate a subtable for each context element, for selection
@@ -201,96 +219,125 @@ and proof2pres term2pres p =
   and ce2pres_in_proof_context_element = function 
     | `Joint ho -> 
       B.H ([],(List.map ce2pres_in_joint_context_element ho.Content.joint_defs))
-    | (`Declaration _) as x -> ce2pres x
-    | (`Hypothesis _) as x  -> ce2pres x
+    | (`Declaration _) as x -> ce2pres x 
+    | (`Hypothesis _) as x  -> ce2pres x 
     | (`Proof _) as x       -> ce2pres x
-    | (`Definition _) as x  -> ce2pres x
+    | (`Definition _) as x  -> ce2pres x 
   
-  and ce2pres = 
+  and ce2pres =
     function 
         `Declaration d -> 
-          (match d.Con.dec_name with
-              Some s ->
-                let ty = term2pres d.Con.dec_type in
-                B.H ([],
-                  [(B.b_kw "Assume");
-                   B.b_space;
-                   B.Object ([], P.Mi([],s));
-                   B.Text([],":");
-                   ty])
-            | None -> 
-                prerr_endline "NO NAME!!"; assert false)
+         let ty = term2pres d.Con.dec_type in
+         B.H ([],
+           [(B.b_kw "assume");
+            B.b_space;
+            B.Object ([], P.Mi([],get_name d.Con.dec_name));
+            B.Text([],":");
+            ty;
+            B.Text([],".")])
       | `Hypothesis h ->
-          (match h.Con.dec_name with
-              Some s ->
-                let ty = term2pres h.Con.dec_type in
-                B.H ([],
-                  [(B.b_kw "Suppose");
-                   B.b_space;
-                   B.Text([],"(");
-                   B.Object ([], P.Mi ([],s));
-                   B.Text([],")");
-                   B.b_space;
-                   ty])
-            | None -> 
-                prerr_endline "NO NAME!!"; assert false) 
+          let ty = term2pres h.Con.dec_type in
+          B.H ([],
+            [(B.b_kw "suppose");
+             B.b_space;
+             ty;
+             B.b_space;
+             B.Text([],"(");
+             B.Object ([], P.Mi ([],get_name h.Con.dec_name));
+             B.Text([],")");
+             B.Text([],".")])
       | `Proof p -> 
-           proof2pres 
+           proof2pres false p false
       | `Definition d -> 
-           (match d.Con.def_name with
-              Some s ->
-                let term = term2pres d.Con.def_term in
-                B.H ([],
-                  [ B.b_kw "Let"; B.b_space;
-                    B.Object ([], P.Mi([],s));
-                    B.Text([]," = ");
-                    term])
-            | None -> 
-                prerr_endline "NO NAME!!"; assert false) 
-
-  and acontext2pres ac continuation indent =
+          let term = term2pres d.Con.def_term in
+          B.H ([],
+            [ B.b_kw "let"; B.b_space;
+              B.Object ([], P.Mi([],get_name d.Con.def_name));
+              B.Text([],Utf8Macro.unicode_of_tex "\\def");
+              term])
+
+  and acontext2pres is_top_down ac continuation indent in_bu_conversion =
     List.fold_right
       (fun p continuation ->
-         let hd = 
-           if indent then
-             B.indent (proof2pres p)
-           else 
-             proof2pres p in
+        let hd = 
+          if indent then
+            B.indent (proof2pres is_top_down p in_bu_conversion)
+          else 
+            proof2pres is_top_down p in_bu_conversion
+        in
          B.V([Some "helm","xref",p.Con.proof_id],
            [B.H([Some "helm","xref","ace_"^p.Con.proof_id],[hd]);
             continuation])) ac continuation 
 
-  and conclude2pres conclude indent omit_conclusion =
+  and conclude2pres ?skip_initial_lambdas_internal is_top_down name conclude indent omit_conclusion omit_dot =
     let tconclude_body = 
       match conclude.Con.conclude_conclusion with
-        Some t when
-         not omit_conclusion or
+        Some t (*when not omit_conclusion or
          (* CSC: I ignore the omit_conclusion flag in this case.   *)
          (* CSC: Is this the correct behaviour? In the stylesheets *)
          (* CSC: we simply generated nothing (i.e. the output type *)
          (* CSC: of the function should become an option.          *)
-         conclude.Con.conclude_method = "BU_Conversion" ->
-          let concl = (term2pres t) in 
+         conclude.Con.conclude_method = "BU_Conversion" *) ->
+          let concl = term2pres t in 
           if conclude.Con.conclude_method = "BU_Conversion" then
-            make_concl "that is equivalent to" concl
+            B.b_hv []
+             (make_concl "that is equivalent to" concl ::
+                     if is_top_down then [B.b_space ; B.b_kw "done";
+                     B.Text([],".")] else [])
           else if conclude.Con.conclude_method = "FalseInd" then
            (* false ind is in charge to add the conclusion *)
            falseind conclude
           else  
-            let conclude_body = conclude_aux conclude in
+            let prequel =
+              if
+               (match skip_initial_lambdas_internal with
+                   None
+                 | Some (`Later _) -> true
+                 | Some (`Now _) -> false)
+               && conclude.Con.conclude_method = "Intros+LetTac"
+              then
+                let name = get_name name in
+                 [B.V ([],
+                 [ B.H([],
+                    let expected = 
+                      (match conclude.Con.conclude_conclusion with 
+                         None -> B.Text([],"NO EXPECTED!!!")
+                       | Some c -> term2pres c)
+                    in
+                     [make_concl "we need to prove" expected;
+                      B.skip;
+                      B.Text([],"(");
+                      B.Object ([], P.Mi ([],name));
+                      B.Text([],")");
+                      B.Text ([],".")
+                     ])])]
+              else
+               [] in
+            let conclude_body = 
+              conclude_aux ?skip_initial_lambdas_internal conclude in
             let ann_concl = 
-              if conclude.Con.conclude_method = "TD_Conversion" then
-                 make_concl "that is equivalent to" concl 
-              else make_concl "we conclude" concl in
-            B.V ([], [conclude_body; ann_concl])
-      | _ -> conclude_aux conclude in
-    if indent then 
-      B.indent (B.H ([Some "helm", "xref", conclude.Con.conclude_id],
-                    [tconclude_body]))
-    else 
-      B.H ([Some "helm", "xref", conclude.Con.conclude_id],[tconclude_body])
+              if  conclude.Con.conclude_method = "Intros+LetTac"
+               || conclude.Con.conclude_method = "ByInduction"
+               || conclude.Con.conclude_method = "TD_Conversion"
+              then
+               B.Text([],"")
+              else if omit_conclusion then 
+                B.H([], [B.b_kw "done" ; B.Text([],".") ])
+              else B.b_hv []
+               ((if not is_top_down || omit_dot then [make_concl "we proved"
+               concl; B.Text([],if not is_top_down then "(previous)" else "")]
+               else [B.b_kw "done"]) @ if not omit_dot then [B.Text([],".")] else [])
+            in
+            B.V ([], prequel @ [conclude_body; ann_concl])
+      | _ -> conclude_aux ?skip_initial_lambdas_internal conclude
+    in
+     if indent then 
+       B.indent (B.H ([Some "helm", "xref", conclude.Con.conclude_id],
+                     [tconclude_body]))
+     else 
+       B.H ([Some "helm", "xref", conclude.Con.conclude_id],[tconclude_body])
 
-  and conclude_aux conclude =
+  and conclude_aux ?skip_initial_lambdas_internal conclude =
     if conclude.Con.conclude_method = "TD_Conversion" then
       let expected = 
         (match conclude.Con.conclude_conclusion with 
@@ -306,15 +353,16 @@ and proof2pres term2pres p =
          | Some c -> (term2pres c)) in
       B.V 
         ([],
-        [make_concl "we must prove" expected;
+        [make_concl "we need to  prove" expected;
          make_concl "or equivalently" synth;
-         proof2pres subproof])
+         B.Text([],".");
+         proof2pres true subproof false])
     else if conclude.Con.conclude_method = "BU_Conversion" then
       assert false
     else if conclude.Con.conclude_method = "Exact" then
       let arg = 
         (match conclude.Con.conclude_args with 
-           [Con.Term t] -> term2pres t
+           [Con.Term (b,t)] -> assert (not b);term2pres t
          | [Con.Premise p] -> 
              (match p.Con.premise_binder with
              | None -> assert false; (* unnamed hypothesis ??? *)
@@ -322,15 +370,17 @@ and proof2pres term2pres p =
          | err -> assert false) in
       (match conclude.Con.conclude_conclusion with 
          None ->
-          B.b_h [] [B.b_kw "Consider"; B.b_space; arg]
-       | Some c -> let conclusion = term2pres c in
-          make_row 
-            [arg; B.b_space; B.b_kw "proves"]
-            conclusion
+          B.b_h [] [B.b_kw "by"; B.b_space; arg]
+       | Some c -> 
+          B.b_h [] [B.b_kw "by"; B.b_space; arg]
        )
     else if conclude.Con.conclude_method = "Intros+LetTac" then
       (match conclude.Con.conclude_args with
-         [Con.ArgProof p] -> proof2pres p
+         [Con.ArgProof p] ->
+           (match conclude.Con.conclude_args with
+              [Con.ArgProof p] -> 
+                proof2pres ?skip_initial_lambdas_internal true p false
+            | _ -> assert false)
        | _ -> assert false)
 (* OLD CODE 
       let conclusion = 
@@ -342,7 +392,7 @@ and proof2pres term2pres p =
            B.V 
             ([None,"align","baseline 1"; None,"equalrows","false";
               None,"columnalign","left"],
-              [B.H([],[B.Object([],proof2pres p)]);
+              [B.H([],[B.Object([],proof2pres p false)]);
                B.H([],[B.Object([],
                 (make_concl "we proved 1" conclusion))])]);
        | _ -> assert false)
@@ -364,12 +414,13 @@ and proof2pres term2pres p =
          | _ -> assert false) in
       let term1 = 
         (match List.nth conclude.Con.conclude_args 2 with
-           Con.Term t -> term2pres t
+           Con.Term (_,t) -> term2pres t
          | _ -> assert false) in 
       let term2 = 
         (match List.nth conclude.Con.conclude_args 5 with
-           Con.Term t -> term2pres t
+           Con.Term (_,t) -> term2pres t
          | _ -> assert false) in
+(*
       B.V ([], 
          B.H ([],[
           (B.b_kw "rewrite");
@@ -378,26 +429,34 @@ and proof2pres term2pres p =
           B.b_space; term2;
           B.b_space; justif1])::
            match justif2 with None -> [] | Some j -> [B.indent j])
+*) B.V([], [justif1 ; B.H([],[B.b_kw "we proved (" ; term2 ; B.b_kw "=" ; term1; B.b_kw ") (previous)."]); B.b_kw "by _"])
     else if conclude.Con.conclude_method = "Eq_chain" then
       let justification p =
-       let j1,j2 = justification term2pres p in
+(*
+        if skip_initial_lambdas <> None (* cheating *) then
+          [B.b_kw "by _"]
+        else
+*)
+          let j1,j2 = justification term2pres p in
          j1 :: B.b_space :: (match j2 with Some j -> [j] | None -> [])
       in
       let rec aux args =
        match args with
          | [] -> []
-         | (Con.ArgProof p)::(Con.Term t)::tl -> 
-             B.H([],([B.b_kw "=";B.b_space;term2pres t;B.b_space]@justification p))::(aux tl)
+         | (Con.ArgProof p)::(Con.Term (_,t))::tl -> 
+             B.HOV(RenderingAttrs.indent_attributes `BoxML,([B.b_kw
+              "=";B.b_space;term2pres t;B.b_space]@justification p@
+              (if tl <> [] then [B.Text ([],".")] else [])))::(aux tl)
          | _ -> assert false 
       in
       let hd = 
        match List.hd conclude.Con.conclude_args with
-         | Con.Term t -> t 
+         | Con.Term (_,t) -> t 
          | _ -> assert false 
       in
-      B.H([],[term2pres hd; B.b_space; 
+      B.HOV([],[B.b_kw "conclude";B.b_space;term2pres hd; (* B.b_space; *)
              B.V ([],aux (List.tl conclude.Con.conclude_args))])
-     else if conclude.Con.conclude_method = "Apply" then
+    else if conclude.Con.conclude_method = "Apply" then
       let pres_args = 
         make_args_for_apply term2pres conclude.Con.conclude_args in
       B.H([],
@@ -416,8 +475,8 @@ and proof2pres term2pres p =
         Con.Aux n -> B.b_kw ("aux " ^ n)
       | Con.Premise prem -> B.b_kw "premise"
       | Con.Lemma lemma -> B.b_kw "lemma"
-      | Con.Term t -> term2pres t
-      | Con.ArgProof p -> proof2pres 
+      | Con.Term (_,t) -> term2pres t
+      | Con.ArgProof p -> proof2pres true p false
       | Con.ArgMethod s -> B.b_kw "method"
  
    and case conclude =
@@ -439,7 +498,7 @@ and proof2pres term2pres p =
                  None -> B.b_kw "the previous result"
                | Some n -> B.Object ([], P.Mi([],n)))
            | Con.Lemma lemma -> B.Object ([], P.Mi([],lemma.Con.lemma_name))
-           | Con.Term t -> 
+           | Con.Term (_,t) -> 
                term2pres t
            | Con.ArgProof p -> B.b_kw "a proof???"
            | Con.ArgMethod s -> B.b_kw "a method???")
@@ -470,14 +529,14 @@ and proof2pres term2pres p =
                  None -> B.b_kw "the previous result"
                | Some n -> B.Object ([], P.Mi([],n)))
            | Con.Lemma lemma -> B.Object ([], P.Mi([],lemma.Con.lemma_name))
-           | Con.Term t -> 
+           | Con.Term (_,t) -> 
                term2pres t
            | Con.ArgProof p -> B.b_kw "a proof???"
            | Con.ArgMethod s -> B.b_kw "a method???") in
         (make_concl "we proceed by induction on" arg) in
      let to_prove =
         (make_concl "to prove" proof_conclusion) in
-     B.V ([], induction_on::to_prove:: (make_cases args_for_cases))
+     B.V ([], induction_on::to_prove:: B.Text([],".")::(make_cases args_for_cases))
 
     and make_cases l = List.map make_case l
 
@@ -500,21 +559,20 @@ and proof2pres term2pres p =
                     (match e with 
                        `Declaration h 
                      | `Hypothesis h -> 
-                         let name = 
-                           (match h.Con.dec_name with
-                              None -> "NO NAME???"
-                           | Some n ->n) in
+                         let name = get_name h.Con.dec_name in
                          [B.b_space;
+                          B.Text([],"(");
                           B.Object ([], P.Mi ([],name));
                           B.Text([],":");
-                          (term2pres h.Con.dec_type)]
-                     | _ -> [B.Text ([],"???")]) in
+                          (term2pres h.Con.dec_type);
+                          B.Text([],")")]
+                     | _ -> assert false (*[B.Text ([],"???")]*)) in
                   dec@p) args [] in
           let pattern = 
             B.H ([],
-               (B.b_kw "Case"::B.b_space::name::pattern_aux)@
+               (B.b_kw "case"::B.b_space::name::pattern_aux)@
                 [B.b_space;
-                 B.Text([], Utf8Macro.unicode_of_tex "\\Rightarrow")]) in
+                 B.Text([], ".")]) in
           let subconcl = 
             (match p.Con.proof_conclude.Con.conclude_conclusion with
                None -> B.b_kw "No conclusion!!!"
@@ -530,20 +588,22 @@ and proof2pres term2pres p =
                    `Hypothesis h ->
                      let name = 
                        (match h.Con.dec_name with
-                          None -> "no name"
+                          None -> "useless"
                         | Some s -> s) in
                      B.indent (B.H ([],
-                       [B.Text([],"(");
+                       [term2pres h.Con.dec_type;
+                        B.b_space;
+                        B.Text([],"(");
                         B.Object ([], P.Mi ([],name));
                         B.Text([],")");
-                        B.b_space;
-                        term2pres h.Con.dec_type]))
+                        B.Text([],".")]))
                    | _ -> assert false in
                let hyps = List.map make_hyp indhyps in
                text::hyps) in          
           (* let acontext = 
                acontext2pres_old p.Con.proof_apply_context true in *)
-          let body = conclude2pres p.Con.proof_conclude true false in
+          let body =
+           conclude2pres true p.Con.proof_name p.Con.proof_conclude true true false in
           let presacontext = 
            let acontext_id =
             match p.Con.proof_apply_context with
@@ -552,8 +612,12 @@ and proof2pres term2pres p =
            in
             B.Action([None,"type","toggle"],
               [ B.indent (add_xref acontext_id (B.b_kw "Proof"));
-                acontext2pres p.Con.proof_apply_context body true]) in
-          B.V ([], pattern::asubconcl::induction_hypothesis@[presacontext])
+                acontext2pres
+                 (p.Con.proof_conclude.Con.conclude_method = "BU_Conversion")
+                 p.Con.proof_apply_context body true
+                 (p.Con.proof_conclude.Con.conclude_method = "BU_Conversion")
+              ]) in
+          B.V ([], pattern::induction_hypothesis@[asubconcl;B.Text([],".");presacontext])
        | _ -> assert false 
 
      and falseind conclude =
@@ -581,7 +645,7 @@ and proof2pres term2pres p =
                [ B.Object ([], P.Mi([],lemma.Con.lemma_name)); B.skip;
                  B.b_kw "is contradictory, hence" ]
            | _ -> assert false) in
-            (* let body = proof2pres {proof with Con.proof_context = tl} in *)
+            (* let body = proof2pres {proof with Con.proof_context = tl} false in *)
        make_row arg proof_conclusion
 
      and andind conclude =
@@ -605,28 +669,25 @@ and proof2pres term2pres p =
            | _ -> assert false) in
        match proof.Con.proof_context with
          `Hypothesis hyp1::`Hypothesis hyp2::tl ->
-            let get_name hyp =
-              (match hyp.Con.dec_name with
-                None -> "_"
-              | Some s -> s) in
             let preshyp1 = 
               B.H ([],
                [B.Text([],"(");
-                B.Object ([], P.Mi([],get_name hyp1));
+                B.Object ([], P.Mi([],get_name hyp1.Con.dec_name));
                 B.Text([],")");
                 B.skip;
                 term2pres hyp1.Con.dec_type]) in
             let preshyp2 = 
               B.H ([],
                [B.Text([],"(");
-                B.Object ([], P.Mi([],get_name hyp2));
+                B.Object ([], P.Mi([],get_name hyp2.Con.dec_name));
                 B.Text([],")");
                 B.skip;
                 term2pres hyp2.Con.dec_type]) in
-            (* let body = proof2pres {proof with Con.proof_context = tl} in *)
-            let body = conclude2pres proof.Con.proof_conclude false true in
+            (* let body = proof2pres {proof with Con.proof_context = tl} false in *)
+            let body= conclude2pres false proof.Con.proof_name proof.Con.proof_conclude false true false in
             let presacontext = 
-              acontext2pres proof.Con.proof_apply_context body false in
+              acontext2pres false proof.Con.proof_apply_context body false false
+            in
             B.V 
               ([],
                [B.H ([],arg@[B.skip; B.b_kw "we have"]);
@@ -647,29 +708,26 @@ and proof2pres term2pres p =
        match proof.Con.proof_context with
            `Declaration decl::`Hypothesis hyp::tl
          | `Hypothesis decl::`Hypothesis hyp::tl ->
-           let get_name decl =
-             (match decl.Con.dec_name with
-                None -> "_"
-              | Some s -> s) in
            let presdecl = 
              B.H ([],
                [(B.b_kw "let");
                 B.skip;
-                B.Object ([], P.Mi([],get_name decl));
+                B.Object ([], P.Mi([],get_name decl.Con.dec_name));
                 B.Text([],":"); term2pres decl.Con.dec_type]) in
            let suchthat =
              B.H ([],
                [(B.b_kw "such that");
                 B.skip;
                 B.Text([],"(");
-                B.Object ([], P.Mi([],get_name hyp));
+                B.Object ([], P.Mi([],get_name hyp.Con.dec_name));
                 B.Text([],")");
                 B.skip;
                 term2pres hyp.Con.dec_type]) in
-            (* let body = proof2pres {proof with Con.proof_context = tl} in *)
-            let body = conclude2pres proof.Con.proof_conclude false true in
+            (* let body = proof2pres {proof with Con.proof_context = tl} false in *)
+            let body= conclude2pres false proof.Con.proof_name proof.Con.proof_conclude false true false in
             let presacontext = 
-              acontext2pres proof.Con.proof_apply_context body false in
+              acontext2pres false proof.Con.proof_apply_context body false false
+            in
             B.V 
               ([],
                [presdecl;
@@ -678,7 +736,12 @@ and proof2pres term2pres p =
          | _ -> assert false
 
     in
-    proof2pres p
+    proof2pres
+     ?skip_initial_lambdas_internal:
+       (match skip_initial_lambdas with
+           None -> Some (`Later 0) (* we already printed theorem: *)
+         | Some n -> Some (`Later n))
+     is_top_down p false
 
 exception ToDo
 
@@ -729,7 +792,7 @@ let conjecture2pres term2pres (id, n, context, ty) =
                                          None -> "_"
                                        | Some n -> n)) ;
                        B.b_text [] (Utf8Macro.unicode_of_tex "\\Assign");
-                       proof2pres term2pres p])
+                       proof2pres true term2pres p])
           (List.rev context)) ] ::
          [ B.b_h []
            [ B.b_text [] (Utf8Macro.unicode_of_tex "\\vdash");
@@ -794,26 +857,35 @@ let joint_def2pres term2pres def =
   | `Inductive ind -> inductive2pres term2pres ind
   | _ -> assert false (* ZACK or raise ToDo? *)
 
-let content2pres term2pres (id,params,metasenv,obj) =
+let content2pres 
+  ?skip_initial_lambdas ?(skip_thm_and_qed=false) term2pres 
+  (id,params,metasenv,obj) 
+=
   match obj with
   | `Def (Content.Const, thesis, `Proof p) ->
       let name = get_name p.Content.proof_name in
+      let proof = proof2pres true term2pres ?skip_initial_lambdas p in
+      if skip_thm_and_qed then
+        proof
+      else
       B.b_v
         [Some "helm","xref","id"]
-        ([ B.b_h [] (B.b_kw ("Proof " ^ name) :: params2pres params);
-           B.b_kw "Thesis:";
-           B.indent (term2pres thesis) ] @
+        ([ B.b_h [] (B.b_kw ("theorem " ^ name) :: 
+          params2pres params @ [B.b_kw ":"]);
+           B.indent (term2pres thesis) ; B.b_kw "." ] @
          metasenv2pres term2pres metasenv @
-         [proof2pres term2pres p])
+         [proof ; B.b_kw "qed."])
   | `Def (_, ty, `Definition body) ->
       let name = get_name body.Content.def_name in
       B.b_v
         [Some "helm","xref","id"]
-        ([B.b_h [] (B.b_kw ("Definition " ^ name) :: params2pres params);
-          B.b_kw "Type:";
+        ([B.b_h []
+           (B.b_kw ("definition " ^ name) :: params2pres params @ [B.b_kw ":"]);
           B.indent (term2pres ty)] @
           metasenv2pres term2pres metasenv @
-          [B.b_kw "Body:"; term2pres body.Content.def_term])
+          [B.b_kw ":=";
+           B.indent (term2pres body.Content.def_term);
+           B.b_kw "."])
   | `Decl (_, `Declaration decl)
   | `Decl (_, `Hypothesis decl) ->
       let name = get_name decl.Content.dec_name in
@@ -829,13 +901,14 @@ let content2pres term2pres (id,params,metasenv,obj) =
         :: List.map (joint_def2pres term2pres) joint.Content.joint_defs)
   | _ -> raise ToDo
 
-let content2pres ~ids_to_inner_sorts =
-  content2pres
-    (fun annterm ->
+let content2pres 
+  ?skip_initial_lambdas ?skip_thm_and_qed ~ids_to_inner_sorts 
+=
+  content2pres ?skip_initial_lambdas ?skip_thm_and_qed
+    (fun ?(prec=90) annterm ->
       let ast, ids_to_uris =
         TermAcicContent.ast_of_acic ids_to_inner_sorts annterm
       in
-      CicNotationPres.box_of_mpres
-        (CicNotationPres.render ids_to_uris
+       CicNotationPres.box_of_mpres
+        (CicNotationPres.render ids_to_uris ~prec
           (TermContentPres.pp_ast ast)))
-