let output fmt = function
  | Term(t) -> Term.pp fmt t
  | Atom(a) -> Atom.pp fmt a
  | Cnstrnt(Some(c)) -> Sign.pp fmt c
  | Cnstrnt(None-> Format.fprintf fmt "None"
  | Dom(Some(d)) -> Dom.pp fmt d
  | Dom(None-> Format.fprintf fmt "None"
  | Optterm(Some(t)) -> Term.pp fmt t
  | Optterm(None-> Format.fprintf fmt "None"
  | Name(n) -> Name.pp fmt n
  | Terms(ts) -> Pretty.set Term.pp fmt (Term.Set.elements ts)
  | Atoms(al) -> Pretty.set Atom.pp fmt (Atom.Set.elements al)
  | Unit() -> Format.fprintf fmt ""
  | Bool(x) -> Format.fprintf fmt "%s" (if x then "true" else "false")
  | Solution(sl) -> Pretty.list (Pretty.eqn Term.pp) fmt sl
  | Context(c) -> 
      Context.pp fmt c
  | Process(status) -> Context.Status.pp Name.pp fmt status
  | Sat(None-> Pretty.string fmt ":unsat"
  | Sat(Some(rho, n)) ->
      Pretty.string fmt ":sat "Prop.Assignment.pp fmt rho;
  | Symtab(sym) -> Symtab.pp fmt sym
  | Entry(e) -> Symtab.pp_entry fmt e
  | Int(i) -> Format.fprintf fmt "%d" i
  | String(s) -> Format.fprintf fmt "%s" s