La historia corta
Un famoso informático, Tarjan , escribió un libro hace años. Contiene pseudocódigo absolutamente extraño. ¿Alguien podría explicarlo?
La larga historia
Tarjan es conocido por muchos logros, incluido el hecho de que fue el coinventor de los árboles . Publicó un libro, " Estructuras de datos y algoritmos de red ", durante la década de 1980.
Todo el pseudocódigo del libro de Tarjan está escrito en un lenguaje de su propia invención. Las convenciones de pseudocódigo están muy regimentadas. Es casi un lenguaje verdadero, y uno podría imaginarse escribiendo un compilador para él. Tarjan escribe que su lenguaje se basa en los siguientes tres:
Espero que alguien familiarizado con uno o dos de los idiomas anteriores, o el trabajo de Tarjan, pueda responder mi pregunta.
A continuación se muestra un ejemplo de una función escrita en el idioma de Tarjan:
heap function mesh (heap nodes h1, h2);
if key(h1) > key(h2) → h1 ⟷ h2 fi;
right (h1) := if right(h1) = null → h2
|right(h1) ≠ null → mesh (right(h1), h2) fi;
if rank (left (h1)) < rank (right (h1)) → left(h1) ⟷ right(h1) fi;
rank (h1) := rank(right(h1)) + 1;
return h1,
end mesh;
He visto muchos pseudocódigos, pero nunca he visto nada como el de Tarjan. ¿Cómo funciona el pseudocódigo de Tarjan? ¿Cómo pueden reescribirse ejemplos del pseudocódigo de Tarjan como algo que se parece más a C o Java? Ni siquiera necesita ser C o Java. La construcción if-else en el lenguaje de Tarjan no solo es diferente de los lenguajes de la familia C, sino también diferente de Python, MATLAB y muchos otros.
fuente
return
declaración realmente termina en una coma?Respuestas:
Tabla de contenido
Dividiré mi explicación del pseudocódigo de Tarjan en las siguientes secciones:
->
&|
):=
y=
)else if
, pero no hayelse
constructo:= if
Ejemplos adicionales de Tarjan's
if
y:= if
5.5. Tarjan Arrays (o Listas)
Resumen de operadores
⟷
)(1) Bloques If-else de Tarjan
(los operadores
→
y|
)La
if-else
construcción es quizás la estructura de control más fundamental en el lenguaje de Tarjan. Además de los bloques if similares a C, el comportamiento if-else está casi integrado en las asignaciones de Tarjan y en los bucles while de Tarjan. El operador de flecha de Tarjan->
(o →) es un delimitador entre la condición de una instrucción if y el bloque de ejecución de una instrucción if.Por ejemplo, en el idioma de Tarjan podríamos tener:
Si traducimos parcialmente la línea de código Tarjan anterior a C o Java, obtenemos lo siguiente:
En lugar de una
if
llave derecha (como en C y Java), Tarjan termina un bloque con una ortografía hacia atrás similar a ALGOL de la palabra clave:fi
Si continuamos traduciendo nuestro ejemplo anterior, obtenemos:
(2) Pruebas de asignación e igualdad (
:=
y=
)Tarjan toma estos operadores de ALGOL (más tarde también visto en Pascal).
Tarjan usa
=
para pruebas de igualdad, no asignaciones (por lo que funciona como Java==
).Para la asignación, Tarjan usa
:=
, que funciona como Java=
.Por lo tanto, si continuamos traduciendo nuestro ejemplo, tenemos:
Una barra vertical (o "tubería" o
|
) en el lenguaje de Tarjan es equivalente a laelse if
palabra clave en C o Java.Por ejemplo, en el idioma de Tarjan podríamos tener:
El código Tarjan anterior se traduce en:
(3)
else if
solo y sinelse
construcciónAnteriormente, cubrí los conceptos básicos de las
if
declaraciones sin describir los matices. Sin embargo, no discutiremos un pequeño detalle. La última cláusula en unif-else
bloque Tarjan-ian siempre debe contener un→
operador arrow ( ). Como tal, no existeelse
en el idioma de Tarjan, soloelse if
. Lo más parecido a unelse
bloque en el lenguaje de Tarjan es hacer la condición de prueba más adecuadatrue
.En C / Java, tendríamos:
Los ejemplos son más fáciles de entender que las descripciones generales. Sin embargo, ahora que tenemos algunos ejemplos en nuestro haber, sepa que la formal general de una construcción if-else de Tarjan es la siguiente:
El personaje
|
es comoif else
El personaje
→
separa la condición de prueba de las cosas por hacer.(4) Operador de asignación condicional de Tarjan
:= if
Tarjan's
if
se puede usar de dos maneras muy diferentes. Hasta ahora, solo hemos descrito uno de los usos del tarjanianoif
. Un tanto confuso, Tarjan todavía usa la notación / sintaxisif
para el segundo tipo deif
construcción. Lo queif
se está utilizando se basa en el contexto. Analizar el contexto es realmente muy fácil de hacer, ya que el segundo tipo de Tarjanif
siempre está preestablecido por un operador de asignación.Por ejemplo, podríamos tener el siguiente código Tarjan:
Comience la digresión
Después de trabajar con el código Tarjan por un tiempo, te acostumbras al orden de las operaciones. Si ponemos entre paréntesis la condición de prueba en el ejemplo anterior, obtenemos:
a = 4
No es una operación de asignación.a = 4
es comoa == 4
: devuelve verdadero o falso.Fin de la digresión
Puede ayudar pensar
:= if
en la sintaxis de un solo operador, distinto:=
yif
, de hecho, nos referiremos al:= if
operador como el operador de "asignación condicional".Para la
if
lista(condition → action)
. Para:= if
que enumeremos(condition → value)
dóndevalue
está el valor del lado derecho que podríamos asignar al lado izquierdolhs
en C o Java podría verse así:
Considere el siguiente ejemplo de "asignación condicional" en código tarjaniano:
# Instancia Tarjan del ejemplo cinco x: = a = 4 → 9 | a> 4 → 11 | verdadero → 99 fi
En C / Java, tendríamos:
(5) Resumen de operadores:
Hasta ahora, tenemos:
:=
...... Operador de asignación (C / Java=
)=
...... Prueba de igualdad (C / Java==
)→
...... Delimitador entre la condición de prueba de un bloque if y el cuerpo de un bloque if|
..... C / Java else-ifif ... fi
..... bloque if-else:= if... fi
..... Asignación condicional basada en un bloque if-else(5.5) Listas / matrices de Tarjan:
El lenguaje de Tarjan tiene contenedores incorporados tipo matriz. La sintaxis para las matrices de Tarjan es mucho más intuitiva que la notación para las
if else
declaraciones de Tarjan .Se accede a los elementos de la matriz de Tarjan entre paréntesis
()
, no entre corchetes[]
La indexación comienza a las
1
. Así,A continuación se muestra cómo crear una nueva matriz que contenga los elementos primero y quinto de
[1, 2, 3, 4, 5, 6, 7]
El operador de igualdad se define para matrices. Se imprime el siguiente código
true
La forma de Tarjan de probar si una matriz está vacía es compararla con una matriz vacía
Se puede crear una vista (no copia) de una submatriz, proporcionando múltiples índices al operador
()
combinados con..
(6) Ejemplos adicionales de Tarjan
if
y:= if
Los siguientes son otros ejemplos de una asignación condicional de Tarjan (
:= if
):(true --> b)
es la(cond --> action)
cláusula más a la izquierda que tiene una condición verdadera. Por lo tanto, la asignación original del Ejemplo Seis tiene el mismo comportamiento de asignación quea := b
A continuación se muestra nuestro ejemplo más complicado de código Tarjan hasta ahora:
La siguiente es una traducción del código de Tarjan para fusionar dos listas ordenadas. Lo siguiente no es exactamente C o Java, pero está mucho más cerca de C / Java que la versión Tarjan.
A continuación se muestra otro ejemplo de código Tarjan y una traducción en algo similar a C o Java:
A continuación se muestra la traducción C / Java:
(7) Operador de flecha de doble punta de Tarjan (
<-->
)A continuación se muestra un ejemplo de código Tarjan:
¿Qué hace un
⟷
operador de doble flecha ( ) en el idioma de Tarjan?Bueno, casi todas las variables en el lenguaje de Tarjan son punteros.
<-->
Es una operación de intercambio. Las siguientes impresionestrue
Después de realizar
x <--> y
,x
apunta al objeto quey
solía señalar yy
apunta al objeto quex
solía señalar.A continuación se muestra una declaración de Tarjan utilizando el
<-->
operador:A continuación se muestra una traducción del código Tarjan anterior a un pseudocódigo alternativo:
Alternativamente, podríamos tener:
A continuación se muestra un ejemplo de una de las funciones de Tarjan utilizando el
⟷
operador:A continuación se muestra una traducción de la
mesh
función de Tarjan a un pseudocódigo que no es C, pero se parece más a C (en términos relativos). El propósito de esto es ilustrar cómo funciona el⟷
operador de Tarjan .(8) Los do-loops de Tarjan son como los loops while de C / Java
El lenguaje
if
y lasfor
construcciones de Tarjan son familiares para los programadores de C / Java. Sin embargo, la palabra clave Tarjan para un ciclo while esdo
. Todos losdo
bucles terminan con la palabra claveod
, que es la ortografía hacia atrás dedo
. A continuación se muestra un ejemplo:En el pseudocódigo de estilo C, tenemos:
Lo anterior en realidad no es del todo correcto. Un Do-loop de Tarjan es realmente un C / Java
while(true)
con un bloque if-else anidado en su interior. Una traducción más literal del código Tarjan es la siguiente:A continuación, tenemos un
do
bucle Tarjan más complicado :El pseudocódigo de estilo C / Java para el complicado
do
circuito de Tarjan es el siguiente:(9) Operador de asignación condicional de Tarjan con todas las condiciones falsas
Aunque la larga explicación anterior cubre la mayoría de las cosas, algunos asuntos aún quedan sin resolver. Espero que alguien más escriba algún día una nueva respuesta mejorada basada en la mía que responda a estas preguntas.
Notablemente, cuando
:= if
se usa el operador de asignación condicional , y ninguna condición es verdadera, no sé qué valor se asigna a la variable.No estoy seguro, pero es posible que no se haga ninguna asignación para
x
:Podría requerir que la variable del lado izquierdo vista en una
:= if
declaración se declare previamente. En ese caso, incluso si todas las condiciones son falsas, la variable seguirá teniendo un valor.Alternativamente, quizás las condiciones totalmente falsas representan un error de tiempo de ejecución. Otra alternativa es devolver un
null
valor especial y almacenarnull
en el argumento de la izquierda de la asignación.fuente
=
significa comparación como donde significa asignación (si alguna vez escribiera un idioma, lo convertiría en un error de sintaxis, y simplemente tengo:=
y==
). Por otro lado, el operador de intercambio es el tipo de cosa que solo ocurriría en lenguajes especializados donde era una operación común; en otros idiomas, sin embargo, podría asumir una función de biblioteca llamadaswap
y reemplazarh1 ⟷ h2
enswap(h1, h2)
lugar de escribir la implementación cada vez.[1, 2] = [1, 2, 3, 4, 5]
verdad?|
operador es un guardia . Se usan en Haskell (y creo que otros lenguajes funcionales) en las definiciones de funciones:f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
aquíotherwise
hay un aliasTrue
yf
define los números de Fibonacci.Nunca he visto esto antes, pero creo que puedo inferir lo que se entiende por contexto. Presumiblemente,
⟷
debe ser una operación de intercambio, yif G1 -> S1 | G2 - >S2 | ... fi
es una construcción de tipo if / then / else que también devuelve un valor, como el?:
operador ternario en C y Java.Con eso en la mano, podríamos escribir la función anterior en un lenguaje similar a Java así:
fuente