#include ; # define bott_vol =2.0; # define latt_vol = 0.355; int main ()

26
#include <stdio.h>; # define bott_vol =2.0; # define latt_vol = 0.355; int main () {int bott_num = 4; int latt_num = 10; double totale = bott_vol * bott_num + latt_vol * latt_num; printf(“volume totale %d litri”, totale); } Linguaggi: Linguaggi: Semantica Semantica Programma in C Cosa significa? cosa calcola ? a cosa serve ? è corretto?

Upload: bailey

Post on 20-Mar-2016

63 views

Category:

Documents


2 download

DESCRIPTION

Linguaggi: Semantica. Programma in C. Cosa significa? cosa calcola ? a cosa serve ? è corretto?. #include ; # define bott_vol =2.0; # define latt_vol = 0.355; int main () { int bott_num = 4; int latt_num = 10; double totale = bott_vol * bott_num - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

#include <stdio.h>;# define bott_vol =2.0;# define latt_vol = 0.355; int main () {int bott_num = 4; int latt_num = 10; double totale = bott_vol * bott_num + latt_vol * latt_num; printf(“volume totale %d litri”, totale); }

Linguaggi: SemanticaLinguaggi: Semantica

Programma in C

Cosa significa?cosa calcola ?a cosa serve ?è corretto?

Page 2: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

let bott_vol =2.0 and latt_vol = 0.355 and bott_num = 4 and latt_num = 10 in bott_vol * bott_num + latt_vol * latt_num;

Linguaggi: SemanticaLinguaggi: Semantica

Programma in Caml

Cosa significa?cosa calcola ?a cosa serve ?è corretto?

Page 3: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

La correttezza sintattica è data dalla La correttezza sintattica è data dalla Grammatica diGrammatica di CC

Programma::= DirettivePrototipi int main() {StmtList} FunctDecList

Direttive ::= Direttiva Direttive | Direttiva::= #define Ide; | #include <Ide.h>;|... Prototipi::= Prototipo ; Prototipi | Prototipo:= Type Ide(FormalList ) ;FunctDecList::= FunctDecl; FunctDecList | FunctDec::= Type Ide (FormalList) Com

Page 4: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

La correttezza sintattica è data dalla La correttezza sintattica è data dalla Grammatica diGrammatica di CC

StmtList ::= Stmt ; StmtList | Stmt::=Decl | ComCom::=Ide=Exp Assegnamento | if (Exp) Com else Com Condizionale | while (Exp) Com Iteratore | {StmtList} Blocco | Ide(Exp) Invocazione di fun | return Exp Calcolo dei valore Exp::= Ide | Const | Exp Op Exp | Uop Exp | Ide

| Ide(Exp) | (Exp)...Decl ::= Type Ide [=Exp]

Page 5: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 5

Sintassi e semanticaSintassi e semantica• La sintassi di un linguaggio di programmazione è in genere

descritta in modo molto rigoroso.• La semantica viceversa spesso è descritta in modo non

formale e quindi poco rigoroso. I vantaggi di una descrizione formale della semantica sono:– è la specifica del compilatore e dell’interprete:

• permette di affrontare in modo rigoroso e strutturato il complesso problema dell’implementazione del linguaggio

• uno stesso programma, eseguito da implementazioni diverse del linguaggio (macchine diverse), che però rispettano la semantica, danno lo stesso risultato.

– aiuta nella definizione di programmi per la soluzione dei problemi,– permette di ragionare sulla correttezza dei programmi,

Page 6: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

Semantica Operazionale: Semantica Operazionale: Sistemi di TransizioniSistemi di Transizioni

Sistema di transizioniSistema di transizioni: S : S < < , T, , T, > >• configurazioniconfigurazioni (Stati)(Stati)• T T finalifinali• x x relazione di transizionerelazione di transizione

Derivazione DDerivazione D: < S , : < S , * >* > * * chiusura antisimmetrica, riflessiva, transitiva di chiusura antisimmetrica, riflessiva, transitiva di

• ii * * kk ii … … kk D D

