Linguaggi di Programmazione (6 Luglio 2015)

Esercizio 1
Definire in Haskell il tipo di dato "termine Prolog" ed inserirlo nella classe Show in modo da vedere sullo schermo i suoi elementi come se fossero reali termini Prolog.
Esercizio 2
Cosa si intende per "polimorfismo subtyping"? Quali regole di inferenza vanno aggiunte al lambda-calcolo a' la Curry con record per avere in esso il polimorfismo subtyping?
Esercizio 3
Si considerino i due seguenti processi PICT.
run ( x!y
    | x?z = z!u
    | y?w = print!"Got it!"
    )


run ( x!y
    | x?z = a!z
    | a?w = print!"Got it!"
    )
Tali processi, se eseguiti isolatamente, hanno lo stesso effetto. Giustificare tale affermazione.
Definire poi un processo PICT che si comporti in modo differente a seconda che il primo o il secondo dei processi precedenti viene utilizzato come sottoprocesso.
Esercizio 4
Il seguente codice Prolog implementa un algoritmo di decisione per un linguaggio regolare. Qual e' l'espressione regolare che rappresenta tale linguaggio?
expr(S) :- q0(S).

q0([a | Cs]) :- q1(Cs).
q0([c | Cs]) :- q3(Cs).
q1([b | Cs]) :- q2(Cs).
q2([c | Cs]) :- q2(Cs).
q2([]).
q3([b | Cs]) :- q4(Cs).
q3([]).
q4([b | Cs]) :- q3(Cs).
Se si esegue la query
expr([a,b,c]).
l'interprete Prolog cerca di dare due soluzioni: restituisce prima true (in maniera ovviamente corretta) e poi false. Invece, sostituendo la seconda clausola con
q0([a | Cs]) :- !, q1(Cs).
l'interprete restituisce una sola soluzione (cioé quella corretta). Perche'?






Esercizio 5
Se forniamo la seguente definizione all'interprete Ocaml
# let o = object (self:'self)
      val mutable x = 0
      val mutable y = 0
      method get_x = x
      method get_y = y
      method setcoord new_x new_y = x <- new_x ; y<- new_y
      method equal (p2:'self) = self#get_x=p2#get_x && self#get_y=p2#get_y
    end;;
otteniamo qualcosa della forma
val o :
  ??? = 
Cosa viene indicato realmente dall'interprete al posto di "???" ?. Giustificare la risposta.
Definire poi un oggetto o2 che abbia la definizione identica ad o, ma con un metodo in piu' e tale che il tipo di o2 sia un sottotipo di di abbia come tipo un sottotipo del tipo di o. Giustificare la risposta.
Esercizio 6
Implementare in Erlang la funzione che, presa una funzione F ed un numero N, restituisca la somma degli F(i) con i che va da 1 ad N.
Poiche' il calcolo di F(i) potrebbe risultare pesante dal punto di vista computazionale, si faccia in modo che ogni singolo valore F(i) venga calcolato da un processo apposito.