Jump to content
Wikipedia The Free Encyclopedia

LOOP (programming language)

From Wikipedia, the free encyclopedia
Programming language
For other uses, see LOOP.

LOOP is a simple register language that precisely captures the primitive recursive functions.[1] The language is derived from the counter-machine model. Like the counter machines the LOOP language comprises a set of one or more unbounded registers, each of which can hold a single non-negative integer. A few arithmetic instructions (like 'CleaR', 'INCrement', 'DECrement', 'CoPY', ...) operate on the registers. The only control flow instruction is 'LOOP x DO ... END'. It causes the instructions within its scope to be repeated x times. (Changes of the content of register x during the execution of the loop do not affect the number of passes.)

History

[edit ]

The LOOP language was formulated in a 1967 paper by Albert R. Meyer and Dennis M. Ritchie.[2] They showed the correspondence between the LOOP language and primitive recursive functions.

The language also was the topic of the unpublished PhD thesis of Ritchie.[3] [4]

It was also presented by Uwe Schöning, along with GOTO and WHILE.[5]

Design philosophy and features

[edit ]

In contrast to GOTO programs and WHILE programs, LOOP programs always terminate.[6] 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).[7]

Meyer & Ritchie proved that each primitive recursive function is LOOP-computable and vice versa.[2] [5]

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

Formal definition

[edit ]

Syntax

[edit ]

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:

P ::= x i := 0 | x i := x i + 1 | P ; P | L O O P x i D O P E N D {\displaystyle {\begin{array}{lrl}P&::=&x_{i}:=0\\&|&x_{i}:=x_{i}+1\\&|&P;P\\&|&{\mathtt {LOOP}},円x_{i},円{\mathtt {DO}},円P,円{\mathtt {END}}\end{array}}} {\displaystyle {\begin{array}{lrl}P&::=&x_{i}:=0\\&|&x_{i}:=x_{i}+1\\&|&P;P\\&|&{\mathtt {LOOP}},円x_{i},円{\mathtt {DO}},円P,円{\mathtt {END}}\end{array}}}

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

Semantics

[edit ]

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

A statement of the form

xi := 0

means the value of the variable x i {\displaystyle x_{i}} {\displaystyle x_{i}} is set to 0.

A statement of the form

xi := xi + 1

means the value of the variable x i {\displaystyle x_{i}} {\displaystyle x_{i}} is incremented by 1.

A statement of the form

P1; P2

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

A statement of the form

LOOP x DO P END

means the repeated execution of the partial program P {\displaystyle P} {\displaystyle P} a total of x {\displaystyle x} {\displaystyle x} times, where the value that x {\displaystyle x} {\displaystyle x} has at the beginning of the execution of the statement is used. Even if P {\displaystyle P} {\displaystyle P} changes the value of x {\displaystyle x} {\displaystyle x}, it won't affect how many times P {\displaystyle P} {\displaystyle P} is executed in the loop. If x {\displaystyle x} {\displaystyle x} has the value zero, then P {\displaystyle P} {\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.

Creating "convenience instructions"

[edit ]

From the base syntax one create "convenience instructions". These will not be subroutines in the conventional sense but rather LOOP programs created from the base syntax and given a mnemonic. In a formal sense, to use these programs one needs to either (i) "expand" them into the code  – they will require the use of temporary or "auxiliary" variables so this must be taken into account, or (ii) design the syntax with the instructions 'built in'.

Example

The k-ary projection function U i k ( x 1 , . . . , x i , . . . , x k ) = x i {\displaystyle U_{i}^{k}(x_{1},...,x_{i},...,x_{k})=x_{i}} {\displaystyle U_{i}^{k}(x_{1},...,x_{i},...,x_{k})=x_{i}} extracts the i-th coordinate from an ordered k-tuple.

In their seminal paper [2] Meyer & Ritchie made the assignment x j := x i {\displaystyle x_{j}:=x_{i}} {\displaystyle x_{j}:=x_{i}} a basic statement. As the example shows the assignment can be derived from the list of basic statements.

To create the assign {\displaystyle \operatorname {assign} } {\displaystyle \operatorname {assign} } instruction use the block of code below. x j := assign ( x i ) {\displaystyle x_{j}:=\operatorname {assign} (x_{i})} {\displaystyle x_{j}:=\operatorname {assign} (x_{i})} =equiv

xj := 0;
LOOP xi DO
 xj := xj + 1
END

Again, all of this is for convenience only; none of this increases the model's intrinsic power.

Example Programs

[edit ]

Addition

[edit ]

Addition is recursively defined as:

a + 0 = a , (1) a + S ( b ) = S ( a + b ) . (2) {\displaystyle {\begin{aligned}a+0&=a,&{\textrm {(1)}}\\a+S(b)&=S(a+b).&{\textrm {(2)}}\end{aligned}}} {\displaystyle {\begin{aligned}a+0&=a,&{\textrm {(1)}}\\a+S(b)&=S(a+b).&{\textrm {(2)}}\end{aligned}}}

Here, S should be read as "successor".

In the hyperoperater sequence it is the function H 1 {\displaystyle \operatorname {H_{1}} } {\displaystyle \operatorname {H_{1}} }

H 1 ( x 1 , x 2 ) {\displaystyle \operatorname {H_{1}} (x_{1},x_{2})} {\displaystyle \operatorname {H_{1}} (x_{1},x_{2})} can be implemented by the LOOP program ADD( x1, x2)

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

Multiplication

[edit ]

Multiplication is the hyperoperation function H 2 {\displaystyle \operatorname {H_{2}} } {\displaystyle \operatorname {H_{2}} }

H 2 ( x 1 , x 2 ) {\displaystyle \operatorname {H_{2}} (x_{1},x_{2})} {\displaystyle \operatorname {H_{2}} (x_{1},x_{2})} can be implemented by the LOOP program MULT( x1, x2 )

x0 := 0;
LOOP x2 DO
 x0 := ADD( x1, x0)
END

The program uses the ADD() program as a "convenience instruction". Expanded, the MULT program is a LOOP-program with two nested LOOP instructions. ADD counts for one.

More hyperoperators

[edit ]

Given a LOOP program for a hyperoperation function H i {\displaystyle \operatorname {H_{i}} } {\displaystyle \operatorname {H_{i}} }, one can construct a LOOP program for the next level

H 3 ( x 1 , x 2 ) {\displaystyle \operatorname {H_{3}} (x_{1},x_{2})} {\displaystyle \operatorname {H_{3}} (x_{1},x_{2})} for instance (which stands for exponentiation) can be implemented by the LOOP program POWER( x1, x2 )

x0 := 1;
LOOP x2 DO
 x0 := MULT( x1, x0 )
END

The exponentiation program, expanded, has three nested LOOP instructions.

    Predecessor

    [edit ]

    The predecessor function is defined as

    pred ( n ) = { 0 if  n = 0 , n 1 otherwise {\displaystyle \operatorname {pred} (n)={\begin{cases}0&{\mbox{if }}n=0,\\n-1&{\mbox{otherwise}}\end{cases}}} {\displaystyle \operatorname {pred} (n)={\begin{cases}0&{\mbox{if }}n=0,\\n-1&{\mbox{otherwise}}\end{cases}}}.

    This function can be computed by the following LOOP program, which sets the variable x 0 {\displaystyle x_{0}} {\displaystyle x_{0}} to p r e d ( x 1 ) {\displaystyle pred(x_{1})} {\displaystyle pred(x_{1})}.

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

    Expanded, this is the program

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

    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 ∸ 1
    

    Remark: Again one has to mind the side effects. The predecessor program changes the variable x2, which might be in use elsewhere. To expand the statement x0 := x1 ∸ 1, one could initialize the variables xn, xn+1 and xn+2 (for a big enough n) to 0, x1 and 0 respectively, run the code on these variables and copy the result (xn) to x0. A compiler can do this.

      Cut-off subtraction

      [edit ]

      If in the 'addition' program above the second loop decrements x0 instead of incrementing, the program computes the difference (cut off at 0) of the variables x 1 {\displaystyle x_{1}} {\displaystyle x_{1}} and x 2 {\displaystyle x_{2}} {\displaystyle x_{2}}.

      x0 := x1
      LOOP x2 DO
       x0 := x0 ∸ 1
      END
      

      Like before we can extend the LOOP syntax with the statement:

      x0 := x1 ∸ x2
      

        If then else

        [edit ]

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

        xn1 := x1 ∸ x2;
        xn2 := 0;
        xn3 := 1;
        LOOP xn1 DO
         xn2 := 1;
         xn3 := 0
        END;
        LOOP xn2 DO
         P1
        END;
        LOOP xn3 DO
         P2
        END;
        

          See also

          [edit ]

          Notes and references

          [edit ]

          Bibliography

          [edit ]
          [edit ]

          AltStyle によって変換されたページ (->オリジナル) /