-------------------------------------------------------------------------------
-- | `theory_solver` returns the `k` belonging to the conflicting `Atom`
--   or empty list if the conjunction of `[Atom]` is satisfiable 

theory_solver     :: TheoryCube k -> [k] 

theory_solver kas = runState (theory_solver' kas) st0 
  where 
    (ks, as)      = unzip kas
    st0           = NOST M.empty M.empty S.empty M.empty solvers 0
theory_solver     :: TheoryCube k -> [k]
theory_solver kas = runState (theory_solver' kas) st0 
  where 
    (ks, as)      = unzip kas
    st0           = NOST M.empty M.empty S.empty M.empty solvers 0
theory_solver kas = runState (theory_solver' kas) st0 
  where 
    (ks, as)      = unzip kas
    st0           = NOST M.empty M.empty S.empty M.empty solvers 0