]> Repositorios git - scryer-prolog.git/commitdiff
add library routines for lists.
authorMark Thom <[email protected]>
Tue, 30 Jan 2018 08:00:46 +0000 (01:00 -0700)
committerMark Thom <[email protected]>
Tue, 30 Jan 2018 08:00:46 +0000 (01:00 -0700)
src/prolog/lib/lists.rs [new file with mode: 0644]
src/prolog/lib/mod.rs [new file with mode: 0644]

diff --git a/src/prolog/lib/lists.rs b/src/prolog/lib/lists.rs
new file mode 100644 (file)
index 0000000..7f4f063
--- /dev/null
@@ -0,0 +1,65 @@
+pub static LISTS: &str = "member(X, [X|_]).
+                          member(X, [_|Xs]) :- member(X, Xs).
+                          
+                          select(X, [X|Xs], Xs).
+                          select(X, [Y|Xs], [Y|Ys]) :- select(X, Xs, Ys).
+                          
+                          append([], R, R).
+                          append([X|L], R, [X|S]) :- append(L, R, S).
+                          
+                          once(G) :- G, !.
+                          
+                          memberchk(X, Xs) :- member(X, Xs), !.
+                          
+                          reverse(Xs, Ys) :- reverse(Xs, [], Ys).
+                          
+                          reverse([], Ys, Ys) :- !.
+                          reverse([H|T], Ps, Rs) :-
+                              reverse(T, [H|Ps], Rs).
+                          
+                          between(Lower, Upper, Lower) :-
+                             Lower =< Upper.
+                          between(Lower1, Upper, X) :-
+                             Lower1 < Upper,
+                             Lower2 is Lower1 + 1,
+                             between(Lower2, Upper, X).
+                          
+                          maplist(_, []).
+                          maplist(Cont1, [E1|E1s]) :-
+                             call(Cont1, E1),
+                             maplist(Cont1, E1s).
+                          
+                          maplist(_, [], []).
+                          maplist(Cont2, [E1|E1s], [E2|E2s]) :-
+                             call(Cont2, E1, E2),
+                             maplist(Cont2, E1s, E2s).
+                          
+                          maplist(_, [], [], []).
+                          maplist(Cont3, [E1|E1s], [E2|E2s], [E3|E3s]) :-
+                             call(Cont3, E1, E2, E3),
+                             maplist(Cont3, E1s, E2s, E3s).
+                          
+                          maplist(_, [], [], [], []).
+                          maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s]) :-
+                             call(Cont, E1, E2, E3, E4),
+                             maplist(Cont, E1s, E2s, E3s, E4s).
+                          
+                          maplist(_, [], [], [], [], []).
+                          maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s]) :-
+                             call(Cont, E1, E2, E3, E4, E5),
+                             maplist(Cont, E1s, E2s, E3s, E4s, E5s).
+                          
+                          maplist(_, [], [], [], [], [], []).
+                          maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s]) :-
+                             call(Cont, E1, E2, E3, E4, E5, E6),
+                             maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s).
+                          
+                          maplist(_, [], [], [], [], [], [], []).
+                          maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s]) :-
+                             call(Cont, E1, E2, E3, E4, E5, E6, E7),
+                             maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s).
+                          
+                          maplist(_, [], [], [], [], [], [], [], []).
+                          maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :-
+                             call(Cont, E1, E2, E3, E4, E5, E6, E7),
+                             maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s).";         
diff --git a/src/prolog/lib/mod.rs b/src/prolog/lib/mod.rs
new file mode 100644 (file)
index 0000000..ea55801
--- /dev/null
@@ -0,0 +1 @@
+pub mod lists;