From f1ac75f21dff4d3474df429e157d1af0d1a0cc07 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 14 Feb 2018 23:21:56 -0700 Subject: [PATCH] add (\=)/2. --- README.md | 1 + src/main.rs | 4 +++- src/prolog/ast.rs | 10 +++++----- src/prolog/lib/control.rs | 13 +++++++++++++ src/prolog/lib/lists.rs | 39 +++++++++++++++------------------------ src/prolog/lib/mod.rs | 2 ++ 6 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 src/prolog/lib/control.rs diff --git a/README.md b/README.md index 4d847d60..9934a22a 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ The following predicates are built-in to rusty-wam. * `(==)/2` * `(\==)/2` * `(=)/2` +* `(\=)/2` * `(=..)/2` * `(->)/2` * `(;)/2` diff --git a/src/main.rs b/src/main.rs index 62cde4ba..3b4a4900 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod prolog; #[macro_use] mod test_utils; use prolog::io::*; +use prolog::lib::control::*; use prolog::lib::lists::*; use prolog::machine::*; @@ -35,7 +36,8 @@ fn prolog_repl() { let mut wam = Machine::new(); load_init_str(&mut wam, LISTS); - + load_init_str(&mut wam, CONTROL); + loop { print!("prolog> "); diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 9ba74e2f..a6624592 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -390,13 +390,13 @@ impl CompareNumberQT { } #[derive(Clone, Copy)] -pub enum CompareTermQT { - GreaterThan, +pub enum CompareTermQT { LessThan, - GreaterThanOrEqual, LessThanOrEqual, - NotEqual, - Equal + Equal, + GreaterThanOrEqual, + GreaterThan, + NotEqual, } impl CompareTermQT { diff --git a/src/prolog/lib/control.rs b/src/prolog/lib/control.rs new file mode 100644 index 00000000..41ce18bf --- /dev/null +++ b/src/prolog/lib/control.rs @@ -0,0 +1,13 @@ +pub static CONTROL: &str = ":- op(700, xfx, \\=). + + once(G) :- G, !. + + \\=(X, X) :- !, false. + \\=(_, _). + + between(Lower, Upper, Lower) :- + Lower =< Upper. + between(Lower1, Upper, X) :- + Lower1 < Upper, + Lower2 is Lower1 + 1, + between(Lower2, Upper, X)."; diff --git a/src/prolog/lib/lists.rs b/src/prolog/lib/lists.rs index 7f4f063a..a584848a 100644 --- a/src/prolog/lib/lists.rs +++ b/src/prolog/lib/lists.rs @@ -1,65 +1,56 @@ 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([], 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)."; + maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s)."; diff --git a/src/prolog/lib/mod.rs b/src/prolog/lib/mod.rs index ea558018..21c58b2b 100644 --- a/src/prolog/lib/mod.rs +++ b/src/prolog/lib/mod.rs @@ -1 +1,3 @@ +pub mod control; pub mod lists; + -- 2.54.0