Programmazione Funzionale, 17 Giugno 2005

  • Niente appunti o calcolatrici. Massima SINTETICITA' nelle risposte.
  • Per quelli della specialistica: dopo una settimana dalla pubblicazione dei risultati, i voti (quelli positivi) verranno registrati. Chi non intende accettare il voto o desidera fare l'orale (se il voto e' maggiore di 24), deve comunicarlo per tempo al docente.

  • Esercizio 1
    (a) Definire la nozione di "Currificazione". E' una nozione applicabile al lambda-calcolo? perche'?
    (b) Enunciare i teoremi di Confluenza e di Church-Rosser. Dimostrare che sono equivalenti. Discutere del loro significato per la programmazione funzionale.
    (c) Definire la nozione di strategia di riduzione. Il termine H = \g.((\f.ff) (\f.(g\x.ffx))) e' un punto fisso? Perche'? Perche' conviene utilizzarlo per definire punti fissi nel lambda-calcolo con strategie tipo quella di Scheme?

    Esercizio 2
    (a) Definire una funzione che prenda in input una lista ls di numeri e tre numeri n1, n2 e n3 tali che n1 < n2 < n3. La funzione dovra' restituire una lista di due liste tali che gli elementi della prima sono tutti gli elementi di ls strettamente minori di n1 e gli elementi della seconda sono tutti gli elementi di ls compresi tra n2 e n3. Possibilmente definire la funzione non utilizzando funzioni ausiliarie.
    (b)
    (define (YY? x y)
      (cond ((= x y) #t)
            ((< x y) #f)
            ((> x y) (YY? (- x y) y))))
    
    Dimostrare che il predicato YY? definito sopra e' totale. Dire per quali valori vale YY?
    Riscrivere YY? utilizzando solo operatori booleani (senza utilizzare cond quindi).
    Esercizio 3
    (a) Descrivere brevemente il sistema di tipi di Haskell.
    (b) Supponiate che venga aggiunta allo Scheme la parola chiave "Boink" e che la nostra S.O.S. per lo Scheme contenga la seguente regola di inferenza:
                             Z,n |-- e1 --> <(lambda (x) e), n'>,Z'   
       Z'[Next(Z'),(n,0[pippo,<(lambda (x) e), n>])],  Next(Z')|-- e2 --> v,Z"
    -----------------------------------------------------------------------------------------------------------
                                  Z,n |-- (Boink e1 e2) --> v, Z"
    Descrivere a parole cosa fa l'interprete per valutare una Boink-espressione
    Descrivere lo stato dei frame alla fine dalla valutazione della seguente sessione Scheme e dire qual e' il valore restituito.
    	(define x 34)
    	(Boink ( (lambda (x) x) (lambda (y) y))  (pippo x) )