Programmazione Funzionale
  3 Marzo 2006


Niente appunti o calcolatrici. Massima SINTETICITA' nelle risposte.

Esercizio 1
(a) Fornire un lambda termine che sia normalizzabile, ma a partire dal quale esista anche una sequenza infinita di beta-riduzioni.
(b) Scrivere esplicitamente il lambda-termine che rappresenta la funzione prodotto quando questa e' definita ricorsivamente a partire dalla funzione somma (supponendo di avere gia' i lambda-termini if, add, iszero,pre e Y) :
0*y = 0
x*y = (y + (x-1)*y)     se x diverso da 0
(c) Discutere brevemente del sistema di assegnamento di tipi alla Curry (type assignment 'a la Curry) studiato durante il corso.
Esercizio 2
(a) Definire in SCHEME il tipo di dato astratto Stack (nella sua versione puramente funzionale).
Definire una funzione SCHEME "perepe" che, preso in input uno Stack restituisce in output lo Stack invertito.
Esempio informale:
           | 1 |             | 3 |
| 7 | | 7 |
(perepe | 3 | ) ---> | 1 |
----- -----
(b) Si consideri la seguente funzione Scheme che prende come input due numeri naturali.
(define (Matrix n m)
               (cond ((= m 0) m)
                     ((= n 0) n) 
                     (else (+ 1 (Matrix (- n 1) (Matrix n (- m 1)))))))   
Dimostrare formalmente che la funzione Matrix termina su ogni coppia di naturali.
Esercizio 3
(a) Definire in Haskell il tipo di dato Stack. Discutere brevemente la soluzione proposta.
(b) Mostrare come evolve l'ambiente (si supponga di partire con l'ambiente che contiene solo il frame a top level vuoto) durante la valutazione della seguente espressione Scheme
(let ((g (lambda (z) (+ z 1))))
((lambda (x) x) (g 2)))