MAYBE Initial complexity problem: 1: T: (?, 1) f1(a, b, c, d, e, f, g, h) -> f1(a, b, j, i, k, f, g, h) [ i >= 1 /\ a >= b + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h) -> f1(a, b, j, i, k, f, g, h) [ 0 >= i + 1 /\ a >= b + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h) -> f1(a, b, j, 0, e, f, g, h) [ a >= b + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h) -> f300(a, b, j, d, e, i, g, h) [ b >= a ] (1, 1) f2(a, b, c, d, e, f, g, h) -> f1(a, b, c, d, e, f, j, j) start location: f2 leaf cost: 0 Slicing away variables that do not contribute to conditions from problem 1 leaves variables [a, b]. We thus obtain the following problem: 2: T: (1, 1) f2(a, b) -> f1(a, b) (?, 1) f1(a, b) -> f300(a, b) [ b >= a ] (?, 1) f1(a, b) -> f1(a, b) [ a >= b + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ 0 >= i + 1 /\ a >= b + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ i >= 1 /\ a >= b + 1 ] start location: f2 leaf cost: 0 Repeatedly removing leaves of the complexity graph in problem 2 produces the following problem: 3: T: (1, 1) f2(a, b) -> f1(a, b) (?, 1) f1(a, b) -> f1(a, b) [ a >= b + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ 0 >= i + 1 /\ a >= b + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ i >= 1 /\ a >= b + 1 ] start location: f2 leaf cost: 1 Complexity upper bound ? Time: 0.137 sec (SMT: 0.125 sec)