Linguaggi di Programmazione (28 Febbraio 2014)




Esercizio 1
La seguente funzione Erlang firstList2secondList prende due liste non vuote di uguale lunghezza e restituisce una funzione che, preso un elemento della prima lista restituisce l'elemento della seconda lista nella stessa posizione.
In Erlang la funzione predefinita lists:nth(N,L) restituisce l'N-esimo elemento della lista L. Inoltre la funzione position prende un elemento ed una lista che lo contiene e restituisce la sua posizione. Notare inoltre l'uso di "fun" per denotare una funzione anonima.
firstList2secondlist(First,Second) -> 
              fun(Elem) -> N = position(Elem,First);
	                   lists:nth(N,Second)
	      end.
Scrivere la stessa funzione in Haskell, senza utilizzare funzioni ausiliarie come position e lists:nth.
Fornire il tipo principale calcolato da Haskell per la funzione definita.
Come mai in Haskell e' possibile fornire la funzione richiesta in modo semplice ed elegante, mentre in Erlang cio' risulterebbe piu' complesso?


Esercizio 2
Enunciare il teorema di Subject Reduction e quello di Progress per FJ.
Quali proprieta' di FJ ci garantiscono tali teoremi?
Enunciare poi i teoremi Reduction preserves safety e Progress of safe programs.
Quale altra proprieta' ci garantiscono?


Esercizio 3
Dire se il seguente termine possiede forma normale ed eventualmente fornirla insieme ai vari passi di riduzione:

(λxxx.((λxx.x)(xx)(λx.x)))x(xx)



Esercizio 4
Si consideri la seguente funzione Haskell
factg g 0 = g 1

factg g n = (g n)*(factg g (n-1))
Poiche' il calcolo di (g n) potrebbe richiedere tempo, vogliamo definire la stessa funzione in Erlang in modo che il calcolo di (g n) venga eseguito da un processo, mentre altri processi si occupano del calcolo di (factg g (n-1)).

Esercizio 5
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)

Perche' e' indispensabile postulare la validita' di questa condizione? qual e' il suo scopo?


Esercizio 6
Si consideri il seguente programma Prolog:
permutation([], []).                                          

permutation(List, [Element | Permutation]) :-                
                                 select(Element, List, Rest),
                                 permutation(Rest, Permutation).
Se forniamo all'interprete il seguente goal
?- permutation([a,b],P).    
dire, descrivendo brevemente come si comporta l'interprete, qual e' il primo subgoal relativo al predicato permutation che viene prodotto durante la ricerca di una soluzione.