1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2% Tests for predicates which manipulate the clause database 3 4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 6 7% 8% List of test suites 9% 10 11test_suites([test_assert, test_retract]). 12 13 14% 15% assert/1 test (equivalent to assertz/1) 16% - ISO - 17% 18 19% Note that these tests have additional code in order to keep the 20% original state of the clause database after executing them 21 22:- dynamic db_assert_legs/2. 23 24db_assert_legs(A, 6) :- db_assert_insect(A). 25 26:- dynamic db_assert_insect/1. 27 28db_assert_insect(ant). 29db_assert_insect(bee). 30 31:- dynamic db_assert_foo/1. 32 33db_assert_foo(X) :- call(X), call(X). 34 35test_assert_1 :- assert(db_assert_legs(spider, 8)), db_assert_legs(spider, 8), 36 retract(db_assert_legs(spider, 8)). 37test_assert_2 :- assert(_). 38test_assert_3 :- assert(4). 39 40throws_exception(test_assert_2). 41throws_exception(test_assert_3). 42 43% The following tests don't work in Bousi-Prolog because assert/1 44% can't be used to assert new rules into the clause database 45% 46%test_assert_X1(B) :- assert((db_assert_legs(B, 2) :- db_assert_bird(B))). 47%test_assert_X2(X) :- assert((db_assert_foo(X) :- X -> call(X))). 48%test_assert_X3 :- assert((db_assert_foo :- 4)). 49%test_assert_X4 :- assert((atom(_) :- true)). 50% 51%throws_exception(test_assert_X3). 52%throws_exception(test_assert_X4). 53 54 55% 56% retract/1 test 57% - ISO - 58% 59 60% Note that these tests have additional code in order to keep the 61% original state of the clause database after executing them 62 63:- dynamic db_retract_legs/2. 64 65db_retract_legs(A, 4) :- db_retract_animal(A). 66db_retract_legs(octopus, 8). 67db_retract_legs(A, 6) :- db_retract_insect(A). 68db_retract_legs(spider, 8). 69db_retract_legs(B, 2) :- db_retract_bird(B). 70 71:- dynamic db_retract_insect/1. 72 73db_retract_insect(ant). 74db_retract_insect(bee). 75 76:- dynamic db_retract_foo/1. 77 78db_retract_foo(X) :- call(X), call(X). 79db_retract_foo(X) :- call(X) -> call(X). 80 81test_retract_1 :- retract(db_retract_legs(octopus, 8)), 82 not(db_retract_legs(octopus, 8)), 83 assert(db_retract_legs(octopus, 8)). 84test_retract_2 :- retract(db_retract_legs(spider, 6)), 85 not(db_retract_legs(spider, 6)), 86 assert(db_retract_legs(spider, 6)). 87test_retract_3 :- subtest_retract_3a ; subtest_retract_3b. 88subtest_retract_3a :- retract(db_retract_insect(I)), write(I), 89 retract(db_retract_insect(bee)), fail. 90subtest_retract_3b :- assert(db_retract_insect(ant)), 91 assert(db_retract_insect(bee)). 92 93% The following tests don't work in Bousi-Prolog because retract/1 94% can't be used to retract rules from the clause database 95% 96%test_retract_X1(X, T) :- retract((db_retract_legs(X, 2) :- T)). 97%test_retract_X2(X, Y) :- retract((db_retract_legs(X, Y) :- Z)). 98%test_retract_X3(A) :- retract((db_retract_foo(A) :- A, call(A))). 99%test_retract_X4(A, B) :- retract((db_retract_foo(A) :- A -> B)). 100%test_retract_X5(X, Y) :- retract((X :- in_eec(Y))). 101%test_retract_X6(X) :- retract((4 :- X)). 102%test_retract_X7(X) :- retract((atom(X) :- X == '[]')). 103% 104%throws_exception(test_retract_X5). 105%throws_exception(test_retract_X6). 106%throws_exception(test_retract_X7).