1:- table p/2. 2:- dynamic p/2. 3 4:- import abolish_table_call/1, abolish_table_pred/1, get_residual/2 from tables. 5 6test:- assert(p(a,b)), assert(p(a,c)),assert(p(b,c)),fail. 7test:- test1. 8test:- test2. 9test:- test3. 10test:- test4. 11test:- test5. 12test:- test6. 13test:- test7. 14test:- test8. 15test:- test9. 16test:- test10. 17test:- test11. 18test. 19 20gc_tables(N,N) :- 21 gc_tables(_). 22 23/* abolish and gc variant call */ 24test1:- p(a,X), abolish_table_call(p(a,X)),writeln(a1(X)),fail. 25test1:- gc_tables(0,N),writeln(N),fail. 26test1:- get_residual(p(a,X),_),writeln(a1_2(X)),fail. 27test1:- writeln('---------------'),fail. 28 29/* abolish and gc unifying call */ 30test2:- p(a,X), abolish_table_call(p(a,b)),writeln(a2(X)),fail. 31test2:- gc_tables(0,N),writeln(N),fail. 32test2:- get_residual(p(a,X),_),writeln(a2_2(X)),fail. 33test2:- writeln('---------------'),fail. 34 35/* make sure p(b,X) does not get abolished. */ 36test3:- p(b,X), abolish_table_call(p(a,b)),writeln(a3(X)),fail. 37test3:- gc_tables(0,N),writeln(N),fail. 38test3:- get_residual(p(b,X),_),writeln(a3_2(X)),fail. 39test3:- writeln('---------------'),fail. 40 41/* make sure p(b,X) does not get abolished. */ 42test4:- p(b,X), p(a,_),abolish_table_call(p(a,b)),writeln(a4(X)),fail. 43test4:- gc_tables(0,N),writeln(N),fail. 44test4:- get_residual(p(b,X),_),writeln(a4_2(X)),fail. 45test4:- get_residual(p(a,X),_),writeln(a4_3(X)),fail. 46test4:- writeln('---------------'),fail. 47 48/* Redundant abolish atc-v + atc-u */ 49test5:- p(a,X),abolish_table_call(p(a,b)), 50 abolish_table_call(p(a,X)),writeln(a5(X)),fail. 51test5:- gc_tables(0,N),writeln(N),fail. 52test5:- get_residual(p(b,X),_),writeln(a5_3(b,X)),fail. 53test5:- get_residual(p(a,X),_),writeln(a5_3(X)),fail. 54test5:- writeln('---------------'),fail. 55 56/* Redundant abolish atc + atp */ 57test6:- p(a,X),abolish_table_call(p(a,b)), 58 abolish_table_pred(p/2),writeln(a6(X)),fail. 59test6:- gc_tables(0,N),writeln(N),fail. 60test6:- get_residual(p(b,X),_),writeln(a6_3(b,X)),fail. 61test6:- get_residual(p(a,X),_),writeln(a6_3(X)),fail. 62test6:- writeln('---------------'),fail. 63 64/* Redundant abolish atp + atc */ 65test7:- p(a,X),abolish_table_pred(p/2),abolish_table_call(p(a,b)), 66 writeln(a7(X)),fail. 67test7:- gc_tables(0,N),writeln(N),fail. 68test7:- get_residual(p(a,X),_),writeln(a7_3(X)),fail. 69test7:- writeln('---------------'),fail. 70 71/* Redundant abolish atc-v + atc-v */ 72test8:- p(a,X),abolish_table_call(p(a,b)),abolish_table_call(p(a,b)), 73 writeln(a8(X)),fail. 74test8:- gc_tables(0,N),writeln(N),fail. 75test8:- get_residual(p(a,X),_),writeln(a8_3(X)),fail. 76test8:- writeln('---------------'),fail. 77 78/* check on safety of gc -- old subgoal */ 79test9:- p(a,X),abolish_table_call(p(a,b)), 80 writeln(a9(X)),fail. 81test9:- p(a,_X),gc_tables(0,N),writeln(N),fail. 82test9:- gc_tables(0,N),writeln(N),fail. 83test9:- get_residual(p(a,X),_),writeln(a9_3(X)),fail. 84test9:- writeln('---------------'),fail. 85 86/* check on safety of gc -- same subgoal */ 87test10:- p(a,X),abolish_table_call(p(a,b)), 88 (X==c->GC=1;GC=0), gc_tables(GC,N), writeln(a10(X,N)),fail. 89test10:- get_residual(p(a,X),_),writeln(a10_2(X)),fail. 90test10:- gc_tables(0,N),writeln(N),fail. 91test10:- get_residual(p(a,X),_),writeln(a10_3(X)),fail. 92test10:- writeln('---------------'),fail. 93 94/* check on safety of gc -- same table */ 95test11:- p(a,X),abolish_table_pred(p/2), 96 (X==c->GC=1;GC=0), gc_tables(GC,N), writeln(a11(X,N)),fail. 97test11:- get_residual(p(a,X),_),writeln(a11_2(X)),fail. 98test11:- gc_tables(0,N),writeln(N),fail. 99test11:- get_residual(p(a,X),_),writeln(a11_3(X)),fail. 100test11:- writeln('---------------'),fail. 101 102end_of_file. 103 104 105Proper output: 106 107| ?- test. 108Delaying abolish of call in use for: p/2 109a1(c) 110a1(b) 111Garbage Collecting Subgoal: p/2 1120 113--------------- 114Delaying abolish of call in use for: p/2 115a2(c) 116a2(b) 117Garbage Collecting Subgoal: p/2 1180 119--------------- 120a3(c) 1210 122a3_2(c) 123--------------- 124Delaying abolish of call in use for: p/2 125a4(c) 126a4(c) 127Garbage Collecting Subgoal: p/2 1280 129a4_2(c) 130--------------- 131Delaying abolish of call in use for: p/2 132a5(c) 133a5(b) 134Garbage Collecting Subgoal: p/2 1350 136a5_3(b,c) 137--------------- 138Delaying abolish of call in use for: p/2 139Delaying abolish of table in use: p/2 140Predicate over-riding subgoal for p/2 141a6(c) 142a6(b) 143Garbage Collecting Predicate: p/2 1440 145--------------- 146Delaying abolish of table in use: p/2 147a7(c) 148a7(b) 149Garbage Collecting Predicate: p/2 1500 151--------------- 152Delaying abolish of call in use for: p/2 153a8(c) 154a8(b) 155Garbage Collecting Subgoal: p/2 1560 157--------------- 158Delaying abolish of call in use for: p/2 159a9(c) 160a9(b) 161Garbage Collecting Subgoal: p/2 1620 1630 1640 165a9_3(c) 166a9_3(b) 167--------------- 168Delaying abolish of call in use for: p/2 169Skipping: p/2 170a10(c,1) 171Garbage Collecting Subgoal: p/2 172a10(b,0) 1730 174--------------- 175Delaying abolish of table in use: p/2 176Skipping: p/2 177a11(c,1) 178Garbage Collecting Predicate: p/2 179a11(b,0) 1800 181--------------- 182