functor (R : Rat->
  sig
    type t = R.q
    val ( - ) : R.q -> R.q -> R.q
    val euclid : R.q -> R.q -> R.q * R.q * R.q
    val solve : R.q list -> R.q -> (R.q * R.q list) option
  end