Una volta acquisite le nozioni contenute in “Structured Operational Semantics of a fragment of the language Scheme” di Honsell, Pravato, Ronchi Della Rocca vediamo come applicarle per la risoluzione di un esercizio tipico.

 

Descrivere gli ambienti della seguente sessione SCHEME :

 (define (K x)

    (lambda (x)    (+ (let ((x 1)

                                      (fun (lambda (y) (+ x 1))))

                                                                                 (fun x))    (+ x x)) ))

(define t 44)

(define x 8)

(let ((x (+ x 2))

       (gg (lambda (y) t))

       (t 66)

       (fun 21))

                     ( (lambda (x) (+ (gg 1) fun)) ((K fun) x) ))

  

Trattiamo la descrizione distinguendo i vari passi.
Sia P_Atop il puntatore al top level environment.

  1. Leggiamo la definizione di una funzione (define (K x) …), perciò si crea l’associazione “nome funzione” à <1° argomento chiusura, 2° argomento chiusura >, in cui il 1° argomento della chiusura è la definizione della funzione, mentre il secondo indica il puntatore all’ambiente in cui abbiamo dichiarato la funzione : stiamo applicando la regola (dec 2).

    wpe4.jpg (9939 bytes)

  2. Leggiamo (define t 44) quindi aggiungiamo all’ambiente corrente la nuova associazione (dec 1):

    wpe6.jpg (10211 bytes)
  3. Leggiamo (define x 8) quindi aggiungiamo all’ambiente corrente la nuova associazione (dec 1):

    wpe7.jpg (10670 bytes)
  4.   Valutiamo    (let ((x (+ x 2))
                                (gg (lambda (y) t))
                                (t 66)
                                (fun 21))
                                               ( (lambda (x) (+ (gg 1) fun)) ((K fun) x) )).
    Nell’ambiente corrente  calcoliamo il valore dei secondi argomenti delle coppie del let ed estendiamo l’ambiente con un nuovo frame che contiene le nuove associazioni. 

    wpe9.jpg (30651 bytes)

  5. Dobbiamo valutare (lambda (x) (+ (gg 1) fun)) il cui valore è la chiusura
    < lambda (x) (+ (gg 1) fun)) , p2 > (1) (lambda).
    La valutazione dell’argomento ((K fun) x ) implica quella di (K fun) e cioè K nel frame puntato da p2 .
    Il valore di K si trova in P_Atop, cerchiamo quello di fun a partire da p2 verso P_Atop e lo troviamo in p2 (appl 1).
    Estendiamo l’ambiente con un nuovo frame contenente l’associazione parametri formali / parametri attuali di K: x à 21 e vi valutiamo
    (lambda (x)(+ (let ((x 1) (fun (lambda (y) (+ x 1)))) (fun x)) (+ x x)) )).

    wpeB.jpg (30593 bytes)
  6. Il valore di (lambda (x)  (+ (let ((x 1)   (fun (lambda (y) (+ x 1)))) (fun x))    (+ x x)) )) è la chiusura < lambda (x) (+ (let ((x 1)(fun (lambda (y) (+ x 1))))(fun x))  (+ x x)) ), p3>.  Recuperiamo il valore da assegnare a x relativo a (lambda … ) e sarà quello contenuto nel frame puntato da p2 per questione di scoping, e procediamo con la solita estensione con un nuovo frame:

    wpeC.jpg (29806 bytes)
  7. Si tratta di un’addizione, quindi applichiamo la regola (appl 2): un argomento è il let, perciò …

    wpeD.jpg (40763 bytes)
  8. Valutiamo in p5 fun x recuperando tramite la regola (var 1) le associazioni x à 1 e   fun à < lambda (y) (+ x 1), p4 >; quindi valutiamo il corpo di fun in p4 calcolando    fun x = 11. I frame puntati da p5 e p5bis non servono più, quindi li eliminiamo. Per l’addizione interna (+ x 1) abbiamo utilizzato (appl 2) la quale non ha modificato l’ambiente.

    wpeE.jpg (29914 bytes)
  9. Adesso calcoliamo l’altro termine dell’addizione: (+ x x) nel frame puntato da p4: a x è associato il valore 10 quindi (+ x x) vale 20. Perciò il valore di (+  (let ((x 1)  (fun (lambda (y) (+ x 1)))) (fun x))    (+ x x)) )) è 31 e cancelliamo p3 e p4 e i frame ad essi relativi. Abbiamo così terminato al valutazione di ((K fun) x).

    wpeF.jpg (22485 bytes)
  10. Prima abbiamo calcolato il valore di (lambda (x) (+ (gg 1) fun)) dato dalla chiusura (1) del punto 5. Possiamo quindi valutare l’applicazione: estendiamo l’ambiente con un nuovo frame.

    wpe10.jpg (29103 bytes)
  11. Calcoliamo (+ (gg 1) fun)) in p6. Cerchiamo gg che si trova nel frame indicato da p2 ed appendiamo a P_Atop il frame contenente l’associazione y à 1 in cui si valuterà il corpo dell’applicazione gg.

    wpe11.jpg (30512 bytes)
  12. Il valore di t è 44, poi valutiamo fun che ha valore 21 ed eseguiamo l’addizione. Il valore di  (+ (gg 1) fun))  è così 65. I puntatori p2, p6 e p7 non sono più necessari e possiamo eliminarli.