construct_pack_table @1, @2, @3 call a query_pack_try
@1: call b call c query_pack_prune
@2: call d query_pack_prune query_pack_prune Figure 6: Abstract machine code for a, (b,c or d or e) .

the set of all refinements of a given query, i.e., it does not correspond to the whole hypothesis space. From a query pack Q containing all queries in S, a derived pack Q ′ is constructed by adding a report_success/2 literal to each leaf of the pack; the (procedural) task of report success(K,i) is simply to add (K,i) to the result set R.  Obviously a specific ILP system not interested in the result set itself could provide its own report_success/2 predicate and thus avoid the overhead of explicitly building the result set. 1 1 2 4 5 6 7 8 g 10 11 12 13
}
evaluate(set of examples E, pack Q, key K) {
Q' ← Q:
q ← 1 ;
for each leaf of Q' do {
add report_success(K, q) to the right of the conjunction in the leaf increment q C ← (evaluate_pack(K) :- Q');
compile and load(C);
for each example e in E do {
evaluate_pack(e);
Figure 7: Using query packs to compute the result set.

Note that the algorithm in Figure 7 follows the strategy of running all queries for each single example before moving on to the next example: this could be called the "examples in outer loop" strategy, as opposed to the "queries in outer loop" strategy used by most ILP