1 (* Copyright (C) 2000, HELM Team.
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.
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.
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.
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,
22 * For details, see the HELM World-Wide-Web page,
23 * http://cs.unibo.it/helm/.
26 (***************************************************************************)
30 (* Andrea Asperti <asperti@cs.unibo.it> *)
33 (***************************************************************************)
35 module P = Mpresentation
38 let p_mtr a b = Mpresentation.Mtr(a,b)
39 let p_mtd a b = Mpresentation.Mtd(a,b)
40 let p_mtable a b = Mpresentation.Mtable(a,b)
41 let p_mtext a b = Mpresentation.Mtext(a,b)
42 let p_mi a b = Mpresentation.Mi(a,b)
43 let p_mo a b = Mpresentation.Mo(a,b)
44 let p_mrow a b = Mpresentation.Mrow(a,b)
45 let p_mphantom a b = Mpresentation.Mphantom(a,b)
50 split (n-1) (List.tl l) in
55 let is_big_general countterm p =
56 let maxsize = Ast2pres.maxsize in
57 let module Con = Content in
58 let rec countp current_size p =
59 if current_size > maxsize then current_size
61 let c1 = (countcontext current_size p.Con.proof_context) in
62 if c1 > maxsize then c1
64 let c2 = (countapplycontext c1 p.Con.proof_apply_context) in
65 if c2 > maxsize then c2
67 countconclude c2 p.Con.proof_conclude
70 countcontext current_size c =
71 List.fold_left countcontextitem current_size c
73 countcontextitem current_size e =
74 if current_size > maxsize then maxsize
78 (match d.Con.dec_name with
79 Some s -> current_size + 4 + (String.length s)
80 | None -> prerr_endline "NO NAME!!"; assert false)
82 (match h.Con.dec_name with
83 Some s -> current_size + 4 + (String.length s)
84 | None -> prerr_endline "NO NAME!!"; assert false)
85 | `Proof p -> countp current_size p
87 (match d.Con.def_name with
89 let c1 = (current_size + 4 + (String.length s)) in
90 (countterm c1 d.Con.def_term)
92 prerr_endline "NO NAME!!"; assert false)
93 | `Joint ho -> maxsize + 1) (* we assume is big *)
95 countapplycontext current_size ac =
96 List.fold_left countp current_size ac
98 countconclude current_size co =
99 if current_size > maxsize then current_size
101 let c1 = countargs current_size co.Con.conclude_args in
102 if c1 > maxsize then c1
104 (match co.Con.conclude_conclusion with
105 Some concl -> countterm c1 concl
108 countargs current_size args =
109 List.fold_left countarg current_size args
111 countarg current_size arg =
112 if current_size > maxsize then current_size
115 Con.Aux _ -> current_size
116 | Con.Premise prem ->
117 (match prem.Con.premise_binder with
118 Some s -> current_size + (String.length s)
119 | None -> current_size + 7)
121 current_size + (String.length lemma.Con.lemma_name)
122 | Con.Term t -> countterm current_size t
123 | Con.ArgProof p -> countp current_size p
124 | Con.ArgMethod s -> (maxsize + 1)) in
125 let size = (countp 0 p) in
129 let is_big = is_big_general (Ast2pres.countterm)
133 let module Con = Content in
136 | `Hypothesis d -> d.Con.dec_id
137 | `Proof p -> p.Con.proof_id
138 | `Definition d -> d.Con.def_id
139 | `Joint jo -> jo.Con.joint_id
142 let make_row ?(attrs=[]) items concl =
145 B.b_v attrs [B.b_h [] items; B.b_indent concl]
147 B.b_h attrs (items@[B.b_space; concl])
150 let make_concl ?(attrs=[]) verb concl =
153 B.b_v attrs [ B.b_kw verb; B.b_indent concl]
155 B.b_h attrs [ B.b_kw verb; B.b_space; concl ]
158 let make_args_for_apply term2pres args =
159 let module Con = Content in
160 let make_arg_for_apply is_first arg row =
163 Con.Aux n -> assert false
164 | Con.Premise prem ->
166 (match prem.Con.premise_binder with
169 (B.b_object (P.Mi ([], name)))::row
171 (B.b_object (P.Mi([],lemma.Con.lemma_name)))::row
175 else (B.b_object (P.Mi([],"_")))::row
178 (B.b_object (P.Mi([],"_")))::row
180 if is_first then res else B.skip::res
184 make_arg_for_apply true hd
185 (List.fold_right (make_arg_for_apply false) tl [])
189 let get_name = function
193 let rec justification term2pres p =
194 let module Con = Content in
195 let module P = Mpresentation in
196 if ((p.Con.proof_conclude.Con.conclude_method = "Exact") or
197 ((p.Con.proof_context = []) &
198 (p.Con.proof_apply_context = []) &
199 (p.Con.proof_conclude.Con.conclude_method = "Apply"))) then
201 make_args_for_apply term2pres p.Con.proof_conclude.Con.conclude_args in
203 (B.b_kw "by")::B.b_space::
204 B.Text([],"(")::pres_args@[B.Text([],")")])
205 else proof2pres term2pres p
207 and proof2pres term2pres p =
208 let rec proof2pres p =
209 let module Con = Content in
214 | `Hypothesis _ -> true
216 ((List.filter is_decl p.Con.proof_context) != []) in
217 let omit_conclusion = (not indent) && (p.Con.proof_context != []) in
219 (match p.Con.proof_conclude.Con.conclude_conclusion with
221 | Some t -> Some (term2pres t)) in
224 conclude2pres p.Con.proof_conclude indent omit_conclusion in
226 acontext2pres p.Con.proof_apply_context presconclude indent in
227 context2pres p.Con.proof_context presacontext in
228 match p.Con.proof_name with
236 ([None,"type","toggle"],
237 [(make_concl ~attrs:[Some "helm", "xref", p.Con.proof_id]
238 "proof of" ac); body])
241 [B.Text ([],"(" ^ name ^ ")");
244 and context2pres c continuation =
245 (* we generate a subtable for each context element, for selection
247 The table generated by the head-element does not have an xref;
248 the whole context-proof is already selectable *)
254 (fun ce continuation ->
255 let xref = get_xref ce in
256 B.V([Some "helm", "xref", xref ],
257 [B.H([Some "helm", "xref", "ce_"^xref],
258 [ce2pres_in_proof_context_element ce]);
259 continuation])) tl continuation in
260 let hd_xref= get_xref hd in
262 [B.H([Some "helm", "xref", "ce_"^hd_xref],
263 [ce2pres_in_proof_context_element hd]);
266 and ce2pres_in_joint_context_element = function
267 | `Inductive _ -> assert false (* TODO *)
268 | (`Declaration _) as x -> ce2pres x
269 | (`Hypothesis _) as x -> ce2pres x
270 | (`Proof _) as x -> ce2pres x
271 | (`Definition _) as x -> ce2pres x
273 and ce2pres_in_proof_context_element = function
275 B.H ([],(List.map ce2pres_in_joint_context_element ho.Content.joint_defs))
276 | (`Declaration _) as x -> ce2pres x
277 | (`Hypothesis _) as x -> ce2pres x
278 | (`Proof _) as x -> ce2pres x
279 | (`Definition _) as x -> ce2pres x
282 let module Con = Content in
285 (match d.Con.dec_name with
287 let ty = term2pres d.Con.dec_type in
291 B.Object ([], P.Mi([],s));
295 prerr_endline "NO NAME!!"; assert false)
297 (match h.Con.dec_name with
299 let ty = term2pres h.Con.dec_type in
304 B.Object ([], P.Mi ([],s));
309 prerr_endline "NO NAME!!"; assert false)
313 (match d.Con.def_name with
315 let term = term2pres d.Con.def_term in
318 B.Object ([], P.Mi([],s));
322 prerr_endline "NO NAME!!"; assert false)
324 and acontext2pres ac continuation indent =
325 let module Con = Content in
327 (fun p continuation ->
330 B.indent (proof2pres p)
333 B.V([Some "helm","xref",p.Con.proof_id],
334 [B.H([Some "helm","xref","ace_"^p.Con.proof_id],[hd]);
335 continuation])) ac continuation
337 and conclude2pres conclude indent omit_conclusion =
338 let module Con = Content in
339 let module P = Mpresentation in
341 match conclude.Con.conclude_conclusion with
343 not omit_conclusion or
344 (* CSC: I ignore the omit_conclusion flag in this case. *)
345 (* CSC: Is this the correct behaviour? In the stylesheets *)
346 (* CSC: we simply generated nothing (i.e. the output type *)
347 (* CSC: of the function should become an option. *)
348 conclude.Con.conclude_method = "BU_Conversion" ->
349 let concl = (term2pres t) in
350 if conclude.Con.conclude_method = "BU_Conversion" then
351 make_concl "that is equivalent to" concl
352 else if conclude.Con.conclude_method = "FalseInd" then
353 (* false ind is in charge to add the conclusion *)
356 let conclude_body = conclude_aux conclude in
358 if conclude.Con.conclude_method = "TD_Conversion" then
359 make_concl "that is equivalent to" concl
360 else make_concl "we conclude" concl in
361 B.V ([], [conclude_body; ann_concl])
362 | _ -> conclude_aux conclude in
364 B.indent (B.H ([Some "helm", "xref", conclude.Con.conclude_id],
367 B.H ([Some "helm", "xref", conclude.Con.conclude_id],[tconclude_body])
370 and conclude_aux conclude =
371 let module Con = Content in
372 let module P = Mpresentation in
373 if conclude.Con.conclude_method = "TD_Conversion" then
375 (match conclude.Con.conclude_conclusion with
376 None -> B.Text([],"NO EXPECTED!!!")
377 | Some c -> term2pres c) in
379 (match conclude.Con.conclude_args with
380 [Con.ArgProof p] -> p
381 | _ -> assert false) in
383 (match subproof.Con.proof_conclude.Con.conclude_conclusion with
384 None -> B.Text([],"NO SYNTH!!!")
385 | Some c -> (term2pres c)) in
388 [make_concl "we must prove" expected;
389 make_concl "or equivalently" synth;
390 proof2pres subproof])
391 else if conclude.Con.conclude_method = "BU_Conversion" then
393 else if conclude.Con.conclude_method = "Exact" then
395 (match conclude.Con.conclude_args with
396 [Con.Term t] -> term2pres t
398 (match p.Con.premise_binder with
399 | None -> assert false; (* unnamed hypothesis ??? *)
400 | Some s -> B.Text([],s))
401 | err -> assert false) in
402 (match conclude.Con.conclude_conclusion with
404 B.b_h [] [B.b_kw "Consider"; B.b_space; arg]
405 | Some c -> let conclusion = term2pres c in
407 [arg; B.b_space; B.Text([],"proves")]
410 else if conclude.Con.conclude_method = "Intros+LetTac" then
411 (match conclude.Con.conclude_args with
412 [Con.ArgProof p] -> proof2pres p
416 (match conclude.Con.conclude_conclusion with
417 None -> B.Text([],"NO Conclusion!!!")
418 | Some c -> term2pres c) in
419 (match conclude.Con.conclude_args with
422 ([None,"align","baseline 1"; None,"equalrows","false";
423 None,"columnalign","left"],
424 [B.H([],[B.Object([],proof2pres p)]);
426 (make_concl "we proved 1" conclusion))])]);
429 else if (conclude.Con.conclude_method = "Case") then
431 else if (conclude.Con.conclude_method = "ByInduction") then
433 else if (conclude.Con.conclude_method = "Exists") then
435 else if (conclude.Con.conclude_method = "AndInd") then
437 else if (conclude.Con.conclude_method = "FalseInd") then
439 else if (conclude.Con.conclude_method = "Rewrite") then
441 (match (List.nth conclude.Con.conclude_args 6) with
442 Con.ArgProof p -> justification term2pres p
443 | _ -> assert false) in
445 (match List.nth conclude.Con.conclude_args 2 with
446 Con.Term t -> term2pres t
447 | _ -> assert false) in
449 (match List.nth conclude.Con.conclude_args 5 with
450 Con.Term t -> term2pres t
451 | _ -> assert false) in
456 B.b_space; (B.b_kw "with");
459 else if conclude.Con.conclude_method = "Apply" then
461 make_args_for_apply term2pres conclude.Con.conclude_args in
465 B.Text([],"(")::pres_args@[B.Text([],")")])
469 [B.Text([],"Apply method" ^ conclude.Con.conclude_method ^ " to");
473 args2pres conclude.Con.conclude_args)))])
475 and args2pres l = List.map arg2pres l
478 let module Con = Content in
481 B.Text ([],"aux " ^ n)
482 | Con.Premise prem ->
483 B.Text ([],"premise")
494 let module Con = Content in
495 let proof_conclusion =
496 (match conclude.Con.conclude_conclusion with
497 None -> B.Text([],"No conclusion???")
498 | Some t -> term2pres t) in
499 let arg,args_for_cases =
500 (match conclude.Con.conclude_args with
501 Con.Aux(_)::Con.Aux(_)::Con.Term(_)::arg::tl ->
503 | _ -> assert false) in
508 B.Text ([],"an aux???")
509 | Con.Premise prem ->
510 (match prem.Con.premise_binder with
511 None -> B.Text ([],"the previous result")
512 | Some n -> B.Object ([], P.Mi([],n)))
513 | Con.Lemma lemma -> B.Object ([], P.Mi([],lemma.Con.lemma_name))
517 B.Text ([],"a proof???")
519 B.Text ([],"a method???")) in
520 (make_concl "we proceed by cases on" case_arg) in
522 (make_concl "to prove" proof_conclusion) in
525 case_on::to_prove::(make_cases args_for_cases))
527 and byinduction conclude =
528 let module Con = Content in
529 let proof_conclusion =
530 (match conclude.Con.conclude_conclusion with
531 None -> B.Text([],"No conclusion???")
532 | Some t -> term2pres t) in
533 let inductive_arg,args_for_cases =
534 (match conclude.Con.conclude_args with
536 let l1,l2 = split (int_of_string n) tl in
537 let last_pos = (List.length l2)-1 in
538 List.nth l2 last_pos,l1
539 | _ -> assert false) in
542 (match inductive_arg with
544 B.Text ([],"an aux???")
545 | Con.Premise prem ->
546 (match prem.Con.premise_binder with
547 None -> B.Text ([],"the previous result")
548 | Some n -> B.Object ([], P.Mi([],n)))
549 | Con.Lemma lemma -> B.Object ([], P.Mi([],lemma.Con.lemma_name))
553 B.Text ([],"a proof???")
555 B.Text ([],"a method???")) in
556 (make_concl "we proceed by induction on" arg) in
558 (make_concl "to prove" proof_conclusion) in
561 induction_on::to_prove::
562 (make_cases args_for_cases))
564 and make_cases l = List.map make_case l
567 let module Con = Content in
571 (match p.Con.proof_name with
572 None -> B.Text([],"no name for case!!")
573 | Some n -> B.Object ([], P.Mi([],n))) in
577 `Hypothesis h -> h.Con.dec_inductive
578 | _ -> false) p.Con.proof_context in
587 (match h.Con.dec_name with
591 B.Object ([], P.Mi ([],name));
593 (term2pres h.Con.dec_type)]
594 | _ -> [B.Text ([],"???")]) in
598 (B.Text([],"Case")::B.b_space::name::pattern_aux)@
602 (match p.Con.proof_conclude.Con.conclude_conclusion with
603 None -> B.Text([],"No conclusion!!!")
604 | Some t -> term2pres t) in
605 let asubconcl = B.indent (make_concl "the thesis becomes" subconcl) in
606 let induction_hypothesis =
611 B.indent (B.Text([],"by induction hypothesis we know:")) in
616 (match h.Con.dec_name with
621 B.Object ([], P.Mi ([],name));
624 term2pres h.Con.dec_type]))
625 | _ -> assert false in
626 let hyps = List.map make_hyp indhyps in
629 acontext2pres_old p.Con.proof_apply_context true in *)
630 let body = conclude2pres p.Con.proof_conclude true false in
633 match p.Con.proof_apply_context with
634 [] -> p.Con.proof_conclude.Con.conclude_id
635 | {Con.proof_id = id}::_ -> id
637 B.Action([None,"type","toggle"],
640 ([None,"color","red" ;
641 Some "helm", "xref", acontext_id],"Proof")) ;
642 acontext2pres p.Con.proof_apply_context body true]) in
643 B.V ([], pattern::asubconcl::induction_hypothesis@[presacontext])
646 and falseind conclude =
647 let module P = Mpresentation in
648 let module Con = Content in
649 let proof_conclusion =
650 (match conclude.Con.conclude_conclusion with
651 None -> B.Text([],"No conclusion???")
652 | Some t -> term2pres t) in
654 (match conclude.Con.conclude_args with
655 [Con.Aux(n);_;case_arg] -> case_arg
658 List.map (ContentPp.parg 0) conclude.Con.conclude_args;
662 Con.Aux n -> assert false
663 | Con.Premise prem ->
664 (match prem.Con.premise_binder with
665 None -> [B.Text([],"Contradiction, hence")]
667 [B.Object ([],P.Mi([],n)); B.skip;B.Text([],"is contradictory, hence")])
669 [B.Object ([], P.Mi([],lemma.Con.lemma_name)); B.skip; B.Text([],"is contradictory, hence")]
670 | _ -> assert false) in
671 (* let body = proof2pres {proof with Con.proof_context = tl} in *)
672 make_row arg proof_conclusion
674 and andind conclude =
675 let module P = Mpresentation in
676 let module Con = Content in
677 let proof_conclusion =
678 (match conclude.Con.conclude_conclusion with
679 None -> B.Text([],"No conclusion???")
680 | Some t -> term2pres t) in
682 (match conclude.Con.conclude_args with
683 [Con.Aux(n);_;Con.ArgProof proof;case_arg] -> proof,case_arg
686 List.map (ContentPp.parg 0) conclude.Con.conclude_args;
690 Con.Aux n -> assert false
691 | Con.Premise prem ->
692 (match prem.Con.premise_binder with
694 | Some n -> [(B.b_kw "by"); B.b_space; B.Object([], P.Mi([],n))])
696 [(B.b_kw "by");B.skip; B.Object([], P.Mi([],lemma.Con.lemma_name))]
697 | _ -> assert false) in
698 match proof.Con.proof_context with
699 `Hypothesis hyp1::`Hypothesis hyp2::tl ->
701 (match hyp.Con.dec_name with
707 B.Object ([], P.Mi([],get_name hyp1));
710 term2pres hyp1.Con.dec_type]) in
714 B.Object ([], P.Mi([],get_name hyp2));
717 term2pres hyp2.Con.dec_type]) in
718 (* let body = proof2pres {proof with Con.proof_context = tl} in *)
719 let body = conclude2pres proof.Con.proof_conclude false true in
721 acontext2pres proof.Con.proof_apply_context body false in
724 [B.H ([],arg@[B.skip; B.Text([],"we have")]);
731 and exists conclude =
732 let module P = Mpresentation in
733 let module Con = Content in
734 let proof_conclusion =
735 (match conclude.Con.conclude_conclusion with
736 None -> B.Text([],"No conclusion???")
737 | Some t -> term2pres t) in
739 (match conclude.Con.conclude_args with
740 [Con.Aux(n);_;Con.ArgProof proof;_] -> proof
743 List.map (ContentPp.parg 0) conclude.Con.conclude_args;
745 match proof.Con.proof_context with
746 `Declaration decl::`Hypothesis hyp::tl
747 | `Hypothesis decl::`Hypothesis hyp::tl ->
749 (match decl.Con.dec_name with
756 B.Object ([], P.Mi([],get_name decl));
757 B.Text([],":"); term2pres decl.Con.dec_type]) in
760 [(B.b_kw "such that");
763 B.Object ([], P.Mi([],get_name hyp));
766 term2pres hyp.Con.dec_type]) in
767 (* let body = proof2pres {proof with Con.proof_context = tl} in *)
768 let body = conclude2pres proof.Con.proof_conclude false true in
770 acontext2pres proof.Con.proof_apply_context body false in
776 | _ -> assert false in
785 let conjecture2pres term2pres (id, n, context, ty) =
786 (B.b_h [Some "helm", "xref", id]
791 [ B.b_object (p_mi [] "_") ;
792 B.b_object (p_mo [] ":?") ;
793 B.b_object (p_mi [] "_")]
794 | Some (`Declaration d)
795 | Some (`Hypothesis d) ->
796 let { Content.dec_name =
797 dec_name ; Content.dec_type = ty } = d
807 | Some (`Definition d) ->
809 { Content.def_name = def_name ;
810 Content.def_term = bo } = d
813 [ B.b_object (p_mi []
820 let proof_name = p.Content.proof_name in
822 [ B.b_object (p_mi []
823 (match proof_name with
827 proof2pres term2pres p])
828 (List.rev context)) @
830 B.b_object (p_mi [] (string_of_int n)) ;
834 let metasenv2pres term2pres = function
837 (* Conjectures are in their own table to make *)
838 (* diffing the DOM trees easier. *)
842 (let _ = incr counter; in (string_of_int !counter)))) ::
843 (List.map (conjecture2pres term2pres) metasenv'))]
845 let params2pres params =
847 B.b_text [Some "xlink", "href", UriManager.string_of_uri uri]
848 (UriManager.name_of_uri uri)
850 let rec spatiate = function
853 | hd :: tl -> hd :: B.b_text [] ", " :: spatiate tl
858 let params = spatiate (List.map param2pres p) in
860 B.b_h [] (B.b_text [] "[" :: params @ [ B.b_text [] "]" ])]
862 let recursion_kind2pres params kind =
865 | `Recursive _ -> "Recursive definition"
866 | `CoRecursive -> "CoRecursive definition"
867 | `Inductive _ -> "Inductive definition"
868 | `CoInductive _ -> "CoInductive definition"
870 B.b_h [] (B.b_text [] kind :: params2pres params)
872 let inductive2pres term2pres ind =
873 let constructor2pres decl =
875 B.b_text [] ("| " ^ get_name decl.Content.dec_name ^ ":");
877 term2pres decl.Content.dec_type
882 B.b_text [] (ind.Content.inductive_name ^ " of arity ");
883 term2pres ind.Content.inductive_type ]
884 :: List.map constructor2pres ind.Content.inductive_constructors)
886 let joint_def2pres term2pres def =
888 | `Inductive ind -> inductive2pres term2pres ind
889 | _ -> assert false (* ZACK or raise ToDo? *)
891 let content2pres term2pres (id,params,metasenv,obj) =
893 | `Def (Content.Const, thesis, `Proof p) ->
894 let name = get_name p.Content.proof_name in
896 [Some "helm","xref","id"]
897 ([ B.b_h [] (B.b_text [] ("Proof " ^ name) :: params2pres params);
898 B.b_text [] "Thesis:";
899 B.indent (term2pres thesis) ] @
900 metasenv2pres term2pres metasenv @
901 [proof2pres term2pres p])
902 | `Def (_, ty, `Definition body) ->
903 let name = get_name body.Content.def_name in
905 [Some "helm","xref","id"]
906 ([B.b_h [] (B.b_text [] ("Definition " ^ name) :: params2pres params);
908 B.indent (term2pres ty)] @
909 metasenv2pres term2pres metasenv @
910 [term2pres body.Content.def_term])
911 | `Decl (_, `Declaration decl)
912 | `Decl (_, `Hypothesis decl) ->
913 let name = get_name decl.Content.dec_name in
915 [Some "helm","xref","id"]
916 ([B.b_h [] (B.b_text [] ("Axiom " ^ name) :: params2pres params);
918 B.indent (term2pres decl.Content.dec_type)] @
919 metasenv2pres term2pres metasenv)
922 (recursion_kind2pres params joint.Content.joint_kind
923 :: List.map (joint_def2pres term2pres) joint.Content.joint_defs)
928 let content2pres ~ids_to_inner_sorts =
931 (Cexpr2pres.cexpr2pres_charcount
932 (Content_expressions.acic2cexpr ids_to_inner_sorts p)))
936 let content2pres ~ids_to_inner_sorts =
939 let (ast, ids_to_uris) as arg =
940 Acic2Ast.ast_of_acic ids_to_inner_sorts annterm
942 let astBox = Ast2pres.ast2astBox arg in
943 Box.map (fun ast -> Ast2pres.ast2mpres (ast, ids_to_uris)) astBox)