sig
  type belnap = T | F | N | B
  type bnp_expr =
      Val of Bnp.belnap
    | BVar of string
    | Not of Bnp.bnp_expr
    | Cnf of Bnp.bnp_expr
    | Unop of (Bnp.belnap -> Bnp.belnap) * Bnp.bnp_expr
    | And of Bnp.bnp_expr * Bnp.bnp_expr
    | Or of Bnp.bnp_expr * Bnp.bnp_expr
    | Impl of Bnp.bnp_expr * Bnp.bnp_expr
    | Impl_CMI of Bnp.bnp_expr * Bnp.bnp_expr
    | Impl_BN of Bnp.bnp_expr * Bnp.bnp_expr
    | Impl_ST of Bnp.bnp_expr * Bnp.bnp_expr
    | Cns of Bnp.bnp_expr * Bnp.bnp_expr
    | Gul of Bnp.bnp_expr * Bnp.bnp_expr
    | Binop of (Bnp.belnap -> Bnp.belnap -> Bnp.belnap) * Bnp.bnp_expr *
        Bnp.bnp_expr
  val not_bnp : Bnp.belnap -> Bnp.belnap
  val conf : Bnp.belnap -> Bnp.belnap
  val and_bnp : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val or_bnp : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val implic : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val implic_cmi : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val implic_bn : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val implic_st : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val cns : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val gull : Bnp.belnap -> Bnp.belnap -> Bnp.belnap
  val eval_bnp : Bnp.bnp_expr -> (string * Bnp.belnap) list -> Bnp.belnap
end