]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/cic_transformations/content2pres.ml
Debugging infos removed.
[helm.git] / helm / ocaml / cic_transformations / content2pres.ml
1 (* Copyright (C) 2000, 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://cs.unibo.it/helm/.
24  *)
25
26 (***************************************************************************)
27 (*                                                                         *)
28 (*                            PROJECT HELM                                 *)
29 (*                                                                         *)
30 (*                Andrea Asperti <asperti@cs.unibo.it>                     *)
31 (*                              17/06/2003                                 *)
32 (*                                                                         *)
33 (***************************************************************************)
34
35 let rec split n l =
36   if n = 0 then [],l
37   else let l1,l2 = 
38     split (n-1) (List.tl l) in
39     (List.hd l)::l1,l2
40 ;;
41   
42
43 let is_big_general countterm p =
44   let maxsize = Cexpr2pres.maxsize in
45   let module Con = Content in
46   let rec countp current_size p =
47     if current_size > maxsize then current_size
48     else 
49       let c1 = (countcontext current_size p.Con.proof_context) in
50       if c1 > maxsize then c1
51     else 
52       let c2 = (countapplycontext c1 p.Con.proof_apply_context) in
53       if c2 > maxsize then c2
54     else 
55       countconclude c2 p.Con.proof_conclude
56
57   and 
58     countcontext current_size c =
59       List.fold_left countcontextitem current_size c
60   and
61     countcontextitem current_size e =
62       if current_size > maxsize then maxsize
63       else 
64         (match e with
65           `Declaration d -> 
66             (match d.Con.dec_name with
67                Some s -> current_size + 4 + (String.length s)
68              | None -> prerr_endline "NO NAME!!"; assert false)
69         | `Hypothesis h ->
70             (match h.Con.dec_name with
71                 Some s -> current_size + 4 + (String.length s)
72               | None -> prerr_endline "NO NAME!!"; assert false) 
73         | `Proof p -> countp current_size p
74         | `Definition d -> 
75             (match d.Con.def_name with
76                 Some s -> 
77                   let c1 = (current_size + 4 + (String.length s)) in
78                   (countterm c1 d.Con.def_term)
79               | None -> 
80                   prerr_endline "NO NAME!!"; assert false) 
81         | `Joint ho -> maxsize + 1) (* we assume is big *)
82   and 
83     countapplycontext current_size ac =
84       List.fold_left countp current_size ac
85   and 
86     countconclude current_size co =
87       if current_size > maxsize then current_size
88       else
89         let c1 = countargs current_size co.Con.conclude_args in
90         if c1 > maxsize then c1 
91       else 
92         (match co.Con.conclude_conclusion with
93            Some concl ->  countterm c1 concl
94         | None -> c1)
95   and 
96     countargs current_size args =
97       List.fold_left countarg current_size args
98   and
99     countarg current_size arg =
100       if current_size > maxsize then current_size
101       else 
102         (match arg with 
103            Con.Aux _ -> current_size
104          | Con.Premise prem -> 
105              (match prem.Con.premise_binder with
106                 Some s -> current_size + (String.length s)
107               | None -> current_size + 7) 
108          | Con.Lemma lemma -> 
109              current_size + (String.length lemma.Con.lemma_name)
110          | Con.Term t -> countterm current_size t
111          | Con.ArgProof p -> countp current_size p
112          | Con.ArgMethod s -> (maxsize + 1)) in
113   let size = (countp 0 p) in
114   (size > maxsize)
115 ;;
116
117 let is_big = is_big_general (Cexpr2pres.countterm)
118 ;;
119
120 let get_xref =
121     let module Con = Content in
122       function
123         `Declaration d  
124       | `Hypothesis d -> d.Con.dec_id
125       | `Proof p -> p.Con.proof_id
126       | `Definition d -> d.Con.def_id
127       | `Joint jo -> jo.Con.joint_id
128 ;;
129
130 let make_row ?(attrs=[]) items concl =
131   let module P = Mpresentation in
132     (match concl with 
133        P.Mtable _ -> (* big! *)
134          P.Mtable (attrs@[None,"align","baseline 1"; None,"equalrows","false";
135           None,"columnalign","left"],
136            [P.Mtr([],[P.Mtd ([],P.Mrow([],items))]);
137             P.Mtr ([],[P.Mtd ([],P.indented concl)])])
138      | _ ->  (* small *)
139        P.Mrow(attrs,items@[P.Mspace([None,"width","0.1cm"]);concl]))
140 ;;
141
142 let make_concl ?(attrs=[]) verb concl =
143   let module P = Mpresentation in
144     (match concl with 
145        P.Mtable _ -> (* big! *)
146          P.Mtable (attrs@[None,"align","baseline 1"; None,"equalrows","false";
147           None,"columnalign","left"],
148            [P.Mtr([],[P.Mtd ([],P.Mtext([None,"mathcolor","Red"],verb))]);
149             P.Mtr ([],[P.Mtd ([],P.indented concl)])])
150      | _ ->  (* small *)
151        P.Mrow(attrs,
152         [P.Mtext([None,"mathcolor","Red"],verb); 
153          P.Mspace([None,"width","0.1cm"]);
154          concl]))
155 ;;
156
157 let make_args_for_apply term2pres args =
158  let module Con = Content in
159  let module P = Mpresentation in
160  let make_arg_for_apply is_first arg row = 
161   let res =
162    match arg with 
163       Con.Aux n -> assert false
164     | Con.Premise prem -> 
165         let name = 
166           (match prem.Con.premise_binder with
167              None -> "previous"
168            | Some s -> s) in
169         P.Mi([],name)::row
170     | Con.Lemma lemma -> 
171          P.Mi([],lemma.Con.lemma_name)::row 
172     | Con.Term t -> 
173         if is_first then
174           (term2pres t)::row
175         else P.Mi([],"_")::row
176     | Con.ArgProof _ 
177     | Con.ArgMethod _ -> 
178        P.Mi([],"_")::row
179   in
180    if is_first then res else P.smallskip::res
181  in
182   match args with 
183     hd::tl -> 
184       make_arg_for_apply true hd 
185         (List.fold_right (make_arg_for_apply false) tl [])
186   | _ -> assert false
187 ;;
188
189 let rec justification term2pres p = 
190   let module Con = Content in
191   let module P = Mpresentation in
192   if ((p.Con.proof_conclude.Con.conclude_method = "Exact") or
193      ((p.Con.proof_context = []) &
194       (p.Con.proof_apply_context = []) &
195       (p.Con.proof_conclude.Con.conclude_method = "Apply"))) then
196     let pres_args = 
197       make_args_for_apply term2pres p.Con.proof_conclude.Con.conclude_args in
198     P.Mrow([],
199       P.Mtext([None,"mathcolor","Red"],"by")::P.Mspace([None,"width","0.1cm"])::
200       P.Mo([],"(")::pres_args@[P.Mo([],")")]) 
201   else proof2pres term2pres p 
202      
203 and proof2pres term2pres p =
204   let rec proof2pres p =
205     let module Con = Content in
206     let module P = Mpresentation in
207       let indent = 
208         let is_decl e = 
209           (match e with 
210              `Declaration _
211            | `Hypothesis _ -> true
212            | _ -> false) in
213         ((List.filter is_decl p.Con.proof_context) != []) in 
214       let omit_conclusion = (not indent) && (p.Con.proof_context != []) in
215       let concl = 
216         (match p.Con.proof_conclude.Con.conclude_conclusion with
217            None -> None
218          | Some t -> Some (term2pres t)) in
219       let body =
220           let presconclude = 
221             conclude2pres p.Con.proof_conclude indent omit_conclusion in
222           let presacontext = 
223             acontext2pres p.Con.proof_apply_context presconclude indent in
224           context2pres p.Con.proof_context presacontext in
225       match p.Con.proof_name with
226         None -> body
227       | Some name ->
228           let action = 
229            match concl with
230               None -> body
231 (*
232                P.Maction
233                  ([None,"actiontype","toggle" ; None,"selection","1"],
234                   [P.Mtext [] "proof" ; body])
235 *)
236             | Some ac ->
237                P.Maction
238                  ([None,"actiontype","toggle" ; None,"selection","1"],
239                   [(make_concl ~attrs:[Some "helm", "xref", p.Con.proof_id]
240                      "proof of" ac); body])
241           in
242           P.Mtable ([None,"align","baseline 1"; None,"equalrows","false";
243               None,"columnalign","left"],
244             [P.Mtr ([],[P.Mtd ([],P.Mfenced([],[P.Mtext ([],name)]))]);
245              P.Mtr ([],[P.Mtd ([], P.indented action)])])
246 (*
247           P.Mtable ([None,"align","baseline 1"; None,"equalrows","false";
248               None,"columnalign","left";Some "helm", "xref", p.Con.proof_id],
249             [P.Mtr ([],[P.Mtd ([],P.Mfenced([],[P.Mtext ([],name)]))]);
250              P.Mtr ([],[P.Mtd ([], P.indented action)])]) *)
251
252   and context2pres c continuation =
253     (* we generate a subtable for each context element, for selection
254        purposes 
255        The table generated by the head-element does not have an xref;
256        the whole context-proof is already selectable *)
257     let module P = Mpresentation in
258     match c with
259       [] -> continuation
260     | hd::tl -> 
261         let continuation' =
262           List.fold_right
263             (fun ce continuation ->
264               let xref = get_xref ce in
265               P.Mtable([None,"align","baseline 1"; None,"equalrows","false";
266                None,"columnalign","left"; Some "helm", "xref", xref ],
267                 [P.Mtr([Some "helm", "xref", "ce_"^xref],[P.Mtd ([],ce2pres ce)]);
268                  P.Mtr([],[P.Mtd ([], continuation)])])) tl continuation in
269          let hd_xref= get_xref hd in
270          P.Mtable([None,"align","baseline 1"; None,"equalrows","false";
271            None,"columnalign","left"],
272              [P.Mtr([Some "helm", "xref", "ce_"^hd_xref],
273                [P.Mtd ([],ce2pres hd)]);
274              P.Mtr([],[P.Mtd ([], continuation')])])
275          
276   and ce2pres =
277     let module P = Mpresentation in
278     let module Con = Content in
279       function
280         `Declaration d -> 
281           (match d.Con.dec_name with
282               Some s ->
283                 let ty = term2pres d.Con.dec_type in
284                 P.Mrow ([],
285                   [P.Mtext([None,"mathcolor","Red"],"Assume");
286                    P.Mspace([None,"width","0.1cm"]);
287                    P.Mi([],s);
288                    P.Mtext([],":");
289                    ty])
290             | None -> 
291                 prerr_endline "NO NAME!!"; assert false)
292       | `Hypothesis h ->
293           (match h.Con.dec_name with
294               Some s ->
295                 let ty = term2pres h.Con.dec_type in
296                 P.Mrow ([],
297                   [P.Mtext([None,"mathcolor","Red"],"Suppose");
298                    P.Mspace([None,"width","0.1cm"]);
299                    P.Mo([],"(");
300                    P.Mi ([],s);
301                    P.Mo([],")");
302                    P.Mspace([None,"width","0.1cm"]);
303                    ty])
304             | None -> 
305                 prerr_endline "NO NAME!!"; assert false) 
306       | `Proof p -> 
307            proof2pres p 
308       | `Definition d -> 
309            (match d.Con.def_name with
310               Some s ->
311                 let term = term2pres d.Con.def_term in
312                 P.Mrow ([],
313                   [P.Mtext([],"Let ");
314                    P.Mi([],s);
315                    P.Mtext([]," = ");
316                    term])
317             | None -> 
318                 prerr_endline "NO NAME!!"; assert false) 
319       | `Joint ho -> 
320             P.Mtext ([],"jointdef")
321
322   and acontext2pres ac continuation indent =
323     let module Con = Content in
324     let module P = Mpresentation in
325     List.fold_right
326       (fun p continuation ->
327          let hd = 
328            if indent then
329              P.indented (proof2pres p)
330            else 
331              proof2pres p in
332          P.Mtable([None,"align","baseline 1"; None,"equalrows","false";
333           None,"columnalign","left"; Some "helm","xref",p.Con.proof_id],
334            [P.Mtr([Some "helm","xref","ace_"^p.Con.proof_id],[P.Mtd ([],hd)]);
335             P.Mtr([],[P.Mtd ([], continuation)])])) ac continuation 
336
337   and conclude2pres conclude indent omit_conclusion =
338     let module Con = Content in
339     let module P = Mpresentation in
340     let tconclude_body = 
341       match conclude.Con.conclude_conclusion with
342         Some t when not omit_conclusion ->
343           let concl = (term2pres t) in 
344           if conclude.Con.conclude_method = "BU_Conversion" then
345             make_concl "that is equivalent to" concl
346           else if conclude.Con.conclude_method = "FalseInd" then
347            (* false ind is in charge to add the conclusion *)
348            falseind conclude
349           else  
350             let conclude_body = conclude_aux conclude in
351             let ann_concl = 
352               if conclude.Con.conclude_method = "TD_Conversion" then
353                  make_concl "that is equivalent to" concl 
354               else make_concl "we conclude" concl in
355             P.Mtable ([None,"align","baseline 1"; None,"equalrows","false";
356               None,"columnalign","left"],
357                 [P.Mtr ([],[P.Mtd ([],conclude_body)]);
358                  P.Mtr ([],[P.Mtd ([],ann_concl)])])
359       | _ -> conclude_aux conclude in
360     if indent then 
361       P.indented (P.Mrow ([Some "helm", "xref", conclude.Con.conclude_id],
362                     [tconclude_body]))
363     else 
364       P.Mrow ([Some "helm", "xref", conclude.Con.conclude_id],[tconclude_body])
365
366
367   and conclude_aux conclude =
368     let module Con = Content in
369     let module P = Mpresentation in
370     if conclude.Con.conclude_method = "TD_Conversion" then
371       let expected = 
372         (match conclude.Con.conclude_conclusion with 
373            None -> P.Mtext([],"NO EXPECTED!!!")
374          | Some c -> term2pres c) in
375       let subproof = 
376         (match conclude.Con.conclude_args with
377           [Con.ArgProof p] -> p
378          | _ -> assert false) in
379       let synth = 
380         (match subproof.Con.proof_conclude.Con.conclude_conclusion with
381            None -> P.Mtext([],"NO SYNTH!!!")
382          | Some c -> (term2pres c)) in
383       P.Mtable 
384         ([None,"align","baseline 1"; None,"equalrows","false"; None,"columnalign","left"],
385         [P.Mtr([],[P.Mtd([],make_concl "we must prove" expected)]);
386          P.Mtr([],[P.Mtd([],make_concl "or equivalently" synth)]);
387          P.Mtr([],[P.Mtd([],proof2pres subproof)])])
388     else if conclude.Con.conclude_method = "BU_Conversion" then
389       assert false
390     else if conclude.Con.conclude_method = "Exact" then
391       let arg = 
392         (match conclude.Con.conclude_args with 
393            [Con.Term t] -> term2pres t
394          | _ -> assert false) in
395       (match conclude.Con.conclude_conclusion with 
396          None ->
397           P.Mrow []
398            [P.Mtext [None, "mathcolor", "red"] "Consider" ; P.smallskip; arg]
399        | Some c -> let conclusion = term2pres c in
400           make_row 
401             [arg; P.Mspace([None,"width","0.1cm"]);P.Mtext([],"proves")]
402             conclusion
403        )
404     else if conclude.Con.conclude_method = "Intros+LetTac" then
405       (match conclude.Con.conclude_args with
406          [Con.ArgProof p] -> proof2pres p
407        | _ -> assert false)
408 (* OLD CODE 
409       let conclusion = 
410       (match conclude.Con.conclude_conclusion with 
411          None -> P.Mtext([],"NO Conclusion!!!")
412        | Some c -> term2pres c) in
413       (match conclude.Con.conclude_args with
414          [Con.ArgProof p] -> 
415            P.Mtable 
416             ([None,"align","baseline 1"; None,"equalrows","false";
417               None,"columnalign","left"],
418               [P.Mtr([],[P.Mtd([],proof2pres p)]);
419                P.Mtr([],[P.Mtd([],
420                 (make_concl "we proved 1" conclusion))])]);
421        | _ -> assert false)
422 *)
423     else if (conclude.Con.conclude_method = "ByInduction") then
424       byinduction conclude
425     else if (conclude.Con.conclude_method = "Exists") then
426       exists conclude
427     else if (conclude.Con.conclude_method = "AndInd") then
428       andind conclude
429     else if (conclude.Con.conclude_method = "FalseInd") then
430       falseind conclude
431     else if (conclude.Con.conclude_method = "Rewrite") then
432       let justif = 
433         (match (List.nth conclude.Con.conclude_args 6) with
434            Con.ArgProof p -> justification term2pres p
435          | _ -> assert false) in
436       let term1 = 
437         (match List.nth conclude.Con.conclude_args 2 with
438            Con.Term t -> term2pres t
439          | _ -> assert false) in 
440       let term2 = 
441         (match List.nth conclude.Con.conclude_args 5 with
442            Con.Term t -> term2pres t
443          | _ -> assert false) in
444       P.Mtable ([None,"align","baseline 1";None,"equalrows","false";
445         None,"columnalign","left"], 
446          [P.Mtr ([],[P.Mtd ([],P.Mrow([],[
447           P.Mtext([None,"mathcolor","Red"],"rewrite");
448           P.Mspace([None,"width","0.1cm"]);term1;
449           P.Mspace([None,"width","0.1cm"]);
450           P.Mtext([None,"mathcolor","Red"],"with");
451           P.Mspace([None,"width","0.1cm"]);term2]))]);
452           P.Mtr ([],[P.Mtd ([],P.indented justif)])]);
453     else if conclude.Con.conclude_method = "Apply" then
454       let pres_args = 
455         make_args_for_apply term2pres conclude.Con.conclude_args in
456       P.Mrow([],
457         P.Mtext([None,"mathcolor","Red"],"by")::
458         P.Mspace([None,"width","0.1cm"])::
459         P.Mo([],"(")::pres_args@[P.Mo([],")")])
460     else 
461       P.Mtable 
462         ([None,"align","baseline 1"; None,"equalrows","false"; None,"columnalign","left"],
463          [P.Mtr ([],[P.Mtd ([],P.Mtext([],"Apply method" ^ conclude.Con.conclude_method ^ " to"))]);
464           P.Mtr ([],
465            [P.Mtd ([], 
466              (P.indented 
467                (P.Mtable 
468                  ([None,"align","baseline 1"; None,"equalrows","false";
469                    None,"columnalign","left"],
470                   args2pres conclude.Con.conclude_args))))])]) 
471
472   and args2pres l =
473     let module P = Mpresentation in
474     List.map 
475      (function a -> P.Mtr ([], [P.Mtd ([], arg2pres a)])) l
476
477   and arg2pres =
478     let module P = Mpresentation in
479     let module Con = Content in
480     function
481         Con.Aux n -> 
482           P.Mtext ([],"aux " ^ n)
483       | Con.Premise prem -> 
484           P.Mtext ([],"premise")
485       | Con.Lemma lemma ->
486           P.Mtext ([],"lemma")
487       | Con.Term t -> 
488           term2pres t
489       | Con.ArgProof p ->
490         proof2pres p 
491       | Con.ArgMethod s -> 
492          P.Mtext ([],"method") 
493  
494    and byinduction conclude =
495      let module P = Mpresentation in
496      let module Con = Content in
497      let proof_conclusion = 
498        (match conclude.Con.conclude_conclusion with
499           None -> P.Mtext([],"No conclusion???")
500         | Some t -> term2pres t) in
501      let inductive_arg,args_for_cases = 
502        (match conclude.Con.conclude_args with
503            Con.Aux(n)::_::tl ->
504              let l1,l2 = split (int_of_string n) tl in
505              let last_pos = (List.length l2)-1 in
506              List.nth l2 last_pos,l1
507          | _ -> assert false) in
508      let induction_on =
509        let arg = 
510          (match inductive_arg with
511             Con.Aux n -> 
512               P.Mtext ([],"an aux???")
513            | Con.Premise prem ->
514               (match prem.Con.premise_binder with
515                  None -> P.Mtext ([],"the previous result")
516                | Some n -> P.Mi([],n))
517            | Con.Lemma lemma -> P.Mi([],lemma.Con.lemma_name)
518            | Con.Term t -> 
519                term2pres t
520            | Con.ArgProof p ->
521                P.Mtext ([],"a proof???")
522            | Con.ArgMethod s -> 
523                P.Mtext ([],"a method???")) in
524         (make_concl "we proceede by induction on" arg) in
525      let to_prove =
526         (make_concl "to prove" proof_conclusion) in
527      P.Mtable 
528        ([None,"align","baseline 1"; None,"equalrows","false"; 
529          None,"columnalign","left"],
530           P.Mtr ([],[P.Mtd ([],induction_on)])::
531           P.Mtr ([],[P.Mtd ([],to_prove)])::
532           (make_cases args_for_cases))
533
534     and make_cases args_for_cases =
535     let module P = Mpresentation in
536     List.map 
537       (fun p -> P.Mtr ([],[P.Mtd ([],make_case p)])) args_for_cases
538
539     and make_case =  
540       let module P = Mpresentation in
541       let module Con = Content in
542       function 
543         Con.ArgProof p ->
544           let name =
545             (match p.Con.proof_name with
546                None -> P.Mtext([],"no name for case!!")
547              | Some n -> P.Mi([],n)) in
548           let indhyps,args =
549              List.partition 
550                (function
551                    `Hypothesis h -> h.Con.dec_inductive
552                  | _ -> false) p.Con.proof_context in
553           let pattern_aux =
554              List.fold_right
555                (fun e p -> 
556                   let dec  = 
557                     (match e with 
558                        `Declaration h 
559                      | `Hypothesis h -> 
560                          let name = 
561                            (match h.Con.dec_name with
562                               None -> "NO NAME???"
563                            | Some n ->n) in
564                          [P.Mspace([None,"width","0.1cm"]);
565                           P.Mi ([],name);
566                           P.Mtext([],":");
567                           (term2pres h.Con.dec_type)]
568                      | _ -> [P.Mtext ([],"???")]) in
569                   dec@p) args [] in
570           let pattern = 
571             P.Mtr ([],[P.Mtd ([],P.Mrow([],
572                P.Mtext([],"Case")::P.Mspace([None,"width","0.1cm"])::name::pattern_aux@
573                 [P.Mspace([None,"width","0.1cm"]);
574                  P.Mtext([],"->")]))]) in
575           let subconcl = 
576             (match p.Con.proof_conclude.Con.conclude_conclusion with
577                None -> P.Mtext([],"No conclusion!!!") 
578              | Some t -> term2pres t) in
579           let asubconcl =
580              P.Mtr([],[P.Mtd([],
581               P.indented (make_concl "the thesis becomes" subconcl))]) in
582           let induction_hypothesis = 
583             (match indhyps with
584               [] -> []
585             | _ -> 
586                let text =
587                  P.Mtr([],[P.Mtd([], P.indented 
588                  (P.Mtext([],"by induction hypothesis we know:")))]) in
589                let make_hyp =
590                  function 
591                    `Hypothesis h ->
592                      let name = 
593                        (match h.Con.dec_name with
594                           None -> "no name"
595                         | Some s -> s) in
596                      P.indented (P.Mrow ([],
597                        [P.Mo([],"(");
598                         P.Mi ([],name);
599                         P.Mo([],")");
600                         P.Mspace([None,"width","0.1cm"]);
601                         term2pres h.Con.dec_type]))
602                    | _ -> assert false in
603                let hyps = 
604                  List.map 
605                    (function ce -> P.Mtr ([], [P.Mtd ([], make_hyp ce)])) 
606                     indhyps in
607                text::hyps) in          
608           (* let acontext = 
609                acontext2pres_old p.Con.proof_apply_context true in *)
610           let body = conclude2pres p.Con.proof_conclude true false in
611           let presacontext = 
612            let acontext_id =
613             match p.Con.proof_apply_context with
614                [] -> p.Con.proof_conclude.Con.conclude_id
615              | {Con.proof_id = id}::_ -> id
616            in
617             P.Maction([None,"actiontype","toggle" ; None,"selection","1"],
618               [P.indented
619                (P.Mtext
620                  ([None,"mathcolor","Red" ;
621                    Some "helm", "xref", acontext_id],"Proof")) ;
622                acontext2pres p.Con.proof_apply_context body true]) in
623           P.Mtable ([None,"align","baseline 1"; None,"equalrows","false";
624              None,"columnalign","left"],
625              pattern::asubconcl::induction_hypothesis@
626               [P.Mtr([],[P.Mtd([],presacontext)])])
627        | _ -> assert false 
628
629      and falseind conclude =
630        let module P = Mpresentation in
631        let module Con = Content in
632        let proof_conclusion = 
633          (match conclude.Con.conclude_conclusion with
634             None -> P.Mtext([],"No conclusion???")
635           | Some t -> term2pres t) in
636        let case_arg = 
637          (match conclude.Con.conclude_args with
638              [Con.Aux(n);_;case_arg] -> case_arg
639            | _ -> assert false;
640              (* 
641              List.map (ContentPp.parg 0) conclude.Con.conclude_args;
642              assert false *)) in
643        let arg = 
644          (match case_arg with
645              Con.Aux n -> assert false
646            | Con.Premise prem ->
647               (match prem.Con.premise_binder with
648                  None -> [P.Mtext([],"Contradiction, hence")]
649                | Some n -> 
650                   [P.Mi([],n);P.smallskip;P.Mtext([],"is contradictory, hence")])
651            | Con.Lemma lemma -> 
652                [P.Mi([],lemma.Con.lemma_name);P.smallskip;P.Mtext([],"is contradictory, hence")]
653            | _ -> assert false) in
654             (* let body = proof2pres {proof with Con.proof_context = tl} in *)
655        make_row arg proof_conclusion
656
657      and andind conclude =
658        let module P = Mpresentation in
659        let module Con = Content in
660        let proof_conclusion = 
661          (match conclude.Con.conclude_conclusion with
662             None -> P.Mtext([],"No conclusion???")
663           | Some t -> term2pres t) in
664        let proof,case_arg = 
665          (match conclude.Con.conclude_args with
666              [Con.Aux(n);_;Con.ArgProof proof;case_arg] -> proof,case_arg
667            | _ -> assert false;
668              (* 
669              List.map (ContentPp.parg 0) conclude.Con.conclude_args;
670              assert false *)) in
671        let arg = 
672          (match case_arg with
673              Con.Aux n -> assert false
674            | Con.Premise prem ->
675               (match prem.Con.premise_binder with
676                  None -> []
677                | Some n -> [P.Mtext([],"by");P.smallskip;P.Mi([],n)])
678            | Con.Lemma lemma -> 
679                [P.Mtext([],"by");P.smallskip;P.Mi([],lemma.Con.lemma_name)]
680            | _ -> assert false) in
681        match proof.Con.proof_context with
682          `Hypothesis hyp1::`Hypothesis hyp2::tl ->
683             let get_name hyp =
684               (match hyp.Con.dec_name with
685                 None -> "_"
686               | Some s -> s) in
687             let preshyp1 = 
688               P.Mrow ([],
689                [P.Mtext([],"(");
690                 P.Mi([],get_name hyp1);
691                 P.Mtext([],")");
692                 P.smallskip;
693                 term2pres hyp1.Con.dec_type]) in
694             let preshyp2 = 
695               P.Mrow ([],
696                [P.Mtext([],"(");
697                 P.Mi([],get_name hyp2);
698                 P.Mtext([],")");
699                 P.smallskip;
700                 term2pres hyp2.Con.dec_type]) in
701             (* let body = proof2pres {proof with Con.proof_context = tl} in *)
702             let body = conclude2pres proof.Con.proof_conclude false true in
703             let presacontext = 
704               acontext2pres proof.Con.proof_apply_context body false in
705             P.Mtable 
706               ([None,"align","baseline 1"; None,"equalrows","false"; 
707                 None,"columnalign","left"],
708                [P.Mtr ([],[P.Mtd ([],
709                  P.Mrow([],arg@[P.smallskip;P.Mtext([],"we have")]))]);
710                 P.Mtr ([],[P.Mtd ([],preshyp1)]);
711                 P.Mtr ([],[P.Mtd ([],P.Mtext([],"and"))]);
712                 P.Mtr ([],[P.Mtd ([],preshyp2)]);
713                 P.Mtr ([],[P.Mtd ([],presacontext)])]);
714          | _ -> assert false
715
716      and exists conclude =
717        let module P = Mpresentation in
718        let module Con = Content in
719        let proof_conclusion = 
720          (match conclude.Con.conclude_conclusion with
721             None -> P.Mtext([],"No conclusion???")
722           | Some t -> term2pres t) in
723        let proof = 
724          (match conclude.Con.conclude_args with
725              [Con.Aux(n);_;Con.ArgProof proof;_] -> proof
726            | _ -> assert false;
727              (* 
728              List.map (ContentPp.parg 0) conclude.Con.conclude_args;
729              assert false *)) in
730        match proof.Con.proof_context with
731            `Declaration decl::`Hypothesis hyp::tl
732          | `Hypothesis decl::`Hypothesis hyp::tl ->
733            let get_name decl =
734              (match decl.Con.dec_name with
735                 None -> "_"
736               | Some s -> s) in
737            let presdecl = 
738              P.Mrow ([],
739                [P.Mtext([None,"mathcolor","Red"],"let");
740                 P.smallskip;
741                 P.Mi([],get_name decl);
742                 P.Mtext([],":"); term2pres decl.Con.dec_type]) in
743            let suchthat =
744              P.Mrow ([],
745                [P.Mtext([None,"mathcolor","Red"],"such that");
746                 P.smallskip;
747                 P.Mtext([],"(");
748                 P.Mi([],get_name hyp);
749                 P.Mtext([],")");
750                 P.smallskip;
751                 term2pres hyp.Con.dec_type]) in
752             (* let body = proof2pres {proof with Con.proof_context = tl} in *)
753             let body = conclude2pres proof.Con.proof_conclude false true in
754             let presacontext = 
755               acontext2pres proof.Con.proof_apply_context body false in
756             P.Mtable 
757               ([None,"align","baseline 1"; None,"equalrows","false"; 
758                 None,"columnalign","left"],
759                [P.Mtr ([],[P.Mtd ([],presdecl)]);
760                 P.Mtr ([],[P.Mtd ([],suchthat)]);
761                 P.Mtr ([],[P.Mtd ([],presacontext)])]);
762          | _ -> assert false in
763
764 proof2pres p
765 ;;
766
767 exception ToDo;;
768
769 let content2pres term2pres (id,params,metasenv,obj) =
770  let module K = Content in
771  let module P = Mpresentation in
772   match obj with
773      `Def (K.Const,thesis,`Proof p) ->
774        P.Mtable
775         [None,"align","baseline 1";
776          None,"equalrows","false";
777          None,"columnalign","left";
778          None,"helm:xref","id"]
779         ([P.Mtr []
780            [P.Mtd []
781             (P.Mrow []
782              [P.Mtext []
783                ("UNFINISHED PROOF" ^ id ^"(" ^
784                  String.concat " ; " (List.map UriManager.string_of_uri params)^
785                 ")")])] ;
786          P.Mtr []
787           [P.Mtd []
788             (P.Mrow []
789               [P.Mtext [] "THESIS:"])] ;
790          P.Mtr []
791           [P.Mtd []
792             (P.Mrow []
793               [P.Mphantom []
794                 (P.Mtext [] "__") ;
795               term2pres thesis])]] @
796          (match metasenv with
797              None -> []
798            | Some metasenv' ->
799               [P.Mtr []
800                 [P.Mtd []
801                   (* Conjectures are in their own table to make *)
802                   (* diffing the DOM trees easier.              *)
803                   (P.Mtable
804                     [None,"align","baseline 1";
805                      None,"equalrows","false";
806                      None,"columnalign","left"]
807                    ((P.Mtr []
808                       [P.Mtd []
809                        (P.Mrow []
810                          [P.Mtext [] "CONJECTURES:"])])::
811                     List.map
812                      (function
813                        (id,n,context,ty) ->
814                          P.Mtr []
815                           [P.Mtd []
816                            (P.Mrow [Some "helm", "xref", id]
817                              (List.map
818                                (function
819                                    None ->
820                                      P.Mrow []
821                                       [ P.Mi [] "_" ;
822                                         P.Mo [] ":?" ;
823                                         P.Mi [] "_"]
824                                  | Some (`Declaration d)
825                                  | Some (`Hypothesis d) ->
826                                     let
827                                      { K.dec_name = dec_name ;
828                                        K.dec_type = ty } = d
829                                      in
830                                       P.Mrow []
831                                        [ P.Mi []
832                                           (match dec_name with
833                                               None -> "_"
834                                             | Some n -> n) ;
835                                          P.Mo [] ":" ;
836                                          term2pres ty]
837                                  | Some (`Definition d) ->
838                                     let
839                                      { K.def_name = def_name ;
840                                        K.def_term = bo } = d
841                                      in
842                                       P.Mrow []
843                                        [ P.Mi []
844                                           (match def_name with
845                                               None -> "_"
846                                             | Some n -> n) ;
847                                          P.Mo [] ":=" ;
848                                          term2pres bo]
849                                  | Some (`Proof p) ->
850                                     let proof_name = p.K.proof_name in
851                                      P.Mrow []
852                                       [ P.Mi []
853                                          (match proof_name with
854                                              None -> "_"
855                                            | Some n -> n) ;
856                                         P.Mo [] ":=" ;
857                                         proof2pres term2pres p]
858                                ) (List.rev context) @
859                              [ P.Mo [] "|-" ] @
860                              [ P.Mi [] (string_of_int n) ;
861                                P.Mo [] ":" ;
862                                term2pres ty ]
863                            ))
864                           ]
865                      ) metasenv'
866                   ))]]
867          )  @
868         [P.Mtr []
869           [P.Mtd []
870             (P.Mrow []
871               [proof2pres term2pres p])]])
872    | _ -> raise ToDo
873 ;;
874
875 let content2pres ~ids_to_inner_sorts =
876  content2pres 
877   (function p -> 
878    (Cexpr2pres.cexpr2pres_charcount 
879     (Content_expressions.acic2cexpr ids_to_inner_sorts p)))
880 ;;