[package] [Java implementation] [Execution output]


Fraction


class Fraction<T>: fraction(T: a, T: b);

// For the canonical form, eliminate common factors and ensure the denominator is positive.
canonical(n, d) = (g = sign d * gcd(n, d); fraction(n /! g, d /! g));

// Arithmetic identities / implementation


                                  stream << fraction(a, b) = if b == multiplicative_identity
                                                                 then stream << a
                                                                 else stream << a << "/" << b;

                          fraction(a, b) == fraction(c, d) = (a == c and b == d);

               compare(fraction(n1, d1), fraction(n2, d2)) = compare(n1 * d2, n2 * d1);

                       fraction(n1, d1) + fraction(n2, d2) = canonical(n1 * d2 + n2 * d1, d1 * d2);

                                           -fraction(n, d) = fraction(-n, d);

                       fraction(n1, d1) * fraction(n2, d2) = canonical(n1 * n2, d1 * d2);

                                           /fraction(n, d) = if n < additive_identity
                                                                 then fraction(-d, -n)
                                                                 else fraction(d, n);

                                         additive_identity = fraction(additive_identity, multiplicative_identity);

                                   multiplicative_identity = fraction(multiplicative_identity, multiplicative_identity);