plus(0, x) → x
plus(s(x), y) → s(plus(x, y))
times(0, y) → 0
times(s(x), y) → plus(y, times(x, y))
exp(x, 0) → s(0)
exp(x, s(y)) → times(x, exp(x, y))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
tower(x, y) → towerIter(0, x, y, s(0))
towerIter(c, x, y, z) → help(ge(c, x), c, x, y, z)
help(true, c, x, y, z) → z
help(false, c, x, y, z) → towerIter(s(c), x, y, exp(y, z))