Linguaggi di Programmazione (5 Ottobre 2010)

Esercizio 1
(a) Perche' dimostrare proprieta' di programmi funzionali dovrebbe essere piu' semplice, in genere, che per programmi imperativi?

(b) Si considerino le seguenti definizioni Haskell contenure in un file di nome esercizio.hs.
contains x [] = False
contains x (y:ys) = if (x == y) then True else (contains x ys)

data Giuggiolo = Giuggiolo Int
  deriving(Show)

data Paperino = Paperosimple Giuggiolo | Paperocomplex  [Giuggiolo]
  deriving(Show)

cucu :: Paperino -> Giuggiolo -> Bool

cucu (Paperosimple (Giuggiolo n)) (Giuggiolo m) = (n == m)

cucu (Paperocomplex lg) g = (contains g lg)
Se facciamo valutare il file esercizio.hs all'interprete Haskell riceviamo la seguente segnalazione di errore:
ERROR "esercizio.hs":17 - Instance of Eq Giuggiolo required for definition of cucu
Perche'? Come si risolve il problema?

Esercizio 2
(a) Supponiamo di avere le seguenti definizioni in FJ:
class A extends Object {
A() { super(); }
}

class B extends Object {
B() { super();  }
}
La seguente espressione FJ e' correttamente tipabile?
(A)(Object)new B()
Perche?
Perche' si e' introdotta in FJ la seguente regola di tipo?
    Gamma |- e : D    C non sottotipo di D    D non sottotipo di C

                          stupid warning
 ----------------------------------------------------------------------
                        Gamma |- (C)e : C

(b) Cos'e' la structural congruence per i termini del pi-calcolo?
La seguente condizione, che deve essere soddisfatta dalla structural congruence, e' scritta correttamente?
   P | new x in Q   =  new x in (P | Q)
(ovviamente, per motivi tipografici abbiamo utilizzato il simbolo '=' al posto di quello che rappresenta la congruenza).
Perche' e' indispensabile postulare la validita' di questa condizione? qual e' il suo scopo?

Esercizio 3
(a) Si supponga di avere una base di dati composta da asserzioni del tipo
parent(tizio, caio).
che indicano che tizio e' figlio di caio.
Scrivere un programmino Prolog per controllare se due persone sono cugini.
Scrivere una query la cui valutazione permetta di ricavare tutti i cugini di Roberto, eventualmente anche con ripetizioni. Se il programma potrebbe produrre delle ripetizioni, indicare quali potrebbero essere le cause di output ripetuti.

(b) VanRoy suggerisce, per i linguaggi O.O., di utilizzare il meccanismo dell'Inheritance il meno possibile e di utilizzare al suo posto il meccanismo della Composition. Perche'?