X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fhelena%2Fsrc%2Fbasic_rg%2Fbrg.ml;h=e6ac94e5bd8f4265ea05a0afe7718bab1d9f211e;hb=c44a7c4d35c1bb9651c3596519d8262e52e90ff4;hp=eeb9f56d61bdb00ae4d2aab5b0bfa5216659566d;hpb=977faf4820cd8ff5e2f0a5249161bbb92ae4b097;p=helm.git diff --git a/helm/software/helena/src/basic_rg/brg.ml b/helm/software/helena/src/basic_rg/brg.ml index eeb9f56d6..e6ac94e5b 100644 --- a/helm/software/helena/src/basic_rg/brg.ml +++ b/helm/software/helena/src/basic_rg/brg.ml @@ -10,65 +10,74 @@ V_______________________________________________________________ *) (* kernel version: basic, relative, global *) -(* note : ufficial basic \lambda\delta *) +(* note : ufficial basic \lambda\delta version 3 *) +module N = Layer module E = Entity -module N = Level type uri = E.uri -type attrs = E.node_attrs +type n_attrs = E.node_attrs +type b_attrs = E.bind_attrs -type bind = Void (* *) - | Abst of N.level * term (* level, type *) - | Abbr of term (* body *) +(* x-reduced abstractions are output by RTM only *) +type bind = Void (* *) + | Abst of bool * N.layer * term (* x-reduced?, layer, type *) + | Abbr of term (* body *) -and term = Sort of attrs * int (* attrs, hierarchy index *) - | LRef of attrs * int (* attrs, position index *) - | GRef of attrs * uri (* attrs, reference *) - | Cast of attrs * term * term (* attrs, type, term *) - | Appl of attrs * term * term (* attrs, argument, function *) - | Bind of attrs * bind * term (* attrs, binder, scope *) +and term = Sort of int (* hierarchy index *) + | LRef of n_attrs * int (* attrs, position index *) + | GRef of n_attrs * uri (* attrs, reference *) + | Cast of term * term (* type, term *) + | Appl of bool * term * term (* extended?, argument, function *) + | Bind of b_attrs * bind * term (* attrs, binder, scope *) type entity = term E.entity (* attrs, uri, binder *) type lenv = Null (* Cons: tail, relative local environment, attrs, binder *) - | Cons of lenv * lenv * attrs * bind + | Cons of lenv * lenv * n_attrs * b_attrs * bind + +type manager = (N.status -> entity -> bool) * (unit -> unit) (* Currified constructors ***************************************************) -let abst n w = Abst (n, w) +let abst r n w = Abst (r, n, w) let abbr v = Abbr v let lref a i = LRef (a, i) -let cast a u t = Cast (a, u, t) +let gref a u = GRef (a, u) + +let cast u t = Cast (u, t) -let appl a u t = Appl (a, u, t) +let appl x u t = Appl (x, u, t) -let bind a b t = Bind (a, b, t) +let bind y b t = Bind (y, b, t) -let bind_abst n a u t = Bind (a, Abst (n, u), t) +let bind_abst r n y u t = Bind (y, Abst (r, n, u), t) -let bind_abbr a v t = Bind (a, Abbr v, t) +let bind_abbr y u t = Bind (y, Abbr u, t) -let bind_void a t = Bind (a, Void, t) +let bind_void y t = Bind (y, Void, t) (* local environment handling functions *************************************) let empty = Null -let push e c a b = Cons (e, c, a, b) +let push e c a y b = Cons (e, c, a, y, b) -let rec get i = function - | Null -> Null, Null, E.empty_node, Void - | Cons (e, c, a, b) when i = 0 -> e, c, a, b - | Cons (e, _, _, _) -> get (pred i) e - -let get e i = get i e +let rec get e i = match e with + | Null -> empty, empty, E.empty_node, E.empty_bind, Void + | Cons (e, c, a, y, b) when i = 0 -> e, c, a, y, b + | Cons (e, _, _, _, _) -> get e (pred i) (* used in BrgOutput.pp_lenv *) let rec fold_right f map e x = match e with - | Null -> f x - | Cons (e, c, a, b) -> fold_right (map f e c a b) map e x + | Null -> f x + | Cons (e, c, a, y, b) -> fold_right (map f c a y b) map e x + +let rec mem err f e y0 = match e with + | Null -> err () + | Cons (e, _, _, y, _) -> + if y.E.b_name = y0.E.b_name then f () else mem err f e y0