Did you know ... | Search Documentation: |
Predicate table/1 |
Although table/1 is normally used as a directive, SWI-Prolog allows calling it as a runtime predicate to prepare an existing predicate for tabled execution. The predicate untable/1 can be used to remove the tabling instrumentation from a predicate.
The example below prepares the predicate edge/2 and the non-terminal statement//1 for tabled execution.
:- table edge/2, statement//1.
Below is an example declaring a predicate to use tabling with answer subsumption. Answer subsumption or mode directed tabling is discussed in section 7.3.
:- table connection(_,_,min).
Additional tabling options can be provided using a term as/2, which can be applied to a single specification or a comma list of specifications. The options themselves are a comma-list of one or more of the following atoms:
incremental
.
This syntax is closely related to the table declarations used in XSB
Prolog. Where in XSB as
is an operator with priority above
the priority of the comma, it is an operator with priority below the
comma in SWI-Prolog. Therefore, multiple predicates or options must be
enclosed in parenthesis. For example:
:- table p/1 as subsumptive. :- table (q/1, r/2) as subsumptive.
:- table c/2. c(F,T) :- c(F,I), c(F,T). c(F,T) :- c(T,F). c(a,b). c(b,c). c(e,f).
Now populate the table for c(a,T)
:
?- c(a,T). T = a ; ...
Now you can enumerate the table's content using get_call/2 and get_returns/3:
?- get_call(c(a,T), Trie, Template), get_returns(Trie, Template). T = a ; ...
Note that this gives the same results as just calling c(a,T)
. The table
inspection predicates are mostly used for debugging.