Setul 5

Exercițiul 1: În C, ML, ca și în alte limbaje, ordinea de evaluare a operanzilor e precizată pentru unii operatori (de exemplu, && și ||, de la stânga la dreapta), și neprecizată (poate fi oricare) pentru majoritatea operatorilor binari uzuali (aritmetici, comparație, etc.).

Fie următoarea expresie

if x > 3 && x < 5 then (x + 1) * (x - 2) else (x - 4) * (x + 6)

Dați etichete distincte (de exemplu litere) tuturor operatorilor din expresie. Explicați care operatori sunt sigur produc rezultatul înaintea cărora, dacă a) x = 4; b) x = 6. Calculați în ambele cazuri închiderea tranzitivă a ordinii parțiale definite.

Exercițiul 2 Scrieți o funcție care ia o listă de caractere și produce un dicționar în care fiecare caracter e asociat cu numărul aparițiilor în listă.

Indicație: parcurgeți lista cu List.fold_left și actualizați dicționarul la fiecare pas. Distingeți cazurile când caracterul e nou în dicționar sau e întâlnit prima dată.

Pentru a crea ușor liste de caractere, puteți folosi următoarea funcție care creează o listă de caractere dintr-un șir:

let explode s = let rec expl i l = if i < 0 then l else expl (i - 1) (s.[i] :: l) in expl (String.length s - 1) [];; explode "acesta este un sir";;