Você está na página 1de 57

Limbajul Algoritmic

Dorel Lucanu
Faculty of Computer Science
Alexandru Ioan Cuza University, Iasi, Romania
dlucanu@info.uaic.ro

PA 2014/2015

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

1 / 57

Outline

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

2 / 57

Introducere

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

3 / 57

Introducere

Ce este un algoritm
Nu exista o definitie standard pentru notiunea de algorithm.
Cambridge Dictionary:
A set of mathematical instructions that must be followed in a fixed order, and that,
especially if given to a computer, will help to calculate an answer to a mathematical
problem.

Schneider and Gersting 1995 (Invitation for Computer Science):


An algorithm is a well-ordered collection of unambiguous and effectively computable
operations that when executed produces a result and halts in a finite amount of time.

Gersting and Schneider 2012 (Invitation for Computer Science, 6nd


edition):
An algorithm is ordered sequence of instructions that is guaranteed to solve a specific
problem.

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

4 / 57

Introducere

Ce este un algoritm?

Wikipedia:
In mathematics and computer science, an algorithm is a step-by-step procedure for
calculations. Algorithms are used for calculation, data processing, and automated
reasoning.
An algorithm is an effective method expressed as a finite list of well-defined instructions
for calculating a function. Starting from an initial state and initial input (perhaps
empty), the instructions describe a computation that, when executed, proceeds through
a finite number of well-defined successive states, eventually producing output and
terminating at a final ending state. The transition from one state to the next is not
necessarily deterministic; some algorithms, known as randomized algorithms, incorporate
random input.

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

5 / 57

Introducere

Ingredientele de baza: model de calcul, problema rezolvata


Toate definitiile au ceva n comun:
datele/informatia si procesarea acestora/acesteia n pasi. Acestea
sunt descrise n general de un model de calcul.
Un model de calcul este format din:
memorie - modul de reprezentare a datelor
instructiuni
sintaxa - descrie sintactic pasii de procesare
semantica - descrie pasii de procesare realizati de executia unei
instructiuni; n general este data de o relatie de tranzitie peste
configuratii (sistem tranzitional)

un algoritm trebuie sa produca un rezultat, adica un algoritm trebuie


sa rezolve o problema.
O problema este n general reprezentata de o pereche (input,output),
unde input reprezinta descrierea datelor de intrare (instanta) iar
output descrierea datelor de iesire (rezultatul).
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

6 / 57

Introducere

Cum descriem un algoritm?


informal: limbaj natural
formal
notatie matematica (masini Turing, lambda-calcul (Church), functii
recursive, . . . )
limbaje de programare: imperative de nivel inalt, de nivel jos,
declarative (e.g., programare functionala, programare logica). Acesta
poate fi si un model informal daca nu exista o semantica formala
pentru limbaj.

semiformal
pseudo-cod: combina notatia formala a limbajelor de prgramare cu
limbajul natural
notatie grafica: scheme logice, automate (state machines), diagrame
de activitati

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

7 / 57

Introducere

De ce nevoie de formalizare?

nainte de secolul 20 matematicienii au utilizat notiunea de algoritm


doar la nivel intuitiv
n 1900, David Hilbert, la Congresul matematicienilor din Paris, a
formulat 23 de probleme ca provocari ale secolului care ncepea
problema a 10-a cerea gasirea unui proces care sa determine daca un
polinom cu coeficienti ntregi are o radacina ntreaga
Hilbert nu a pronuntat termenul de algoritm

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

8 / 57

Introducere

De ce nevoie de formalizare?

problema a 10-a a lui Hilbert este nerezolvabila, i.e. nu exista un


algoritm care avand la intrare un polinom p, decide daca p are
radacina ntreaga
acest fapt nu se poate demonstra avand doar notiunea intuitiva de
algoritm
pentru a demonstra ca nu exista algoritm care rezolva o problema, e
necesar de o notiune formala

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

9 / 57

Introducere

