Lenguaje de programación primitivo creado en 1964.
P′′ (P doble primo [1] ) es un lenguaje de programación informático primitivo creado por Corrado Böhm [2] [3] en 1964 para describir una familia de máquinas de Turing .
Definición
(en adelante P′′ ) se define formalmente como un conjunto de palabras del alfabeto de cuatro instrucciones , de la siguiente manera:![{\textstyle \{R,\lambda ,(,)\}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Sintaxis
y son palabras en P′′.![{\estilo de texto \lambda }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Si y son palabras en P′′, entonces es una palabra en P′′.
![{\estilo de texto q_ {1}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto q_ {2}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle q_{1}q_{2}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Si es una palabra en P′′, entonces es una palabra en P′′.
![{\estilo de texto q}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto (q)}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Sólo las palabras derivables de las tres reglas anteriores son palabras en P′′.
Semántica
es el alfabeto-cinta de una máquina de Turing con cinta infinita a la izquierda, siendo el símbolo en blanco , equivalente a .![{\estilo de texto \Caja }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto c_ {0}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Todas las instrucciones en P′′ son permutaciones del conjunto de todas las configuraciones de cinta posibles; es decir, todas las configuraciones posibles tanto del contenido de la cinta como de la posición del cabezal de la cinta.
![{\estilo de texto X}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
es un predicado que dice que el símbolo actual no lo es . No es una instrucción y no se usa en programas, sino que se usa para ayudar a definir el lenguaje.![{\estilo de texto \Caja }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
significa mover el cabezal de la cinta una celda hacia la derecha (si es posible).
significa reemplazar el símbolo actual con y luego mover el cabezal de la cinta una celda hacia la izquierda.![{\estilo de texto c_ {i}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle c_{(i+1){\bmod {(}}n+1)}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
significa la composición de la función . En otras palabras, la instrucción se realiza antes .![{\textstyle q_{2}\circ q_{1}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto q_ {1}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto q_ {2}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
significa iterar en un bucle while , con la condición .![{\estilo de texto q}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto \alpha }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Relación con otros lenguajes de programación
- P′′ fue el primer lenguaje de programación estructurado imperativo "sin GOTO " que se demostró que era completo en Turing [2] [3]
- El lenguaje Brainfuck (aparte de sus comandos de E/S) es una variación informal menor de P′′. Böhm proporciona programas P′′ explícitos para cada uno de un conjunto de funciones básicas suficientes para calcular cualquier función computable , utilizando únicamente , y las cuatro palabras donde con denota la iteración de , y . Estos son los equivalentes de los seis comandos Brainfuck respectivos [ , ] , + , - , < , > . Tenga en cuenta que desde , incrementar los tiempos del símbolo actual se ajustará de modo que el resultado sea "disminuir" el símbolo en la celda actual en uno ( ).
![{\estilo de texto (}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto )}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle r,r^{\prime },L,R}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle r\equiv \lambda R,r^{\prime }\equiv r^{n}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto r^{n}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto n}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto r}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle L\equiv r^{\prime }\lambda }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle c_{n+1}\equiv c_{0}\equiv \Box }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto n}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto r^{\prime }}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Programa de ejemplo
Böhm [2] proporciona el siguiente programa para calcular el predecesor ( x -1) de un número entero x > 0:
![{\displaystyle R(R)L(r^{\prime }(L(L))r^{\prime }L)Rr}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
que se traduce directamente al programa Brainfuck equivalente :
> [ > ] < [ − [ < [ < ]] − < ] > +
El programa espera que un número entero se represente en notación biyectiva en base k , codificando los dígitos respectivamente, y que tenga antes y después de la cadena de dígitos. (Por ejemplo, en biyectiva base 2, el número ocho se codificaría como , porque 8 en base 2 es 100, se invierten los dígitos y se suma uno a cada uno de ellos). Al principio y al final del cálculo, la cinta -head está en el precedente de la cadena de dígitos.![{\textstyle c_{1},c_{2}\ldots,c_{k}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto 1,2,\ldots,k}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto \Caja }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\textstyle \Box c_{1}c_{1}c_{2}\Box}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\estilo de texto \Caja }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Referencias
- ^ "PDBL: una herramienta para la simulación de la máquina de Turing". 4 de septiembre de 2021.
- ^ abc Böhm, C .: "Sobre una familia de máquinas de Turing y el lenguaje de programación relacionado", ICC Bull. 3, 185-194, julio de 1964.
- ^ ab Böhm, C. y Jacopini, G.: "Diagramas de flujo, máquinas de Turing y lenguajes con sólo dos reglas de formación", CACM 9(5), 1966. (Nota: este es el artículo más citado sobre el teorema del programa estructurado .)
enlaces externos
- P′′Intérprete en línea: Demostración de la canción iterativa 99 Bottles of Beer interpretada en las instrucciones 337568 P′′ .