From a9a03438157d8bbeec1dd7090d7d3f1d24cf2445 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 24 Feb 2019 03:38:07 -0700 Subject: [PATCH] add numlist/3 --- README.md | 2 +- src/prolog/lib/between.pl | 48 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0aec782..db007f97 100644 --- 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}` diff --git a/src/prolog/lib/between.pl b/src/prolog/lib/between.pl index 9dce74da..c6e203f0 100644 --- a/src/prolog/lib/between.pl +++ b/src/prolog/lib/between.pl @@ -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). -- 2.54.0