Formalizarea notiunii de algoritm


abia n 1936 Alonso Church si Alan Turing au definit formal, fiecare
independent, notiunea de de algoritm
Church a utilizat notattia cunoscuta acum sub numele de
lambda-calcul (-calcul)
Turing a definit modelul de calcul care acum este cunoscut sub
numele de masini Turing
cele doua modele de calcul sunt echivalente
n 1970 Yuri Matijasevic a aratat ca nu exista algoritm care sa testeze
daca un polinom dat are radacina ntreaga sau nu (rezultaul se
bazraza pe munca anterioara depusa de Martin Davis, Hilary Putnam,
si Julia Robinson)
de atunci au aparut multe alte modele echivalente cu masinile Turing

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

10 / 57

Introducere

Teza Church-Turing
Turing a afirmat (Teza lui Turing) ca orice functie a carei valoare poate fi
obtinuta printr-o metoda efectiva (?), poate fi calculta de o masina Turing.
Forma cea mai accesibila formulata de Turing:
LCMs [logical computing machines: Turings expression for Turing machines] can
do anything that could be described as rule of thumb or purely mechanical.
(Turing 1948)
Teza lui Church:
A function of positive integers is effectively calculable only if recursive.
Modelul de calcul al functiilor recursive a fost definit de de Godel si Herbrand
(1932-1934) si este echivalent cu lambda-calculul (Kleene, Church, 1936).
Kleene (1967) este cel care a introdus termenul de Teza Church-Turing:
So Turings and Churchs theses are equivalent. We shall usually refer to them
both as Churchs thesis, or in connection with that one of its . . . versions which
deals with Turing machines as the Church-Turing thesis.
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

11 / 57

Introducere

Nivelul de formalizare
Care este cel mai potrivit limbaj formal de prezentare a algoritmilor?
masinile Turing, lambda-calculul, functiile recursive au avantajul ca
sunt usor de definit matematic, dar sunt greu de utilizat n practica
limbajele de programare sunt usor de utilizat n practica dar dificil de
manevrat n demonstratii datorita detaliilor de implementare
cel mai simplu limbaj de programare echivalent cu masinile Turing:
modelul de memorie: multime de variabile ce pot lua valori ntregi
instructiuni: goto conditionala si neconditionala, incrementarea si
decrementarea variabilelor
este cunoscut sub numele de counting machines
o variant structurata (modelul programelor while):
modelul de memorie: multime de variabile ce pot lua valori ntregi
instructiuni: atribuirea, if, while, si compunerea secventiala
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

12 / 57

Limbajul Alk

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

13 / 57

Limbajul Alk

Motivatie
Scopul nostru este de a avea un limbaj care este
destul de simplu pentru a fi nteles
suficient de expresiv pentru a descrie toti algoritmii prezentati
abstract: descrierea algoritmului face abstractie de detaliile de
implementare (specifice unui limbaj de programare real), avantajand
astfel focalizarea pe gandirea algoritmica
sa ofere un model de calcul riguros definit si potrivit pentru analiza
algoritmilor (corectitudine si eficienta)
executabil: algoritmii pot testati si executiile lor analizate cu diverse
mijloace (executie pas cu pas, executie simbolica, etc)
intrarile si iesirile sunt reprezentate abstract, ca obiecte matematice.
astfel ncat detaliile de implementare sunt omise total
Un candidat care satisface aceste cerinte este Alk (limbaj specific acestui
curs).
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

14 / 57

Limbajul Alk

Modelul de memorie

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

15 / 57

Limbajul Alk

Modelul de memorie

Modelul de memorie
memoria este data de o multime de variabile
variabilele nu sunt altceva decat locatii de memorie care stocheaza
valori si care sunt accesta prin nume simbolice n loc de adrese
astfel o varibila este o pereche:
notatie matematica nume-variabila 7 valoare
valoare
notatie grafica
nume-variabila
o valoare va fi un obiect al unui tip de date abstract
exemple de tipuri de valori:
scalare
tablouri
structuri
liste
...
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

