Linguaggi di Programmazione (7 Ottobre 2014)


Esercizio 1
Si consideri la seguente funzione Haskell:
myPenultimo (x) |  (length x)==1  = x
                |  (length x)==2  = head x
                |  otherwise      = myPenultimo(tail x)
L'interprete restituisce il seguente errore
Occurs check: cannot construct the infinite type: a0 = [a0]
    Expected type: [[a0]]
      Actual type: [a0]
    In the first argument of `head', namely `x'
    In the expression: head x
    In an equation for `myPenultimo':
        myPenultimo (x)
          | (length x) == 1 = x
          | (length x) == 2 = head x
          | otherwise  = myPenultimo (tail x)
Failed, modules loaded: none.
Perche'?
Modificare inoltre la funzione in modo che restituisca il penultimo elemento di una lista (definendo penultimo di [] come [] e penultimo di una lista con un solo elemento come l'unico l'elemento).

Esercizio 2
Perche' il downcast in Java e' pericoloso? E perche', nonostante cio', e' stato inserito nel linguaggio?
Esercizio 3
Che cosa si intende con scope extrusion nel π-calcolo?
Come si formalizza tale nozione nella relazione di riduzione che vede un insieme di processi come in sistema chiuso (che non ha cioe' alcuna interazione con l'ambiente esterno)?
Esercizio 4
   animal(lion).
   animal(sparrow).
   animal(X) :- bird(X).
   has_feathers(sparrow).
   bird(eagle).

   bird(X) :-
     animal(X),
     has_feathers(X).
Il programma prolog appena definito, sulla query
?-bird(X).
entra in loop, restituendo infinite volte il valore sparrow. Perche'?
Modificare il programma, mantenendo gli stessi fatti, in modo che cio' non accada.
Esercizio 5
Discutere brevemente del concetto di chiusura (closure).

Esercizio 6
Si descriva un session type che rappresenti (dalla parte del server) il protocollo di interazione con un server che permette di effettuare una votazione. Il protocollo e' descritto informalmente nel modo seguente.
Si effettua un login inserendo stringa come password. Se la password e' scorretta viene segnalato un errore, altrimenti si procede dando la possibilita' di votare per l'elezione del sindaco o per quella della giunta. La votazione procede fornendo il nome del sindaco, se si intende votare per il sindaco, oppure con due nomi, nel caso della giunta. Se il nome inserito non e' tra i candidati ammissibili si comunica un errore, altrimenti viene fornito a chi vota un valore numerico che corrisponde ad una ricevuta di avvenuta votazione.