(*TP2*) (*Partie I*) let l1 = [];; let l2 = [1;2;4;99;7];; let l3 = [(6,"toto");(8,"etc");(2,"ur");(-10,"grenoble")];; let l4 = ['a';12];; let larg = [2;4;7;12;45];; let g = fun i-> i+2;; (*it fonctionnels*) (* exo 1 *) let rec map f l = match l with [] -> [] | a::reste -> (f a)::(map f reste);; (* val map : ('a -> 'b) -> 'a list -> 'b list = *) let _ = map g l2;; (* - : int list = [3; 4; 6; 101; 9] *) let _ = List.map g l2;; (* idem *) let g2 = fun i-> print_int i; print_string " ";i+2;; map g2 l2;; (* List.map g2 l2;; # map g2 l2;; 7 99 4 2 1 - : int list = [3; 4; 6; 101; 9] # List.map g2 l2;; 1 2 4 99 7 - : int list = [3; 4; 6; 101; 9] *) (* exo 2 *) let rec select t l = match l with [] -> [] | a::reste -> if t a then a::(select t reste) else select t reste;; let _ = select (fun i->i>4) l2;; (* - : int list = [99; 7] *) let _ = List.filter (fun i-> i>4) l2;; (* idem *) (* exo3 *) let selectionne_pairs l = select (fun i-> i mod 2 =0) l;; let _ = selectionne_pairs l2;; (* - : int list = [2; 4] *) let tres_gros=select (fun c->(String.length c)>=3);; (*val tres_gros : string list -> string list = *) let _ = tres_gros ["ab";"toto";"titi";"ba";"baba"];; (*- : string list = ["toto"; "titi"; "baba"]*) (*it procéduraux*) (*exo 4*) let x = 2+2 ; print_int 42;; (* Warning: this expression should have type unit. *) (* 42val x : unit = () *) (* une autre façon de faire :*) let x = let _ = 2+2 in print_int 42;; (* 42val x : unit = () *) (* ou encore : *) let x = ignore(2+2) ; print_int 42;; (* 42val x : unit = () *) (*exo 5*) let rec dolist fonc lis = match lis with | [] -> () | a::reste -> fonc a ; dolist fonc reste ;; (* val dolist : ('a -> 'b) -> 'a list -> unit = *) let _ = dolist print_int larg ;; (*2471245- : unit = ()*) let _ = List.iter print_int larg;; (*idem au niveau du resu, pas au niveau du typage*) (*forcer le type*) let rec dolistbis fonc lis = match lis with | [] -> () | a::reste -> let () = fonc a in dolist fonc reste ;; (* val dolist : ('a -> unit) -> 'a list -> unit = *) (* exo 6 *) let rec reduce fonc lis b = match lis with | [] -> failwith "pb" | [a] -> fonc a b | a::reste -> fonc a (reduce fonc reste b);; (*filtrage sur la liste à un élément pour faire le cas terminal*) (* val reduce : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = *) List.fold_right;; (*idem*) (* exo 7 *) let somme ilist = reduce (fun x y -> x+y) ilist 0;; (* val somme : int list -> int = *) let _ = somme l2;; (* - : int = 113 *) (*Partie II*) (*exo 8 *) (*sera int list*) let p1 = [3];; let p2 = [3;1;-2;0;0;7];; (*7X^5-2X^2+X+3*) let p3 = [1;1;1;0;3];; (*3X^4+X^2+X+1*) (* exo 9 *) let rec monome a n = if n=0 then [a] else 0:: (monome a (n-1));; let p4 = monome 3 5;; (* val monome : int -> int -> int list = *) (* val p4 : int list = [0; 0; 0; 0; 0; 3] *) (* exo 10 *) let rec somme p1 p2 = match (p1,p2) with ([],_) -> p2 | (_,[]) -> p1 | (a::reste,b::reste2) -> (a+b)::(somme reste reste2) let _ = somme p1 p2;; (* - : int list = [6; 1; -2; 0; 0; 7] *) let _ = somme p2 p2;; (* - : int list = [6; 2; -4; 0; 0; 14] *) let produit_cst a p = List.map (fun x-> a*x) p;; (* val produit_cst : int -> int list -> int list = *) let _ = produit_cst 4 p3;; (* - : int list = [4; 4; 4; 0; 12] *) (*fonction auxilliaire*) (*multiplier par x^p revient à décaler de p la liste (ajout de p zeros)*) let multi_x exp p = let rec aux nb p2 = if nb = 0 then p2 else (aux (nb-1) (0::p2)) in aux exp p ;; (* val multi_x : int -> int list -> int list = *) let _ = multi_x 2 p3;; (* - : int list = [0; 0; 1; 1; 1; 0; 3] *) let produit p1 p2 = (*flemme*) (* exo 11 *) let rec egal_poly p1 p2 = match p1 with | [] -> not (List.exists (fun x-> x<>0) p2) | a::reste -> match p2 with [] -> a=0 | b::reste2 -> (a=b && egal_poly reste reste2);; let _ = egal_poly p2 p2;; let _ = egal_poly [0] [0;0;0];; (*Partie III*) (* exo 12 *) type graphe = (int * int list) list;; (*Je force le type de g1*) let (gr1:graphe) = [(1,[2;3]);(2,[]);(3,[4]);(4,[])];; (* exo 13 *) let voisins (gr:graphe) sommet = List.assoc sommet gr;; let _ = voisins gr1 3;; (* - : int list = [4] *) (* exo 14 *) let parcours_from gr (sommet:int) todo = let rec parcours_aux (visited:int list) (tobe_visited:int list) = match tobe_visited with [] -> () | sommet::reste -> if (List.mem sommet visited) then parcours_aux visited reste else begin todo sommet; let voisis = voisins gr sommet in parcours_aux (sommet::visited) (voisis@reste) end in parcours_aux [] [sommet];; let _ = parcours_from gr1 3 (fun x-> print_int x);; (* 34- : unit = () *)