Advertisement
Keodedad

TD 3

Mar 17th, 2020
2,263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 5.62 KB | None | 0 0
  1. (** TD 3 *)
  2.  
  3. (** Exercice 1 *)
  4.  
  5. let somme_liste : float list -> float  =
  6.   fun l -> List.fold_right (+.) l 0.
  7.  
  8. let nb_occu : 'a list -> 'a -> int =
  9.   fun l e ->
  10.   List.fold_right
  11.     (fun x y -> if x= e then x + y else y)
  12.     l 0
  13.  
  14. let appartient : 'a list -> 'a -> bool =
  15.   fun l e ->
  16.   List.fold_right (fun x y -> x = e || y) l false
  17.    
  18. let ensemble  =
  19.   fun l ->
  20.   List.fold_right
  21.     (fun x y -> if appartient y x then y else x::y)
  22.     l []
  23.  
  24. let regroupe : 'a list -> ('a * int) list =
  25.   fun l ->
  26.   List.map (fun x -> (x, nb_occu l x)) (ensemble l)
  27.  
  28. let inclus : 'a list -> 'a list -> bool =
  29.   fun l1 l2 ->
  30.   List.fold_right
  31.     (&&)
  32.     (List.map (fun (x,y) -> y <= nb_occu l2 x) (regroupe l1))
  33.     true
  34.  
  35. let liste_egal : 'a list -> 'a list -> bool =
  36.   fun l1 l2 -> inclus l1 l2 && inclus l2 l1
  37.  
  38.  
  39. (* Exercice 2 *)
  40.  
  41. (* Question 1 *)
  42.  
  43. let rec subst : 'a list -> 'a -> 'a -> 'a list =
  44.   fun l a b ->
  45.   match l with
  46.     [] -> []
  47.   | h::t when h = b -> a::(subst t a b)
  48.   | h::t -> h::(subst t a b)
  49.  
  50. (* Question 2 *)
  51.  
  52. let listMin : 'a list -> 'a  =
  53.   fun l ->
  54.   let rec aux l d =
  55.     match l with
  56.       [] -> d
  57.     | h::t -> min h (aux t d)
  58.   in aux (List.tl l) (List.hd l)
  59.    
  60.  
  61. (* Question 3 *)
  62.    
  63. let rec cut : 'a list -> int -> 'a list * 'a list =
  64.   fun l n ->
  65.   match l with
  66.     [] -> ([], [])
  67.   | h::t when n > 0 ->
  68.      let (l1,l2) = cut t (n - 1) in
  69.      (h::l1, l2)
  70.   | h::t ->
  71.      let (l1,l2) = cut t (n - 1) in
  72.      (l1, h::t);;
  73.  
  74. let split : 'a list -> 'a list * 'a list =
  75.   fun l -> cut l (List.length l / 2);;
  76.  
  77. (** Exercice 3 *)
  78.  
  79. let g = List.map (fun (x,y) -> (-x, y + 1))
  80.  
  81. (* List.map : ('a -> 'b) -> 'a list -> 'b list *)
  82. (* fun (x,y) -> (-x, y +1) : int * int -> int * int *)
  83. (* Les paramètres 'a et 'b de List.map sont donc instanciés par int * int *)
  84. (* ce qui donne (int * int) list -> (int * int) list pour l'expression *)
  85.  
  86. let rec f = fun x y z ->
  87.   match x with
  88.     [] -> z
  89.   | h::t -> y h (f t y z)
  90.  
  91. (* le type de f est de la forme 'a -> 'b -> 'c -> 'd *)
  92. (* par le filtrage 'a est de la forme 'e list *)
  93. (* par le premier cas du filtrage : 'c = 'd (le retour de f est z) *)
  94. (* par l'application dans le second cas du filtrage : y : 'e -> 'd -> 'd *)
  95. (* au final on a : f: 'e list -> ('e -> 'd -> 'd) -> 'd -> 'd *)
  96.  
  97. let l = List.map (fun p -> p 7) [(fun n m -> n + m)]
  98.  
  99. (* List.map : ('a -> 'b) -> 'a list -> 'b list) *)
  100. (* fun p -> p 7 : (int -> 'c) -> 'c *)
  101. (* fun n m -> n + m : (int -> int -> int) list *)
  102. (* par application on a donc 'a -> 'b = (int -> 'c) -> 'c *)
  103. (* et 'a list = (int -> int -> int) list *)
  104. (* en simplifiant on obtient : 'a = int -> 'c, 'c = 'b et 'a = int -> int -> int *)
  105. (* et donc 'a = int -> int -> int et 'b = int -> int *)
  106. (* l est de type (int -> int) list *)
  107.  
  108. let f = fun l -> List.map (fun (g,x) -> (g x) + 1) l
  109.  
  110.  
  111. (* fun (g,x) -> (g x) + 1 : ('a * 'b) -> 'c *)
  112. (* par le type de + on a
  113.    - (g x) : int et donc g : 'b -> int puisque x:'b
  114.    - 'c = int *)
  115. (* ce qui donne fun (g,x) : ('b -> int, int) -> int *)
  116. (* List.map : ('c -> 'd) -> 'c list -> 'd list *)
  117. (* par application on a 'c -> 'd = ('b -> int, int) -> int *)
  118. (* et donc 'c = 'b -> int, int et 'd = int *)
  119. (* le type de l'expression est donc ('b -> int, int) list -> int list *)
  120.  
  121. let b = fun l ->
  122.   let f =
  123.     fun l ->
  124.       match l with
  125.         [] -> []
  126.       | h::_ -> h
  127.   in List.rev (List.map f l)
  128.  
  129. (* b est une fonction donc b : 'a -> 'b *)
  130. (* *)
  131. (* f est une fonction et donc f : 'c -> 'd *)
  132. (* par le filtrage, l est une liste et donc 'c = 'e list *)
  133. (* par le résultat du premier cas, la valeur de retour est une liste et donc
  134.    'd = 'f list *)
  135. (* par le résultat du second cas 'e = 'f list et donc f : ' f list list -> 'f list *)
  136. (* List.map : ('g -> 'h) -> 'g list -> 'h list *)
  137. (* par application, on a 'g = 'f list list et 'h = 'f list ce qui donne  
  138.    List.map f : 'f list list list -> 'f list list *)
  139. (* on a donc 'a = 'f list list list et 'b = 'f list list (rev ne change pas le type) *)
  140.  
  141. (** Exercice 4 *)
  142.  
  143. (* Pour le plaisir, on commence par réécrire les fonctions avec du filtrage
  144.    et la fonctoin List.fold_right *)
  145.  
  146. let rec insert : 'a -> 'a list -> 'a list =
  147.   fun x l ->
  148.   match l with
  149.     [] -> [x]
  150.   | h::t when x < h -> x::l
  151.   | h::t -> h::(insert x t)
  152.  
  153. let rec tri_insertion : 'a list -> 'a list =
  154.   fun l -> List.fold_right insert l []
  155.  
  156. (* Pour généraliser ces fonctions, on prend simplement la relation
  157.    d'ordre en paramètre *)
  158.  
  159. let rec insert order =
  160.   fun x l ->
  161.   match l with
  162.     [] -> [x]
  163.   | h::t when order x h -> x::l
  164.   | h::t -> h::(insert order x t)
  165.  
  166. let rec tri_insertion order =
  167.   fun l -> List.fold_right (insert order) l []
  168.  
  169. (* On retrouve le cas de base en utilisant la relation d'ordre usuelle sur les entiers *)
  170.  
  171. let exemple1 = tri_insertion (<)
  172.  
  173. (* On peut facilement inverser la relation en écrivant *)
  174.  
  175. let exemple2 = tri_insertion (>)
  176.  
  177. (* En supposant qu'un monôme est représenté par une paire (c,d) ou c est le
  178.    coefficient et d le degré du monôme *)
  179.    
  180. let exemple3 = tri_insertion (fun (x,y) (z,t) -> x < z)
  181.  
  182. (* Exercice 5 *)
  183.  
  184. let rec alterne : 'a list -> bool =
  185.   fun l ->
  186.   match l with
  187.     []
  188.   | [_] -> true
  189.   | [h1;h2] -> h1 <> h2
  190.   | h1::h2::h3::t when h1 < h2 && h2 > h3 -> alterne (h2::h3::t)
  191.   | h1::h2::h3::t when h1 > h2 && h2 > h3 -> alterne (h2::h3::t)
  192.   | _ -> false
  193.  
  194. (* Exercice 6 *)
  195.  
  196. let rec schuffle : 'a list -> 'a list -> 'a list list =
  197.   fun l1 l2 ->
  198.   match (l1, l2) with
  199.     (x, []) | ([], x) -> [x]
  200.   | (h1::t1, h2::t2) ->
  201.      List.map (fun x -> h1::x) (schuffle t1 l2)
  202.      @ List.map (fun x -> h2::x) (schuffle l1 t2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement