# LOOP (programming language)

LOOP is a programming language designed by Uwe Schöning, along with GOTO and WHILE. The only operations supported in the language are assignment, addition and looping.

The key property of the LOOP language is that the functions it can compute are exactly the primitive recursive functions.[1]

## Features

Each primitive recursive function is LOOP-computable and vice versa.[2]

In contrast to GOTO programs and WHILE programs, LOOP programs always terminate.[3] Therefore, the set of functions computable by LOOP-programs is a proper subset of computable functions (and thus a subset of the computable by WHILE and GOTO program functions).[4]

An example of a total computable function that is not LOOP computable is the Ackermann function.[5]

## Formal definition

### Syntax

LOOP-programs consist of the symbols LOOP, DO, END, :=, +, - and ; as well as any number of variables and constants. LOOP-programs have the following syntax in modified Backus–Naur form:

${\displaystyle {\begin{array}{lrl}P&:=&x_{i}:=x_{j}+c\\&|&x_{i}:=x_{j}-c\\&|&P;P\\&|&{\mathtt {LOOP}}\,x_{i}\,{\mathtt {DO}}\,P\,{\mathtt {END}}\end{array}}}$

Here, ${\displaystyle Var:=\{x_{0},x_{1},...\}}$ are variable names and ${\displaystyle c\in \mathbb {N} }$ are constants.

### Semantics

If P is a LOOP program, P is equivalent to a function ${\displaystyle f:\mathbb {N} ^{k}\rightarrow \mathbb {N} }$. The variables ${\displaystyle x_{1}}$ through ${\displaystyle x_{k}}$ in a LOOP program correspond to the arguments of the function ${\displaystyle f}$, and are initialized before program execution with the appropriate values. All other variables are given the initial value zero. The variable ${\displaystyle x_{0}}$ corresponds to the value that ${\displaystyle f}$ takes when given the argument values from ${\displaystyle x_{1}}$ through ${\displaystyle x_{k}}$.

A statement of the form

x0 := x1 + c


means the value of the constant ${\displaystyle c}$ is added to the value of the variable ${\displaystyle x_{1}}$, and the result is set as the value of the variable ${\displaystyle x_{0}}$. ${\displaystyle c}$ can have the value zero, which allows the value of one variable to be assigned to another variable:

x0 := x1 + 0


A statement of the form

x0 := x1 - c


means the value of the constant ${\displaystyle c}$ is subtracted from the value of the variable ${\displaystyle x_{1}}$, and the result is set as the value of the variable ${\displaystyle x_{0}}$. Negative numbers aren't allowed, and are replaced by zeros.

Variables are allowed to be simultaneously on the left and right side of an assignment. A statement of the form:

x1: = x1 + c


for example, adds the value of the constant ${\displaystyle c}$ to the variable ${\displaystyle x_{1}}$.

A statement of the form

P1; P2


represents the sequential execution of sub-programs ${\displaystyle P_{1}}$ and ${\displaystyle P_{2}}$, in that order.

A statement of the form

LOOP x DO P END


means the repeated execution of the partial program ${\displaystyle P}$ a total of ${\displaystyle x}$ times, where the value that ${\displaystyle x}$ has at the beginning of the execution of the statement is used. Even if ${\displaystyle P}$ changes the value of ${\displaystyle x}$, it won't affect how many times ${\displaystyle P}$ is executed in the loop. If ${\displaystyle x}$ has the value zero, then ${\displaystyle P}$ is not executed inside the LOOP statement. This allows for branches in LOOP programs, where the conditional execution of a partial program depends on whether a variable has value zero or one.

## Example Programs

In the following program, the variable ${\displaystyle x_{0}}$ is set to the sum of the variables ${\displaystyle x_{1}}$ and ${\displaystyle x_{2}}$.

x0 := x1 + 0;
LOOP x2 DO
x0 := x0 + 1
END


${\displaystyle x_{0}}$ is first assigned the value of ${\displaystyle x_{1}}$. Then, ${\displaystyle x_{0}}$ is incremented a total of ${\displaystyle x_{2}}$ times by the LOOP statement. This program can be used as a subroutine in other LOOP programs. The LOOP syntax can be extended with the following statement, equivalent to calling the above as a subroutine:

x0 := x1 + x2


### Multiplication

The following LOOP program sets the value of the variable ${\displaystyle x_{0}}$ to the product of the variables ${\displaystyle x_{1}}$ and ${\displaystyle x_{2}}$.

LOOP x1 DO
x0 := x0 + x2
END


This multiplication program uses the syntax introduced by the addition subroutine from the previous example. The multiplication is performed here by adding the value of ${\displaystyle x_{2}}$ a total of ${\displaystyle x_{1}}$ times, storing results in ${\displaystyle x_{0}}$.

### If then else

An if-then-else statement with if x1 > c then P1 else P2:

xn1:=x1-c; xn2:=0; xn3:=1;
LOOP xn1 DO
xn2 := 1
xn3 := 0
END;
LOOP xn2 DO
P1
END;
LOOP xn3 DO
P2
END;