Edit: just looking at it I'm pretty sure this language is Turing complete, I can't see any reason why it wouldn't be
Bitwise operators are another. A & B, A | B, A << B, A >> B are all in general not invertible given the output and B. (e.g. A | 1 = 1, is A 0 or 1?)
Now I haven't looked at the language in detail, maybe there's a way around this, but it sounds like if truly every single operation is invertible, then there would be no way to calculate these simple functions.
The actual % operator in this language is defined as (x, y) -> (y, x / y, x % y), acting as a divmod. The + and - operators are defined as (x, y) -> (x + y, y) and (x, y) -> (x - y, y). And so on, making sure enough inputs are left on the stack to reconstruct the others.
I'm not clever enough to write the solution, but I imagine a loop using the branching operators (<, >, v, ^). Since each time through the loop pushes a bit onto the control stack, you have a built-in count for the number of times the loop was traversed.
In the example of 12 mod 4, the program would loop through 3 times and break once giving you 0001 (or 1110) on the control stack and something like 12, 8, 4, 0 on the stack. Then when reversing, control bits would be popped off and you'd end up going back 0, 4, 8, 12.
Quantum computing suffer from the same problem. There you use the CNOT gate for example, because XOR is not reversible
Some pointers
https://en.wikipedia.org/wiki/Controlled_NOT_gate
https://en.wikipedia.org/wiki/Reversible_computing#Logical_r...
https://physics.stackexchange.com/questions/270266/why-do-qu...