Corrigé de l'interrogation écrite
de Programmation Fonctionnelle


I Récursivité

1.

let rec puiss x n = if n=0 then 1.
                           else let u = puiss x (n/2) in
                                if n mod 2 = 0 then u*.u
                                               else u*.u*.x;;
2.

let rec serie n a x = if n=0 then a(0)
                             else a(n)*.(puiss x n) +. serie (n-1) a x;;

3.

4.*.(serie 100000 (function i -> 1./.(2.*.float_of_int(i)+.1.)) (-1.));;


4.

serie 1 (function n -> 1.);;

Cette expression est bien typée :
- son type est float -> float
- sa valeur est la fonction qui à tout x associe x+1



II Algorithme de typage

    H                  E                                          T

    f : t1       t = t1 -> t2              function f -> function x -> f x : t
    x : t3       t2 = t3 -> t4             function x -> f x : t2
                 t1 = t5 -> t4             f x : t4
                t3 = t5                   f : t5 -> t4
                                          x : t5
                     

    d'où:   t = t1 -> t2 = (t5 -> t4) -> t3 -> t4 = (t5 -> t4) -> t5 -> t4

    d'où:   app : ('a -> 'b) -> 'a -> 'b



III Types structurés
   
1.

let rec take n l = if n=0 then []
                          else match(l) with
                                 [] -> []
                               | t::r -> t::(take (n-1) r);;

2.


let rec drop n l = if n=0 then l
                          else match(l) with
                                 [] -> []
                               | t::r -> drop (n-1) r;;


3.

let partage l =
    let long = (List.length l)/2 in
        (take long l, drop long l);;

4.


let rec fusion (l1,l2) = match(l1,l2) with
    ([],l) -> l
|   (l,[]) -> l
|   (t1::r1,t2::r2) -> if t1<t2 then t1::fusion (r1,l2)
                                else t2::fusion (l1,r2);;


5.

let rec tri l = if List.length l < 2 then l
                                     else
       let (l1,l2) = partage l in
           fusion (tri l1,tri l2);;


IV Vous pensiez avoir fini ?

1.


type 'a expr_ens =
    Vide
  | Singleton of 'a
  | Union of 'a expr_ens * 'a expr_ens
  | Intersection of 'a expr_ens * 'a expr_ens;;


2.


Union (Singleton 1, Singleton 2);;