limit
Sometimes it is useful to limit an output relation to a fixed number of tuples.
One can achieve this in two different way with the use of the post-processing
annotations limit and prelimit as shown below.
@post("atomName", "limit(N)").
@post("atomName", "prelimit(N)").
In the snippet atomName is the name of the atom at hand and N the limit on the number of tuples.
The limit annotation acts just as limit in SQL: after populating the output relation and after
applying all additional post-processing operations, the relation is trimmed to the required size.
Consider for example the following program:
p(2).
p(4).
p(3).
p(7).
p(1).
q(X) :- p(X).
@output("q").
@post("q", "orderBy(1)").
@post("q", "limit(3)").
After transferring all tuples from relation p to relation q and after performing the required
ordering, the result of the execution will be
q(1).
q(2).
q(3).
In contrast, the prelimit annotation limits the number of tuples that are loaded into the
relation and only then the remaining post-processing annotations are applied. Consider for
example the following variant of the above program, wherein prelimit is used instead of limit.
p(2).
p(4).
p(3).
p(7).
p(1).
q(X) :- p(X).
@output("q").
@post("q", "orderBy(1)").
@post("q", "prelimit(3)").
After transferring the first three tuples from relation p to relation q
and after performing the required ordering, the result of the execution will be
q(2).
q(3).
q(4).
Note that unlike limit, which comes after reasoning and does not affect the program
execution, prelimit effectively terminates reasoning once the required number of tuples
have been loaded into the output relation.