sig
  val gcd : int -> int -> int
  type t = { num : int; den : int; }
  val make : int -> int -> Rational.t
  val inv : Rational.t -> Rational.t
  val neg : Rational.t -> Rational.t
  val add : Rational.t -> Rational.t -> Rational.t
  val sub : Rational.t -> Rational.t -> Rational.t
  val mul : Rational.t -> Rational.t -> Rational.t
  val div : Rational.t -> Rational.t -> Rational.t
  val to_string : Rational.t -> string
  val print : Format.formatter -> Rational.t -> unit
end