Page 7: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

Regole (Regole (RR) condizionali per ) condizionali per

12n

Le i sono premesse e sono relazioni tra espressioni che contengono costanti, variabili e operatori del tipo (=, ≠, ).

Le variabili sono quelle che permettono di istanziare la regola. Le indichiamo con Vars(R).

La copertura delle variabili serve a garantire la fondatezza della regola.

Page 8: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

Copertura delle variabili Copertura delle variabili

12n

Sia x Vars(R), x è coperta in R se e solo se vale una delle seguenti condizioni:

• x occorre ;

• esiste in R una premessa i del tipo y=t tale che y è coperta in R e x Vars(t)

• esiste in R una premessa i del tipo x=t tale che tutte le variabili in Vars(t) sono coperte.

• esiste in R una premessa i del tipo ’ ’ tale che tutte le variabili in sono coperte in R e xVars(’)

Sia R la seguente regola condizionale

Page 9: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 9

Sostituzioni e istanziazioniSostituzioni e istanziazioni

• Sia V= {x1,...xk} è un insieme di variabili, si dice sostituzione l’insieme di associazioni ={c1/x1,... ck/xk} dove c1,... ck sono costanti.

• Dato un termine o espressione E questo può essere istanziato su una sostituzione (E). L’istanza è l’espressione che si ottiene rimpiazzando in E tutte le variabili che occorrono in con i rispettivi valori.– es. V= {x,y} e sia E = x<y+1 l’espressione se ={4/x,2/y}

allora (E) = 4<2+1 = 4<3= false– se invece ={2/x, 3/y} allora (E) = 2<3+1 2< 4= true

Page 10: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 10

Derivazione Derivazione ’’Sia < , T, > un sistema di transizioni con (r)...(rn) regole condizionali, abbiamo che ’ se e solo se esiste una regola condizionale ri per cui esiste una sostituzione per le variabili in ritale che:

• tutte le premesse di (ri)sono soddisfatte;

• la conclusione di (ri)è proprio ’

Le variabili (spesso di seguito denotate con ,,,) rappresentano generici elementi del dominio del discorso,

e si riconoscono perchè, nelle premesse, ne viene definito l’intervallo di variabilità.

Page 11: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 11

Grammatiche LC come sistemi di transizioniGrammatiche LC come sistemi di transizioni

Data una G=<,V,s,P>si può definire un sistema di transizioni nel seguente modo:

• le configurazioni sono sequenze di simboli in V• le configurazioni terminali sono sequenze di simboli in • la relazione di transizione è definita in base alle

produzioni, nel seguente modo: Per ogni produzione A::= P è definita una regola condizionale.

(V)*A

precondizioni/precondizioni/premesse/premesse/prerequisitiprerequisiti

Page 12: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 12

Un esempioUn esempio

Data la grammatica G=<{a,b},{S},S,{S::=ab, S::=aSb}>definiamo un sistema di transizione nel modo seguente:

={ | ({a,b}{S})*}T ={ | {a,b}*}

({a,b}{S})}S ab

({a,b}{S})}S aSb

Page 13: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 13

Rev < Rev, TRev, Rev>

• Rev {<,> | }

• T Rev {<, > | }

