Installez ocaml sur votre compte de l'université (ou votre machine perso) en suivant les instructions sur la page publique du cours (http://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.
Définissez les fonctions suivantes:
val_abs
qui renvoie la valeur absolue d'un réelsigne
telle que signe x
renvoie 0 si x=0
, 1 si x > 0
, et -1
sinon fac
qui calcule la factorielle de son argumentest_diviseur
telle que est_diviseur n d
renvoie true
si d divise n, false
sinonest_premier
qui indique si son argument est un nombre premier. Veillez à définir une fonction auxiliaire locale (une "sous-fonction").hello
qui affiche Hello, world!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 fonction string_of_int
pourrait vous être utileOn représente un point du plan par un couple de nombres flottants (x, y)
.
distance
qui calcule la distance d'un point du plan à l'origine du repère.rand_point
qui renvoie aléatoirement un point à l'intérieur du carré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 π.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[.
approche0
let f x = x *. x - 2.0 in approche0 f 1.0 2.0 0.000001
fun x -> ...
)¶min
qui calcule le min de deux nombres. Son type doit être int -> int -> int
.plafonne_a n
qui renvoie une fonction f
de type int -> int
telle que f m
vaut m
plafonné à n
. Le type de plafonne_a
est le même que celui de min
(et la ressemblance ne s'arrête pas là).permute_args f
qui prend en argument une fonction f
ayant pour arguments a
puis b
et qui
renvoie la fonction g
ayant pour arguments b
puis a
. Par exemple, permute_args plus_petit
renvoie la fonction plus_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
.
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).
est_facteur_position u v i
qui renvoie true
si u
est un facteur de v
à partir de la position i
, et false
sinon.est_prefixe
, est_suffixe
, et est_facteur
.