:- module integer.
:- use_module builtin, char, float, int, list, private_builtin, require, std_util, string.
:- type (integer:sign) == int.
:- type (integer:integer)
	--->	i(int, (list:list(int)))
	.
:- type (integer:digit) == int.
:- func (integer:base) = int.
:- mode (integer:base) = (builtin:out) is det.
:- func integer:big_abs((integer:integer)) = (integer:integer).
:- mode integer:big_abs((builtin:in)) = (builtin:out) is det.
:- pred integer:neg_list((list:list(int)), (list:list(int)), (list:list(int))).
:- mode integer:neg_list((builtin:in), (builtin:out), (builtin:in)) is det.
:- func integer:big_neg((integer:integer)) = (integer:integer).
:- mode integer:big_neg((builtin:in)) = (builtin:out) is det.
:- func integer:big_mul((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_mul((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_quot((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_quot((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_rem((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_rem((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_div((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_div((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_mod((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_mod((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_cmp((integer:integer), (integer:integer)) = (builtin:comparison_result).
:- mode integer:big_cmp((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:big_plus((integer:integer), (integer:integer)) = (integer:integer).
:- mode integer:big_plus((builtin:in), (builtin:in)) = (builtin:out) is det.
:- func integer:int_to_integer(int) = (integer:integer).
:- mode integer:int_to_integer((builtin:in)) = (builtin:out) is det.
:- pred integer:big_quot_rem((integer:integer), (integer:integer), (integer:integer), (integer:integer)).
:- mode integer:big_quot_rem((builtin:in), (builtin:in), (builtin:out), (builtin:out)) is det.
:- func integer:float_list(float, float, (list:list(int))) = float.
:- mode integer:float_list((builtin:in), (builtin:in), (builtin:in)) = (builtin:out) is det.
:- func (integer:one) = (integer:integer).
:- mode (integer:one) = (builtin:out) is det.
:- func integer:string_to_integer((list:list(character))) = (integer:integer).
:- mode integer:string_to_integer((builtin:in)) = (builtin:out) is semidet.
integer:(X1_3 < X2_4) :-
		C_5 = integer:big_cmp(X1_3, X2_4),
		C_5 = builtin:(<).
integer:(X1_3 > X2_4) :-
		C_5 = integer:big_cmp(X1_3, X2_4),
		C_5 = builtin:(>).
integer:(X1_3 =< X2_4) :-
		C_5 = integer:big_cmp(X1_3, X2_4),
		( % disjunction
			C_5 = builtin:(<)
		;
			C_5 = builtin:(=)
		).
integer:(X1_3 >= X2_4) :-
		C_5 = integer:big_cmp(X1_3, X2_4),
		( % disjunction
			C_5 = builtin:(>)
		;
			C_5 = builtin:(=)
		).
integer:integer(N_3) = HeadVar__2_2 :-
		HeadVar__2_2 = integer:int_to_integer(N_3).
integer:from_string(S_3) = Big_4 :-
		string:to_char_list(S_3, Cs_5),
		Big_4 = integer:string_to_integer(Cs_5).
integer:(+ X1_3) = X1_3.
integer:(- N_3) = HeadVar__2_2 :-
		HeadVar__2_2 = integer:big_neg(N_3).
integer:(X1_4 + X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_plus(X1_4, X2_5).
integer:(X1_4 - X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_plus(X1_4, V_6),
		V_6 = integer:big_neg(X2_5).
integer:(X1_4 * X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_mul(X1_4, X2_5).
integer:(X1_4 // X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_quot(X1_4, X2_5).
integer:(X1_4 div X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_div(X1_4, X2_5).
integer:(X1_4 rem X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_rem(X1_4, X2_5).
integer:(X1_4 mod X2_5) = HeadVar__3_3 :-
		HeadVar__3_3 = integer:big_mod(X1_4, X2_5).
integer:(\ X_3) = HeadVar__2_2 :-
		HeadVar__2_2 = integer:big_neg(V_4),
		V_4 = integer:big_plus(X_3, V_5),
		V_5 = integer:one.
integer:abs(N_3) = HeadVar__2_2 :-
		HeadVar__2_2 = integer:big_abs(N_3).
integer:float((integer:i(V_3, List_4))) = HeadVar__2_2 :-
		HeadVar__2_2 = integer:float_list(FBase_5, V_6, List_4),
		V_6 = 0.00000000000000,
		V_7 = integer:base,
		int:to_float(V_7, FBase_5).
integer:base = 16384.
integer:big_neg((integer:i(S_3, Ds_4))) = (integer:i(V_6, NewDs_5)) :-
		V_6 = int:(- S_3),
		V_7 = list:[],
		integer:neg_list(Ds_4, NewDs_5, V_7).
integer:big_quot(X1_4, X2_5) = Q_6 :-
		integer:big_quot_rem(X1_4, X2_5, Q_6, _R_7).
integer:big_rem(X1_4, X2_5) = R_6 :-
		integer:big_quot_rem(X1_4, X2_5, _Q_7, R_6).
integer:big_cmp(I1_4, I2_5) = Result_6 :-
		builtin:compare(Result_6, I1_4, I2_5).
integer:one = (integer:i(V_2, V_3)) :-
		V_2 = 1,
		V_3 = list:[V_4 | V_5],
		V_4 = 1,
		V_5 = list:[].
:- pragma termination_info(integer:'<'((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(integer:'>'((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(integer:'=<'((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(integer:'>='((builtin:in), (builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(integer:integer((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:to_string((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:from_string((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'+'((builtin:in)) = (builtin:out), finite(0, [yes, no]), cannot_loop).
:- pragma termination_info(integer:'-'((builtin:in)) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(integer:'+'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'-'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'*'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'//'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:div((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:rem((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:mod((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'<<'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'>>'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'/\\'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'\\/'((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:xor((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:'\\'((builtin:in)) = (builtin:out), infinite, can_loop).
:- pragma termination_info(integer:abs((builtin:in)) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(integer:pow((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(integer:float((builtin:in)) = (builtin:out), finite(0, [no, no]), can_loop).
:- pragma termination_info(integer:int((builtin:in)) = (builtin:out), finite(0, [no, no]), can_loop).
