sig
  exception Unknown
  type trilean = T | F | U
  type tern_expr =
      Var of string
    | Tr of Tern.trilean
    | Not of Tern.tern_expr
    | Unop of (Tern.trilean -> Tern.trilean) * Tern.tern_expr
    | And of Tern.tern_expr * Tern.tern_expr
    | AndSt of Tern.tern_expr * Tern.tern_expr
    | Or of Tern.tern_expr * Tern.tern_expr
    | OrSt of Tern.tern_expr * Tern.tern_expr
    | Impl of Tern.tern_expr * Tern.tern_expr
    | Impl_Lukas of Tern.tern_expr * Tern.tern_expr
    | ImplSt of Tern.tern_expr * Tern.tern_expr
    | BicondSt of Tern.tern_expr * Tern.tern_expr
    | XorSt of Tern.tern_expr * Tern.tern_expr
    | Binop of (Tern.trilean -> Tern.trilean -> Tern.trilean) *
        Tern.tern_expr * Tern.tern_expr
  val not_tern : Tern.trilean -> Tern.trilean
  val and_tern : Tern.trilean -> Tern.trilean -> Tern.trilean
  val and_st : Tern.trilean -> Tern.trilean -> Tern.trilean
  val or_tern : Tern.trilean -> Tern.trilean -> Tern.trilean
  val or_st : Tern.trilean -> Tern.trilean -> Tern.trilean
  val impl_tern : Tern.trilean -> Tern.trilean -> Tern.trilean
  val impl_lukas : Tern.trilean -> Tern.trilean -> Tern.trilean
  val impl_st : Tern.trilean -> Tern.trilean -> Tern.trilean
  val bicond_st : Tern.trilean -> Tern.trilean -> Tern.trilean
  val eval_tern :
    Tern.tern_expr -> (string * Tern.trilean) list -> Tern.trilean
  val to_bool : Tern.trilean -> bool
  val wdef : Tern.trilean -> bool
  val is_strict : Tern.tern_expr -> bool
end