Krótka historia
Słynny informatyk Tarjan napisał książkę lata temu. Zawiera absolutnie dziwny pseudokod. Czy ktoś mógłby to wyjaśnić?
Długa historia
Tarjan jest znany z wielu osiągnięć, w tym z faktu, że był współtwórcą drzew pnia . W latach 80. opublikował książkę „ Struktury danych i algorytmy sieciowe ”.
Cały pseudo-kod w książce Tarjana napisany jest w języku jego własnego autora. Konwencje pseudokodu są bardzo szczegółowe. To prawie prawdziwy język i można sobie wyobrazić napisanie kompilatora. Tarjan pisze, że jego język opiera się na następujących trzech:
Mam nadzieję, że ktoś, kto zna jeden lub dwa powyższe języki lub dzieło Tarjana, będzie w stanie odpowiedzieć na moje pytanie.
Przykład funkcji napisanej w języku Tarjan pokazano poniżej:
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;
Widziałem dużo pseudo-kodu, ale nigdy nie widziałem czegoś takiego jak Tarjan. Jak działa pseudokod Tarjana? W jaki sposób przykłady pseudokodu Tarjana można przepisać jako coś, co wygląda bardziej jak C lub Java? Nie musi to być nawet C ani Java. Konstrukcja if-else w języku Tarjana różni się nie tylko od języków rodziny C, ale także różni się od Python, MATLAB i wielu innych.
źródło
return
zdanie naprawdę kończy się przecinkiem?Odpowiedzi:
Spis treści
Moje wyjaśnienie pseudokodu Tarjana podzielę na następujące sekcje:
->
i|
):=
i=
)else if
, ale nie maelse
konstrukcji:= if
Dodatkowe przykłady Tarjana
if
i:= if
5.5. Tablice Tarjan (lub listy)
Podsumowanie operatorów
⟷
)(1) Bloki If-else Tarjana
(operatorzy
→
i|
)if-else
Konstrukt jest chyba najbardziej podstawową strukturę sterowania w języku Tarjan użytkownika. Oprócz podobnych do C bloków, zachowanie if-else jest prawie wbudowane w zadania Tarjana i pętle while Tarjana. Operator strzałki Tarjana->
(lub →) jest separatorem między warunkiem instrukcji if a blokiem wykonania instrukcji if.Na przykład w języku Tarjana możemy mieć:
Jeśli częściowo przetłumaczymy wiersz powyższego kodu Tarjan na język C lub Java, otrzymujemy:
Zamiast prawych nawiasów klamrowych (jak w C i Javie) Tarjan kończy
if
blok -blokiem odwróconej pisowni słowa kluczowego w stylu ALGOL:fi
Jeśli nadal będziemy tłumaczyć nasz powyższy przykład, otrzymamy:
(2) Testy przydziału i równości (
:=
i=
)Tarjan bierze tych operatorów z ALGOL (później także w Pascal).
Tarjan używa
=
do testów równości, a nie przypisań (więc działa jak Java==
).Do przypisania używa Tarjan
:=
, który działa jak Java=
.Zatem jeśli będziemy kontynuować tłumaczenie naszego przykładu, otrzymamy:
Pionowy pasek (lub „potok” lub
|
) w języku Tarjan jest równoważnyelse if
słowu kluczowemu w języku C lub Java.Na przykład w języku Tarjana możemy mieć:
Powyższy kod Tarjan tłumaczy się na:
(3)
else if
tylko i bezelse
konstruktuWcześniej
if
opisywałem podstawy wypowiedzi bez opisywania niuansów. Nie będziemy jednak omawiać drobnego szczegółu. Ostatnia klauzula wif-else
bloku Tarjan-ian musi zawsze zawierać→
operator arrow ( ). W związku z tym nie maelse
tylko języka Tarjanelse if
.else
Najblizszą opcją dla -block w języku Tarjan jest wykonanie warunku testowego znajdującego się po prawej stronietrue
.W C / Java mielibyśmy:
Przykłady są łatwiejsze do zrozumienia niż ogólne opisy. Jednak teraz, gdy mamy już kilka przykładów, wiedz, że ogólna formalność konstruktu Tarjan if-else jest następująca:
Ta postać
|
jest jakif else
Znak
→
oddziela warunek testowy od rzeczy do zrobienia.(4) Operator warunkowego przydziału Tarjana
:= if
Tarjana
if
można używać na dwa różne sposoby. Jak dotąd opisaliśmy tylko jedno z zastosowań Tarjanianaif
. Nieco mylące, Tarjan nadal używa notacji / składniif
dla drugiego typuif
-construct. To, coif
jest używane, oparte jest na kontekście. Analiza kontekstu jest w rzeczywistości bardzo łatwa, ponieważ drugi typ Tarjan-if
jest zawsze wstępnie ustalany przez operatora przypisania.Na przykład możemy mieć następujący kod Tarjan:
Rozpocznij dygresję
Po pewnym czasie pracy z kodem Tarjan przyzwyczajasz się do kolejności operacji. Jeśli nawiasujemy warunek testu w powyższym przykładzie, otrzymujemy:
a = 4
nie jest operacją przypisania.a = 4
jest jaka == 4
- zwraca true lub false.Koniec dygresji
Może pomóc myśleć o
:= if
składni dla pojedynczego operatora, odrębnej od:=
i wif
rzeczywistości będziemy nazywać:= if
operatora „operatorem przypisania warunkowego”.Do
if
listy(condition → action)
. Gdyż:= if
podajemy,(condition → value)
gdzievalue
jest wartość po prawej stronie, którą możemy przypisać po lewej stronielhs
w C lub Java może wyglądać następująco:
Rozważ następujący przykład „przypisania warunkowego” w kodzie Tarjanian:
# Tworzenie instancji w Tarjan z przykładu piątego x: = a = 4 → 9 | a> 4 → 11 | prawda → 99 fi
W C / Java mielibyśmy:
(5) Podsumowanie operatorów:
Do tej pory mamy:
:=
...... Operator przypisania (C / Java=
)=
...... Test równości (C / Java==
)→
...... Ogranicznik między warunkiem testu bloku if a korpusem bloku if|
..... C / Java else-ifif ... fi
..... jeśli-inny blok:= if... fi
..... Przypisanie warunkowe na podstawie bloku if-else(5.5) Listy / tablice Tarjan:
Język Tarjana ma wbudowane pojemniki podobne do tablicy. Składnia tablic Tarjan jest znacznie bardziej intuicyjna niż notacja
if else
instrukcji Tarjan .Elementy tablicy Tarjan są dostępne w nawiasach
()
, a nie w nawiasach kwadratowych[]
Indeksowanie zaczyna się od
1
. A zatem,Poniżej pokazano, jak utworzyć nową tablicę zawierającą 1 i 5 element
[1, 2, 3, 4, 5, 6, 7]
Operator równości jest zdefiniowany dla tablic. Zostanie wydrukowany następujący kod
true
Sposobem Tarjana na sprawdzenie, czy tablica jest pusta, jest porównanie jej z pustą tablicą
Można stworzyć widok (a nie kopiować) pod-macierzy, zapewniając operatorowi wiele indeksów w
()
połączeniu..
(6) Dodatkowe przykłady Tarjana
if
i:= if
Poniżej znajdują się kolejne przykłady warunkowego przypisania Tarjan (
:= if
):(true --> b)
jest(cond --> action)
klauzulą najbardziej wysuniętą w lewo , mającą prawdziwy warunek. Tak więc pierwotne zadanie przydziału Szósty ma takie samo zachowanie przydziału jaka := b
Poniżej znajduje się nasz najbardziej skomplikowany przykład kodu Tarjan do tej pory:
Poniżej znajduje się tłumaczenie kodu Tarjana do scalania dwóch posortowanych list. Poniżej nie jest dokładnie C lub Java, ale jest znacznie bliżej C / Java niż wersja Tarjan.
Poniżej znajduje się kolejny przykład kodu Tarjan i tłumaczenia w czymś podobnym do C lub Java:
Poniżej znajduje się tłumaczenie C / Java:
(7) Operator strzała z podwójnymi szpicami Tarjana (
<-->
)Poniżej znajduje się przykład kodu Tarjan:
Co robi
⟷
operator Double Arrow ( ) w języku Tarjana?Cóż, prawie wszystkie zmienne w języku Tarjana są wskaźnikami.
<-->
jest operacją zamiany. Następujące wydrukitrue
Po wykonaniu
x <--> y
,x
punkty do obiektu, któryy
wykorzystywany do punktu doy
punktów do obiektu, któryx
wykorzystywany do punktu celu.Poniżej znajduje się instrukcja Tarjan używająca
<-->
operatora:Poniżej znajduje się tłumaczenie z powyższego kodu Tarjan na alternatywny pseudokod:
Alternatywnie możemy mieć:
Poniżej znajduje się przykład jednej z funkcji Tarjana używającej
⟷
operatora:Poniżej znajduje się tłumaczenie funkcji Tarjana
mesh
na pseudo-kod, który nie jest C, ale bardziej przypomina C (względnie mówiąc). Ma to na celu zilustrowanie działania⟷
operatora Tarjana .(8) Pętle do Tarjana są jak pętle C / Java while
Język
if
ifor
konstrukcje Tarjana są znane programistom C / Java. Jednak słowem kluczowym Tarjan dla pętli while jestdo
. Wszystkiedo
pętle kończą się słowem kluczowymod
, które jest literowaniem wstecznymdo
. Poniżej znajduje się przykład:W pseudokodzie w stylu C mamy:
Powyższe nie jest właściwie słuszne. Pętla do Tarjan to tak naprawdę C / Java
while(true)
z zagnieżdżonym blokiem if-else. Bardziej dosłowne tłumaczenie kodu Tarjan jest następujące:Poniżej mamy bardziej skomplikowaną
do
pętlę Tarjan :Pseudokod w stylu C / Java dla skomplikowanej
do
pętli Tarjan wygląda następująco:(9) Operator warunkowego przypisania Tarjana ze wszystkimi fałszywymi warunkami
Chociaż powyższe długie wyjaśnienie obejmuje większość rzeczy, kilka spraw pozostaje nierozwiązanych. Mam nadzieję, że ktoś inny napisze kiedyś ulepszoną odpowiedź na podstawie mojej, która odpowiada na te pytania.
W szczególności, gdy
:= if
używany jest operator przypisania warunkowego i żaden warunek nie jest spełniony, nie jestem tym, jaką wartość przypisano zmiennej.Nie jestem pewien, ale możliwe jest, że nie zostanie przypisane
x
:Możesz wymagać, aby zmienna po lewej stronie widoczna w
:= if
instrukcji była wcześniej zadeklarowana. W takim przypadku, nawet jeśli wszystkie warunki są fałszywe, zmienna nadal będzie miała wartość.Alternatywnie, być może warunki całkowicie fałszywe oznaczają błąd czasu wykonywania. Inną alternatywą jest zwrócenie specjalnej
null
wartości i zapisanienull
w lewym argumencie przypisania.źródło
=
oznacza porównanie, jak w przypadku przypisania (gdybym kiedykolwiek napisał język, uczyniłbym go błędem składniowym i po prostu miałbym:=
i==
). Z drugiej strony operator wymiany jest czymś, co występowałoby tylko w wyspecjalizowanych językach, w których było to powszechne działanie; w innych językach, choć można po prostu założyć funkcję biblioteki o nazwieswap
i wymienićh1 ⟷ h2
zswap(h1, h2)
raczej niż wypisywanie wdrożenia każdym razem.[1, 2] = [1, 2, 3, 4, 5]
prawda?|
Operator jest strażnik . Są one używane w języku Haskell (i uważam, że w innych językach funkcjonalnych) w definicjach funkcji:f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
tutajotherwise
jest aliasTrue
if
określa liczby Fibonacciego.Nigdy wcześniej tego nie widziałem, ale myślę, że mogę wywnioskować, co to znaczy z kontekstu. Prawdopodobnie
⟷
musi to być operacja zamiany iif G1 -> S1 | G2 - >S2 | ... fi
jest to konstrukcja typu if / then / else, która również zwraca wartość, podobnie jak?:
operator trójskładnikowy w języku C i Java.Mając to w ręku, moglibyśmy napisać powyższą funkcję w języku podobnym do Java:
źródło