Adding and Subtracting Negative Integers

The Adding and Subtracting script in the Examples section constructs a transducer, PlusMinusOne, for adding to and subtracting one from a positive integer. For example, with PlusMinusOne on the stack, the command apply up 9 returns 10; and apply down 10 returns 9. The apply up commands works for positive integers of any size but the apply down command does not yield any output for numbers smaller that 1.

The Task: Using the Adding and Subtracting script as a model, construct a transducer that works for zero and the infinite set of negative integers. The result, call it PlusMinusOneNeg, should yield the results below:

apply down 0
-1

apply up -1
0

apply up -1000
-999

apply down -1000
-1001

etc.

When all is done, see if you can improve the original Adding and Subtracting script to produce a single transducer that handles both positive and negative integers with zero.

Hint: This is not as straight-forward as it may seem. Just combining the positive PlusMinusOne network with the negative one by composition will not have the intended effect because the zero in the middle gets lost and 1 maps directly to -1, and vice versa. One solution is to operate initially with two stand-in zeros, say +0 and -0. When everything else is done, the two temporary zeros can be replaced with the real zero using the substitute symbol command:

substitute symbol "0" for "+0"
substitute symbol "0" for "-0"