(* ||M|| This file is part of HELM, an Hypertextual, Electronic ||A|| Library of Mathematics, developed at the Computer Science ||T|| Department, University of Bologna, Italy. ||I|| ||T|| HELM is free software; you can redistribute it and/or ||A|| modify it under the terms of the GNU General Public License \ / version 2 or (at your option) any later version. \ / This software is distributed as is, NO WARRANTY. V_______________________________________________________________ *) module U = NUri module N = Layer type uri = U.uri type id = string (* identifier *) type name = id * bool (* token, real? *) type arity = int * int (* sort, degree *) type meta = Main (* main object *) | InProp (* inhabitant of a proposition *) | Progress (* uncompleted object *) | Private (* private global definition *) type node_attrs = { n_apix: int; (* additional position index *) } type appl_attrs = { a_rest: bool; (* restricted application? *) a_main: arity; (* main arity *) a_side: arity; (* side arity *) } type bind_attrs = { b_name: name option; (* name *) b_main: arity; (* main arity *) b_side: arity; (* side arity *) } type root_attrs = { r_meta: meta list; (* metaliguistic classification *) r_info: (string * string) option; (* metaliguistic annotation: language (defaults to "en-US"), text *) } type env_attrs = { e_side: arity; (* arity *) } type 'term bind = Abst of env_attrs * 'term (* declaration: attrs, domain *) | Abbr of env_attrs * 'term (* definition: attrs, body *) | Void (* exclusion *) type 'term entity = root_attrs * node_attrs * uri * 'term bind (* attrs, uri, binder *) (* helpers ******************************************************************) let node_attrs ?(apix=0) () = { n_apix = apix; } let appl_attrs ?(main=(0,0)) ?(side=(0,0)) rest = { a_rest = rest; a_main = main; a_side = side; } let bind_attrs ?name ?(main=(0,0)) ?(side=(0,0)) () = { b_name = name; b_main = main; b_side = side; } let root_attrs ?(meta=[]) ?info () = { r_meta = meta; r_info = info; } let env_attrs ?(side=(0,0)) () = { e_side = side; } let empty_node = node_attrs () let empty_bind = bind_attrs () let empty_root = root_attrs () let empty_env = env_attrs () let abst a t = Abst (a, t) let abbr a t = Abbr (a, t) let common f (ra, na, u, _) = f ra na u let succ (sort, degr) = sort, succ degr let compose av yt = {av with b_main = yt} let rec name err f a = match a.b_name with | Some (n, r) -> f n r | None -> err () let rec info err f a = match a.r_info with | Some (lg, tx) -> f lg tx | None -> err () let xlate f xlate_term = function | ra, na, uri, Abst (a, t) -> let f t = f (ra, na, uri, abst a t) in xlate_term f t | ra, na, uri, Abbr (a, t) -> let f t = f (ra, na, uri, abbr a t) in xlate_term f t | _, _, _, Void -> assert false