From b761575f7fc4f8f6aa8fc924d211dbb5c31fc541 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 30 Jan 2018 01:00:46 -0700 Subject: [PATCH] add library routines for lists. --- src/prolog/lib/lists.rs | 65 +++++++++++++++++++++++++++++++++++++++++ src/prolog/lib/mod.rs | 1 + 2 files changed, 66 insertions(+) create mode 100644 src/prolog/lib/lists.rs create mode 100644 src/prolog/lib/mod.rs diff --git a/src/prolog/lib/lists.rs b/src/prolog/lib/lists.rs new file mode 100644 index 00000000..7f4f063a --- /dev/null +++ b/src/prolog/lib/lists.rs @@ -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 index 00000000..ea558018 --- /dev/null +++ b/src/prolog/lib/mod.rs @@ -0,0 +1 @@ +pub mod lists; -- 2.54.0