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:
  • 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):

    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