]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/content_pres/content2pres.ml
Bug fixed in bottom-up conversion.
[helm.git] / helm / software / components / content_pres / content2pres.ml
index 018497404cf3277aef6f93c9636d07825eb8b427..97f225f62b0bc2a9b9ad5c4781ba6bbcbcba2be5 100644 (file)
@@ -257,17 +257,35 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
               term])
 
   and acontext2pres is_top_down ac continuation indent in_bu_conversion =
-    List.fold_right
-      (fun p continuation ->
+   let rec aux =
+    function
+       [] -> continuation
+     | p::tl ->
+        let continuation = aux tl in
+        (* Applicative context get flattened and the "body" of a BU_Conversion
+           is put in the applicative context. Thus two different situations
+           are possible:
+            {method = "BU_Conversion"; applicative_context=[p1; ...; pn]}
+            {method = xxx; applicative_context =
+              [ p1; ...; pn; {method="BU_Conversion"} ; p_{n+1}; ... ; pm ]}
+           In both situations only pn must be processed in in_bu_conversion
+           mode
+        *)
+        let in_bu_conversion =
+         match tl with
+            [] -> in_bu_conversion
+          | p::_ -> p.Con.proof_conclude.Con.conclude_method = "BU_Conversion"
+        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 
+        B.V([Some "helm","xref",p.Con.proof_id],
+          [B.H([Some "helm","xref","ace_"^p.Con.proof_id],[hd]);
+           continuation])
+   in aux ac
 
   and conclude2pres ?skip_initial_lambdas_internal is_top_down name conclude indent omit_conclusion omit_dot =
     let tconclude_body = 
@@ -283,7 +301,7 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
             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 [])
+                     B.Text([],".")] else [B.Text([],".")])
           else if conclude.Con.conclude_method = "FalseInd" then
            (* false ind is in charge to add the conclusion *)
            falseind conclude
@@ -320,10 +338,15 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
                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 [])
+              else
+                B.b_hv []
+                 ((if not is_top_down || omit_dot then
+                    (make_concl "we proved" concl) ::
+                      if not is_top_down then
+                       [B.b_space; B.Text([],"(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
@@ -351,8 +374,7 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
       B.V 
         ([],
         [make_concl "we need to  prove" expected;
-         make_concl "or equivalently" synth;
-         B.Text([],".");
+         B.H ([],[make_concl "or equivalently" synth; B.Text([],".")]);
          proof2pres true subproof false])
     else if conclude.Con.conclude_method = "BU_Conversion" then
       assert false
@@ -532,8 +554,8 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
            | 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:: B.Text([],".")::(make_cases args_for_cases))
+      B.H ([], [make_concl "to prove" proof_conclusion ; B.Text([],".")]) in
+     B.V ([], induction_on::to_prove::(make_cases args_for_cases))
 
     and make_cases l = List.map make_case l
 
@@ -597,8 +619,6 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
                    | _ -> 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 true p.Con.proof_name p.Con.proof_conclude true true false in
           let presacontext = 
@@ -614,7 +634,7 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
                  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])
+          B.V ([], pattern::induction_hypothesis@[B.H ([],[asubconcl;B.Text([],".")]);presacontext])
        | _ -> assert false 
 
      and falseind conclude =
@@ -642,7 +662,6 @@ and proof2pres ?skip_initial_lambdas is_top_down 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} false in *)
        make_row arg proof_conclusion
 
      and andind conclude =
@@ -680,8 +699,9 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
                 B.Text([],")");
                 B.skip;
                 term2pres hyp2.Con.dec_type]) 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 body =
+             conclude2pres false proof.Con.proof_name proof.Con.proof_conclude
+              false true false in
             let presacontext = 
               acontext2pres false proof.Con.proof_apply_context body false false
             in
@@ -720,8 +740,9 @@ and proof2pres ?skip_initial_lambdas is_top_down term2pres p =
                 B.Text([],")");
                 B.skip;
                 term2pres hyp.Con.dec_type]) 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 body =
+             conclude2pres false proof.Con.proof_name proof.Con.proof_conclude
+              false true false in
             let presacontext = 
               acontext2pres false proof.Con.proof_apply_context body false false
             in
@@ -869,7 +890,7 @@ let content2pres
         [Some "helm","xref","id"]
         ([ B.b_h [] (B.b_kw ("theorem " ^ name) :: 
           params2pres params @ [B.b_kw ":"]);
-           B.indent (term2pres thesis) ; B.b_kw "." ] @
+           B.H ([],[B.indent (term2pres thesis) ; B.b_kw "." ])] @
          metasenv2pres term2pres metasenv @
          [proof ; B.b_kw "qed."])
   | `Def (_, ty, `Definition body) ->