type id = Entity.id
type attrs = Entity.attrs
-type bind = Void of attrs (* attrs *)
- | Abst of attrs * term (* attrs, type *)
- | Abbr of attrs * term (* attrs, body *)
+type bind = Void (* *)
+ | Abst of term (* 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 bind * term (* binder, scope *)
+ | Bind of attrs * bind * term (* attrs, binder, scope *)
type entity = term Entity.entity (* attrs, uri, binder *)
type lenv = Null
-(* Cons: tail, relative local environment, binder *)
- | Cons of lenv * lenv option * bind
+(* Cons: tail, relative local environment, attrs, binder *)
+ | Cons of lenv * lenv * attrs * bind
(* helpers ******************************************************************)
-let mk_uri root s =
- String.concat "/" ["ld:"; "brg"; root; s ^ ".ld"]
+let mk_uri si root s =
+ let kernel = if si then "brg-si" else "brg" in
+ String.concat "/" ["ld:"; kernel; root; s ^ ".ld"]
(* Currified constructors ***************************************************)
-let abst a w = Abst (a, w)
+let abst w = Abst w
-let abbr a v = Abbr (a, v)
+let abbr v = Abbr v
let lref a i = LRef (a, i)
let appl a u t = Appl (a, u, t)
-let bind b t = Bind (b, t)
+let bind a b t = Bind (a, b, t)
-let bind_abst a u t = Bind (Abst (a, u), t)
+let bind_abst a u t = Bind (a, Abst u, t)
-let bind_abbr a v t = Bind (Abbr (a, v), t)
+let bind_abbr a v t = Bind (a, Abbr v, t)
+
+let bind_void a t = Bind (a, Void, t)
(* local environment handling functions *************************************)
-let empty_lenv = Null
+let empty = Null
+
+let push e c a b = Cons (e, c, a, b)
-let push es ?c b = Cons (es, c, b)
+let rec get i = function
+ | Null -> Null, Null, [], Void
+ | Cons (e, c, a, b) when i = 0 -> e, c, a, b
+ | Cons (e, _, _, _) -> get (pred i) e
-let get err f es i =
- let rec aux j = function
- | Null -> err ()
- | Cons (tl, None, b) when j = 0 -> f tl b
- | Cons (_, Some c, b) when j = 0 -> f c b
- | Cons (tl, _, _) -> aux (pred j) tl
- in
- aux i es
+let get e i = get i e
-(* check closure *)
-let rec rev_iter f map = function
- | Null -> f ()
- | Cons (tl, None, b) ->
- let f _ = map f tl b in rev_iter f map tl
- | Cons (tl, Some c, b) ->
- let f _ = map f c b in rev_iter f map tl
+(* 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
+(* used in MetaBrg.unwind_to_xlate_term *)
let rec fold_left map x = function
- | Null -> x
- | Cons (tl, _, b) -> fold_left map (map x b) tl
+ | Null -> x
+ | Cons (e, _, a, b) -> fold_left map (map x a b) e