LOOP (programming language)
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:
- {\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, {\displaystyle Var:=\{x_{0},x_{1},...\}} are variable names and {\displaystyle c\in \mathbb {N} } are constants.
Semantics
[edit ]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
xi := 0
means the value of the variable {\displaystyle x_{i}} is set to 0.
A statement of the form
xi := xi + 1
means the value of the variable {\displaystyle x_{i}} is incremented by 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.
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 {\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 {\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 {\displaystyle \operatorname {assign} } instruction use the block of code below. {\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:
- {\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 {\displaystyle \operatorname {H_{1}} }
{\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 {\displaystyle \operatorname {H_{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 {\displaystyle \operatorname {H_{i}} }, one can construct a LOOP program for the next level
{\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
- {\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 {\displaystyle x_{0}} to {\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 {\displaystyle x_{1}} and {\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 ]- ^ Enderton 2012.
- ^ a b c Meyer & Ritchie 1967.
- ^ Brock 2020.
- ^ Ritchie 1967.
- ^ a b Schöning 2008, p. 105.
- ^ Schöning 2008, p. 93.
- ^ Schöning 2001, p. 122.
- ^ Schöning 2008, p. 112.
Bibliography
[edit ]- Axt, Paul (1966). "Iteration of relative primitive recursion". Mathematische Annalen . 167: 53–55. doi:10.1007/BF01361215. S2CID 119730846.
- Axt, Paul (1970). "Iteration of primitive recursion". Journal of Symbolic Logic . 35 (3): 253–255. doi:10.1002/malq.19650110310.
- Brock, David C. (19 June 2020). "Discovering Dennis Ritchie's Lost Dissertation". CHM. Retrieved 14 July 2020.
- Calude, Cristian (1988). Theories of Computational Complexity. Annals of Discrete Mathematics. Vol. 35. North Holland Publishing Company. ISBN 9780080867755.
- Cherniavsky, John Charles (1976). "Simple Programs Realize Exactly Presburger Formulas". SIAM Journal on Computing . 5 (4): 666–677. doi:10.1137/0205045.
- Cherniavsky, John Charles; Kamin, Samuel Noah (1979). "A Complete and Consistent Hoare Axiomatics for a Simple Programming Language". Association for Computing Machinery . 26 (1): 119–128. doi:10.1145/322108.322120 . S2CID 13062959.
- Constable, Robert L.; Borodin, Allan B (1972). "Subrecursive programming languages, part I: Efficiency and program structure". Journal of the ACM . 19 (3): 526–568. doi:10.1145/321707.321721 . S2CID 42474303.
- Crolard, Tristan; Lacas, Samuel; Valarcher, Pierre (2006). "On the expressive power of the loop language". Nordic Journal of Computing. 13: 46–57.
- Crolard, Tristan; Polonowski, Emmanuel; Valarcher, Pierre (2009). "Extending the loop language with higher-order procedural variables" (PDF). ACM Transactions on Computational Logic . 10 (4): 1–37. doi:10.1145/1555746.1555750. S2CID 1367078.
- Enderton, Herbert (2012). Computability Theory. Academic Press. doi:10.1145/1555746.1555750 .
- Fachini, Emanuela; Maggiolo-Schettini, Andrea (1979). "A hierarchy of primitive recursive sequence functions". R.A.I.R.O. - Informatique Théorique - Theoretical Informatics. 13 (1): 49–67. doi:10.1051/ita/1979130100491 .
- Fachini, Emanuela; Maggiolo-Schettini, Andrea (1982). "Comparing Hierarchies of Primitive Recursive Sequence Functions". Zeitschrift für mathematische Logik und Grundlagen der Mathematik. 28 (27–32): 431–445. doi:10.1002/malq.19820282705.
- Goetze, Bernhard; Nehrlich, Werner (1980). "The Structure of Loop Programs and Subrecursive Hierarchies". Zeitschrift für mathematische Logik und Grundlagen der Mathematik. 26 (14–18): 255–278. doi:10.1002/malq.19800261407 .
- Ibarra, Oscar H.; Leininger, Brian S. (1981). "Characterizations of Presburger Functions". SIAM Journal on Computing . 10 (1): 22–39. doi:10.1137/0210003.
- Ibarra, Oscar H.; Rosier, Louis E. (1983). "Simple Programming Languages and Restricted Classes of Turing Machines". Theoretical Computer Science . 26 (1–2): 197–220. doi:10.1016/0304-3975(83)90085-3 .
- Kfoury, A.J.; Moll, Robert N.; Arbib, Michael A. (1982). A Programming Approach to Computability. Springer, New York, NY. doi:10.1007/978-1-4612-5749-3. ISBN 978-1-4612-5751-6.
- Machtey, Michael (1972). "Augmented loop languages and classes of computable functions". Journal of Computer and System Sciences . 6 (6): 603–624. doi:10.1016/S0022-0000(72)80032-1 .
- PlanetMath. "primitive recursive vector-valued function" . Retrieved 21 August 2021.
- Matos, Armando B. (3 November 2014). "Closed form of primitive recursive functions: from imperative programs to mathematical expressions to functional programs" (PDF). Retrieved 20 August 2021.
- Matos, Armando B. (2015). "The efficiency of primitive recursive functions: A programmer's view". Theoretical Computer Science . 594: 65–81. doi:10.1016/j.tcs.2015年04月02日2 .
- Meyer, Albert R.; Ritchie, Dennis MacAlistair (1967). The complexity of loop programs. ACM '67: Proceedings of the 1967 22nd national conference. doi:10.1145/800196.806014 .
- Minsky, Marvin Lee (1967). Computation: finite and infinite machines. Prentice Hall. doi:10.1017/S0008439500029350. S2CID 227917578.
- Ritchie, Dennis MacAlistair (1967). Program structure and computational complexity (draft) (Thesis). Computer History Museum (CHM). p. 181. Retrieved 16 October 2024.
- Ritchie, Robert Wells (November 1965). "Classes of recursive functions based on Ackermann's function". Pacific Journal of Mathematics . 15 (3): 1027–1044. doi:10.2140/pjm.1965151027 .
- Schöning, Uwe (2001). Theoretische Informatik-kurz gefasst (4 ed.). London: Oxford University Press. ISBN 3-8274-1099-1.
- Schöning, Uwe (2008). Theoretische Informatik-kurz gefasst (5 ed.). London: Oxford University Press. ISBN 978-3-8274-1824-1. DNB 986529222.
- Tsichritzis, Dennis C (1970). "The Equivalence Problem of Simple Programs". Journal of the ACM . 17 (4): 729–738. doi:10.1145/321607.321621. S2CID 16066171.
- Tsichritzis, Dennis C (1971). "A note on comparison of subrecursive hierarchies". Information Processing Letters . 1 (2): 42–44. doi:10.1016/0020-0190(71)90002-0.