]> Repositorios git - scryer-prolog.git/commitdiff
add numlist/3
authorMark Thom <[email protected]>
Sun, 24 Feb 2019 10:38:07 +0000 (03:38 -0700)
committerMark Thom <[email protected]>
Sun, 24 Feb 2019 10:38:07 +0000 (03:38 -0700)
README.md
src/prolog/lib/between.pl

index a0aec78274771c4ce77d7eb939a1799e419e10c0..db007f97764efb26eb2d47dfb27b22b2f6264db5 100644 (file)
--- a/README.md
+++ b/README.md
@@ -172,7 +172,7 @@ The following predicates are built-in to rusty-wam.
 * `nl/0`
 * `nonvar/1`
 * `numbervars/2`
-* `numlist/2`
+* `numlist/{2,3}`
 * `once/1`
 * `partial_string/2`
 * `phrase/{2,3}`
index 9dce74daa8306fc48f3b70ce8815fb880bc8d8d8..c6e203f0c5f0c30a131415fb18628eec10d7a042 100644 (file)
@@ -1,6 +1,6 @@
-:- 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]).
 
@@ -46,3 +46,47 @@ numlist(Upper, List) :-
     (  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).