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




    Esercizio 4




    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 enda'      a', begin δ2;..;δn end b
    _________________________________________________________________

    a, beginδ12;..;δn end b

    Servono altre regole per completare la semantica del costrutto beginδ12;..;δ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?
    1. Quest'espressione e' un assioma della SOS del linguaggio WHILE
    2. Quest'espressione e' una regola della SOS del linguaggio WHILE
    3. Quest'espressione sarebbe un assioma della SOS del linguaggio WHILE se il vettore a sinistra avesse tutti 0
    4. 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'
    1. corretto
    2. completo
    3. ne' corretto ne' completo
    4. 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'δ12 end ⇓ c⃗
    
    
                    a⃗, begin δ2 end ⇓ b⃗       b⃗, begin δ2; end ⇓ c⃗
    (∀i.ai≠0)  ------------------------------------------------------------
                             a⃗, begin cucu'δ12 end ⇓ c⃗
    
    Descrivere informalmente il comportamento dell'istruzione cucu'.
  • Soluzione

    Esercizio XX

  • Soluzione