Linguaggi di Programmazione (4 Ottobre 2012)

Esercizio 1
Eseguire il "principal typing algorithm" sul termine λx.λy.x
Qual'e' invece il tipo principale dell'operatore di punto fisso λf.((λx.f(xx))(λx.f(xx))) ?
Esercizio 2
In FJ e' possibile dimostrare il seguente

Theorem [Progress] Suppose e is a well-typed expression.
(1) If e includes new C0(e1,..,en).f as a subexpression, then fields(C0)=T1f1,..,Tnfn and f is in {f1,..,fn}.
(2) If e includes C0(e1,..,en).m(d1,..,dk) as a subexpression, then mbody(m,C0)=(x1,..,xj, e0) and k=j.

In sintesi, cosa ci dice questo teorema?
Esercizio 3
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 4
Input channel types e Output channel types in PICT: discuterne e fornire un esempio di programma PICT che ne faccia uso.
Cosa va inserito al posto di "??" affinche' la seguente regola sia una regola corretta per il subtyping di PICT? Giustificare brevemente.
S ?? T
----------
?S < ?T

Esercizio 5
Si consideri il seguente insieme di fatti PROLOG.
c(1).
c(2).
d(1).
d(2).
e(3).
e(4).
f(3).
f(4).
Descrivere il risultato prodotto dall'interprete PROLOG (giustificando le risposte) per il seguente goal
?- p(X,Y).
prendendo in considerazione i seguenti insiemi di fatti.
1.
 
p(X,Y) :- a(X),b(Y).
a(X):- c(_),!,d(X).
b(X):- e(X),!,f(X).
b(X):- f(_).
2.
p(X,Y) :- a(X),b(Y).
a(X):- c(_),!,d(X).
b(X):- e(X),f(X).
3.
p(X,Y) :- a(X),!,b(Y).
a(X):- c(_),d(X).
b(X):- e(X),f(X).

Esercizio 6
In Ocaml la definizione di una classe ha la forma
class name =
    object (self:'self)
    ....
    ....
    end;;
Qual e' il significato di "self" e di "'self"?
Quale vantaggio fornisce l'uso di "'self" relativamente ai metodi binari?