• Rev {<x,

<x> <x>

Un esempio: la reverse di una Un esempio: la reverse di una sequenza di caratterisequenza di caratteri

Soluzione con solo coppie di sequenze. La configurazione iniziale è <,>

Page 14: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 14

Rev < Rev, TRev, Rev>

• Rev {<,> | } { |}• TRev { |}

• Rev {<x,

<x> <x>

<> <>

Un’altra soluzione: la reverse Un’altra soluzione: la reverse

Soluzione con coppie di sequenze, che termina con una singola sequenza

Page 15: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 15

Rem < Rem, TRem, Rem>

• Rem {<,x> | , x {START,STOP}}

• TRem {< ,STOP> | },• Rem { <,START> <,STOP> (1)

x <x,START> <x,STOP>

<x, <xSTART>*Rem<,STOP> <xxSTART> <,STOP>

<x,y, x≠y, <ySTART>*Rem<,STOP> <xySTART> <x,STOP> }

Esempio eliminazione di ripetuti Esempio eliminazione di ripetuti

(2)

(3)

(4)

Page 16: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 16

Eliminazione dei ripetuti:Eliminazione dei ripetuti:Esempio di applicazione

<acbbb,START> *<0,STOP>

<acbbb,START> (4)1<a1,STOP> 1={a/x1,c/y1,bbb/1, /1}

<cbbb,START> *<1,STOP>

<cbbb,START> (4)2<c2,STOP> 2 ={c/x2,b/y2,bb/2, /2}

<bbb,START> *<2,STOP>

<bbb,START> (3)3<3,STOP> 3 ={b/x3,b/3, /3}

<bb,START> *<3,STOP>

<bb,START> (3)4<4,STOP> 4 ={b/x4,/4, /4}

<b,START> *<4,STOP>

<b,START> (2)5< b,STOP> 5 ={b/x5}

4= b

3 = b

2= b

1 = cb

0= acb<aacbbb,START> (3)0

<0,STOP> 0={a/x0,cbbb/0 , /0}< acb,STOP>

< acb,STOP><acb,STOP>

<b,STOP>

<b,STOP>

<b,STOP>

<b,STOP>

<b,STOP>

<cb,STOP>

<cb,STOP>

b

b

b

cb

acb

Page 17: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 17

Addizionatore di numeriAddizionatore di numeri

• Vediamo come esempio un addizionatore di numeri interi, che fa uso di due sistemi di transizione:– un addizionatore di cifre decimali– l’addizionatore di numeri

• la grammatica per definire i numeri da addizionare è la seguente:

Num::= Num Cif | CifNum::= Num Cif | CifCif::= 0|1|2|3|4|5|6|7|8|9Cif::= 0|1|2|3|4|5|6|7|8|9

110456+ 57=513

Page 18: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 18

AddizioneAddizione

<456,57><456,57> <6,7,0> <6,7,0> <3,1>}<3,1>}

<45,5,3,1><45,5,3,1> <5,5,1> <5,5,1> <1,1>}<1,1>}

<4,0,13,1><4,0,13,1> <4,0,1> <4,0,1> <5,0>}<5,0>}

<0,0,513,0><0,0,513,0> 513513

Page 19: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 19

Addizionatore di cifreAddizionatore di cifre

Addizionatore di cifreAddizionatore di cifre: S: Scrcr < < crcr, T, Tcrcr, , crcr>>

• cr cr {<c,c’,r> | r{<c,c’,r> | r{0,1}, c,c’{0,1}, c,c’Cif} Cif}

{<c,r> | r{<c,r> | r{0,1}, c{0,1}, cCif} Cif} •TTcr cr {<c,r> | r{<c,r> | r{0,1}, c{0,1}, cCif} Cif}

• crcr <0,0,0><0,0,0>crcr<0,0><0,0> <0,0,1> <0,0,1>crcr<1,0><1,0>

<0,1,0><0,1,0>crcr<1,0><1,0> <0,1,1> <0,1,1>crcr<2,0><2,0>

<0,2,0><0,2,0>crcr<2,0><2,0> <0,2,1> <0,2,1>crcr<3,0><3,0>

…….. …..…..<9,8,0><9,8,0>crcr<7,1><7,1> <9,8,1> <9,8,1>crcr<8,1><8,1>

<9,9,0><9,9,0>crcr<8,1><8,1> <9,9,1> <9,9,1>crcr<9,1><9,1>

Page 20: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 20

Addizionatore di numeriAddizionatore di numeri

Addizionatore di Num: S+ < +, T+, +>

• + {<n,n’> | n,n’Num}

{<n,n’,m,r> | r{0,1}, n,n’,mNum} {n | nNum} • T+ {n | nNum}

• + <c,c’,0>cr<c’’,r>

(i) <c,c’>+<0,0,c’’,r>

<c,c’,0>cr<c’’,r> (ii)

