P prime prime
- The title of this article is incorrect due to technical limitations. The correct title is {{{title|{{{1}}}}}}.
<math>\mathcal{P}^{\prime\prime}</math> is a primitive programming language created by Corrado Böhm 1,2 in 1964 to describe a family of Turing machines.
Contents |
Definition
<math>\mathcal{P}^{\prime\prime}</math> (hereafter written P′′) is formally defined as a set of words on the four-instruction alphabet {R, λ, (, )}, as follows:
Syntax
- R and λ are words in P′′.
- If p and q are words in P′′, then pq is a word in P′′.
- If q is a word in P′′, then (q) is a word in P′′.
- Only words derivable from the previous three rules are words in P′′.
Semantics
- {a0, a1, ..., an}(n ≥ 1) is the tape-alphabet of a Turing machine with left-infinite tape, a0 being the blank symbol.
- R means move the tape-head rightward one cell (if any).
- λ means replace the current symbol ai by ai+1 (taking an+1 = a0), and then move the tape-head leftward one cell.
- (q) means iterate q in a while-loop, with condition that the current symbol is not a0.
- A program is a word in P′′. Execution of a program proceeds left-to-right, executing R, λ, and (q) as they are encountered, until there is nothing more to excecute.
Relation to other programming languages
- P′′ was the first "GOTO-less" imperative structured programming language to be proved1,2 Turing-complete.
- Brainfuck (apart from its I/O commands) is a minor informal variation of P′′. Böhm1 gives explicit P′′ programs for each of a set of basic functions sufficient to compute any partial recursive function, using only the six words r ≡ λR, r′ ≡ rn, L ≡ r′λ, R, (, ), which are the equivalents of the respective brainfuck commands +, -, <, >, [, ].
Example program
Böhm1 gives the following program to compute the predecessor (x-1) of an integer x > 0:
R ( R ) L ( r' ( L ( L ) ) r' L ) R r
which translates directly to the equivalent brainfuck program
> [ > ] < [ − [ < [ < ] ] − < ] > +
The program expects an integer to be represented in bijective base-n notation, with a1, ..., an coding the digits 1,...,n, respectively, and to have an a0 before and after the digit-string. (E.g. in bijective base-2, the number eight would be encoded as a0a1a1a2a0, because 8 = 1*2^2 + 1*2^1 + 2*2^0.) At the beginning and end of the computation, the tape-head is on the a0 preceding the digit-string.
References
- Böhm, C.: "On a family of Turing machines and the related programming language", ICC Bull. 3, 187-194, July 1964.
- Böhm, C. and Jacopini, G.: "Flow diagrams, Turing machines and languages with only two formation rules", CACM 9(5), 1966. (Note: This is the seminal paper on the structured program theorem.)
External resources
- The Fm languages are variations of P′′ as adapted to Turing machines with a right- (or optionally both-ways-) infinite tape.