aboutsummaryrefslogtreecommitdiffhomepage
path: root/kernel/closure.ml
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/closure.ml')
-rw-r--r--kernel/closure.ml31
1 files changed, 18 insertions, 13 deletions
diff --git a/kernel/closure.ml b/kernel/closure.ml
index 96f57f88d..bf39fa42b 100644
--- a/kernel/closure.ml
+++ b/kernel/closure.ml
@@ -691,19 +691,24 @@ let rec fstrong unfreeze_fun lfts v =
to_constr (fstrong unfreeze_fun) lfts (unfreeze_fun v)
*)
-let rec zip m stk =
- match stk with
- | [] -> m
- | Zapp args :: s -> zip {norm=neutr m.norm; term=FApp(m, args)} s
- | Zcase(ci,p,br)::s ->
- let t = FCases(ci, p, m, br) in
- zip {norm=neutr m.norm; term=t} s
- | Zfix(fx,par)::s ->
- zip fx (par @ append_stack [|m|] s)
- | Zshift(n)::s ->
- zip (lift_fconstr n m) s
- | Zupdate(rf)::s ->
- zip (update rf m.norm m.term) s
+let rec zip m stk rem = match stk with
+| [] ->
+ begin match rem with
+ | [] -> m
+ | stk :: rem -> zip m stk rem
+ end
+| Zapp args :: s -> zip {norm=neutr m.norm; term=FApp(m, args)} s rem
+| Zcase(ci,p,br)::s ->
+ let t = FCases(ci, p, m, br) in
+ zip {norm=neutr m.norm; term=t} s rem
+| Zfix(fx,par)::s ->
+ zip fx par ((Zapp [|m|] :: s) :: rem)
+| Zshift(n)::s ->
+ zip (lift_fconstr n m) s rem
+| Zupdate(rf)::s ->
+ zip (update rf m.norm m.term) s rem
+
+let zip m stk = zip m stk []
let fapp_stack (m,stk) = zip m stk