Linguaggi di Programmazione (19 Settembre 2013)

Esercizio 1
Definire la nozione di Pattern matching ed il suo utilizzo in Haskell.
In quale altro linguaggio studiato nel corso viene utilizzata la nozione di pattern matching?
In generale, in cosa differiscono i concetti di Pattern matching e di Unificazione?
Esercizio 2
Quale problema viene introdotto in Java dall'uso del downcast? Perche' allora viene utilizzato?
Perche' il type system di Java per FJ viene esteso con la regola (T-SCast) (stupid cast)?
Esercizio 3
Scrivere un programma PROLOG che riconosca o rifiuti stringhe appartenenti al linguaggio regolare, sull'alfabeto {a,b,c}, associato alla seguente espressione regolare
abc*b + aa(bb)*c*
Per semplicita' rappresentiamo una stringa con una lista di atomi (aacb verra' rappresentata dalla lista [a,a,c,b]).
Esercizio 4
Definire i concetti di covarianza e controvarianza di una relazione rispetto ad un operatore e giustificare informalmente la controvarianza della relazione di sottotipo per il costruttore di tipo Ref. Giustificare quindi perche' non e' possibile modificare il tipo delle instance variables in una sottoclasse.
Esercizio 5
Descrivere le caratteristiche fondamentali del linguaggio Lucid Syncrone.
Esercizio 6
Il seguente processo PICT simula il calcolo del fattoriale eseguito dal seguente programma Haskell:
fact 0 = 1
fact n = n*(fact (n-1))
def fact [n:Int r:!Int] =
          ( new br:^Bool
            ( ==![n 0 (rchan br)]
            | br?b =  
                if b then
                  r!1
                else
                  ( new nr:^Int
                    ( -![n 1 (rchan nr)]
                    | nr?nMinus1 =
                         (new fr:^Int
                           ( fact![nMinus1 fr]
                           | fr?f =
                               *![f n (rchan r)]
           ) )     ) )    

Scrivere un programma PICT che simuli il calcolo del fattoriale per ricorsione di coda, cioe' calcolato dal seguente programma Haskell
factaux 0 c = c

factaux n c = factaux (n-1) c*n