-:- module(between, [between/3, gen_int/1, gen_nat/1, numlist/2, repeat/1]).
+:- module(between, [between/3, gen_int/1, gen_nat/1, numlist/2, numlist/3, repeat/1]).
-%% TODO: numlist/3, numlist/5.
+%% TODO: numlist/5.
:- use_module(library(lists), [length/2]).
( integer(Upper) -> findall(X, between(1, Upper, X), List)
; List = [_|_], length(List, Upper), findall(X, between(1, Upper, X), List)
).
+
+diag_nats(M, N, M, N).
+diag_nats(M, N, M1, N1) :-
+ N > 0, !,
+ M0 is M+1,
+ N0 is N-1,
+ diag_nats(M0, N0, M1, N1).
+diag_nats(M, 0, M1, N1) :-
+ M0 is M+1,
+ diag_nats(0, M0, M1, N1).
+
+diag_nats(0, 0).
+diag_nats(M, N) :-
+ diag_nats(0, 1, M, N).
+
+diag_nats_signs(0, 0, 0, 0) :- !.
+diag_nats_signs(0, M, 0, M0) :- !,
+ ( M0 = M ; M0 is -M ).
+diag_nats_signs(M, 0, M0, 0) :- !,
+ ( M0 = M ; M0 is -M ).
+diag_nats_signs(M, N, M, N).
+diag_nats_signs(M, N, M, N0) :-
+ N0 is -N.
+diag_nats_signs(M, N, M0, N) :-
+ M0 is -M.
+diag_nats_signs(M, N, M0, N0) :-
+ M0 is -M, N0 is -N.
+
+diag_ints(M, N, M0, N0) :-
+ diag_nats(M, N),
+ diag_nats_signs(M, N, M0, N0).
+
+diag_ints(M, N) :-
+ diag_ints(M0, N0, M, N).
+
+gen_ints(L, U) :-
+ integer(L), !, gen_int(U), L =< U.
+gen_ints(L, U) :-
+ integer(U), !, gen_int(L), L =< U.
+gen_ints(L, U) :-
+ diag_ints(L, U), L =< U.
+
+numlist(Lower, Upper, List) :-
+ gen_ints(Lower, Upper), findall(X, between(Lower, Upper, X), List).