Restricted BlooP/FlooP

This is a restricted kind of Douglas Hofstadter's BlooP/FlooP programming language. There is no primitive adding, multiplying, and comparing; there is no conditions and no tests; the only primitive is successor operation.

I use the convention that a question mark is just like a letter and that 1 is the same as YES and 0 is the same as NO. It is also assumed that CELLs are local to each procedure.

You can see how many things are not needed: IF AT MOST QUIT BLOCK ABORT LOOP addition multiplication comparison

Actually, the ABORT LOOP command will be needed inside of a MU-LOOP block. You can assume the command "ABORT LOOP;" aborts the innermost mu-loop.

Add two numbers
DEFINE PROCEDURE ADD [X,Y]: BEGIN: CELL(0) <- X;    LOOP Y TIMES: BEGIN: CELL(0) <- ^CELL(0); END; OUTPUT <- CELL(0); END;

Calculate the predecessor of a number
DEFINE PROCEDURE PREDECESSOR [X]: BEGIN: CELL(0) <- 0; CELL(1) <- 0; LOOP X TIMES: BEGIN: LOOP CELL(0) TIMES: BEGIN: CELL(1) <- ^CELL(1); END; CELL(0) <- 1; END; OUTPUT <- CELL(1); END;

Subtract two numbers
DEFINE PROCEDURE SUBTRACT [X,Y]: BEGIN: CELL(0) <- X;    LOOP Y TIMES: BEGIN: CELL(0) <- PREDECESSOR[CELL(0)]; END; OUTPUT <- CELL(0); END;

Check if one number is equal to another
DEFINE PROCEDURE EQUAL? [X,Y]: BEGIN: OUTPUT <- YES; LOOP ADD[SUBTRACT[X,Y],SUBTRACT[Y,X]] TIMES: BEGIN: OUTPUT <- NO; END; END;

Check if one number is greater than another
DEFINE PROCEDURE GREATER? [X,Y]: BEGIN: LOOP SUBTRACT[X,Y] TIMES: BEGIN: OUTPUT <- YES; END; END;