sig
  module Constraint :
    sig
      type numconstraint = CEq | CNeq | CLt | CGt | CLte | CGte
      type varname = string
      type recordindex = string * string * int
      type constraintbinop = CPlus | CMinus | CTimes | CDivide
      type cvar =
          CVar of Constraint.Constraint.varname
        | CRecordVar of Constraint.Constraint.recordindex
      type cexp =
          CVarExp of Constraint.Constraint.cvar
        | CInt of int
        | CArithop of Constraint.Constraint.constraintbinop *
            Constraint.Constraint.cexp * Constraint.Constraint.cexp
        | CBoolop of Constraint.Constraint.numconstraint *
            Constraint.Constraint.cexp * Constraint.Constraint.cexp
        | CGuard of Constraint.Constraint.cexp * Constraint.Constraint.cexp *
            Constraint.Constraint.cexp
        | CAnd of Constraint.Constraint.cexp list
        | COr of Constraint.Constraint.cexp list
        | CTrue
        | CFalse
      val negate : Constraint.Constraint.cexp -> Constraint.Constraint.cexp
      val mkEqs :
        Constraint.Constraint.cexp ->
        Constraint.Constraint.cexp -> Constraint.Constraint.cexp
      val mkVar : string -> Constraint.Constraint.cexp
      val mkRVar : string -> string -> int -> Constraint.Constraint.cexp
    end
end