type ('f, 'p) res = Sat | Unsat of 'f list * 'p type 'f slice = { start:int; length:int; get:int -> 'f } module type S = sig val backtrack : level -> unit val current_level : unit -> level val assume : formula slice -> (formula, proof) res end