+ let strip i t =
+ let rec aux i l = function
+ | Ast.Binder (_, var, body) when i > 0 -> aux (pred i) (var :: l) body
+ | body -> List.rev l, body
+ in
+ aux i [] t
+ in
+ let rec get_guard i = function
+ | [] -> assert false
+ | [term, _] when i = 1 -> term
+ | _ :: tl -> get_guard (pred i) tl
+ in
+ let map (var, body, i) =
+ let id, vars, typ, body = match var with
+ | term, Some typ ->
+ let pvars, pbody = strip i typ in
+ let _, bbody = strip i body in
+ term, pvars, pbody, bbody
+ | _ -> assert false
+ in
+ sprintf "%s %s on %s: %s \\def %s"
+ (pp_term ~pp_parens:false term)
+ (String.concat " " (List.map pp_capture_variable vars))
+ (pp_term ~pp_parens:false (get_guard i vars))
+ (pp_term typ) (pp_term body)
+ in
+ sprintf "let %s %s in %s"