functor
  (X : Sig.X) (P : sig
                     type r = X.r
                     type t
                     val compare : t -> t -> int
                     val hash : t -> int
                     val create : (Num.num * r) list -> Num.num -> Ty.t -> t
                     val add : t -> t -> t
                     val sub : t -> t -> t
                     val mult : t -> t -> t
                     val mult_const : Num.num -> t -> t
                     val div : t -> t -> t * bool
                     val modulo : t -> t -> t
                     val is_empty : t -> bool
                     val find : r -> t -> Num.num
                     val choose : t -> Num.num * r
                     val subst : r -> t -> t -> t
                     val remove : r -> t -> t
                     val to_list : t -> (Num.num * r) list * Num.num
                     val print : Format.formatter -> t -> unit
                     val type_info : t -> Ty.t
                     val is_monomial : t -> (Num.num * r * Num.num) option
                     val ppmc_denominators : t -> Num.num
                     val pgcd_numerators : t -> Num.num
                     val normal_form : t -> t * Num.num * Num.num
                     val normal_form_pos : t -> t * Num.num * Num.num
                   end) (C : sig
                               type t = P.t
                               type r = X.r
                               val extract : r -> t option
                               val embed : t -> r
                             end->
  sig
    type t = P.t
    type r = X.r
    val name : string
    val is_mine_symb : Symbols.t -> bool
    val unsolvable : t -> bool
    val make : Term.t -> r * Literal.LT.t list
    val term_extract : r -> Term.t option
    val type_info : t -> Ty.t
    val embed : r -> t
    val leaves : t -> r list
    val subst : r -> r -> t -> r
    val compare : t -> t -> int
    val hash : t -> int
    val solve : r -> r -> (r * r) list
    val print : Format.formatter -> t -> unit
    val fully_interpreted : Symbols.t -> bool
    module Rel :
      sig
        type t
        type r = r
        val empty : unit -> t
        val assume : t -> r Sig.input list -> t * r Sig.result
        val query : t -> r Sig.input -> Sig.answer
        val case_split : t -> (r Literal.view * Explanation.t * Num.num) list
        val add : t -> r -> t
      end
  end