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 *)
type node_attrs = {
n_name: name option; (* name *)
n_apix: int; (* additional position index *)
- n_degr: int; (* degree *)
- n_sort: int; (* sort *)
+ n_main: arity; (* main arity *)
+ n_side: arity; (* side arity *)
}
type root_attrs = {
(* helpers ******************************************************************)
-let node_attrs ?(apix=0) ?name ?(degr=0) ?(sort=0) () = {
- n_apix = apix; n_name = name; n_degr = degr; n_sort = sort
+let node_attrs ?name ?(main=(0,0)) ?(side=(0,0)) () = {
+ n_apix = 0; n_name = name; n_main = main; n_side = side;
}
let root_attrs ?(meta=[]) ?info () = {
let common f (ra, na, u, _) = f ra na u
+let succ (sort, degr) = sort, succ degr
+
+let compose av at = {av with n_main = at.n_main}
+
+let shift av = {av with n_side = av.n_main}
+
let rec name err f a = match a.n_name with
| Some (n, r) -> f n r
| None -> err ()