%% TODO: numlist/5.
:- use_module(library(lists), [length/2]).
+:- use_module(library(error)).
between(Lower, Upper, Lower) :-
Lower =< Upper.
gen_nat(N) :-
integer(N), !, N >= 0.
gen_nat(N) :-
- var(N), enumerate_nats(0, N).
+ var(N), !, enumerate_nats(0, N).
+gen_nat(N) :-
+ throw(error(type_error(integer, N), gen_nat/1)).
enumerate_ints(I, I).
enumerate_ints(I0, N) :-
gen_int(N) :-
integer(N), !.
gen_int(N) :-
- var(N), enumerate_ints(0, N).
+ var(N), !, enumerate_ints(0, N).
+gen_int(N) :-
+ throw(error(type_error(integer, N), gen_int/1)).
repeat_integer(N) :-
N > 0.
N0 > 0, N1 is N0 - 1, repeat_integer(N1).
repeat(N) :-
- integer(N), N > 0, repeat_integer(N).
+ must_be(integer, N), N > 0, repeat_integer(N).
numlist(Upper, List) :-
( integer(Upper) -> findall(X, between(1, Upper, X), List)
).
diag_nats(M, N, M, N).
+diag_nats(M, 0, M1, N1) :-
+ !,
+ M0 is M+1,
+ diag_nats(0, M0, M1, N1).
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_ints(M0, N0, M, N).
gen_ints(L, U) :-
+ can_be(integer, L), can_be(integer, U),
( integer(L), integer(U), !
; integer(L) -> gen_int(U)
; integer(U) -> gen_int(L)
}
static BUILTINS: &str = include_str!("../lib/builtins.pl");
-static BETWEEN: &str = include_str!("../lib/between.pl");
static LISTS: &str = include_str!("../lib/lists.pl");
static QUEUES: &str = include_str!("../lib/queues.pl");
static ERROR: &str = include_str!("../lib/error.pl");
+static BETWEEN: &str = include_str!("../lib/between.pl");
static TERMS: &str = include_str!("../lib/terms.pl");
static DCGS: &str = include_str!("../lib/dcgs.pl");
static ATTS: &str = include_str!("../lib/atts.pl");
}
fn compile_libraries(&mut self) {
- compile_user_module(self, LISTS.as_bytes());
- compile_user_module(self, BETWEEN.as_bytes());
+ compile_user_module(self, LISTS.as_bytes());
compile_user_module(self, QUEUES.as_bytes());
compile_user_module(self, ERROR.as_bytes());
+ compile_user_module(self, BETWEEN.as_bytes());
compile_user_module(self, TERMS.as_bytes());
compile_user_module(self, DCGS.as_bytes());
compile_user_module(self, ATTS.as_bytes());