# Restricted BlooP/FlooP

Jump to navigation
Jump to search

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 `CELL`s 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.

## Contents

## Add two numbers

`Procedure codes` =

DEFINE PROCEDUREADD[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

`Procedure codes` =

DEFINE PROCEDUREPREDECESSOR[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

`Procedure codes` =

DEFINE PROCEDURESUBTRACT[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

`Procedure codes` =

DEFINE PROCEDUREEQUAL?[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

`Procedure codes` =

DEFINE PROCEDUREGREATER?[X,Y]: BEGIN: LOOP SUBTRACT[X,Y] TIMES: BEGIN: OUTPUT <- YES; END; END;