add numlist/3

This commit is contained in:
Mark Thom
2019-02-24 03:38:07 -07:00
parent 67ae47a01a
commit a9a0343815
2 changed files with 47 additions and 3 deletions

View File

@@ -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}`

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