A história curta
Um famoso cientista da computação, Tarjan , escreveu um livro anos atrás. Ele contém um pseudocódigo absolutamente bizarro. Alguém poderia explicar isso?
A longa história
Tarjan é conhecido por muitas realizações, incluindo o fato de que ele era o co-mentor das árvores espalhadas . Ele publicou um livro, " Estruturas de dados e algoritmos de rede ", durante os anos 80.
Todo o pseudocódigo do livro de Tarjan está escrito em uma linguagem de sua própria invenção. As convenções de pseudo-código são muito regimentadas. É quase uma linguagem verdadeira, e alguém poderia imaginar escrever um compilador para ela. Tarjan escreve que seu idioma é baseado nos três seguintes:
Espero que alguém familiarizado com um ou dois dos idiomas acima, ou o trabalho de Tarjan, possa responder à minha pergunta.
Um exemplo de uma função escrita na linguagem do Tarjan é mostrada abaixo:
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;
Eu já vi muitos pseudo-códigos, mas nunca vi nada como o de Tarjan. Como funciona o pseudocódigo de Tarjan? Como exemplos do pseudocódigo de Tarjan podem ser reescritos como algo que se parece mais com C ou Java? Nem precisa ser C ou Java. A construção if-else na linguagem Tarjan não é apenas diferente das linguagens da família C, mas também é diferente do Python, MATLAB e muitos outros.
fonte
return
declaração realmente termina em vírgula?Respostas:
Índice
Dividirei minha explicação do pseudocódigo de Tarjan nas seguintes seções:
->
&|
):=
e=
)else if
, mas nenhumaelse
construção:= if
Exemplos adicionais de Tarjan
if
e:= if
5.5. Matrizes Tarjan (ou listas)
Resumo dos Operadores
⟷
)(1) Os blocos If-else de Tarjan
(os operadores
→
e|
)O
if-else
construto é talvez a estrutura de controle mais fundamental na linguagem de Tarjan. Além dos blocos if-like C, o comportamento if-else está quase embutido nas atribuições de Tarjan e nos loops while de Tarjan. O operador de seta do Tarjan->
(ou →) é um delimitador entre a condição de uma instrução if e o bloco de execução de uma instrução if.Por exemplo, no idioma de Tarjan, podemos ter:
Se traduzirmos parcialmente a linha do código Tarjan acima em C ou Java, obteremos o seguinte:
Em vez de chaves entre chaves (como em C e Java), Tarjan encerra um
if
-block com uma ortografia semelhante à ALGOL da palavra-chave:fi
Se continuarmos traduzindo nosso exemplo acima, obtemos:
(2) Testes de atribuição e igualdade (
:=
e=
)Tarjan pega esses operadores da ALGOL (posteriormente vistos também em Pascal).
O Tarjan usa
=
para testes de igualdade, não atribuições (portanto, funciona como Java==
).Para atribuição, o Tarjan usa
:=
, que funciona como Java=
.Assim, se continuarmos traduzindo nosso exemplo, teremos:
Uma barra vertical (ou "pipe" ou
|
) na linguagem do Tarjan é equivalente àelse if
palavra - chave em C ou Java.Por exemplo, no idioma de Tarjan, podemos ter:
O código Tarjan acima se traduz em:
(3)
else if
único e nenhumelse
construtoAnteriormente, eu cobri o básico das
if
declarações sem descrever as nuances. No entanto, não discutiremos um pequeno detalhe. A última cláusula em umif-else
bloco Tarjan-ian deve sempre conter um→
operador arrow ( ). Como tal, não existe apenaselse
na língua de Tarjanelse if
. A coisa mais próxima de umelse
bloco na linguagem do Tarjan é fazer a condição de teste mais à direitatrue
.Em C / Java, teríamos:
Exemplos são mais fáceis de entender do que descrições gerais. No entanto, agora que temos alguns exemplos em mente, saiba que o formal geral da construção if-else de Tarjan é o seguinte:
O personagem
|
é comoif else
O caractere
→
separa a condição de teste das coisas a fazer.(4) Operador de atribuição condicional da Tarjan
:= if
O Tarjan
if
pode ser usado de duas maneiras muito diferentes. Até agora, descrevemos apenas um dos usos do Tarjanianoif
. Um tanto confuso, Tarjan ainda usa a notação / sintaxeif
para o segundo tipo deif
construção. Qualif
está sendo usado é baseado no contexto. Analisar o contexto é realmente muito fácil de fazer, pois o segundo tipo de Tarjan-if
é sempre pré-fixado por um operador de atribuição.Por exemplo, podemos ter o seguinte código Tarjan:
Iniciar digressão
Depois de trabalhar com o código Tarjan por um tempo, você se acostuma à ordem das operações. Se colocarmos parênteses na condição de teste no exemplo acima, obteremos:
a = 4
não é uma operação de atribuição.a = 4
é comoa == 4
- retorna verdadeiro ou falso.Digressão final
Pode ajudar a pensar
:= if
na sintaxe de um único operador, distinto:=
eif
Na verdade, vamos nos referir ao:= if
operador como o operador de "atribuição condicional".Para
if
nós listamos(condition → action)
. Para:= if
listamos(condition → value)
ondevalue
é teh valor mão do lado direito podemos atribuir à mão do lado esquerdolhs
em C ou Java pode se parecer com:
Considere o seguinte exemplo de "atribuição condicional" no código tarjaniano:
Instanciação Tarjan do Exemplo Cinco x: = a = 4 → 9 | a> 4 → 11 | verdadeiro → 99 fi
Em C / Java, teríamos:
(5) Resumo dos operadores:
Até agora, temos:
:=
...... Operador de atribuição (C / Java=
)=
...... Teste de igualdade (C / Java==
)→
...... Delimitador entre a condição de teste de um bloco if e o corpo de um bloco if|
..... C / Java else-ifif ... fi
..... bloco if-else:= if... fi
..... Atribuição condicional baseada em um bloco if-else(5.5) Tarjan listas / matrizes:
O Tarjan's Language possui contêineres do tipo array embutidos. A sintaxe para matrizes Tarjan é muito mais intuitiva que a notação para
if else
instruções Tarjan .Os elementos da matriz Tarjan são acessados com parênteses
()
, não entre colchetes[]
A indexação começa em
1
. Portanto,Abaixo mostra como criar uma nova matriz contendo os 1º e 5º elementos de
[1, 2, 3, 4, 5, 6, 7]
O operador de igualdade é definido para matrizes. O código a seguir é impresso
true
A maneira de Tarjan testar se uma matriz está vazia é compará-la com uma matriz vazia
Pode-se criar uma visão (não copiar) de uma sub-matriz, fornecendo múltiplos índices ao operador
()
combinados com..
(6) Exemplos adicionais de Tarjan
if
e:= if
A seguir, outros exemplos de uma atribuição condicional do Tarjan (
:= if
):(true --> b)
é a(cond --> action)
cláusula mais à esquerda com uma condição verdadeira. Assim, o Exemplo Seis da atribuição original tem o mesmo comportamento de atribuição quea := b
Abaixo está o nosso exemplo mais complicado de código Tarjan até agora:
A seguir, uma tradução do código de Tarjan para mesclar duas listas classificadas. O seguinte não é exatamente C ou Java, mas é muito mais próximo do C / Java do que a versão Tarjan.
Abaixo está outro exemplo de código Tarjan e uma tradução em algo semelhante a C ou Java:
Abaixo está a tradução C / Java:
(7) Operador de flecha dupla de Tarjan (
<-->
)Abaixo está um exemplo de código Tarjan:
O que um
⟷
operador de seta dupla ( ) faz no idioma do Tarjan?Bem, quase todas as variáveis na linguagem do Tarjan são ponteiros.
<-->
é uma operação de troca. As seguintes impressõestrue
Após a execução
x <--> y
,x
aponta para o objeto quey
costumava apontar ey
aponta para o objeto quex
costumava apontar.Abaixo está uma instrução Tarjan usando o
<-->
operador:Abaixo está uma tradução do código Tarjan acima para o pseudocódigo alternativo:
Como alternativa, poderíamos ter:
Abaixo está um exemplo de uma das funções do Tarjan usando o
⟷
operador:Abaixo está uma tradução da
mesh
função de Tarjan em pseudo-código que não é C, mas parece mais com C (relativamente falando). O objetivo disso é ilustrar como o⟷
operador do Tarjan funciona.(8) Os loops de Tarjan são como loops de C / Java
A linguagem
if
e asfor
construções de Tarjan são familiares para programadores de C / Java. No entanto, a palavra-chave Tarjan para um loop while édo
. Todos osdo
loops terminam com a palavra-chaveod
, que é a grafia inversa dedo
. Abaixo está um exemplo:No pseudocódigo no estilo C, temos:
O exposto acima não é exatamente correto. Um loop do Tarjan é realmente um C / Java
while(true)
com um bloco if-else aninhado dentro. Uma tradução mais literal do código Tarjan é a seguinte:Abaixo, temos um Tarjan-
do
loop mais complicado :O pseudocódigo no estilo C / Java para o complicado Tarjan-
do
loop é o seguinte:(9) Operador de atribuição condicional da Tarjan com todas as condições falsas
Embora a longa explicação acima cubra a maioria das coisas, algumas questões ainda não foram resolvidas. Espero que alguém mais algum dia escreva uma resposta nova e melhorada, com base na minha, que responda a esses dilemas.
Notavelmente, quando o operador de atribuição condicional
:= if
é usado e nenhuma condição é verdadeira, não sou o valor atribuído à variável.Não tenho certeza, mas é possível que nenhuma atribuição seja feita para
x
:Você pode exigir que a variável do lado esquerdo vista em uma
:= if
declaração seja declarada anteriormente. Nesse caso, mesmo que todas as condições sejam falsas, a variável ainda terá um valor.Como alternativa, talvez todas as condições falsas representem um erro de tempo de execução. Outra alternativa é retornar um
null
valor especial e armazenarnull
no argumento esquerdo da atribuição.fonte
=
significa comparação quanto onde significa atribuição (se eu escrevesse um idioma, eu o tornaria um erro de sintaxe, e apenas tenho:=
e==
). Por outro lado, o operador de swap é o tipo de coisa que ocorreria apenas em idiomas especializados, onde era uma operação comum; em outros idiomas, você pode assumir uma função de biblioteca chamadaswap
e substituirh1 ⟷ h2
por, emswap(h1, h2)
vez de escrever a implementação todas as vezes.[1, 2] = [1, 2, 3, 4, 5]
verdade?|
operador é um guarda . Eles são usados em Haskell (e acredito que outras linguagens funcionais) nas definições de funções:f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
aquiotherwise
está um apelido paraTrue
ef
define os números de fibonacci.Nunca vi isso antes, mas acho que posso deduzir o que se entende por contexto. Presumivelmente,
⟷
deve ser uma operação de troca eif G1 -> S1 | G2 - >S2 | ... fi
é uma construção do tipo if / then / else que também retorna um valor, como o?:
operador ternário em C e Java.Com isso em mãos, poderíamos escrever a função acima em uma linguagem semelhante a Java:
fonte