Exercice 0 : Environnement de travail¶
Installez ocaml sur votre compte de l'université (ou votre machine perso) en suivant les instructions sur la page publique du cours (http://webusers.i3s.unice.fr/~elozes/enseignement/PF), soit en suivant les instructions pas à pas, soit en lançant le script d'installation (pour les machines de Valrose).
Attendez votre tour pour lancer le téléchargement, si tout le monde lance l'installation en même temps, le réseau sature. Comptez environ 10 minutes pour achever l'installation.
En attendant, vous pouvez commencer le TP en travaillant sous tryocaml, cf https://try.ocamlpro.com, cela peut vous servir à la fois de toplevel et d'IDE très rudimentaire.
Une fois l'installation achevée, lancez visual code et créez un fichier tp1.ml
dans un répertoire dédié aux TPs de PF. Installez l'extension officielle d'Ocaml labs ("Ocaml Platform"). Vous voilà prêt à écrire votre futur projet en OCaml!
Si l'installation ne marche pas pendant le premier TP, revenez dessus plus tard (à la fin du TP, ou à un autre moment de la semaine). Pour une partie du TP 2 vous aurez besoin d'une version de Caml avec la librairie graphics, donc pensez à bien finir votre installation. De manière générale, revenez sur les exercices après la séance de TD ou de TP, les sujets sont difficiles à finir dans le temps imparti.
Exercice 1 : Fonction usuelles¶
Définissez les fonctions suivantes:
- la fonction
val_abs
qui renvoie la valeur absolue d'un réel - la fonction
signe
telle quesigne x
renvoie 0 six=0
, 1 six > 0
, et-1
sinon - la fonction
fac
qui calcule la factorielle de son argument - la fonction
est_diviseur
telle queest_diviseur n d
renvoietrue
si d divise n,false
sinon - la fonction
est_premier
qui indique si son argument est un nombre premier. Veillez à définir une fonction auxiliaire locale (une "sous-fonction").
Exercice 2 : Hello, world!¶
- Écrivez une expression qui affiche Hello, world!. Quelle est la valeur de cette expression?
- Définissez une fonction
hello
qui affiche Hello, world! - Modifiez la fonction
hello
pour qu'elle prenne en paramètres un nom et un âge et qu'elle affiche une petite phrase de présentation. Par exemple,hello "Julien" 34
affiche Hello, my name is Julien, and I am 34. Indication: la fonctionstring_of_int
pourrait vous être utile
Exercice 3 : Approximation de Pi¶
On représente un point du plan par un couple de nombres flottants (x, y)
.
- Définissez une fonction
distance
qui calcule la distance d'un point du plan à l'origine du repère. - On considère le cercle de rayon 1 centré à l'origine du repère et le carré [-1,1]x[-1,1] le contenant, de côtés parallèles aux axes. Quelle est la probabilité qu'un point pris au hasard dans le carré soit dans le cercle?
- Définissez une fonction
rand_point
qui renvoie aléatoirement un point à l'intérieur du carré - Définissez une fonction
approche_pi n
qui tire au hasard n points à l'intérieur du carré, compte combien parmi eux sont dans le cercle, et en déduit une approximation de π.
Exercice 4 : Zéro d'une fonction¶
On considère une fonction f continue sur l'intervalle [a,b] telle que f(a)f(b)<0. On sait alors qu'il existe un réel c tel que f(c)=0. On se propose de trouver ce réel à une précision donnée près. Plus précisément, on va programmer une fonction approche0 f a b p
qui renvoie un nombre c tel que |f(c)|<p[.
On procède par recherche dichotomique: on pose d'abord c=(a+b)/2. Si |f(c)|<p, on renvoie c. Si f(a)f(c)<0, on poursuit la recherche dans ]a,c[, sinon on poursuit la recherche dans ]c,b[.
- Définissez la fonction
approche0
- Que calcule le code suivant?
let f x = x *. x - 2.0 in approche0 f 1.0 2.0 0.000001
- Déduisez-en une nouvelle façon d'approximer le nombre π.
Exercice 5 : Curryfication, évaluation partielle, fonctions anonymes (fun x -> ...
)¶
- Relisez le cours pour vous rafraichir la mémoire sur la curryfication.
- Définissez la fonction
min
qui calcule le min de deux nombres. Son type doit êtreint -> int -> int
. - Déduisez-en la fonction
plafonne_a n
qui renvoie une fonctionf
de typeint -> int
telle quef m
vautm
plafonné àn
. Le type deplafonne_a
est le même que celui demin
(et la ressemblance ne s'arrête pas là). - Définissez une fonction
permute_args f
qui prend en argument une fonctionf
ayant pour argumentsa
puisb
et qui renvoie la fonctiong
ayant pour argumentsb
puisa
. Par exemple,permute_args plus_petit
renvoie la fonctionplus_grand
, avec les définitions suivantes:
let plus_petit a b = a < b
let plus_grand a b = a > b
Indication : le type de permute_args
doit être ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
.
Exercice 6 : Préfixe, suffixe, facteur¶
On dit qu'un mot u est un préfixe d'un mot v si v commence par u. Par exemple, le mot tu est un préfixe du mot tuyau. Un suffixe, inversement, est un mot qui termine un autre mot. Par exemple, au est un suffixe de tuyau. Enfin, un mot est un facteur d'un mot s'il apparait à l'intérieur du mot à une position quelconque. Par exemple uy est un facteur de tuyau à la position 1 (la position 0 est celle de la lettre t).
- Définissez une fonction
est_facteur_position u v i
qui renvoietrue
siu
est un facteur dev
à partir de la positioni
, etfalse
sinon. - Déduisez-en les fonctions
est_prefixe
,est_suffixe
, etest_facteur
.