type 'a suite_infinie = Nil | Cellule of (unit -> 'a * 'a suite_infinie) ;; exception Suite_Vide ;; let cons x l = let f () = (x,l) in Cellule f ;; let tte = function Nil -> raise Suite_Vide | Cellule f -> match f() with x,_ -> x ;; let queue = function Nil -> raise Suite_Vide | Cellule f -> match f() with _,q -> q ;; let est_vide = function Nil -> true | _ -> false ;; let rec force n l = match n,l with 0,l -> [],l | n,Nil -> raise Suite_Vide | n,Cellule f -> match f() with x,q -> let liste,reste = force (n-1) q in x :: liste,reste ;; let rec ˆ_partir_de n = let f () = n,(ˆ_partir_de (n+1)) in Cellule f ;; let entiers_naturels = ˆ_partir_de 0 ;; let suite_de_1 = let rec f() = 1,(Cellule f) in Cellule f ;; let premiers n l = match force n l with liste,_ -> liste ;; let reste n l = match force n l with _,r -> r ;; let rec filtre prŽdicat = function Nil -> Nil | Cellule f -> match f() with x,q -> if (prŽdicat x) then let g () = x,(filtre prŽdicat q) in Cellule g else filtre prŽdicat q ;; let non_multiple a b = (b mod a) <> 0 ;; let Žlimine x l = filtre (non_multiple x) l ;; let rec crible = function Nil -> raise Suite_Vide | Cellule f -> match f() with x,q -> let g() = x,(crible (Žlimine x q)) in Cellule g ;; let nombres_premiers = crible (ˆ_partir_de 2) ;; let rec addition l1 l2 = match l1,l2 with Nil,Nil -> Nil | Nil,_ -> raise Suite_Vide | _,Nil -> raise Suite_Vide | (Cellule f1),(Cellule f2) -> match f1(),f2() with (x1,q1),(x2,q2) -> let f () = (x1+x2),(addition q1 q2) in Cellule f ;; let rec soustraction l1 l2 = match l1,l2 with Nil,Nil -> Nil | Nil,_ -> raise Suite_Vide | _,Nil -> raise Suite_Vide | (Cellule f1),(Cellule f2) -> match f1(),f2() with (x1,q1),(x2,q2) -> let f () = (x1-x2),(soustraction q1 q2) in Cellule f ;; let rec multiplication_scalaire x = function Nil -> Nil | Cellule f -> match f() with a,q -> let g() = (x*a),(multiplication_scalaire x q) in Cellule g ;; let produit_de_Cauchy l1 l2 = match l1,l2 with Nil,Nil -> Nil | Nil,_ -> raise Suite_Vide | _,Nil -> raise Suite_Vide | _,_ -> produit l1 l2 [] [] 0 ;;