Linguaggi di Programmazione (16 Dicembre 2013)

Esercizio 1
(a) Volendo estendere il lambda-calcolo a' la Curry con i record ed i record types, descrivere come estendere la sintassi dei termini, dei tipi e le typing rules.
Come si introduce in questo contesto la nozione di sottotipo?
(b) Dare una derivazione formale nel sistema di assegnamento di tipi alla Curry per il seguente giudizio:

|--  \xy.yx :  a --> (a-->b) --> b

Scrivere la funzione Haskell "pippo" che corrisponde al lambda termine dato. Come si puo' fare in modo che, senza modificare la definizione della funzione pippo, questa possa accettare solo elementi numerici come primo input?
Esercizio 2
(a) Fornire sintassi e regole di riduzione del Pi-calculus fornendone significato e giustificazione.
(b) Si consideri il seguente programma PICT
def consumer channel:^Int =
  channel?i = ( printi!i
              | consumer!channel
              )
def producer [channel:^Int i:Int] =
  if (== i 0)
  then ()
  else ( channel!i
       | producer![channel (dec i)]
       )

new ch:^Int
run consumer!ch
run producer![ch 4]
Descrivere il suo comportamento e l'eventuale output.

Cosa sono i responsive channels in PICT? Per quale motivo sono stati introdotti?
Esercizio 3
(a) Nella programmazione O.O. possono esserci casi in cui l'invocazione di un metodo puo' provocare la necessita' di scegliere tra piu' possibili codici da eseguire. Questo puo' avvenire sia in presenza di metodi overloaded che di metodi overridden.
Che differenza c'e' tra metodi overloaded e metodi overridden?
Cosa si intende per "static" e "dynamic" method resolution?
Il seguente e' un esempio del testo contenente un metodo che e' sia overloaded che overridden e dove
SCType <: CType








class C {
     ...
     function equals(other:CType): Boolean is
         { ... }      // equals 1
	}

class SC inherits C modifies equals {
     ...
     function equals(other:CType): Boolean is
         { ... }      // equals 1
     function equals(other:SCType): Boolean is
         { ... }      // equals 2
}
In presenza di static resolution per i metodi overloaded e dynamic per quelli overridden, quale codice viene eseguito nelle seguenti invocazioni di metodo?
Giustificare le risposte. Risposte senza giustificazione non verranno valutate.
c := new C;
sc := new SC;
c' := new SC;

c  <= equals(c);
c  <= equals(c');
c  <= equals(sc);

c'  <= equals(c);
c'  <= equals(c');
c'  <= equals(sc);

sc  <= equals(c);
sc  <= equals(c');
sc  <= equals(sc);


(b) Definire la funzione fattoriale come predicato PROLOG.