The system is accessible function passing by a sort ordering that equates all sorts. We start by computing the following initial DP problem: P1. (1) f#(true, x) => ack#(10, 10) (2) f#(true, x) => f#(ack(10, 10) >= x, x + 1) (3) ack#(x, y) => ackNat#(x >= 0 /\ y >= 0, x, y) (4) ackNat#(true, x, y) => cond1#(x = 0, x, y) (5) cond1#(false, x, y) => cond2#(y = 0, x, y) (6) cond2#(true, x, y) => ack#(x - 1, y + 1) (7) cond2#(false, x, y) => ack#(x, y - 1) (8) cond2#(false, x, y) => ack#(x - 1, ack(x, y - 1)) ***** We apply the Graph Processor on P1. There is only one SCC, so all DPs not inside the SCC can be removed: P2. (1) ack#(x, y) => ackNat#(x >= 0 /\ y >= 0, x, y) (2) ackNat#(true, x, y) => cond1#(x = 0, x, y) (3) cond1#(false, x, y) => cond2#(y = 0, x, y) (4) cond2#(true, x, y) => ack#(x - 1, y + 1) (5) cond2#(false, x, y) => ack#(x, y - 1) (6) cond2#(false, x, y) => ack#(x - 1, ack(x, y - 1)) ***** We apply the Theory Arguments Processor on P2. We use the following theory arguments function: ack# : [] ackNat# : [1, 2, 3] cond1# : [1, 2, 3] cond2# : [1, 2, 3] This yields the following new DP problems: P3. (1) ack#(x, y) => ackNat#(x >= 0 /\ y >= 0, x, y) (2) ackNat#(true, x, y) => cond1#(x = 0, x, y) { x, y } (3) cond1#(false, x, y) => cond2#(y = 0, x, y) { x, y } (4) cond2#(true, x, y) => ack#(x - 1, y + 1) { x, y } (5) cond2#(false, x, y) => ack#(x, y - 1) { x, y } (6) cond2#(false, x, y) => ack#(x - 1, ack(x, y - 1)) { x, y } P4. (1) ackNat#(true, x, y) => cond1#(x = 0, x, y) (2) cond1#(false, x, y) => cond2#(y = 0, x, y) (3) cond2#(true, x, y) => ack#(x - 1, y + 1) (4) cond2#(false, x, y) => ack#(x, y - 1) (5) cond2#(false, x, y) => ack#(x - 1, ack(x, y - 1)) ***** No progress could be made on DP problem P3.