Consider a tabled evaluation when the query ?- a(0,X) is given to the following program
:- table mut_ret_a/2, mut_ret_b/2. mut_ret_a(X,Y) :- mut_ret_d(X,Y). mut_ret_a(X,Y) :- mut_ret_b(X,Z),mut_ret_c(Z,Y). mut_ret_b(X,Y) :- mut_ret_c(X,Y). mut_ret_b(X,Y) :- mut_ret_a(X,Z),mut_ret_d(Z,Y). mut_ret_c(2,2). mut_ret_c(3,3). mut_ret_d(0,1). mut_ret_d(1,2). mut_ret_d(2,3).mut_ret_a(0,1) can be derived immediately from the first clause of mut_ret_a/2. All other answers to the query depend on answers to the subgoal mut_ret_b(0,X) which arises in the evaluation of the second clause of mut_ret_a/2. Each answer to mut_ret_b(0,X) in turn depends on an answer to mut_ret_a(0,X), so that the evaluation switches back and forth between deriving answers for mut_ret_a(0,X) and mut_ret_b(0,X).
Try tracing this evaluation, using creep and skip. Do you find the behavior intuitive or not?