MAYBE Initial complexity problem: 1: T: (?, 1) f1(a, b, c, d, e, f, g, h, i) -> f1(a, b, k, l, j, m, g, h, i) [ j >= 1 /\ b >= a + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h, i) -> f1(a, b, k, l, j, m, g, h, i) [ 0 >= j + 1 /\ b >= a + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h, i) -> f1(a, b, k, l, 0, f, g, h, i) [ b >= a + 1 ] (?, 1) f1(a, b, c, d, e, f, g, h, i) -> f300(a, b, k, l, e, f, j, h, i) [ a >= b ] (1, 1) f2(a, b, c, d, e, f, g, h, i) -> f1(a, b, c, d, e, f, g, k, l) 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) [ a >= b ] (?, 1) f1(a, b) -> f1(a, b) [ b >= a + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ 0 >= j + 1 /\ b >= a + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ j >= 1 /\ b >= a + 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) [ b >= a + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ 0 >= j + 1 /\ b >= a + 1 ] (?, 1) f1(a, b) -> f1(a, b) [ j >= 1 /\ b >= a + 1 ] start location: f2 leaf cost: 1 Complexity upper bound ? Time: 0.146 sec (SMT: 0.136 sec)