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 (**************************************************************************)
37 let symbol_table = Hashtbl.create 503;;
38 let symbol_table_charcount = Hashtbl.create 503;;
42 let rec countvar current_size = function
43 (Cic.Anonymous, None) -> current_size + 1 (* underscore *)
44 | (Cic.Anonymous, Some ty) -> countterm current_size ty
45 | (Cic.Name s, None) -> current_size + String.length s
46 | (Cic.Name s, Some ty) -> current_size + countterm current_size ty
48 and countterm current_size t =
49 if current_size > maxsize then current_size
51 A.AttributedTerm (_,t) -> countterm current_size t
53 List.fold_left countterm current_size l
54 | A.Binder (_,var,body) ->
55 let varsize = countvar current_size var in
56 countterm (varsize + 1) body (* binder *)
57 | A.Case (arg, _, ty, pl) ->
58 let size1 = countterm (current_size+10) arg in (* match with *)
62 | Some ty -> countterm size1 ty in
64 (fun c ((constr,vars),action) ->
66 List.fold_left countvar (c+String.length constr) vars in
67 countterm size3 action) size2 pl
68 | A.LetIn (var,s,t) ->
69 let size1 = countvar current_size var in
70 let size2 = countterm size1 s in
76 let size1 = countvar c var in
77 countterm size1 s) current_size l in
81 (fun c (v,t) -> countterm (c + (String.length v)) t)
82 (current_size + (String.length s)) l
83 | A.Implicit -> current_size + 1 (* underscore *)
88 None -> c + 1 (* underscore *)
89 | Some t -> countterm c t)
90 (current_size + 1) l (* num *)
91 | A.Num (s, _) -> current_size + String.length s
92 | A.Sort _ -> current_size + 4 (* sort name *)
93 | A.Symbol (s,_) -> current_size + String.length s
97 ((countterm 0 t) > maxsize)
103 (Some "helm","loc",(string_of_int n)^" "^(string_of_int m))
105 (Some "helm","xref",s)
108 let map_attributes = List.map map_attribute
110 let resolve_binder = function
111 `Lambda -> Box.Text([],"\\lambda")
112 | `Pi -> Box.Text([],"\\Pi")
113 | `Exists -> Box.Text([],"\\exists")
114 | `Forall -> Box.Text([],"\\forall")
116 let rec ast2box ?(priority = 0) ?(assoc = false) ?(attr = []) t =
118 bigast2box ~priority ~assoc ~attr t
119 else Box.Object (map_attributes attr, t)
120 and bigast2box ?(priority = 0) ?(assoc = false) ?(attr = []) =
122 A.AttributedTerm (attr1, t) ->
123 (* attr should be empty, since AtrtributedTerm are not
124 supposed to be directly nested *)
125 bigast2box ~priority ~assoc ~attr:(attr1::~attr) t
128 (map_attributes attr,
130 Box.V([],List.map ast2box l);
132 | A.Binder (`Forall, (Cic.Anonymous, typ), body)
133 | A.Binder (`Pi, (Cic.Anonymous, typ), body) ->
134 Box.V(map_attributes attr,
135 [Box.H([],[(match typ with
136 | None -> Box.Text([], "?")
137 | Some typ -> ast2box typ);
139 Box.Text([], "\\to")]);
140 Box.indent(ast2box body)])
141 | A.Binder(kind, var, body) ->
142 Box.V(map_attributes attr,
143 [Box.H([],[resolve_binder kind;
147 Box.indent (ast2box body)])
148 | A.Case(arg, _, ty, pl) ->
149 let make_rule sep ((constr,vars),rhs) =
151 Box.V([],[Box.H([],[Box.Text([],sep);
153 make_pattern constr vars;
156 Box.indent (bigast2box rhs)])
158 Box.H([],[Box.Text([],sep);
160 make_pattern constr vars;
164 Box.Object([],rhs)]) in
165 let plbox = match pl with
166 [] -> Box.Text([],"[]")
170 (make_rule "[" r)::(List.map (make_rule "|") tl));
171 Box.Text([],"]")]) in
175 [ Box.H([],[Box.Text([],"[");
181 Box.V(map_attributes attr,
183 [Box.Text([],"match");
187 Box.Text([],"with")]);
190 Box.V(map_attributes attr,
192 [Box.H(map_attributes attr,
193 [Box.Text([],"match");
197 Box.Text([],"with")]);
199 | A.LetIn (var, s, t) ->
200 Box.V(map_attributes attr,
201 (make_def "let" var s "in")@[ast2box t])
202 | A.LetRec (_, vars, body) ->
204 let rec make_defs let_txt = function
207 make_def let_txt var s "in"
209 (make_def let_txt var s "")@(make_defs "and" tl) in
210 make_defs "let rec" vars in
211 Box.V(map_attributes attr,
212 definitions@[ast2box body])
213 | A.Ident (s, subst) ->
215 let rec make_substs start_txt =
219 make_subst start_txt s t "]"
221 (make_subst start_txt s t ";")@(make_substs " " tl) in
222 make_substs "[" subst in
223 Box.V([], (* attr here or on Vbox? *)
224 [Box.Text(map_attributes attr,s);
225 Box.indent(Box.V([],subst))])
227 Box.Text([],"_") (* big? *)
232 Box.H([],[aux_option t; Box.Text([],";")]))
234 Box.V(map_attributes attr,
235 [Box.Text([],"?"^(string_of_int n));
236 Box.H([],[Box.Text([],"[");
237 Box.V([],local_context);
243 `Prop -> Box.Text([],"Prop")
244 | `Set -> Box.Text([],"Set")
245 | `Type -> Box.Text([],"Type")
246 | `CProp -> Box.Text([],"CProp"))
250 and aux_option = function
251 None -> Box.Text([],"_")
252 | Some ast -> ast2box ast
254 and make_var = function
255 (Cic.Anonymous, None) -> Box.Text([],"_:_")
256 | (Cic.Anonymous, Some t) ->
257 Box.H([],[Box.Text([],"_:");ast2box t])
258 | (Cic.Name s, None) -> Box.Text([],s)
259 | (Cic.Name s, Some t) ->
261 Box.V([],[Box.Text([],s^":");
262 Box.indent(bigast2box t)])
264 Box.H([],[Box.Text([],s^":");Box.Object([],t)])
266 and make_pattern constr =
268 [] -> Box.Text([],constr)
275 (* ignoring the type *)
276 (Cic.Anonymous, _) -> Box.Text([],"_")
277 | (Cic.Name s, _) -> Box.Text([],s) in
278 Box.Text([]," ")::bv::acc) vars [Box.Text([],")")] in
279 Box.H([],Box.Text([],"(")::Box.Text([],constr)::bvars)
282 and make_def let_txt var def end_txt =
285 (* ignoring the type *)
286 (Cic.Anonymous, _) -> Box.Text([],"_")
287 | (Cic.Name s, _) -> Box.Text([],s)) in
289 [Box.Text([],let_txt);
296 [Box.smallskip;Box.Text([],end_txt)]
298 and make_subst start_txt varname body end_txt =
300 [Box.Text([],start_txt);
301 Box.Text([],varname);
306 [Box.Text([],end_txt)]
308 and pretty_append l ast tail =
309 prerr_endline("pretty riceve: " ^ (CicAstPp.pp_term ast));
312 Box.H([],Box.skip::(bigast2box ast)::tail)]
314 [Box.H([],l@(Box.smallskip::(ast2box ast)::tail))]