16 / 57

Limbajul Alk

Modelul de memorie

Tip de date
Tip de data = valori (obiecte) + operatii
Fiecare valoare (obiect) este reprezentata pe un spatiu de memorie.
Pentru fiecare tip trebuie precizata lungimea (dimensiunea) reprezentarii
obiectelor.
Exista doua moduri de a defini lungimea reprezentarii:
uniform: lungimea reprezentarii valorilor scalare = 1, pentru obiectele
conpuse = numarul obiectelor scalare componente;
logaritmic: pentru obiectele scalare se presupune reprezentarea binara,
pentru obiectele compuse se ia suma reprezentarilor obiectelor
componente.

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

17 / 57

Limbajul Alk

Modelul de memorie

Scalari
aici sunt incluse tipurile primitive: valorile boolene, algebra ntregilor,
algebra numerelor rationale (virgula mobila), siruri
notatie matematica

b 7 true

i 7 5

notatie grafica

true
b

5
i

C++

bool b = true;

int i = 5;

Notatia matematica este scrierea simplificata (fara numele intermediar al


functiei) al unei functii : {b, i, . . .} Val data prin (b) = true,
(i) = 5, . . . . Val este reuniunea valorilor booleene, ntregi,. . . .
Lungimea reprezentaarii: ntregi n - log2 n, booleeni b - 1, . . .
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

18 / 57

Limbajul Alk

Modelul de memorie

Scalari (cont.)

ntregi:
Int = {. . . , 2, 1, 0, 1, 2, . . .}
booleeni:
Bool = {false, true}
rationale:
Float = numerele rationale
O caracteristica importanta pentru valorile scalare: admit reprezentari
finite
Intrebare: ce se poate spune despre numerele irationale, de exemplu

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

2?

19 / 57

Limbajul Alk

Modelul de memorie

Tablouri (unidimensionale)
Un tablou (unidimensional) poate fi abstractizat ca o functie de la
multimea (finita) de indici la multimea de valori. O astfel de functie poate
fi reprezentata de o multime de perechi indice 7 valoare. Vom considera
ca multimea indicilor este {0, 1, . . . , n 1} (la fel ca n C++):
notatie matematica

notatie grafica

a 7 {0 7 a0 1 7 a1 2 7 a2 }

0
a0
a

1
a1

2
a2

int a[3];
for (i=0; i<3;++i)
cin >> a[i];

C++
or
int a = {a0, a1, a2};

Tablourile multidimensionale pot fi modele cu tablouri unidimensionale de


tablouri . . .
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

20 / 57

Limbajul Alk

Modelul de memorie

Tablouri (unidimensionale) (cont.)

