>>109833445
This is a definition of a fraction in MAIDS. Fractions automatically reduce via GCD when you create them. It is also compatible with integers.
digit:: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
sign:: "-" | succeed;
digits:: digit digits | succeed;
integer:: sign digits;
numerator(*a)::
?[
integer>numerator "/" integer : numerator;
integer>numerator : numerator
](*a);
denominator(*a)::
?[
integer "/" integer>denominator : denominator;
integer : "1"
](*a);
fracMul(*a, *b):: fraction(mul(numerator(*a),numerator(*b)), mul(denominator(*a),denominator(*b)));
fracDiv(*a, *b):: fraction(mul(denominator(*a),denominator(*b)), mul(numerator(*a),numerator(*b)));
fracAdd(*a, *b):: fraction(add(mul(numerator(*a),denominator(*b)), mul(numerator(*b),denominator(*a))), mul(denominator(*a),denominator(*b)));
fracSub(*a, *b):: fraction(sub(mul(numerator(*a),denominator(*b)), mul(numerator(*b),denominator(*a))), mul(denominator(*a),denominator(*b)));
fraction(*a, *b)::
eq(*b, "0") fail
| eq(*b, "1") *a
| lt(*b, "0") fraction(mul(*a, "-1"), abs(*b))
| gt(*b, "1") eq(gcd(*a,*b), "1") *a"/"*b
| gt(*b, "1") ne(gcd(*a,*b), "1") fraction(div(*a, gcd(*a,*b)), div(*b, gcd(*a,*b)));
gcd(*a, *b)::
eq(*b, "0") abs(*a)
| ne(*b, "0") gcd(abs(*b), mod(abs(*a), abs(*b)));