sig
  module Ast :
    sig
      type t =
          Unit
        | Num of int
        | Ref of I.Ast.t
        | Var of string
        | Set of I.Ast.t * I.Ast.t
        | Get of I.Ast.t
        | Op of Op.t * I.Ast.t * I.Ast.t
        | Ifz of I.Ast.t * I.Ast.t * I.Ast.t
        | Let of string * I.Ast.t * I.Ast.t
        | App of I.Ast.t * I.Ast.t
        | Fun of string * I.Ast.t
        | Fix of string * I.Ast.t
        | Seq of I.Ast.t * I.Ast.t
      type 'a env = (string * 'a) list
    end
  module Reader :
    sig
      val from_chan : Pervasives.in_channel -> I.Ast.t
      val from_string : string -> I.Ast.t
    end
  module Top :
    sig
      val loop :
        (Pervasives.out_channel -> '-> unit) ->
        ('I.Ast.env -> I.Ast.t -> 'a) -> unit
    end
end