Linguaggi Funzionali 2004/2005
docente: Fausto Spoto fausto.spoto@univr.it
Materiale didattico:
Il sito del linguaggio OCaml
Lucidi introduttivi al corso
Introduzione a OCaml
Introduzione a OCaml (moduli, segnature e funtori)
Introduzione al lambda-calcolo
Testo del laboratorio 1 e
soluzione
Testo del laboratorio 2 e
soluzione
Testo del laboratorio 3 e
soluzione
Soluzione del laboratorio 5
Sorgenti OCaml per il capitolo 2 di Okasaki
Sorgenti OCaml per il capitolo 3 di Okasaki
Sorgenti OCaml per il capitolo 4 di Okasaki
Sorgenti OCaml per il capitolo 5 di Okasaki
Sorgenti OCaml per il capitolo 6 di Okasaki
Esempi di funzioni sugli stream
Lezione 1 (12 gennaio 2005)
Introduzione al corso
Storia della programmazione funzionale
Esempi di programmazione in OCaml
Lezione 2 (14 gennaio 2005)
lambda-calcolo: definizioni di base
regole di riduzione
codifica dei booleani
codifica delle coppie
codifica dei naturali
Lezione 3 (14 gennaio 2005)
operazioni sui naturali
operatore di punto fisso Y
Laboratorio 1 (21 gennaio 2005)
implementazione di funzioni sui naturali alla Peano
testo del laboratorio
soluzione
Lezione 4 (21 gennaio 2005)
correzione del laboratorio 1
uso del combinatore Y di punto fisso
convergenza del lambda-calcolo
Lezione 5 (26 gennaio 2005)
ordine di riduzione normale del lambda-calcolo
call-by-value
valutazione lazy
lambda-calcolo con costanti
lambda-calcolo tipato
controllo dei tipi per il lambda-calcolo
Laboratorio 2 (28 gennaio 2005)
implementazione di funzioni su liste di naturali
testo del laboratorio
soluzione
Lezione 6 (28 gennaio 2005)
inferenza dei tipi per il lambda-calcolo
esercizi sull'inferenza dei tipi
Laboratorio 3 (4 febbraio 2005)
implementazione di funzioni su liste
testo del laboratorio
soluzione
Lezione 7 (4 febbraio 2005)
moduli e segnature
Introduzione a OCaml (moduli, segnature e funtori)
Lezione 8 (9 febbraio 2005)
funtori
esempio: insiemi
strutture dati funzionali: persistenza
condivisione di strutture dati
esercizi sulla condivisione di strutture dati
Laboratorio 4 (11 febbraio 2005)
i sorgenti del capitolo 2 del libro di Okasaki
implementazione di segnatura e modulo funtoriali per mappe finite:
- una segnatura funtoriale FINITEMAP(ORDERED) con funzioni
empty, bind, lookup e collect
- una implementazione funtoriale FiniteMap(ORDERED)
con le stesse funzioni di cui sopra
- una implementazione funtoriale StringFiniteMap le cui chiavi sono
stringhe
soluzione
Lezione 9 (11 febbraio 2005)
Sorgenti OCaml per il capitolo 3 di Okasaki
heap sinistrorsi
correttezza e complessità della merge fra heap sinistrorsi
costruzione di un heap sinistrorso a partire da una lista di elementi
Lezione 10 (16 febbraio 2005)
heap binomiali
alberi rosso/neri
Laboratorio 5 (18 febbraio 2005)
implementazione di una funzione
fromOrdList : Elem list -> tree
che converte una lista ordinata senza duplicati in un albero rosso/nero.
Deve funzionare in tempo O(n), dove n è la lunghezza
della lista
Soluzione
Lezione 11 (23 febbraio 2005)
valutazione lazy
stream
funzioni incrementali e funzioni monolitiche
insertionsort sugli stream
stream infiniti
fusione di stream infiniti
crivello di Eratostene come stream infinito
Sorgenti OCaml per il capitolo 4 di Okasaki
Esempi di funzioni sugli stream
code (ammortizzate) con front e rear list
Laboratorio 6 (25 febbraio 2005)
Si definiscano le seguenti funzioni su stream (finiti e infiniti):
- numbers, che restituisce lo stream di tutti i numeri (positivi
e negativi) in un ordine scelto da voi
- fib, che restituisce lo stream dei numeri di
Fibonacci: 1, 1, 2, 3, 5, 8, 13, ...
- alternate s, che restituisce lo stream ottenuto prendendo
un elemento sì e uno no dello stream s. La si usi
per definire i numeri pari e i numeri dispari
- stream_map s f, che restituisce lo stream ottenuto da
s applicando a ciascun elemento la funzione f
- stream_filter s p, che restituisce lo stream ottenuto
da s eliminando
tutti gli elementi che non soddisfano il predicato p
- even_pairs, che restituisce l'insieme delle coppie
non ordinate (m,n) in cui la differenza n - m è pari
Si utilizzi infine la funzione stream_filter per definire una
funzione sieve che implementa il crivello di Eratostene su
uno stream. Non si usi una lista ausiliaria dei primi già
identificati. Si definisca
let eratostenes = sieve (from 2)
e si provi l'implementazione con
print eratostenes
Lezione 12 (25 febbraio 2005)
introduzione alla complessità ammortizzata
il metodo del banchiere
il metodo del fisico
complessità ammortizzata delle code con front e rear list
ammortizzazione e persistenza
complessità ammortizzata dell'inserimento in
heap binomiali
Sorgenti OCaml per il capitolo 5 di Okasaki
Lezione 13 (4 marzo 2005)
splay heap ammortizzati
Lezione 14 (4 marzo 2005)
pairing heap ammortizzati
il ruolo della valutazione lazy nei calcoli persistenti ammortizzati
complessità ammortizzata in presenza di valutazione lazy: idea del debito
Lezione 15 (9 marzo 2005)
il metodo del banchiere con valutazione lazy
code ammortizzate persistenti
il metodo del fisico con valutazione lazy
alberi binomiali ammortizzati persistenti
Sorgenti OCaml per il capitolo 6 di Okasaki
Lezione 16 (11 marzo 2005)
altre code ammortizzate persistenti
mergesort con condivisione