Given a program P and query Q, the residual program for Q and P consists of all (conditional and unconditional) answers created in the complete evaluation of Q.
:- table ppgte_p/0,ppgte_q/0,ppgte_r/0,ppgte_s/0,
ppgte_t/0,ppgte_u/0,ppgte_v/0.
ppgte_p:- ppgte_q. ppgte_p:- ppgte_r.
ppgte_q:- ppgte_s. ppgte_r:- ppgte_u.
ppgte_q:- ppgte_t. ppgte_r:- ppgte_v.
ppgte_s:- ppgte_w. ppgte_u:- undefined.
ppgte_t:- ppgte_x. ppgte_v:- undefined.
ppgte_w:- ppgte(1). ppgte_x:- ppgte(0).
ppgte_w:- undefined. ppgte_x:- undefined.
ppgte(0).
:- table undefined/0.
undefined:- tnot(undefined).
Write a routine that uses get_residual/2 to print out the
residual program for the query ?- ppgte_p,fail. Try altering the
tabling declarations, in particular by making ppgte_q/0, ppgte_r/0, ppgte_s/0 and ppgte_t/0 non-tabled. What
effect does altering the tabling declarations have on the residual
program?When XSB returns a conditional answer to a literal L, it does not propagate the delay list of the conditional answer, but rather delays L itself, even if L does not occur in a negative loop. This has the advantage of ensuring that delayed literals are not propagated exponentially through conditional answers.