add (^) as an evaluable factor, re: #39
This commit is contained in:
71
src/tests.rs
71
src/tests.rs
@@ -1019,6 +1019,75 @@ fn test_queries_on_arithmetic()
|
||||
assert_prolog_success!(&mut wam, "?- f(5, Sum).", [["Sum = 33"]]);
|
||||
assert_prolog_success!(&mut wam, "?- f(5, 33).");
|
||||
assert_prolog_failure!(&mut wam, "?- f(5, 32).");
|
||||
|
||||
// exponentiation.
|
||||
|
||||
// the ~ operators tests whether |X - Y| <= 1/10000...
|
||||
// or whatever degree of approximation used by Newton's method in rational_pow.
|
||||
submit(&mut wam, ":- op(900, xfx, ~).");
|
||||
submit(&mut wam, "X ~ Y :- abs(X - Y) =< 1 rdiv 10000.");
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ 3.",
|
||||
[["X = 27"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ 0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ -0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ 1.",
|
||||
[["X = 3"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ -3.",
|
||||
[["X = 1/27"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ 3.",
|
||||
[["X = -27"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ 3.",
|
||||
[["X = -27"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ 0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ -0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ 1.",
|
||||
[["X = -3"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ -3.",
|
||||
[["X = -1/27"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (1 rdiv 27) ^ -3, X ~ 19683.");
|
||||
assert_prolog_success!(&mut wam, "?- X is (-1 rdiv 27) ^ -3, X ~ -19683.");
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X is 0.0 ^ 0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is 0.0 ^ -2342, error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is 0.0 ^ 2342.",
|
||||
[["X = 0"]]);
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is (-3) ^ (1 rdiv 2), error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is (-3/2) ^ (1 rdiv 2), error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is (-3 rdiv 2) ^ (1 rdiv 4), error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is (-3 rdiv 2) ^ (-1 rdiv 4), error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is 0 ^ (-5 rdiv 4), error(E, _), true).",
|
||||
[["E = evaluation_error(no_roots)"]]);
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X is 3 ^ (1 rdiv 3), Y is X ^ 3, Y ~ 3.");
|
||||
assert_prolog_success!(&mut wam, "?- X is (-3) ^ (1 rdiv 3), Y is X ^ 3, Y ~ -3.");
|
||||
assert_prolog_failure!(&mut wam, "?- X is (-5) ^ (1 rdiv 3), Y is X ^ 3, Y ~ -3.");
|
||||
assert_prolog_failure!(&mut wam, "?- X is 5 ^ (1 rdiv 3), Y is X ^ 3, Y ~ 3.");
|
||||
assert_prolog_failure!(&mut wam, "?- X is (1 rdiv 3) ^ 0.5, Y is X ^ 2, X ~ Y.");
|
||||
assert_prolog_success!(&mut wam, "?- X is (1 rdiv 3) ^ 0.5, Y is X ^ 2, 1 rdiv 3 ~ Y.");
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X is (-5) ^ (-1 rdiv 3), Y is X ^ 3, Y ~ -1 rdiv 5.");
|
||||
assert_prolog_failure!(&mut wam, "?- X is (-5) ^ (-1 rdiv 3), Y is X ^ 3, Y ~ 1 rdiv 5.");
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X is (0 rdiv 5) ^ 5.",
|
||||
[["X = 0"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (-0 rdiv 5) ^ 5.",
|
||||
[["X = 0"]]);
|
||||
assert_prolog_success!(&mut wam, "?- X is (0 rdiv 5) ^ 0.",
|
||||
[["X = 1"]]);
|
||||
assert_prolog_success!(&mut wam, "?- catch(_ is (0 rdiv 0) ^ 5, error(E, _), true).",
|
||||
[["E = evaluation_error(zero_divisor)"]]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1788,7 +1857,7 @@ fn test_queries_on_string_lists()
|
||||
assert_prolog_failure!(&mut wam, "?- matcher(\"abcdef\", Y).");
|
||||
|
||||
submit(&mut wam, "?- set_prolog_flag(double_quotes, chars).");
|
||||
|
||||
|
||||
assert_prolog_success!(&mut wam, "?- X = \"abc\", X = ['a' | Y], set_prolog_flag(double_quotes, atom).",
|
||||
[["X = \"abc\"", "Y = \"bc\""]]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user