<nc,c’>+<n,0,c’’,r>

<c,c’,0>cr<c’’,r> (iii)<c,nc’>+<0,n,c’’,r>

Page 21: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 21

Transizioni Transizioni ++(continua)(continua) <c,c’,0>cr<c’’,r>

<nc,n’c’>+<n,n’,c’’,r>

<0,0,m,0> + m

<c,c’,r>cr<c’’,r’>

<c,c’,m,r>+<0,0,c’’m,r’>se <c,c’,r>≠<0,0,0> (vi)

<c,c’,r>cr<c’’,r’>

<nc,c’,m,r>+<n,0,c’’m,r’>

(v)

(iv)

(vii)

<c,c’,r>cr<c’’,r’>

<c,nc’,m,r>+<0,n,c’’m,r’>

(viii)

<c,c’,r>cr<c’’,r’>

<nc,n’c’,m,r>+<n,n’,c’’m,r’>(ix)

Page 22: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 22

Applicazione dell’addizionatoreApplicazione dell’addizionatore

<92,512><92,512>++{(iV), <2,2,0> {(iV), <2,2,0> crcr<4,0>}<4,0>}

<9,51,4,0><9,51,4,0>++{(iX), <9,1,0> {(iX), <9,1,0> crcr<0,1>}<0,1>}

<0,5,04,1><0,5,04,1>++{(vi), <0,5,1> {(vi), <0,5,1> crcr<6,0>}<6,0>}

<0,0,604,0><0,0,604,0>++{(v)}{(v)}

604604

Page 23: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

Macchina SMacchina S++

<277,9902> <277,9902> <27,990,9,0> <27,990,9,0> <2,99,79,0> <2,99,79,0> <0,9,179,1> <0,9,179,1> <0,0,0179,1> <0,0,0179,1> <0,0,10179,0> <0,0,10179,0> 1017910179

277 + 9902277 + 99021017910179

Continua 3

Page 24: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 24

Rappresentazione e semanticaRappresentazione e semantica• I numeri (che indichiamo qui con sulla dispensa sono N)

con le loro operazioni sono entità astratte che godono di importanti proprietà.

• Per utilizzarli e studiarli gli uomini hanno inventato delle rappresentazioni (concrete) di tali entità:– quella che conosciamo e usiamo normalmente sono i numeri arabi su

base decimale,– i Romani ne usavano una diversa (I,II, III, IV, ...X, ..L...)– ne esistono molte altre, ad esempio su basi diverse (2,3,...ecc).

• Nel definire la semantica di un linguaggio di programmazione, dove le algebre dei numeri sono rappresentate da tipi predefiniti (int, long, real,..) e importante chiarire la differenza tra valore e rappresentazione.

Page 25: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

Correttezza: Rappresentazione e Semantica Correttezza: Rappresentazione e Semantica dei numeridei numeri

: Num -> (0) = 0 …. (9) = 9 (nc) = (n)x10 + (c)

: -> Num(0) = 0 Num

…. (9) = 9 Num (n) = (n 10)(n mod 10) Num, n>9

<n,n’> +* m (n) + (n’) = (m)

Sia l’insieme dei numeri naturali ={0,1,2,3,...} con le usuali operazioni di somma, sottrazione, ecc., e gli operatori di relazione (=, ≠,>,ecc).

Mentre Num sono sequenze di simboli che rappresentano i numeri naturali nella solita rappresentazione decimale.

funzione di valutazione funzione di rappresentazione

Page 26: #include ; # define  bott_vol =2.0; # define  latt_vol = 0.355; int  main ()

04/24/23 26

Rappresentazione binariaRappresentazione binaria

• La rappresentazione che utilizza il minimo numero di simboli è la rappresentazione binaria (quella usata dai calcolatori).

• Tale rappresentazione è definita dalla seguente funzione di valutazione:

(0) = 0 (1) = 1 (yb) = ((y) 2) + (b)

Si calcoli il valore di (1100) cioè il numero rappresentato dalla stringa binaria 1100.