YAP 7.1.0
tabling.yap
1:- system_module( '$_tabling', [abolish_table/1,
2 global_trie_statistics/0,
4 show_all_local_tables/0,
5 show_all_tables/0,
6 show_global_trie/0,
8 show_table/2,
9 show_tabled_predicates/0,
10 (table)/1,
12 table_statistics/2,
14 tabling_statistics/0,
15 tabling_statistics/2], []).
16
17:- '$do_error'/2use_system_module( '$_errors', []).
18
19/** @defgroup Tabling Tabling
20@ingroup extensions
21@{
22
23 *YAPTab* is the tabling engine that extends YAP's execution
24model to support tabled evaluation for definite programs. YAPTab was
25implemented by Ricardo Rocha and its implementation is largely based
26on the ground-breaking design of the XSB Prolog system, which
27implements the SLG-WAM. Tables are implemented using tries and YAPTab
28supports the dynamic intermixing of batched scheduling and local
29scheduling at the subgoal level. Currently, the following restrictions
30are of note:
31
32+ YAPTab does not handle tabled predicates with loops through negation (undefined behaviour).
33+ YAPTab does not handle tabled predicates with cuts (undefined behaviour).
34+ YAPTab does not support coroutining (configure error).
35+ YAPTab does not support tabling dynamic predicates (permission error).
36
37
38To experiment with YAPTab use `--enable-tabling` in the configure
39script or add `-DTABLING` to `YAP_EXTRAS` in the system's
40`Makefile`. We next describe the set of built-ins predicates
41designed to interact with YAPTab and control tabled execution:
42
43
44*/
45
46/*
47%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48%% %%
49%% The YapTab/YapOr/OPTYap systems %%
50%% %%
51%% YapTab extends the Yap Prolog engine to support sequential tabling %%
52%% YapOr extends the Yap Prolog engine to support or-parallelism %%
53%% OPTYap extends the Yap Prolog engine to support or-parallel tabling %%
54%% %%
55%% %%
56%% Yap Prolog was developed at University of Porto, Portugal %%
57%% %%
58%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59*/
60
61/**
62YapTab extends the Yap Prolog engine to support sequential tabling. YapOr extends the Yap Prolog engine to support or-parallelism. YapOr extends the Yap Prolog engine to support or-parallelism.
63*/
64
65
66/** @pred abolish_table(+ _P_)
67
68
69Removes all the entries from the table space for predicate _P_ (or
70a list of predicates _P1_,..., _Pn_ or
71[ _P1_,..., _Pn_]). The predicate remains as a tabled predicate.
72
73
74*/
75/** @pred is_tabled(+ _P_)
76
77
78Succeeds if the predicate _P_ (or a list of predicates
79 _P1_,..., _Pn_ or [ _P1_,..., _Pn_]), of the form
80 _name/arity_, is a tabled predicate.
81
82
83*/
84/** @pred show_table(+ _P_)
85
86
87Prints table contents (subgoals and answers) for predicate _P_
88(or a list of predicates _P1_,..., _Pn_ or
89[ _P1_,..., _Pn_]).
90
91
92*/
93/** @pred table( + _P_ )
94
95
96Declares predicate _P_ (or a list of predicates
97 _P1_,..., _Pn_ or [ _P1_,..., _Pn_]) as a tabled
98predicate. _P_ must be written in the form
99 _name/arity_. Examples:
100
101```
102:- table son/3.
103:- table father/2.
104:- table mother/2.
105```
106 or
107
108```
109:- table son/3, father/2, mother/2.
110```
111 or
112
113```
114:- table [son/3, father/2, mother/2].
115```
116
117
118*/
119/** @pred table_statistics(+ _P_)
120
121
122Prints table statistics (subgoals and answers) for predicate _P_
123(or a list of predicates _P1_,..., _Pn_ or
124[ _P1_,..., _Pn_]).
125
126
127*/
128/** @pred tabling_mode(+ _P_,? _Mode_)
129
130
131Sets or reads the default tabling mode for a tabled predicate _P_
132(or a list of predicates _P1_,..., _Pn_ or
133[ _P1_,..., _Pn_]). The list of _Mode_ options includes:
134
135+ `batched`
136
137 Defines that, by default, batched scheduling is the scheduling
138strategy to be used to evaluated calls to predicate _P_.
139
140+ `local`
141
142 Defines that, by default, local scheduling is the scheduling
143strategy to be used to evaluated calls to predicate _P_.
144
145+ `exec_answers`
146
147 Defines that, by default, when a call to predicate _P_ is
148already evaluated (completed), answers are obtained by executing
149compiled WAM-like code directly from the trie data
150structure. This reduces the loading time when backtracking, but
151the order in which answers are obtained is undefined.
152
153+ `load_answers`
154
155 Defines that, by default, when a call to predicate _P_ is
156already evaluated (completed), answers are obtained (as a
157consumer) by loading them from the trie data structure. This
158guarantees that answers are obtained in the same order as they
159were found. Somewhat less efficient but creates less choice-points.
160
161The default tabling mode for a new tabled predicate is `batched`
162and `exec_answers`. To set the tabling mode for all predicates at
163once you can use the yap_flag/2 predicate as described next.
164
165*/
166:- meta_predicate
167 table(:),
168 is_tabled(:),
169 tabling_mode(:,?),
170 abolish_table(:),
171 show_table(:),
172 show_table(?,:),
174 table_statistics(?,:).
175
176
177
178%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
179%% show_tabled_predicates/0 %%
180%% show_global_trie/0 %%
181%% show_all_tables/0 %%
182%% show_all_local_tables/0 %%
183%% global_trie_statistics/0 %%
184%% tabling_statistics/0 %%
185%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186
187table_statistics :-
188 current_output(Stream),
189 show_tabled_predicates(Stream).
190
191show_tabled_predicates :-
192 current_output(Stream),
193 show_global_trie(Stream).
194
195show_global_trie :-
196 current_output(Stream),
197 show_all_tables(Stream).
198
199show_all_tables :-
200 current_output(Stream),
201 show_all_local_tables(Stream).
202
203show_all_local_tables :-
204 current_output(Stream),
205 global_trie_statistics(Stream).
206
207/** @pred tabling_statistics/0
208
209
210Prints statistics on space used by all tables.
211
212
213
214 */
215global_trie_statistics :-
216 current_output(Stream),
217 tabling_statistics(Stream).
218
219
220
221%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
222%% tabling_statistics/2 %%
223%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224
225%% should match with code in OPTYap/opt.preds.c
226tabling_statistics(total_memory,[BytesInUse,BytesAllocated]) :-
227 '$c_get_optyap_statistics'(0,BytesInUse,BytesAllocated).
228tabling_statistics(table_entries,[BytesInUse,StructsInUse]) :-
229 '$c_get_optyap_statistics'(1,BytesInUse,StructsInUse).
230tabling_statistics(subgoal_frames,[BytesInUse,StructsInUse]) :-
231 '$c_get_optyap_statistics'(2,BytesInUse,StructsInUse).
232tabling_statistics(dependency_frames,[BytesInUse,StructsInUse]) :-
233 '$c_get_optyap_statistics'(3,BytesInUse,StructsInUse).
234tabling_statistics(subgoal_trie_nodes,[BytesInUse,StructsInUse]) :-
235 '$c_get_optyap_statistics'(6,BytesInUse,StructsInUse).
236tabling_statistics(answer_trie_nodes,[BytesInUse,StructsInUse]) :-
237 '$c_get_optyap_statistics'(7,BytesInUse,StructsInUse).
238tabling_statistics(subgoal_trie_hashes,[BytesInUse,StructsInUse]) :-
239 '$c_get_optyap_statistics'(8,BytesInUse,StructsInUse).
240tabling_statistics(answer_trie_hashes,[BytesInUse,StructsInUse]) :-
241 '$c_get_optyap_statistics'(9,BytesInUse,StructsInUse).
242tabling_statistics(global_trie_nodes,[BytesInUse,StructsInUse]) :-
243 '$c_get_optyap_statistics'(10,BytesInUse,StructsInUse).
244tabling_statistics(global_trie_hashes,[BytesInUse,StructsInUse]) :-
245 '$c_get_optyap_statistics'(11,BytesInUse,StructsInUse).
246tabling_statistics(subgoal_entries,[BytesInUse,StructsInUse]) :-
247 '$c_get_optyap_statistics'(16,BytesInUse,StructsInUse).
248tabling_statistics(answer_ref_nodes,[BytesInUse,StructsInUse]) :-
249 '$c_get_optyap_statistics'(17,BytesInUse,StructsInUse).
250
251
252
253%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254%% table/1 %%
255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256
257table(Pred) :-
258 '$current_module'(Mod),
259 '$do_table'(Mod,Pred).
260
261'$do_table'(Mod,Pred) :-
262 var(Pred), var,
263 '$do_error'(instantiation_error,table(Mod:Pred)).
264'$do_table'(_,Mod:Pred) :- '$do_table',
265 '$do_table'(Mod,Pred).
266'$do_table'(_,[]) :- '$do_table'.
267'$do_table'(Mod,[HPred|TPred]) :- '$do_table',
268 '$do_table'(Mod,HPred),
269 '$do_table'(Mod,TPred).
270'$do_table'(Mod,(Pred1,Pred2)) :- '$do_table',
271 '$do_table'(Mod,Pred1),
272 '$do_table'(Mod,Pred2).
273'$do_table'(Mod,PredName/PredArity) :-
274 atom(PredName),
275 integer(PredArity),
276 functor(PredFunctor,PredName,PredArity), functor,
277 '$set_table'(Mod,PredFunctor,[]).
278'$do_table'(Mod,PredDeclaration) :-
279 PredDeclaration=..[PredName|PredList],
280 '$transl_to_mode_list'(PredList,PredModeList,PredArity),
281 functor(PredFunctor,PredName,PredArity), functor,
282 '$set_table'(Mod,PredFunctor,PredModeList).
283'$do_table'(Mod,Pred) :-
284 '$do_pi_error'(type_error(callable,Pred),table(Mod:Pred)).
285
286'$set_table'(Mod,PredFunctor,_PredModeList) :-
287 '$undefined'('$c_table'(_,_,_),prolog), '$undefined',
288 functor(PredFunctor, PredName, PredArity),
289 '$do_error'(resource_error(tabling,Mod:PredName/PredArity),table(Mod:PredName/PredArity)).
290'$set_table'(Mod,PredFunctor,PredModeList) :-
291 '$undefined'(PredFunctor,Mod), '$undefined',
292 '$c_table'(Mod,PredFunctor,PredModeList).
293'$set_table'(Mod,PredFunctor,_PredModeList) :-
294 '$predicate_flags'(PredFunctor,Mod,Flags,Flags),
295 Flags /\ 0'$predicate_flags' =:= 0'$predicate_flags', '$predicate_flags'.
296'$set_table'(Mod,PredFunctor,PredModeList) :-
297 '$predicate_flags'(PredFunctor,Mod,Flags,Flags),
298 Flags /\ 0'$predicate_flags' =:= 0,
299 '$c_table'(Mod,PredFunctor,PredModeList), '$c_table'.
300'$set_table'(Mod,PredFunctor,_PredModeList) :-
301 functor(PredFunctor,PredName,PredArity),
302 '$do_error'(permission_error(modify,table,Mod:PredName/PredArity),table(Mod:PredName/PredArity)).
303
304'$transl_to_mode_list'([],[],0) :- '$transl_to_mode_list'.
305'$transl_to_mode_list'([TextualMode|L],[Mode|ModeList],Arity) :-
306 '$transl_to_mode_directed_tabling'(TextualMode,Mode),
307 '$transl_to_mode_list'(L,ModeList,ListArity),
308 Arity is ListArity + 1.
309
310%% should match with code in OPTYap/tab.macros.h
311'$transl_to_mode_directed_tabling'(index,1).
312'$transl_to_mode_directed_tabling'(min,2).
313'$transl_to_mode_directed_tabling'(max,3).
314'$transl_to_mode_directed_tabling'(all,4).
315'$transl_to_mode_directed_tabling'(sum,5).
316'$transl_to_mode_directed_tabling'(last,6).
317'$transl_to_mode_directed_tabling'(first,7).
318%% B-Prolog compatibility
319'$transl_to_mode_directed_tabling'(+,1).
320'$transl_to_mode_directed_tabling'(@,4).
321'$transl_to_mode_directed_tabling'(-,7).
322
323
324
325%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326%% is_tabled/1 %%
327%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
328
329is_tabled(Pred) :-
330 '$current_module'(Mod),
331 '$do_is_tabled'(Mod,Pred).
332
333'$do_is_tabled'(Mod,Pred) :-
334 var(Pred), var,
335 '$do_error'(instantiation_error,is_tabled(Mod:Pred)).
336'$do_is_tabled'(_,Mod:Pred) :- '$do_is_tabled',
337 '$do_is_tabled'(Mod,Pred).
338'$do_is_tabled'(_,[]) :- '$do_is_tabled'.
339'$do_is_tabled'(Mod,[HPred|TPred]) :- '$do_is_tabled',
340 '$do_is_tabled'(Mod,HPred),
341 '$do_is_tabled'(Mod,TPred).
342'$do_is_tabled'(Mod,(Pred1,Pred2)) :- '$do_is_tabled',
343 '$do_is_tabled'(Mod,Pred1),
344 '$do_is_tabled'(Mod,Pred2).
345'$do_is_tabled'(Mod,PredName/PredArity) :-
346 atom(PredName),
347 integer(PredArity),
348 functor(PredFunctor,PredName,PredArity),
349 '$predicate_flags'(PredFunctor,Mod,Flags,Flags), '$predicate_flags',
350 Flags /\ 0'$predicate_flags' =\= 0.
351'$do_is_tabled'(Mod,Pred) :-
352 '$do_pi_error'(type_error(callable,Pred),is_tabled(Mod:Pred)).
353
354
355
356%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
357%% tabling_mode/2 %%
358%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
359
360tabling_mode(Pred,Options) :-
361 '$current_module'(Mod),
362 '$do_tabling_mode'(Mod,Pred,Options).
363
364'$do_tabling_mode'(Mod,Pred,Options) :-
365 var(Pred), var,
366 '$do_error'(instantiation_error,tabling_mode(Mod:Pred,Options)).
367'$do_tabling_mode'(_,Mod:Pred,Options) :- '$do_tabling_mode',
368 '$do_tabling_mode'(Mod,Pred,Options).
369'$do_tabling_mode'(_,[],_) :- '$do_tabling_mode'.
370'$do_tabling_mode'(Mod,[HPred|TPred],Options) :- '$do_tabling_mode',
371 '$do_tabling_mode'(Mod,HPred,Options),
372 '$do_tabling_mode'(Mod,TPred,Options).
373'$do_tabling_mode'(Mod,(Pred1,Pred2),Options) :- '$do_tabling_mode',
374 '$do_tabling_mode'(Mod,Pred1,Options),
375 '$do_tabling_mode'(Mod,Pred2,Options).
376'$do_tabling_mode'(Mod,PredName/PredArity,Options) :-
377 atom(PredName),
378 integer(PredArity),
379 functor(PredFunctor,PredName,PredArity),
380 '$predicate_flags'(PredFunctor,Mod,Flags,Flags), '$predicate_flags',
381 (
382 Flags /\ 0x000040 =\= 0, !, '$set_tabling_mode'(Mod,PredFunctor,Options)
383 ;
384 '$do_error'(domain_error(table,Mod:PredName/PredArity),tabling_mode(Mod:PredName/PredArity,Options))
385 ).
386'$do_tabling_mode'(Mod,Pred,Options) :-
387 '$do_pi_error'(type_error(callable,Pred),tabling_mode(Mod:Pred,Options)).
388
389'$set_tabling_mode'(Mod,PredFunctor,Options) :-
390 var(Options), var,
391 '$c_tabling_mode'(Mod,PredFunctor,Options).
392'$set_tabling_mode'(_,_,[]) :- '$set_tabling_mode'.
393'$set_tabling_mode'(Mod,PredFunctor,[HOption|TOption]) :- '$set_tabling_mode',
394 '$set_tabling_mode'(Mod,PredFunctor,HOption),
395 '$set_tabling_mode'(Mod,PredFunctor,TOption).
396'$set_tabling_mode'(Mod,PredFunctor,(Option1,Option2)) :- '$set_tabling_mode',
397 '$set_tabling_mode'(Mod,PredFunctor,Option1),
398 '$set_tabling_mode'(Mod,PredFunctor,Option2).
399'$set_tabling_mode'(Mod,PredFunctor,Option) :-
400 '$transl_to_pred_flag_tabling_mode'(Flag,Option), '$transl_to_pred_flag_tabling_mode',
401 '$c_tabling_mode'(Mod,PredFunctor,Flag).
402'$set_tabling_mode'(Mod,PredFunctor,Options) :-
403 functor(PredFunctor,PredName,PredArity),
404 '$do_error'(domain_error(flag_value,tabling_mode+Options),tabling_mode(Mod:PredName/PredArity,Options)).
405
406%% should match with code in OPTYap/opt.preds.c
407'$transl_to_pred_flag_tabling_mode'(1,batched).
408'$transl_to_pred_flag_tabling_mode'(2,local).
409'$transl_to_pred_flag_tabling_mode'(3,exec_answers).
410'$transl_to_pred_flag_tabling_mode'(4,load_answers).
411'$transl_to_pred_flag_tabling_mode'(5,local_trie).
412'$transl_to_pred_flag_tabling_mode'(6,global_trie).
413'$transl_to_pred_flag_tabling_mode'(7,coinductive).
414
415
416
417%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
418%% abolish_table/1 %%
419%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
420
421abolish_table(Pred) :-
422 '$current_module'(Mod),
423 '$do_abolish_table'(Mod,Pred).
424
425'$do_abolish_table'(Mod,Pred) :-
426 var(Pred), var,
427 '$do_error'(instantiation_error,abolish_table(Mod:Pred)).
428'$do_abolish_table'(_,Mod:Pred) :- '$do_abolish_table',
429 '$do_abolish_table'(Mod,Pred).
430'$do_abolish_table'(_,[]) :- '$do_abolish_table'.
431'$do_abolish_table'(Mod,[HPred|TPred]) :- '$do_abolish_table',
432 '$do_abolish_table'(Mod,HPred),
433 '$do_abolish_table'(Mod,TPred).
434'$do_abolish_table'(Mod,(Pred1,Pred2)) :- '$do_abolish_table',
435 '$do_abolish_table'(Mod,Pred1),
436 '$do_abolish_table'(Mod,Pred2).
437'$do_abolish_table'(Mod,PredName/PredArity) :-
438 atom(PredName),
439 integer(PredArity),
440 functor(PredFunctor,PredName,PredArity),
441 '$predicate_flags'(PredFunctor,Mod,Flags,Flags), '$predicate_flags',
442 (
443 Flags /\ 0x000040 =\= 0, !, '$c_abolish_table'(Mod,PredFunctor)
444 ;
445 '$do_error'(domain_error(table,Mod:PredName/PredArity),abolish_table(Mod:PredName/PredArity))
446 ).
447'$do_abolish_table'(Mod,Pred) :-
448 '$do_pi_error'(type_error(callable,Pred),abolish_table(Mod:Pred)).
449
450
451
452%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
453%% show_table/1 %%
454%% show_table/2 %%
455%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
456
457show_table(Pred) :-
458 current_output(Stream),
459 show_table(Stream,Pred).
460
461show_table(Stream,Pred) :-
462 '$current_module'(Mod),
463 '$do_show_table'(Stream,Mod,Pred).
464
465'$do_show_table'(_,Mod,Pred) :-
466 var(Pred), var,
467 '$do_error'(instantiation_error,show_table(Mod:Pred)).
468'$do_show_table'(Stream,_,Mod:Pred) :- '$do_show_table',
469 '$do_show_table'(Stream,Mod,Pred).
470'$do_show_table'(_,_,[]) :- '$do_show_table'.
471'$do_show_table'(Stream,Mod,[HPred|TPred]) :- '$do_show_table',
472 '$do_show_table'(Stream,Mod,HPred),
473 '$do_show_table'(Stream,Mod,TPred).
474'$do_show_table'(Stream,Mod,(Pred1,Pred2)) :- '$do_show_table',
475 '$do_show_table'(Stream,Mod,Pred1),
476 '$do_show_table'(Stream,Mod,Pred2).
477'$do_show_table'(Stream,Mod,PredName/PredArity) :-
478 atom(PredName),
479 integer(PredArity),
480 functor(PredFunctor,PredName,PredArity),
481 '$predicate_flags'(PredFunctor,Mod,Flags,Flags), '$predicate_flags',
482 (
483 Flags /\ 0x000040 =\= 0, !, '$c_show_table'(Stream,Mod,PredFunctor)
484 ;
485 '$do_error'(domain_error(table,Mod:PredName/PredArity),show_table(Mod:PredName/PredArity))
486 ).
487'$do_show_table'(_,Mod,Pred) :-
488 '$do_pi_error'(type_error(callable,Pred),show_table(Mod:Pred)).
489
490
491
492%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
493%% table_statistics/1 %%
494%% table_statistics/2 %%
495%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
496
497table_statistics(Pred) :-
498 current_output(Stream),
499 table_statistics(Stream,Pred).
500
501table_statistics(Stream,Pred) :-
502 '$current_module'(Mod),
503 '$do_table_statistics'(Stream,Mod,Pred).
504
505'$do_table_statistics'(_,Mod,Pred) :-
506 var(Pred), var,
507 '$do_error'(instantiation_error,table_statistics(Mod:Pred)).
508'$do_table_statistics'(Stream,_,Mod:Pred) :- '$do_table_statistics',
509 '$do_table_statistics'(Stream,Mod,Pred).
510'$do_table_statistics'(_,_,[]) :- '$do_table_statistics'.
511'$do_table_statistics'(Stream,Mod,[HPred|TPred]) :- '$do_table_statistics',
512 '$do_table_statistics'(Stream,Mod,HPred),
513 '$do_table_statistics'(Stream,Mod,TPred).
514'$do_table_statistics'(Stream,Mod,(Pred1,Pred2)) :- '$do_table_statistics',
515 '$do_table_statistics'(Stream,Mod,Pred1),
516 '$do_table_statistics'(Stream,Mod,Pred2).
517'$do_table_statistics'(Stream,Mod,PredName/PredArity) :-
518 atom(PredName),
519 integer(PredArity),
520 functor(PredFunctor,PredName,PredArity),
521 '$predicate_flags'(PredFunctor,Mod,Flags,Flags), '$predicate_flags',
522 (
523 Flags /\ 0x000040 =\= 0, !, '$c_table_statistics'(Stream,Mod,PredFunctor)
524 ;
525 '$do_error'(domain_error(table,Mod:PredName/PredArity),table_statistics(Mod:PredName/PredArity))
526 ).
527'$do_table_statistics'(_,Mod,Pred) :-
528 '$do_pi_error'(type_error(callable,Pred),table_statistics(Mod:Pred)).
529
530%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
531
532/**
533@}
534*/
535
current_output(+ S)
YapTab extends the Yap Prolog engine to support sequential tabling.
is_tabled(+ P)
show_table(+ P)
table( + P )
table_statistics(+ P)
tabling_mode(+ P,? Mode)
atom( T)
functor( T, F, N)
integer( T)
var( T)