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