====== Examen restanta 27 mai ======
1. Scrieti o functie care primeste o lista de ''String''-uri si interschimba primul caracter cu al patrulea. Exemplu:
repl ["Matei", "Mihai", "George"] = ["eatMi", "aihMi", "reoGge"]
2. Scrieti un predicat care primeste o lista de liste imbricate, si construieste o lista //ne-imbricata// cu aceleasi elemente. Exemplu:
?- flat([[a,b], [c], [[[d]]], e],R).
R = [a,b,c,d,e].
3. Dati un exemplu de lambda expresie **reductibila**, care produce **aceeasi** secventa de reduceri, atunci cand este evaluata prin strategia normala si prin cea aplicativa.
4. Scrieti o functie in Haskell care primeste o matrice ''m'' si un intreg ''i'' si intoarce coloana ''i'' din matrice, sub forma unei liste.
5. Fie urmatorul cod in Haskell care codifica formule boolene:
data CNF = Var Bool | And CNF CNF | Or CNF CNF | Not CNF
eval (Var x) = x
eval (And f f') = (eval f) && (eval f')
eval (Or f f') = (eval f) || (eval f')
eval (Not f) = not (eval f)
Modificati codul de mai sus (si implementarea lui ''eval'') astfel incat arbori precum:
And
/ \
And True
/ \
False True
sa poata fi reprezentati folosind un singur nod cu mai multi copii:
And
/ | \
False True True
6. Scrieti un predicat ''p(X,K,Y)'' care construieste toate submultimile de dimensiune ''K'' formate cu elemente din ''X''.