Task

Create a reasonably complete implementation of rational arithmetic in the particular language using the idioms of the language.



Example

Define a new type called frac with binary operator "//" of two integers that returns a structure made up of the numerator and the denominator (as per a rational number).

Further define the appropriate rational unary operators abs and '-', with the binary operators for addition '+', subtraction '-', multiplication '×', division '/', integer division '÷', modulo division, the comparison operators (e.g. '<', '≤', '>', & '≥') and equality operators (e.g. '=' & '≠').

Define standard coercion operators for casting int to frac etc.

If space allows, define standard increment and decrement operators (e.g. '+:=' & '-:=' etc.).

Finally test the operators:
Use the new type frac to find all perfect numbers less than 219 by summing the reciprocal of the factors.



Related task

   Perfect Numbers


 
divisor(N, Div) :-
    Max is floor(sqrt(N)),
    between(1, Max, D),
    divmod(N, D, _, 0),
    (Div = D; Div is N div D, Div =\= D).
 
divisors(N, Divs) :-
    setof(M, divisor(N, M), Divs).
 
recip(A, B) :- B is 1 rdiv A.
 
sumrecip(N, A) :-
    divisors(N, [1 | Ds]),
    maplist(recip, Ds, As),
    sum_list(As, A).
 
perfect(X) :- sumrecip(X, 1).
 
main :-
    Limit is 1 << 19,
    forall(
        (between(1, Limit, N), perfect(N)),
	(format("~w~n", [N]))),
    halt.
 
?- main.
 