:- 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).
