¡Vamos a hacer esto! (aunque no tengo idea de por qué importaría en absoluto...)
Entonces, no soy un científico de la computación, y solo estoy un tercio a través de "
The Annotated Turing
" (que parece ser un gran libro, por cierto). Esto significa que lo que sigue es el enfoque de un lego en esto.
En primer lugar, tuve que entender qué se entiende por "completamente turing" y cómo mostrar que un lenguaje tiene esa característica.
Para eso, hay un par de entradas en Wikipedia y discusiones en SO disponibles y dejo que todos las lean (p. ej.,
aquí
,
aquí
). Una de esas discusiones enlazó a una presentación que afirmaba probar que PostgreSQL-SQL con expresiones comunes de tabla recursivas (CTS) es completamente turing. Para probar esto, el autor de la presentación (
aquí
por cierto) dijo que es suficiente demostrar que un lenguaje puede emular a otro lenguaje que ya se ha demostrado que es completamente turing. Justo.
La elección del autor fue un "
sistema de etiquetas cíclicas
" con un conjunto de reglas específico (
Regla 110
) que aparentemente se ha demostrado que es completamente turing.
Luego el autor continúa e implementa este sistema de etiquetas cíclicas con una expresión común de tabla recursiva y así demuestra la afirmación.
¡Hurra!
Entonces, ¿qué significa esto para SAP HANA SQL? SAP HANA SQL/SQLScript no admite expresiones comunes de tabla recursivas (mucho disgusto para todos los que intentan manejar jerarquías y no conocen las vistas y funciones de jerarquía especiales de SAP HANA (mira
allí
) y tampoco admite llamadas de procedimiento recursivas.
Qué lástima, uno podría pensar.
Afortunadamente, cada recursión se puede expresar como una iteración (compara
aquí
), así que pensé, intentemos este sistema de etiquetas cíclicas en SQLScript. Este es el resultado (HANA 1, rev.122.15, en mi NUC):
do begin
declare prods VARCHAR(4) ARRAY;
declare currProd, initWord, currWord VARCHAR(300);
declare runs, maxruns bigint = 0;
declare currProdNo integer = 0;
initWord :='11001';
maxruns := 100;
runs := 0;
prods = ARRAY ('010', '000', '1111');
currWord := :initWord;
-- tabla falsa var para monitorear output
tmp = select :runs as RUNS, :currProd as CURRPROD, :currWord as CURRWORD
from dummy;
while (:runs
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019