Arr n = {{0 7 v0 , . . . , n1 7 vn1 | vi Val, i = 0, . . . , n1}


Val = multimea tuturor valorilor (scalare si nescalare (compuse))
S
Val = Int Bool Float n1 Arr n . . .
Arr n hV i = {{0 7 v0 , . . . , n1 7 vn1 | vi V , i = 0, . . . , n1}
Exemple: Arr n hInti, Arr n hBooli, Arr n hArr m i, Arr n hListi
Notatie: Uneori notam 0 7 v0 , . . . , n1 7 vn1 prin (v0 , . . . , vn1 ).

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

21 / 57

Limbajul Alk

Modelul de memorie

Structuri
Structurile sunt reprezentate ntr-un mod similar celui de la tablouri,
numai ca acum domeniul functiilor este multimea numelor de campuri n
loc de cea a indicilor.
De exemplu, o structura p reprezentand puncte n plan are doua campuri:
x si y:
notatie matematica

notatie grafica

C++

D. Lucanu (FII - UAIC)

p 7 {x 7 2 y 7 7}
x
2
p

y
7

struct Point {
int x;
int y;
} p;
p.x = 2; p.y = 7;
Limbajul Algoritmic

PA 2014/2015

22 / 57

Limbajul Alk

Modelul de memorie

Structuri (cont.)

F = {f1 , . . . , fn } - o multime de campuri (de exemplu


x y next val...)
Str F = {{f1 7 v1 , . . . , fn 7 vn } | vi Val, i = 1, . . . , n}
Str hf1 : V1 , . . . fn : Vn i = {{f1 7 v1 , . . . , fn 7 vn } | v1 V1 , . . . , fn Vn }
Exemplu:
FSLL = {len, arr}
Str hlen : Int, arr : Arr 100 hIntii =
{{len 7 n arr 7 a | n Int, a Arr 100 hInti}

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

23 / 57

Limbajul Alk

Modelul de memorie

Liste liniare

O lista liniara este o secventa de valori:


notatie matematica

ll 7 [2, 7, 4, 2, 8]

notatie grafica

2, 7, 4, 2, 8
ll
list<int> ll;

C++
(pot exista diferite implementari)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

24 / 57

Limbajul Alk

Modelul de memorie

Liste liniare (cont.)

LLin = {[v0 , . . . , vn1 ] | vi Val, i = 0, . . . , n}


LLinhV i = {[v0 , . . . , vn1 ] | vi V , i = 0, . . . , n}
Exemple: LLinhInti, LLinhArr n i, LLinhArr n hFloatii
A nu se confunda notatia [v0 , . . . , vn1 ] (lista liniara) cu (v0 , . . . , vn1 )
(tablou unidimensional).

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

25 / 57

Limbajul Alk

Modelul de memorie

Valori complexe: grafuri


Graful G = ({0, 1, 2}, {(0, 1), (0, 2), (1, 2)}) este reprezentat prin liste de
adiacenta dupa cum urmeaza:
notatie matematica
{n 7 3 a 7 {0 7 [1, 2] 1 7 [0, 2] 2 7 [0, 1]}}
notatie grafica
n a
0
1
3 [1, 2] [0, 2]
G

2
[0, 1]

C++
struct Graph {
int n;
vector<list<int>> a;
} G;
D. Lucanu (FII - UAIC)

G.n = 3;
G.a[0].push_front(1);
...
Limbajul Algoritmic

PA 2014/2015

26 / 57

Limbajul Alk

Operatii

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

27 / 57

Limbajul Alk

Operatii

Tip de date (cont.)

Tip de data = obiecte + operatii


Fiecare operatie are un cost timp.
Pentru fiecare tip trebuie precizat timpul pentru fiecare operatie.
Exista doua moduri de a defini timpul (mostenite de la lungimea
reprezentarii):
uniform: nu depinde de marimea reprezentarii obiectelor
logaritmic: depinde de marimea reprezentarii

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

28 / 57

Limbajul Alk

Operatii

Operatii cu scalari

Intregi:
Operatie
a +Int b
a Int b

time(Operatie)
Cost uniform Cost logaritmic
O(1)
O(max(log a, log b))
O(log a log b)
O(1)
O(max(log a, log b)1.545 )

...

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

29 / 57

Limbajul Alk

Operatii

Tablouri

Operatie
A.lookup(i)
A.update(i, v )

time(Operatie)
Cost uniform Cost logaritmic
O(1)
O(i + log ai )
O(1)
O(i + log v )

unde am presupus A 7 {0 7 a0 , . . . , n 1 7 an1 }

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

30 / 57

Limbajul Alk

Operatii

Structuri

Operatie
S.lookup(x)
S.update(x, v )

time(Operatie)
Cost uniform Cost logarithmic
O(1)
O(log sx )
O(1)
O(log v )

unde am presupus S 7 {. . . x 7 sx , . . .}

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

31 / 57

Limbajul Alk

Operatii

Liste liniare: definitie operatii


empty()
L.topFront()
L.topBack()
L.lookup(i)
L.insert(i,x)
L.remove(i,x)
L.size()
L.popFront()
L.popBack()
L.pushFront(x)
L.pushBack(x)
L.update(i,x)

ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce

lista vida []
v0
vn1
vi
[. . . vi1 , x, vi , . . .]
[. . . vi1 , vi+1 , . . .]
n
[v1 , . . . , vn1 ]
[v0 , . . . , vn2 ]
[x, v0 , . . . , vn1 ]
[v0 , . . . , vn1 , x]
[. . . vi1 , x, vi+1 , . . .]

unde am presupus L 7 [v0 , . . . , vn1 ]


Notatii: L[i] este aceeasi cu L.lookup(i)
L[i] = x este aceeasi cu L.insert(i, x)
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

32 / 57

Limbajul Alk

Operatii

Liste liniare: operatii (versiunea 1)


- corespunde implementarii cu tablouri
Operatie
time(Operatie)
Cost uniform
Cost logaritmic
L.lookup(i)
O(1)
?
L.insert(i, x) O(L.size() i)
?
L.remove(i, x) O(L.size() i)
?
L.update(i, x) O(1)
?
L.topFront()
O(1)
?
L.popFront()
O(L.size())
?
L.pushFront() O(L.size()))
?
L.topBack()
O(1)
?
L.popBack()
O(1)
?
L.pushBack()
O(1)
?

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

33 / 57

Limbajul Alk

Operatii

Liste liniare: operatii (versiunea 2)


- corespunde implementarii cu liste dublu nlantuite
Operatie
time(Operatie)
Cost uniform Cost logaritmic
L.lookup(i)
O(i)
?
L.insert(i, x) O(i)
?
L.remove(i, x) O(i)
?
L.update(i, x) O(i)
?
L.topFront()
O(1)
?
L.popFront()
O(1)
?
L.pushFront() O(1)
?
L.topBack()
O(1)
?
L.popBack()
O(1)
?
L.pushBack()
O(1)
?

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

34 / 57

Limbajul Alk

Operatii

Liste liniare: operatii (versiunea 3?)


- Exista o lista liniara cu urmatoarele proprietati?
Operatie
time(Operatie)
Cost uniform Cost logaritmic
L.lookup(i)
O(1)
?
L.insert(i, x) O(i)
?
L.remove(i, x) O(i)
?
L.update(i, x) O(1)
?
L.topFront()
O(1)
?
L.popFront()
O(1)
?
L.pushFront() O(1)
?
L.topBack()
O(1)
?
L.popBack()
O(1)
?
L.pushBack()
O(1)
?

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

35 / 57

Limbajul Alk

Expresii si instructiuni

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

36 / 57

Limbajul Alk

Expresii si instructiuni

Expresii: sintaxa
Sintaxa este foarte apropiata de cea limbajului C++:
Varianta recursiva
Notatia Backus-Naur

un identificator (nume de variabila)


este espresie

syntax Exp ::= Id


| Int
| Exp "+" Exp
| Exp "*" Exp
...
| Exp "&&" Exp
| Exp "||" Exp
...
| Id "(" Exps ")"
...
syntax Exps ::= List{Exp,","}

un numar ntreg este expresie


daca E1 si E2 sunt expresii atunci
E1 + E2 este expresie
daca E1 si E2 sunt expresii atunci
E1 * E2 este expresie
...
daca E1 , . . . , En este o lista de
expresii sI F un identificator (nume
de functie)
...

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

37 / 57

Limbajul Alk

Expresii si instructiuni

Instructiuni: sintaxa
syntax Stmt ::= Exp "=" Exp ";"
| Exp ";"
| "{" "}"
| "{" Stmts "}"
| "while" "(" Exp ")" Stmt
| "return" Exps ";"
| Exp "(" Ids ")" "{" Stmts "}"
| "if" "(" Exp ")" Stmt "else" Stmt
| "if" "(" Exp ")" Stmt
...
syntax Stmts ::= List{Stmt,""}
Alk este extensibil: pot fi adaugate noi expresii si instructiuni, cu precizaari
pentru costul timp
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

38 / 57

Limbajul Alk

Expresii si instructiuni

Tipuri de date

Sunt predefinite n Alk.


Presupunem existenta unei metainformatii care mentioneaza tipul fiecarei
variabile (nu exista declaratii de variabile).

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

39 / 57

Limbajul Alk

Expresii si instructiuni

Exemplu de program
/*
This example includes the recursive version of the DFS algorithm.
@input: a digraf D and a vertex i0
@output: the list S of the verices reachable from i0
*/
// the recursive function
dfsRec(i) {
if (S[i] == 0) {
// visit i
S[i] = 1;
p = D.a[i];
while (p.size() > 0) {
j = p.topFront();
p.popFront();
dfsRec(j);
}
}
}
D. Lucanu (FII - UAIC)

// the calling program


i = 0;
while (i < D.n) {
S[i] = 0;
i = i + 1;
}
dfsRec(1);

Limbajul Algoritmic

PA 2014/2015

40 / 57

Limbajul Alk

Expresii si instructiuni

Evaluarea expresiilor
Consideram o functie [[ ]]( ) : Expresii (Stare Valori), unde [[E ]]() ntoarce
valoarea expresiei E calculata n starea .
Exemplu: [[a + b 2]](a 7 3 b 7 6) = 15.
Reguli de calcul pentru [[ ]]( ):
[[x]](. . . x 7 v . . .) = v

[[v ]]( ) = v

[[E1 ]]() = v1 [[E2 ]]() = v2


[[E1 +E2 ]]() = v1 +Int v2
unde +Int reprezinta algoritmul de adunare peste ntregi.
Regulile de mai sus ne dau si o metoda de calcul a timpului necesar evaluarii:
time([[x]](. . . x 7 v . . .)) = log v (logaritmic)
time([[x]](. . . x 7 v . . .)) = 1 (uniform)
time([[E1 +E2 ]]()) = time([[E1 ]]()) + time([[E2 ]]()) + time([[E1 ]]() +Int [[E2 ]]())
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

41 / 57

Limbajul Alk

Expresii si instructiuni

Configuratii

O configuratie este o pereche hsecventa-de-program, starei


Exemple:
hx = x + 1; y = y + 2 * x;, x 7 7 y 7 12i
hs = 0; while (x > 0) {s = s+x; x = x-1;}, x 7 5 s 7 15i

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

42 / 57

Limbajul Alk

Expresii si instructiuni

Pasi de executie

Un pas de executie este definit ca o tranzitie ntre configuratii:


hS, i hS 0 , 0 i
daca si numai daca
executand prima instructiune secventa S n starea obtinem secventa S 0 ,
ce urmeaza a fi executata n continuare, si o noua stare 0
Pasii de executie sunt descrisi prin reguli hS1 , 1 i hS2 , 2 i, unde
S1 , S2 , 1 , 2 sunt termeni cu variabile (patterns).

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

43 / 57

Limbajul Alk

Expresii si instructiuni

Instructiuni: semantica

atribuirea: x = E ;
informal: se evalueaza E si rezultatul este atribuit ca noua valoare a
variabilei x
formal:
hx = E ;S, (x 7 v )}i hS, (x 7 [[E ]]( (x 7 v ))}i
time(hx = E ;S, i hS, 0 i) = time([[E ]]()) + 1, cost uniform
time(hx = E ;S, i hS, 0 i) = time([[E ]]() + log[[E ]]()), cost
logaritmic

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

44 / 57

Limbajul Alk

Expresii si instructiuni

Instructiuni: semantica

if: if (E ) then S else S 0


informal: se evalueaza e; daca rezultatul obtinut este true, atunci se executa
S, altfel se executa S 0
formal:
hif (E ) then S else S 0 y S 00 , i hS S 00 , i daca [[E ]]() = true
hif (E ) then S else S 0 y S 00 , i hS 0 S 00 , i daca [[E ]]() = false
time(hif (E ) then S else S 0 S, i h , i) = time([[E ]]()), cost uniform
time(hif (E ) then S else S 0 S, i h , i) = time([[E ]]()), cost
logaritmic

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

45 / 57

Limbajul Alk

Expresii si instructiuni

Instructiuni: semantica

while: while (E ) S
informal: se evalueaza e; daca rezultatul obtinut este true, atunci se
executa S, dupa care se evalueaza din nou e si . . . ; altfel executia
instructiunii se termina
formal: se exprima cu ajutorul lui if:
hwhile (e) S y S 0 , i
hif (e) { S ; while (e) S } else { }S 0 , i
time(hwhile (E ) then S else S 0 S, i hif (e) ...S, i) = 0,
pentru ambele costuri

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

46 / 57

Limbajul Alk

Expresii si instructiuni

Apelul de functie
Operatie mai complexa ce include mai multe activitati:
se evalueaza argumentele actuale
legarea parametrilor formali la valorile date de argumentele actuale
(parametrii functiei devin variabile cu valorile date de evaluarea
argumentelor actuale)
salvarea starii curente n lista de actvitati
construirea starii de start pentru executia corpului functiei formata
din variabilele globale, parametrii si variabilele locale ale functiei
dupa executia corpului functiei, se restaureaza starea de dinainte de
apel
Functiile sunt memorate ca variabile speciale
f 7 (parametri@{corpul functiei})
Presupunere: costul unui apel este suma dintre costul evaluarii
argumentelor actuale si costul executiei corpului functiei.
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

47 / 57

Limbajul Alk

Expresii si instructiuni

Calcul (executie)
Un calcul (o executie) este o secventa de pasi:
hS1 , 1 i hS2 , 2 i hS3 , 3 i . . .
Exemplu:
hif (x > 3) x = x + y; else x = 0; y = 4; skip, x 7 7 y 7 12i
hx = x + y; y = 4; skip, x 7 7 y 7 12i
hy = 4; skip, x 7 19 y 7 12i
hskip, x 7 19 y 7 4i
[[x > 0]](x 7 7 y 7 12) = true
[[x + y]](x 7 7 y 7 12) = 19
[[4]](x 7 19 y 7 12) = 4

cost uniform: 4
cost logaritmic: log 7 + log 7 + log 12 + log 19 + log 4

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

48 / 57

Testarea algoritmilor cu K Framework (Informativ)

Plan

Introducere

Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica

Testarea algoritmilor cu K Framework (Informativ)

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

49 / 57

Testarea algoritmilor cu K Framework (Informativ)

Testarea algoritmilor cu K Framework


K Framework (www.kframework.org) este un mediu de lucru pentru
definitii de limbaje de programare. Definitiile K sunt executabile. Limbajul
Alk este definit n K, asa ca algoritmii descrisi n Alk pot fi testati si
analizati.
Exista o interfata online pentru K (http://fmse.info.uaic.ro/tools/K/), dar
se recomanda instalarea Kului pentru calculatorul personal.
Definitia K a lui Alk se gaseste la adresa
https://github.com/kframework/alk-semantics
Compilarea definitiei limbajului Alk:
kompile alk
Proiect (posibil pentru licenta): dezvoltarea unei interfete specifice pentru
Alk.
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

50 / 57

Testarea algoritmilor cu K Framework (Informativ)

Precizarea configuratiei initiale


Pentru executia unui algoritm, trebuie precizata configuratia initiala, care consta
din program si starea memoriei.
Urmatorul exemplu este un generator de numere pseudo-aleatorii din cartea The
C Programming Language de Kernighan and Ritchie.
rand() {
random_seed = random_seed * 1103515245 +12345;
return (random_seed / 65536) % 32768;
}
x = rand();
y = rand();
Deoarece random seed este variabila globala, valoarea ei initiala trebuie
precizata n starea initialaa (ST):
krun programs/random.alk -c ST="random_seed |-> 1212"

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

51 / 57

Testarea algoritmilor cu K Framework (Informativ)

Obtinerea configuratiei finale


Configuratia finala se obtine prin urmatoarea comanda:

$ krun programs/random.alk -cST=".Map" -cGST="random_seed |-> 1212"


<k>
.K
</k>
<state>
rand |-> lambda ( @ random_seed = ((random_seed * 1103515245) +
return ((random_seed / 65536) % 32768) ; )
random_seed |-> 1475908039511156662170
x |-> 26331
y |-> 19887
</state>
Componentele unei confiratii n K sunt celule, descrise cu o sintaxa inspirata din
XML. Celula <k> S </k> include lista de activitati S de executat (n cpnfiguratia
initiala ea include programul), iar celula <state> </state> include starea
memoriei . Functiile program sunt memorate ca lambda-expresii.
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

52 / 57

Testarea algoritmilor cu K Framework (Informativ)

Exemplu de algoritm n Alk: DFS nerecursiv


/*

This example includes the nonrecursive version of the DFS algorith


@input: a digraf D and a vertex i0
@output: the list S of the verices reachable from i0
*/

i = 0;
while (i < D.n) {
p[i] = D.a[i];
S[i] = 0;
i = i + 1;
}
SB = empty();
SB.pushFront(i0);
S[i0] = 1;

D. Lucanu (FII - UAIC)

// visit i0
while (SB.size() > 0) {
i = SB.topFront();
if (p[i].size() == 0) {
SB.popFront();
}
else {
j = p[i].topFront();
p[i].popFront();
if (S[j] == 0) {
// visit j;
S[j] = 1;
SB.pushFront(j);
}
}
}
Limbajul Algoritmic

PA 2014/2015

53 / 57

Testarea algoritmilor cu K Framework (Informativ)

Executia algoritmului DFS nerecursiv


Presupunand ca digraful D este
D.n = 3
D.a[0] = (1,2)
D.a[1] = (2, 0)
D.a[2] = (0)
si ca varful de start i0 este 1, linia de comanda pentru executie va preciza
valoarea lui D n starea locala (ST):
krun programs/dfsnerec.alk
-cST "D |-> { n |-> 3
a |-> { 0 |-> [1, 2]
1 |-> [2, 0]
2 |-> [0] } }
i0 |-> 1
p |-> { .Map }
S |-> { .Map }"
D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

54 / 57

Testarea algoritmilor cu K Framework (Informativ)

Exemplu de algoritm n Alk: DFS recursiv


/*
This example includes the recursive version of the DFS algorithm.
@input: a digraf D and a vertex i0
@output: the list S of the verices reachable from i0
*/
// the recursive function
dfsRec(i) {
if (S[i] == 0) {
// visit i
S[i] = 1;
p = D.a[i];
while (p.size() > 0) {
j = p.topFront();
p.popFront();
dfsRec(j);
}
}
}
D. Lucanu (FII - UAIC)

// the calling program


i = 0;
while (i < D.n) {
S[i] = 0;
i = i + 1;
}
dfsRec(1);

Limbajul Algoritmic

PA 2014/2015

55 / 57

Testarea algoritmilor cu K Framework (Informativ)

Executia algoritmului DFS recursiv

Este similara cu a variantei nerecursive:


krun programs/dfsrec.alk
-cST "D |-> { n |-> 3
a |-> { 0 |-> [1, 2]
1 |-> [2, 0]
2 |-> [0] } }
i0 |-> 1
p |-> { .Map }
S |-> { .Map }"

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

56 / 57

Testarea algoritmilor cu K Framework (Informativ)

Demo

Executia algoritmilor de mai sus cu interfata online.

D. Lucanu (FII - UAIC)

Limbajul Algoritmic

PA 2014/2015

57 / 57

Você também pode gostar