Esercizi sulla semantica formale dei linguaggi di programmazione.
Esercizio 1
(a)
Cosa si intende per "semantica dei linguaggi di programmazione".
A cosa serve? Cosa si intende, in generale, per "semantica operazionale strutturata" e
per "semantica assiomatica"?
(b)
Descrivere in dettaglio il significato della seguente regola della semantica operazionale
del linguaggio WHILE:
ai ≠ aj a , begin δ end ⇓ b b , begin while Xi ≠ Xj do δ end ⇓ c
______________________________________________________
a begin while Xi ≠ Xj do δ end ⇓ c
Servono altre regole per completare la semantica delle istruzioni while del linguaggio? Se si, perche' e quali sono? se no, giustificare il motivo per cui
la regola sopra descritta e' sufficiente.
(c)
Supponiamo di voler introdurre nel linguaggio WHILE un nuovo tipo di istruzione della seguente forma:
for X1 do δ
La semantica informale di tale istruzione e' la seguente: se l'esecuzione di δ produce, tra le altre cose, un decremento della variabile X1, si ripete l'esecuzione di
δ tante volte quanto e' il valore di X1.
Descrivere formalmente la semantica delle istruzioni for fornendo
una o piu' regole di inferenza.
Soluzione.
Esercizio 2
(a)
Che cosa e', a cosa serve la Logica di Hoare? Che forma hanno in giudizi
della Logica di Hoare?
(b)
Qual e' la definizione di giudizio valido nella Logica di Hoare?
Il seguente giudizio e' valido? Dimostrare informalmente perche'.
{Pari(X2)} begin X2 := succ(X2); X1:=0 end {X2+X1=X2 ∧ ¬ Pari(X2)}
(c)
Quella seguente e' la regola di inferenza della Logica di Hoare per
le istruzioni condizionali:
{A ∧ E} I1 {B} {A ∧ ¬E} I2 {B}
----------------------------------
{A} if E then I1 else I2 {B}
Dimostrare la correttezza di tale regola.
Soluzione.
Esercizio 3
-
Fornire la soluzione dell'esercizio 1(c) nel caso in cui
l'istruzione for X1 do δ esegua X1 volte
l'istruzione δ, ma durante l'esecuzione il valore di X1
non viene modificato (supponendo sempre che X1 non possa mai capitare
a sinistra di un assegnamento in δ)
-
Fornire la soluzione dell'esercizio 1(c) nel caso in cui
nell'istruzione for X1 do δ sia permesso alla variabile X1 di
trovarsi a sinistra di un assegnamento in δ, ed inoltre il valore di X1
venga decrementato automaticamente dall'istruzione ad ogni ciclo. Il ciclo
termina quando X1 contiene 0.
Esercizio 4
-
Estendere il linguaggio WHILE con un'istruzione if then else, specificando
informalmente la sua semantica e formalizzando poi questa con assiomi e/o regole
di inferenza.
- Soluzione.
Estendere il linguaggio WHILE con un'istruzione tipo lo switch di JAVA, specificando
informalmente la sua semantica e formalizzando poi questa con assiomi e/o regole
di inferenza.
Esercizio 5
Dimostrare nella logica di Hoare per il linguaggio WHILE che
{a ≥ 0 ∧ b > 0} q := 0; r := a; {r ≥ 0 ∧ b > 0 ∧ (a = b *
q + r)}
Soluzione.
Altra Soluzione.(by Reverseengeneering, file pdf)
Esercizio 6
Fornire l'invariante di ciclo per il ciclo while contenuto
nel seguente codice e che permetta di dimostrare che al
termine dellesecuzione del codice la variabile booleana "pari"
contenga true se e solo se a e' pari.
pari:=true;
b:=a;
while b≠0
do b:=b-1;
pari:=not pari
endw
Esercizio 7
Si consideri il seguente codice nel linguaggio WHILE.
p:=a;
s:=b;
while p≠0
do
p:=p-1;
s:=s+1
endw
Si determinino la precondizione A e la postcondizione B
tali che la dimostrazione di {A} C {B} nella Logica di Hoare,
ci garantisca che al termine dell'esecuzione del codice la variabile
s contenga la somma di a e b, nel caso in cui a sia maggiore o uguale a 0.
Indicare quale puo' essere una asserzione D (invariante di ciclo)
da utilizzare nella dimostrazione di cui sopra per quanto riguarda
l'istruzione while:
{D} while p≠0 do p:=p-1;s:=s+1 endw {D /\ p=0}
Fornire a grandi linee la dimostrazione completa omettendo per semplicita'
le regole per il rafforzamento delle precondizioni e per l'indebolimento
delle postcondizioni.
Esercizio 8
Dimostrare informalmente che il seguente giudizio per la Logica di Hoare per il linguaggio WHILE e' valido.
{(Dispari(q)∧ Pari(r)} r:=r+1; q:=r+r {Dispari(r)∧ Pari(q)}
Fornire per tale giudizio una derivazione nella Logica di Hoare.
Esercizio 9
Si consideri l'asserzione A = (∀ x. Pari(x)) ∧ r=5
Il seguente dovrebbe essere quindi un assioma della Logica di Hoare:
------------------------------
{A[r+1/r]} r:=r+1 {A}
Il seguente ragionamento pero' sembra dimostrare che tale assioma
non sia un giudizio valido:
Prendiamo uno stato in cui tutte le variabili del programma siano Pari ed r contenga il numero 4,
ed eseguiamo l'assegnamento r:=r+1. Nello stato risultante c'e' almeno
una variabile che contiene un dispari (la variabile r), e per tale stato l'asserzione A
non puo' essere vera.
C'e' un errore in questo ragionamento. Quale?
Aiutino: Dire che un'asserzione P e' vera per uno stato σ
formalmente corrisponde al fatto che P e' soddisfacibile nella struttura dei numeri
interi rispetto ad un ambiente corrispondente a σ. Quindi....
Esercizio 10
Supponiamo di voler introdurre nel linguaggio WHILE un nuovo tipo di ciclo della seguente forma:
do <programma> until <test>;
dove <test> e' sempre della forma Xi≠Xj.
La semantica informale di tale istruzione e' la seguente: si esegue
il codice dopo il do e si esce dal ciclo se <test> e' vero.
Altrimenti si continua ad eseguire il codice finche' <test> diventa vero.
Fornire una o piu' regole della semantica operazionale strutturata che descrivano
formalmente la semantica del ciclo do - until.
Soluzione (by Luca98)
Esercizio 11
Il seguente programma WHILE calcola il massimo di due numeri.
x3 := 0
while (x3 ≠ x1) and (x3 ≠ x2) do
x3 := x3 + 1
end
if x1 ≠ x3 then
M := x1
else
M := x2
Dimostrarne la correttezza utilizzando la Logica di Hoare.
Soluzione.pdf (by Fabio D'Urso)
Esercizio 12
Sia A la seguente precondizione: ∃k.X2=k*2 e sia B la seguente postcondizione:
∃k.X2=k*2 ∧ X2≥X1.
Fornire una istruzione WHILE E do I tale che il seguente giudizio della logica di Hoare
sia valido: {A} WHILE E do I {B}.
Soluzione
Esercizio 13
Descrivere in dettaglio il significato della seguente regola della semantica operazionale
del linguaggio WHILE:
n ≥ 1 a,
begin δ1 end ⇓
a'
a',
begin δ2;..;δn end ⇓
b
_________________________________________________________________
a,
beginδ1;δ2;..;δn end ⇓
b
Servono altre regole per completare la semantica del
costrutto
beginδ1;δ2;..;δn end ?
Se si, perche' e quali sono? se no, giustificare il motivo per cui
la regola sopra descritta e' sufficiente.
Esercizio 14
Supponiamo di estendere il linguaggio WHILE con una istruzione case che abbia
la seguente sintassi:
case Xj =
n1: δ1;
.....
nk: δk;
otherwise: δk+1
end
L'esecuzione di un'istruzione case consiste nel controllare se la variabile
Xj contenga uno tra i valori n1,..,nk,
nel qual caso viene eseguita l'istruzione corrispondente, altrimenti viene
eseguita l'istruzione δk+1.
Scrivere uno o piu' assiomi e/o regole di inferenza che
formalizzino la semantica dell'istruzione case
Soluzione
Esercizio 15
Si consideri il linguaggio di programmazione VSL gia' utilizzato per alcuni esercizi sulle macchine astratte,
che ha i programmi definiti dalla seguente grammatica:
Programma ::= Istr; | Istr;Programma
Istr ::= m[x]<-0 | m[x]<-1 | m[x]<-m[y] | m[x]<-m[y]ANDm[z] | m[x]<-m[y]ORm[z] | if B then Istr
B ::= m[x]=0 | m[x]=1 | m[x]=m[y]
dove il significato delle istruzioni e' il seguente:
m[x] <- 0 (nella cella di memoria di indirizzo x poni 0)
m[x] <- 1 (nella cella di memoria di indirizzo x poni 1)
m[x] <- m[y] (nella cella di memoria di indirizzo x poni il contenuto della
cella di indirizzo y)
m[x] <- m[y]ANDm[z] (nella cella di memoria di indirizzo x poni l'OR del contenuto della
cella di indirizzo y con quello della cella z)
m[x] <- m[y]ORm[z] (nella cella di memoria di indirizzo x poni l'OR del contenuto della
cella di indirizzo y con quello della cella z)
Inoltre x, y e z possono avere come valori solo 0, 1, 2, 3. Questo significa che la
memoria per i dati associata al nostro linguaggio ha solo quattro celle.
Inoltre queste celle della parte di memoria riservata ai dati sono formate da un unico bit (possiamo memorizza
rci solo
0 oppure 1).
Ovviamente questo linguaggio non e' universale (non ha la potenza
computazionale per descrivere qualsiasi algoritmo).
Descrivere formalmente la semantica di VSL utilizzando la Semantica Operazionale Strutturata.
Esercizio 16
Fare l'esercizio 15 utilizzando la semantica assiomatica.
Esercizio 17
Dimostrare, utilizzando la logica di Hoare, che il seguente programma, nel caso la variabile y contenga
all'inizio un valore maggiore o uguale a zero, calcola x alla y e pone il risultato nella variabile z.
z := 1;
c := y;
while (c not= 0) do
z := z*x;
c := c-1
end
Soluzione
Esercizio 18
Dimostrare che, nel caso si passi come argomento un valore non negativo, il seguente codice calcola correttamente la funzione fattoriale, utilizzando la logica di Hoare.
int fattIt(int n)
{ int f=1; /* definizione della variabile accumulatore */
int i=0; /* variabile contatore */
while (i!=n)
{ i++;
f *= i;
}
return f;
}
Soluzione
Esercizio 19
Descrivere il sistema formale della Logica di Hoare
Esercizio 20
Supponiamo di vedere il modello computazionale delle URM, senza
l'istruzione J(-,-,-), come
un linguaggio di programmazione, e di voler utilizzare una logica
di Hoare per darne la semantica assiomatica.
Fornire le regole
e/o gli assiomi
che descrivono la semantica delle istruzioni Z(n) e T(n,m).
Dire inoltre se, aggiungendo l'istruzione J(-,-,-), l'assioma
-----------------------
{A} J(n,m,p) {A}
risulterebbe valido e se descriverebbe correttamente il comportamento
di tale istruzione.
Soluzione
Esercizio 21
Cos'e' la Logica di Hoare? A cosa serve? Descrivere qualche regola della logica
di Hoare per il linguaggio WHILE, fornendone una giustificazione informale.
Esercizio 22
Fornire la definizione precisa di Sistema Formale. Elencare i nomi di almeno quattro sistemi formali.
Esercizio 23
Supponiamo di voler introdurre nel linguaggio WHILE un nuovo tipo di istruzione della seguente forma:
for X1 do δ
La semantica informale di tale istruzione e' la seguente: si ripete l'esecuzione di
δ tante volte quanto e' il valore della variabile X1, ed ogni volta che si esegue δ
il valore di X1 viene decrementato automaticamente, a meno che non venga modificato esplicitamente
da un assegnamento. Il ciclo
termina quando X1 contiene 0.
Soluzione
Esercizio 24
Fornire una deduzione particolareggiata nella Logica di Hoare
che abbia la seguente conclusione.
(ovviamente usando solo gli assiomi
e le regole diinferenza, senza utilizzare ipotesi aggiuntive)
(<> indica "diverso da")
{s+c=a+b,c<>0} s:=s+1; c:=c-1 {s+c=a+b}
Soluzione
Esercizio 25
Che cosa e', a cosa serve la Logica di Hoare? Che forma hanno in giudizi
della Logica di Hoare? Qual e' la definizione di giudizio valido nella Logica di Hoare?
Esercizio 26
La seguente regola della Logica di Hoare contiene un errore. Individuarlo, correggerlo
e giustificare la correzione. Mostrare inoltre come, utilizzando la regola cosi' com'e' si potrebbe
derivare un giudizio non valido partendo da giudizi validi.
{A ∧ E} I1 {B} {B ∧ ¬E} I2 {B}
-------------------------------------------------
{A} if E then I1 else I2 fi {B}
Soluzione
Esercizio 27
Fornire l'invariante di ciclo per il ciclo while contenuto
nel seguente codice e che permetta di dimostrare che al
termine dell'esecuzione del codice la variabile booleana "pari"
contenga true se e solo se a e' pari.
pari:=true;
b:=a;
while b≠0
do b:=b-1;
pari:=not pari
endw
Soluzione
Esercizio 28
Si consideri il seguente giudizio nella Logica di Hoare.
{r≥0 ∧ b>0 ∧ (a= b*q + r) ∧ r≥b} q:=q+1; r:=r-b {r≥0 ∧ b>0 ∧ (a= b*q + r)}
Dimostrare tale giudizio (usando la regola del rafforzamento della precondizione,
due volte la regola per l'assegnamento,
la regola per la sequenza di istruzioni e la regola per l'indebolimento della postcondizione).
Soluzione (con correzioni di S.Veneziano)
Esercizio 29
Descrivere brevemente cosa si intende per Semantica Operazionale Strutturata
e fornire la regola per il costrutto while del linguaggio WHILE.
Esercizio 30
Si consideri il seguente frammento di codice WHILE, dove a,b,c,s sono variabili:
s:=a;
c:=b;
while c≠0 do
s:=s+1;
c:=c-1
endw
Si dimostri formalmente (saltando eventualmente qualche passaggio banale e regole di indebolimento o rafforzamento di condizioni),
utilizzando la Logica di Hoare, che quando questo codice
viene eseguito in uno stato in cui la variabile b contiene un numero non negativo,
alla fine dell'esecuzione la variabile s contiene la somma di a e b.
Soluzione
Esercizio 31
Descrivere la forma dei giudizi (asserzioni) nella Semantica Operazionale Strutturata
ed il loro significato. Fornire inoltre una delle regole della semantica operazionale strutturata
del linguaggio WHILE, descrivendone il significato (regole senza descrizione del
significato non verranno prese in considerazione)
Esercizio 32
Discutere brevemente della semantica operazionale strutturata (SOS)
dei linguaggi di programmazione.
Esercizio 33
si consideri l'espressione
(3,5,0,7) begin X3:=pred(X3) end ⇓ (3,5,-1,7)
Quale delle seguenti affermazioni e' vera?
- Quest'espressione e' un assioma della SOS del linguaggio WHILE
- Quest'espressione e' una regola della SOS del linguaggio WHILE
- Quest'espressione sarebbe un assioma della SOS del linguaggio WHILE
se il vettore a sinistra avesse tutti 0
- Quest'espressione non e' neanche una fbf della SOS del linguaggio WHILE
Giustificare la risposta, considerando come riferimento per la SOS del linguaggio WHILE il
testo [RR] nella pagina del programma del corso.
Soluzione
Esercizio 34
Supponiamo di estendere la sintassi del linguaggio WHILE, aggiungendo
la produzione
<test> ::= ALL=0
Si vuole fare in modo che la condizione ALL=0
risulti vera quando tutte le variabili del programma sono uguali a zero.
Estendere la SOS di WHILE con opportuni assiomi e/o regole di inferenza
in modo da tener conto di tale nuovo possibile test.
Esercizio 35
Supponiamo di modificare la semantica del linguaggio WHILE
sostituendo l'assioma
a, begin end ⇓ a
con la regola
b, begin end ⇓ a
-------------------------
a, begin end ⇓ b
Con la nuova semantica, qual e' l'effetto dell'esecuzione del programma begin end
avendo come vettore di stato iniziale il vettore (0,0,0)?
Giustificare la risposta.
Esercizio 36
Nel testo [RR] si afferma che se &neg;∃b. ⊢ ;a, P ⇓ b
allora la computazione termina.
Questa affermazione si puo' fare poiche' il sistema formale della SOS e'
- corretto
- completo
- ne' corretto ne' completo
- in realta' questa affermazione e' scorretta
Giustificare la risposta.
Esercizio 37
Supponiamo di estendere la sintassi del linguaggio WHILE, aggiungendo
la produzione
<test> → ALL=0
Si vuole fare in modo che la condizione ALL=0
risulti vera quando tutte le variabili del programma sono uguali a zero.
Estendere la SOS di WHILE con opportuni assiomi e/o regole di inferenza
in modo da tener conto di tale nuovo possibile test.
Utilizzare poi ALL≠0
in modo che risulti vera quando tutte le variabili del programma sono diverse da zero.
Soluzione
Esercizio 38
Fornire gli assiomi e/o le regole di inferenza che descrivono la S.O.S.
del costrutto while del linguaggio WHILE.
(B)
Fornire gli assiomi e/o le regole di inferenza che descrivono la S.O.S.
del costrutto while del linguaggio WHILE+, dove WHILE+ e' come il linguaggio WHILE
con l'unica differenza che esiste un solo <test>, che e' ALL=1, che e' vero quando
tutte le variabili sono uguali ad 1.
Soluzione
Esercizio 39
Si assuma di aggiungere alla grammatica del linguaggio WHILE la seguente produzione:
<istruzione>   →    cucu' <istruzione>;<istruzione>
Si assuma inoltre di estendere la semantica con le seguenti regole
a⃗, begin δ1 end ⇓ b⃗       b⃗, begin δ1; end ⇓ c⃗
(∃i.ai=0) ------------------------------------------------------------
a⃗, begin cucu'δ1;δ2 end ⇓ c⃗
a⃗, begin δ2 end ⇓ b⃗       b⃗, begin δ2; end ⇓ c⃗
(∀i.ai≠0) ------------------------------------------------------------
a⃗, begin cucu'δ1;δ2 end ⇓ c⃗
Descrivere informalmente il comportamento dell'istruzione cucu'.
Soluzione
Esercizio XX
Soluzione