type expr =
    EFalse
  | ETrue
  | EVar of string
  | EAnd of expr * expr
  | EOr of expr * expr
  | ENot of expr
  | EForall of string * expr
  | EExists of string * expr

type asst = (string * bool) list

type bvec = expr list (* low order bit at head of list *)

val eval : asst -> expr -> bool
val free_vars : expr -> string list
val sat : expr -> asst option

val int_of_bvec : bvec -> int
val bvec_of_int : int -> bvec
val subst : asst -> bvec -> bvec
val zero : bvec -> expr
val bitand : bvec -> bvec -> bvec
val eq : bvec -> bvec -> expr
val lt : bvec -> bvec -> expr
val gt : bvec -> bvec -> expr
val le : bvec -> bvec -> expr
val ge : bvec -> bvec -> expr
val add : bvec -> bvec -> bvec
val mult : bvec -> bvec -> bvec
