Here is a definition of a very simplistic programming language (it is not Turing complete). Input to a function is any natural number. The following functions are primitive to the language:
- (Successor) $s(x) = x + 1$
- (Divide) $d(x) = \lfloor \frac{x}{2} \rfloor$
Additionally, if $f, g$ are well-defined functions in the language, then the user may define a new function using one of the following four templates:
- (Plus) $p_{f,g}(x) = f(x) + g(x)$
- (Minus) $m_{f,g}(x) = \max(0, f(x) - g(x))$
- (Compose) $c_{f,g}(x) = f(g(x))$
- (Short Recursion) $r_{f,g}(x) = \underbrace{f(f( \dots f(x) \dots ))}_{g(\lfloor \log_2(x) \rfloor) times}$
A program consists of a series of function definitions by the programmer, the last of which is the "main" one to which the natural number input is received.
My question:
Can any of these language features be implemented using the other language features? In other words, is it possible to remove any of these items from the language definition without the language losing any computational power?
Making comments an answer.
Certainly, $(s\circ s-s)(x)=1$ for all $x$, so $s-(s\circ s-s)=i$. So Successor and Minus imply identity.
Also, Short Recursion, Minus, Successor and Identity imply Log, since:
$$r_{s,i}(x) = x+l(x)\implies(r_{s,i}-i)(x) = l(x)$$