:- module rational. :- use_module builtin, integer, private_builtin, require. :- type (rational:rational) ---> r((integer:integer), (integer:integer)) . :- type (rational:comparison) ---> equal ; lessthan ; greaterthan . :- func rational:inverse((rational:rational)) = (rational:rational). :- mode rational:inverse((builtin:in)) = (builtin:out) is det. :- func rational:rational_norm((integer:integer), (integer:integer)) = (rational:rational). :- mode rational:rational_norm((builtin:in), (builtin:in)) = (builtin:out) is det. :- func rational:cmp((rational:rational), (rational:rational)) = (rational:comparison). :- mode rational:cmp((builtin:in), (builtin:in)) = (builtin:out) is det. rational:(R1_3 < R2_4) :- Cmp_5 = rational:cmp(R1_3, R2_4), Cmp_5 = rational:lessthan. rational:(R1_3 > R2_4) :- Cmp_5 = rational:cmp(R1_3, R2_4), Cmp_5 = rational:greaterthan. rational:(R1_3 =< R2_4) :- Cmp_5 = rational:cmp(R1_3, R2_4), ( % disjunction Cmp_5 = rational:lessthan ; Cmp_5 = rational:equal ). rational:(R1_3 >= R2_4) :- Cmp_5 = rational:cmp(R1_3, R2_4), ( % disjunction Cmp_5 = rational:greaterthan ; Cmp_5 = rational:equal ). rational:rational(Num_4, Den_5) = HeadVar__3_3 :- HeadVar__3_3 = rational:rational_norm(V_6, V_7), V_6 = integer:integer(Num_4), V_7 = integer:integer(Den_5). rational:rational_from_integers(Num_4, Den_5) = HeadVar__3_3 :- HeadVar__3_3 = rational:rational_norm(Num_4, Den_5). rational:(+ Rat_3) = Rat_3. rational:(- (rational:r(Num_3, Den_4))) = (rational:r(V_5, Den_4)) :- V_5 = integer:(- Num_3). rational:(R1_4 - R2_5) = HeadVar__3_3 :- HeadVar__3_3 = rational:(R1_4 + V_6), V_6 = rational:(- R2_5). rational:(R1_4 / R2_5) = HeadVar__3_3 :- HeadVar__3_3 = rational:(R1_4 * V_6), V_6 = rational:inverse(R2_5). rational:numer((rational:r(Num_3, V_4))) = Num_3. rational:denom((rational:r(V_3, Den_4))) = Den_4. rational:abs((rational:r(Num_3, Den_4))) = (rational:r(V_5, Den_4)) :- V_5 = integer:abs(Num_3). rational:one = (rational:r(V_2, V_3)) :- V_2 = integer:integer(V_4), V_4 = 1, V_3 = integer:integer(V_5), V_5 = 1. rational:zero = (rational:r(V_2, V_3)) :- V_2 = integer:integer(V_4), V_4 = 0, V_3 = integer:integer(V_5), V_5 = 1. :- pragma termination_info(rational:'<'((builtin:in), (builtin:in)), finite(0, [no, no]), can_loop). :- pragma termination_info(rational:'>'((builtin:in), (builtin:in)), finite(0, [no, no]), can_loop). :- pragma termination_info(rational:'=<'((builtin:in), (builtin:in)), finite(0, [no, no]), can_loop). :- pragma termination_info(rational:'>='((builtin:in), (builtin:in)), finite(0, [no, no]), can_loop). :- pragma termination_info(rational:rational((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:rational_from_integers((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:'+'((builtin:in)) = (builtin:out), finite(0, [yes, no]), cannot_loop). :- pragma termination_info(rational:'-'((builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:'+'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:'-'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:'*'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:'/'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info(rational:numer((builtin:in)) = (builtin:out), finite(-2, [yes, no]), cannot_loop). :- pragma termination_info(rational:denom((builtin:in)) = (builtin:out), finite(-2, [yes, no]), cannot_loop). :- pragma termination_info(rational:abs((builtin:in)) = (builtin:out), infinite, can_loop). :- pragma termination_info((rational:one) = (builtin:out), infinite, can_loop). :- pragma termination_info((rational:zero) = (builtin:out), infinite, can_loop).