Corrigé de l'interrogation écrite
de Programmation Fonctionnelle


I Récursivité

1.

let toujours = List.fold_left (&) true;;

2.

let parfois = List.fold_left (or) false;;



II Algorithme de typage


    H                E                                       T

    x : t1     t = t1 -> t2            function x -> function y -> x (x y) + 1 : t
    y : t3     t2 = t3 -> t4           function y -> x (x y) + 1 : t2
               t4 = int                x (x y) + 1 : t4
              int = int               x (x y) : int
              t5 -> int = t1   (°)    1 : int
              t6 -> t5  = t1   (°°)   x : t5 -> int
              t6 = t3                 x y  : t5
                                      x : t6 -> t5
                                      y : t6


    d'après (°) et (°°), on a:  t5 = t6 = int

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

    d'où:   f : (int -> int) -> int -> int



III Types algébriques
   
1.


type expr_bool =
     Val of bool
   | Ou of expr_bool * expr_bool
   | Non of expr_bool
   | Var of char
;;


2.



let exemple = Ou (Ou ((Non (Var 'A')), (Var 'B')), (Ou ((Val false), (Var 'A'))));;


3.



let rec val_of x env = match(env) with
     []        -> failwith "erreur"
   | (id,v)::r -> if id = x then v else val_of x r;;

let rec eval e env = match(e) with
   Val b      -> b
 | Ou (e1,e2) -> (eval e1 env) or (eval e2 env)
 | Non e      -> not (eval e env)
 | Var x      -> val_of x env
;;


4.



let adjoint a = List.map (function b -> a::b);;

let rec cree_envs vars = match(vars) with
   []   -> [[]]
 | t::r -> let l = cree_envs r in
               (adjoint (t,true) l) @ (adjoint (t,false) l)
;;


5.


let est_valide e vars =
  let envs = cree_envs vars in
      toujours (List.map (eval e) envs);;