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