sig
  type program = MiniAst.binding list
  and binding =
      BindValue of Positions.position * MiniAst.value_definition list
    | BindRecValue of Positions.position * MiniAst.value_definition list
    | TypeDec of Positions.position * MiniAst.type_declaration list
  and expression =
      EVar of Positions.position * MiniAst.name
    | ELambda of Positions.position * MiniAst.pattern * MiniAst.expression
    | EApp of Positions.position * MiniAst.expression * MiniAst.expression
    | EBinding of Positions.position * MiniAst.binding * MiniAst.expression
    | EPrimApp of Positions.position * MiniAst.primitive *
        MiniAst.expression list
    | EForall of Positions.position * MiniAst.tname list * MiniAst.expression
    | EExists of Positions.position * MiniAst.tname list * MiniAst.expression
    | ETypeConstraint of Positions.position * MiniAst.expression *
        MiniAst.typ
    | EDCon of Positions.position * MiniAst.dname * MiniAst.expression list
    | EMatch of Positions.position * MiniAst.expression * MiniAst.clause list
    | ERecordEmpty of Positions.position
    | ERecordAccess of Positions.position * MiniAst.expression *
        MiniAst.lname
    | ERecordExtend of Positions.position * MiniAst.record_binding list *
        MiniAst.expression
    | ERecordUpdate of Positions.position * MiniAst.expression *
        MiniAst.lname * MiniAst.expression
    | EAssertFalse of Positions.position
  and name = Constraint.sname = SName of string
  and tname = MultiEquation.tname
  and dname = DName of string
  and lname = CoreAlgebra.lname
  and primitive = PIntegerConstant of int | PCharConstant of char | PUnit
  and clause = Positions.position * MiniAst.pattern * MiniAst.expression
  and record_binding = MiniAst.lname * MiniAst.expression
  and type_declaration =
      Positions.position * MiniAst.kind * MiniAst.tname *
      MiniAst.type_definition
  and type_definition =
      DAlgebraic of
        (Positions.position * MiniAst.dname * MiniAst.tname list *
         MiniAst.typ)
        list
  and value_definition =
      Positions.position * MiniAst.tname list * MiniAst.pattern *
      MiniAst.expression
  and pattern =
      PVar of Positions.position * MiniAst.name
    | PWildcard of Positions.position
    | PAlias of Positions.position * MiniAst.name * MiniAst.pattern
    | PTypeConstraint of Positions.position * MiniAst.pattern * MiniAst.typ
    | PPrimitive of Positions.position * MiniAst.primitive
    | PData of Positions.position * MiniAst.dname * MiniAst.pattern list
    | PAnd of Positions.position * MiniAst.pattern list
    | POr of Positions.position * MiniAst.pattern list
  and kind =
      KStar
    | KTimes of MiniAst.kind * MiniAst.kind
    | KArrow of MiniAst.kind * MiniAst.kind
    | KEmptyRow
  and typ =
      TypVar of Positions.position * MiniAst.tname
    | TypApp of Positions.position * MiniAst.typ * MiniAst.typ list
    | TypRowCons of Positions.position * (MiniAst.lname * MiniAst.typ) list *
        MiniAst.typ
    | TypRowUniform of Positions.position * MiniAst.typ
end