32
Curs 7 E ti d ti ii Extinderea semanticii Valoarea unui tablou Exemplu: suma valorilor unui tablou Exemplu: suma valorilor unui tablou Provocari: adaugarea de noi trasaturi: • operatori • tipuri alte instructiuni alte instructiuni • subprograme alte paradigme de programare: • nedeterminism • paralelism distribuire D. Lucanu – Programare Algebrica distribuire

Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Curs 7

E ti d ti ii• Extinderea semanticii– Valoarea unui tablou– Exemplu: suma valorilor unui tablouExemplu: suma valorilor unui tablou

• Provocari: – adaugarea de noi trasaturi:

• operatori• tipuri• alte instructiuni• alte instructiuni• subprograme

– alte paradigme de programare:• nedeterminism• paralelism

distribuire

D. Lucanu – Programare Algebrica

• distribuire

Page 2: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Liste de intregifmod LIST GEN{X :: TRIV} isfmod LIST-GEN{X :: TRIV} is

protecting NAT .

sorts NeList{X} List{X} .sorts NeList{X} List{X} .subsort NeList{X} < List{X} .

op [] : -> List{X} [ctor] .op _:_ : X$Elt List{X} -> NeList{X} [ctor] ....op the_th`from_ : NzNat NeList{X} ~> X$Elt .

--- definita partialeq the 1 th from E : L = E .eq the (s N) th from E : L = the N th from L .

op insert : List{X} NzNat X$Elt -> List{X} .eq insert(L, s 0, E) = E : L .eq insert(E' : L, s s N, E) = E' : insert(L, s N, E) .

D. Lucanu – Programare Algebrica

eq insert(E : L, s s N, E) E : insert(L, s N, E) .endfm

Page 3: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Liste de intregif d LIST INT ifmod LIST-INT is

protecting LIST-GEN{Int} .

var L : List{Int} .var I : Int .

op sum : List{Int} -> Int .eq sum([]) = 0 .

(I L) I + (L)eq sum(I : L) = I + sum(L) .

--- a lemmaeq sum (take 1 + I from L) =

sum (take I from L) + (the (s I) th from L) .endfm

D. Lucanu – Programare Algebrica

Page 4: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Modificarea semanticii (modulul SEM)( [[ ]]) St X$A V > Li t{I t}op (_[[_]]) : Store X$ArrVar -> List{Int}

...*** lists as values for arrayseq S [[ A [ E ] ]] =

the s(S [[ E ]]) th from (S [[ A]]) .......eq (S [[ X <- E ; ]] ) [[ A ]] = S [[ A ]] .eq (S [[ A[E1] <- E2 ; ]] ) [[ B ]] =

if (A B)if (A == B)then insert(S [[ A ]], s(S [[ E1 ]]), S[[ E2 ]]) else S [[ B ]]

fi . ...

D. Lucanu – Programare Algebrica

Page 5: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablou0s = 0;

i = 0;while (i < n){

s = s + a[i];i = i + 1;;

}

D. Lucanu – Programare Algebrica

Page 6: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tabloufmod SUMARR VAR isfmod SUMARR-VAR issort MySimVar MyArrVar .ops i n s : -> MySimVar .op a : -> MyArrVar .op a : > MyArrVar .

endfm

view SUMARR-VAR-VIEW from VAR to SUMARR-VAR is sort SimVar to MySimVar .sort ArrVar to MyArrVar .

endv

fmod SUMARR-OBJ ispr OBJCODE{SUMARR-VAR-VIEW} .ops init body wbody : > ObjInstrSeqops init body wbody : -> ObjInstrSeq .eq wbody = (s <- s + (a[i]) ;) (i <- i + 1 ;) .eq init = (s <- 0 ;) (i <- 0 ;) .eq body = init while (i < n) { wbody } .

D. Lucanu – Programare Algebrica

eq body init while (i < n) { wbody } .endfm

Page 7: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablouf d TEST ifmod TEST ispr SUMARR-OBJ + SEM{SUMARR-VAR-VIEW} .op s0 : -> Store .eq s0[[ n ]] = 3 .eq s0[[ a ]] = 5 : 7 : 4 : [] .

endfme d

red (s0[[body]])[[s]] .

D. Lucanu – Programare Algebrica

Page 8: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablou

i i t l?• invariantul?assert(true)s = 0;i = 0;assert(inv: ??)while (i < n)while (i < n){

s = s + a[i];i = i + 1;

}assert(s == a[0] + … + a[n-1])assert(s == sum(take n from a))

D. Lucanu – Programare Algebrica

Page 9: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablou

i i t l?• invariantul?s = 0;i = 0;assert(inv: s == sum(take i from a))while (i < n){{

s = s + a[i];i = i + 1;

}

D. Lucanu – Programare Algebrica

Page 10: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablou

fmod SUMARR-INV ispr SUMARR-OBJ + SEM{SUMARR-VAR-VIEW} .ops s0 s1 : -> Store .eq s1[[a]] = s0[[a]] .eq s1[[ i < n ]] = trueeq s1[[ i < n ]] = true .eq s1[[s]] = sum(take s1[[i]] from s0[[ a ]]) .

endfm

red (s1[[wbody]])[[s]] ==sum(take (s1[[wbody]])[[i]] from s0[[ a ]]) .

red (s1[[wbody]])[[a]] .

D. Lucanu – Programare Algebrica

Page 11: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Suma valorilor unui tablou

s = 0;i = 0;assert(inv: s == sum(take i from a))while (i < n){{

s = s + a[i];i = i + 1;

}assert(i == n and s == sum(take i from a))

D. Lucanu – Programare Algebrica

Page 12: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocari

Dorel Lucanu Programare algebrica

Page 13: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 1: operatorii =,++, --i t• sintaxaop _=_ : SimVar Exp -> Exp .op = : ArrComp Exp -> Exp .p _ _ p p pop ++_ : Exp -> Exp .op _++ : Exp -> Exp .op --_ : Exp -> Exp .op _-- : Exp -> Exp .

• semanticasemanticaeq S[[E1 = E2]] = ??eq S[[++ E1]] = ??

[[ 1 ]]eq S[[E1 ++]] = ??eq S[[-- E1]] = ??eq S[[E1 --]] = ??

Dorel Lucanu Programare algebrica

Page 14: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Operatorii =,++, --f ti [[ ]] d bl f tfunctia _[[_]] are un dublu efect acum:

• intoarce valoarea expresiei• schimba starea• schimba starea

de aceea _[[_]] e de natura mai mult coalgebrica decat algebrica:

_[[_]] : Store → (Store × (Int U Bool))ObjExp ∪ ObjTst

Dorel Lucanu Programare algebrica

Page 15: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

operatorii =,++, --: solutii posibilel i l d il• la nivel de compilarex = y = i++;poate fi compilat inp py = i;i = i+1;x = y;

• reconsiderarea definitiei pentru functia semantica:[[ ]] : Store × → StoreVal_[[_]] : Store → StoreVal

<_,_> : Store Val → StoreVal Int < Val, Bool < Valstore : StoreVal → Storeint : StoreVal → Intbool : StoreVal → Bool

Dorel Lucanu Programare algebrica

bool : StoreVal → Bool

Page 16: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 2: noi tipuri de datei bil b l• variabile booleenebool b;

• variabile caracter• variabile caracterchar c;

• probleme ce trebuie rezolvatep ob e e ce t ebu e e o ate– modificarea sintaxei– expresii (definitie, evaluare)– tablouri

Dorel Lucanu Programare algebrica

Page 17: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 3: noi instructiunifor (E1; E2; E3) INSTRdo SECV_INSTR while(T)switch (T)switch (T){

case V1:...case Vn:

SECV INSTR1SECV_INSTR1...case W1:...case Wn:

SECV INSTRk

Dorel Lucanu Programare algebrica

SECV_INSTRk}

Page 18: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 4: subprograme• exemplu

int prim(int x){int i;i = 3;if ( x % 2 == 0) return 0;if ( x % 2 == 0) return 0;while ((x % i != 0) && i < x/2)

i = i + 2;return (x % i);

}• apel prin valoare/referinta• corectitudine

assert(true)ret = prim(a);

Dorel Lucanu Programare algebrica

ret = prim(a);assert((ret == 1) => (∀i)(2<=i<=a/2) => a %i != 0))

Page 19: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 5: programe nedeterministe

• sintaxaif { T1 → INSTR1 □ ... □ Tn → INSTRn }d { T1 → INSTR1 □ □ T → INSTR }do { T1 → INSTR1 □ ... □ Tn → INSTRn }

• semanticacq S[[if {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] =q [[ { }]][[ ]]

S[[INSTRi]] if S[[Ti]]cq S[[if {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] =

[[ ]] [[ ]]⊥ if not S[[T1]] ∧ ... ∧ not S[[Tn]] cq S[[do {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] =

S[[INSTRi do {... }]] if S[[Ti]]S[[INSTRi do {... }]] if S[[Ti]]cq S[[do {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] =

S[[X]] if not S[[T1]] ∧ ... ∧ not S[[Tn]]

Dorel Lucanu Programare algebrica

Page 20: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe nedeterministe: exempluI t ti 3 t bl i d t t• Intersectia a 3 tablouri ordonate crescator– descriere

program– programi = 0; j = 0; k = 0;do {a[i] < b[j] → i++;□ b[j] < c[k] → j++;□ c[k] < a[i] → k++;

}

Dorel Lucanu Programare algebrica

Page 21: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe nedeterministe: corectitudine

Dorel Lucanu Programare algebrica

Page 22: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 6: programe paralele cu variabile partajate

i t• sintaxa– regiune atomica

⟨INSTR⟩⟨INSTR⟩– sectiuni neintreruptibile

• teste, atribuiri, skip, regiuni atomiceteste, at bu , s p, eg u ato ce– compunerea paralela

[INSTR1 || ... || INSTRn]

• semantica

Dorel Lucanu Programare algebrica

Page 23: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe paralele: exempluC t i d i i• Cautarea unei radacini[{x = 0;while (!found) {x++ ;if (f(x) == 0) found = true;

}}}

||{ 1{y = 1;while (!found) {y-- ;if (f(y) == 0) found = true;

}}

Dorel Lucanu Programare algebrica

}]

Page 24: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe paralele: corectitudine

assert(true)[x = 1; || x = 3;]assert(x == 1 ∨ x ==3)

Dorel Lucanu Programare algebrica

Page 25: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 7: programe paralele cu sincronizare

• sintaxaawait (T) INSTR op await_ _ : Tst Instr -> Instr

– notatiewait T ≡ await T skip;wait T ≡ await T skip;

• semanticacq S[[await T INSTR]] = S[[INSTR]] if S[[T]]cq S[[await T INSTR]] S[[INSTR]] if S[[T]]

Dorel Lucanu Programare algebrica

Page 26: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe paralele cu sincronizare: exemplu

• problema producator/consumator – descriere– productia: citeste din a[0..M-1]– consum: scrie in b[0..M-1]– buffer: buffer[0..N-1]

Dorel Lucanu Programare algebrica

Page 27: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Producator/comsumator: program

in = 0; out = 0; i = 0; j = 0;[ while (i < M) {

x = a[i];x a[i];wait ((in – out) < N); buffer[in % M] = x;in++; i++;

}}||while (j < M) {

wait ((in – out) > 0); y := buffer[out % M];out++;b[j] = y;b[j] = y;j++;

}

Dorel Lucanu Programare algebrica

]

Page 28: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe paralele cu sincronizare: corectitudine

Dorel Lucanu Programare algebrica

Page 29: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Provocarea 8: programe distribuite

• program distribuit = o colectie de procese secventiale care comunica prin intermediul unor canale

ti l• procese secventiale– comanda de intrare: c?u– comanda de iesire: c!tcomanda de iesire: c!t

unde c este numele unui canal de comunicare, u si tsunt variabile

– garda: T;iocomunde iocom este o comanda i/o si T un test

– sintaxa pentru procese secventiale: INSTR0 do IOC1 → INSTR1 □ ... □ IOCn → INSTRn od

Dorel Lucanu Programare algebrica

Page 30: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe distribuite - semanticai f t l i i i ? i !t t– comunicarea: efectul unei comunicari c?u si c!t este

atribuirea u = t

Dorel Lucanu Programare algebrica

Page 31: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Programe distribuite: exemplu

• sender/receiver - descriere

R iinput outputSender Filter Receiverinput output

Dorel Lucanu Programare algebrica

Page 32: Curs 7dlucanu/cursuri/progalg/...unde ceste numele unui canal de comunicare, usi t sunt variabile – garda: T;iocom unde iocomeste o comanda i/o si T un test – sintaxa pentru procese

Sender/receiver-program[ //sender

i = 0; do {i != M;input!a[i] → i++}] ||[ //filter[ //

in = 0; out = 0; x = ' ';do { x != '*';input?x →

if { x == ' ' → skip;if { x → skip;□ x != ' ' → b[in] = x; in++;}

□ out != in;output!b[out] → out++;□ out ! in;output!b[out] → out++;}

] ||[ //receiver[ //receiver

j = 0; y = ' '; do {y != '*';output?y → c[j] =y; j++;}

]

Dorel Lucanu Programare algebrica

]