Laurea Specialistica: Programmazione Funzionale
e
Vecchio Ordinamento: Linguaggi di Programmazione II
(modulo progr. funzionale)
2 Marzo 2005
Niente appunti o calcolatrici.
Massima SINTETICITA' nelle risposte.
Esercizio 1
(a)
Eseguire le seguenti sostituzioni:
-
(\x.yx)[yz/x]
-
(\y.xy)[yz/x]
-
(\z.(\x.yx)xz)[zx/x]
(b)
Discutere della nozione di Punto Fisso e del suo uso nel Lambda-calcolo.
Esercizio 2
(a)
Supponiamo di aver definito il tipo di dato astratto Insieme che ha i
seguenti
Costruttori:
emptyset l'insieme vuoto;
(add-elem element set) restituisce l'insieme set a cui e' stato aggiunto element
Selettori:
(pick set) restituisce un elemento a caso di set;
(residue element set) restituisce set ia cui e' stato tolto element
Predicati:
(emptyset? set) vero se set e' l'insieme vuoto.
Definire un predicato SCHEME ForAll che, presi in input un insieme I ed un predicato P?,
verifichi se il predicato P? e' soddisfatto per tutti gli elementi di I.
(b)
Si consideri l'insieme (N->N)xNxN, dove N e' l'insieme dei naturali e N->N quello delle
funzioni totali da N in N. Su tale insieme si consideri la seguente relazione:
(g,n,m) << (g',n',m') sse (n = n' e g(n) < g(n')) oppure (n = n', g=g' e m < m')
Si dimostri che ((N->N)xN,<<) e' un insieme ben-fondato.
Si fornisca una qualsiasi funzione SCHEME la cui totalita' sia dimostrabile
utilizzando l'induzione ben-fondata su ((N->N)xNxN,<<).
Esercizio 3
(a)
Mostrare l'ambiente al termine della valutazione della espressione Scheme
( (lambda (y) (+ y 3)) (+ x y) )
supponendo di valutarla nel seguente ambiente avendo p1 come puntatore di frame corrente.
^ pTop
|
------------------
| y --> 5 |
| pippo --> true |
------------------
^
| p2
--------------
| x --> 64 | <---- p1
| y --> 3 |
--------------
(b)
Dire brevemente cosa fa' l'interprete HASKELL quando scriviamo qualcosa
del genere:
funct :: [Int] -> Bool
funct ls = BODY