V_______________________________________________________________ *)
module B = Brg
+(* module O = Output *)
+
+let rec icm a = function
+ | B.Sort _
+ | B.LRef _
+ | B.GRef _ -> succ a
+ | B.Bind (_, B.Void, t) -> icm (succ a) t
+ | B.Cast (_, u, t) -> icm (icm a u) t
+ | B.Appl (_, u, t)
+ | B.Bind (_, B.Abst u, t)
+ | B.Bind (_, B.Abbr u, t) -> icm (icm (succ a) u) t
let iter map d =
let rec iter_bind d = function
- | B.Void _ as b -> b
- | B.Abst (a, w) -> B.Abst (a, iter_term d w)
- | B.Abbr (a, v) -> B.Abbr (a, iter_term d v)
+ | B.Void -> B.Void
+ | B.Abst w -> B.Abst (iter_term d w)
+ | B.Abbr v -> B.Abbr (iter_term d v)
and iter_term d = function
| B.Sort _ as t -> t
| B.GRef _ as t -> t
| B.LRef (a, i) as t -> if i < d then t else map d a i
| B.Cast (a, w, v) -> B.Cast (a, iter_term d w, iter_term d v)
| B.Appl (a, w, u) -> B.Appl (a, iter_term d w, iter_term d u)
- | B.Bind (b, u) -> B.Bind (iter_bind d b, iter_term (succ d) u)
+ | B.Bind (a, b, u) -> B.Bind (a, iter_bind d b, iter_term (succ d) u)
in
iter_term d
if i + h >= 0 then B.LRef (a, i + h) else assert false
let lift h d t =
- if h = 0 then t else iter (lift_map h) d t
-
-let lift_bind h d = function
- | B.Void _ as b -> b
- | B.Abst (a, w) -> B.abst a (lift h d w)
- | B.Abbr (a, v) -> B.abbr a (lift h d v)
+ if h = 0 then t else begin
+(* O.icm := succ (* icm *) !O.icm (*t*); *) iter (lift_map h) d t
+ end