Consignes

Ce TP ne sera pas noté, par contre, vous devrez soumettre votre travail en utilisant l'interface TPLab.

Liens utiles

1. Préliminaires

1.1. Linux

Redémarrez votre ordinateur, et choisissez Linux au démarrage. Si vous n'avez pas l'habitude de Linux, passez quelques minutes pour explorer l'interface. Vous avez accès à vos dossiers personnels, au web (le navigateur internet s'appelle iceweasel) etc.

1.2. Caml avec l'interprète simple

Le plus simple pour expérimenter avec des tous petits programmes Caml est d'utiliser l'interprète Caml. Pour lancer cet interprète, vous avez plusieurs solutions.

  1. La méthode simple : téléchargez le petit fichier interprete-caml que vous sauvegardez sur votre bureau, puis vous double-cliquez sur l'icône correspondante.

  2. La méthode pour les experts : vous lancer l'application Terminal (menu Applications --> Accessoires --> Terminal), puis vous tapez la commande suivante à l'intérieur de ce terminal :

    $ ledit ocaml
    
    Vous pouvez aussi utiliser la commande

    $ ocaml
    
    mais vous n'aurez pas la possibilité de vous déplacer avec les flèches...}

Une fois dans l'interprète Caml, vous pouvez :

Reprenez les exercices que l'on a fait en TD et testez dans l'interprète Caml. Vous avez le droit (c'est même encouragé) de faire des trucs bizarres et interdits, mais essayez de comprendre ce qui se passe.

Dans le code suivant, quelle sera la valeur donnée par f 2 la première et la deuxième fois. Expliquer ce qu'il se passe...

        Objective Caml version 3.11.2
# let x=4 ;;

# let f y = y+x ;;

# f 2 ;;

# let x=5 ;;

# f 2 ;;

Que se passe-t'il si vous ne mettez pas de else dans un if ?

Comment expliquez vous cela ?

1.3. Caml et Emacs

L'interprète tout seul est un peu pauvre, et si l'on veut faire des programme un peu gros, il faut sauvegarder ce que l'on fait dans un fichier. Vous avez peut-être déjà utilisé l'éditeur de texte GEdit. Pour ce cours, nous utiliser l'éditeur de texte Emacs, qui a plusieurs avantages.

Comme l'utilisation de Emacs est un peu étrange au début, et pour éviter de faire un sujet de TP de 15 pages, je vous montrerais comment faire les choses suivantes pour commencer à programmer en Caml.

  1. Étape préliminaire : créez un répertoire TP-info-421,

  2. lancez Emacs (menu Applications --> Programmation --> Emacs) et créez un nouveau fichier (menu File --> Visit New File ; ou premier icône en haut à gauche) appelé tp1.ml dans le répertoire crée à l'étape précédente. Attention, il faut donner le nom de votre fichier sur la ligne en bas de la fenêtre :
    • commencer par taper le début du nom du répertoire que vous voulez utiliser, puis appuyer sur la touche ``Tabulation'' : le nom du répertoire se terminera tout seul,
    • tapez le nom du fichier (tp1.ml par exemple) et validez.
  3. Ajoutez au moins les options suivantes (si elles sont présentes) :
    • menu Options --> Syntax Highlighting,
    • menu Options --> Paren Match Highlighting,
    • menu Options --> Active Region Highlighting,
    • et sauvegardez ces options (menu Options --> Save Options).

  4. Tapez le code Caml suivant dans votre fichier : (remarquez que Emacs colorie les mots clés, et l'utilisation de la touche Tabulation n'a pas l'effet attendu)

    let max (a:int) (b:int) : int =
      if (a<b)
      then b
      else a
    

  1. Faites un copier-coller dans l'interprète Caml (pour copier, il suffit de sélectionner, et pour coller, il suffit appuyer sur le bouton du milieu),

  2. encore mieux, mais vous pouvez également utilisez Tuareg --> Interactive Mode --> Evaluate Buffer pour donner tout ce que vous avez écrit à un interprète Caml qui se retrouvera dans une sous-fenêtre de Emacs.

  3. passez un moment à essayer différentes chose avec Emacs et Caml.

Ça parait un peu complexe au début, mais vous verrez que c'est finalement bien pratique.

1.4. Fonctions récursives

En utilisant Emacs et le mode interactif, programmez les fonctions suivantes de la feuille de TD 1 :

Quelle est la plus grande valeur de fact que vous pouvez calculer ?

Les suites de Hofstadter a et b sont définies par

Ces suites sont mutuellement recursives.

Calculez à la main les valeurs de a(1) et a(2) puis programmez deux fonctions a : int -> int et b : int -> int

La suite de Fibonacci est définie de la manière suivante : f(0) = 0, f(1) = 1 et f(n) = f(n-1) + f(n-2) si n>1.

Programmez une fonction fib : int -> int pour la calculer.

Quelle est la plus grande valeur que vous pouvez obtenir ?

Combien d'additions sont effectuées par Caml pour le calcul de de f 10 ? Qu'en pensez-vous ?

Écrivez deux fonctions sur les listes :

2. Courbe du dragon

La courbe du dragon est obtenue en suivant le processus suivant :

Voici les trois premières étapes :

Les coordonnées du nouveau point C sont calculées à partir des coordonnées des anciens points A et B grâce à la formule ( (xA+xB)/2 + (yB-yA)/ 2 , (yA+yB)/2 + (xA-xB)/2 ).

Programmer une fonction dragon : int -> ... qui dessine la courbe du dragon d'ordre n (premier argument) pour un segment AB (autre argument de la fonction).

Pour pouvoir dessiner, vous aurez besoins de :

Les opérations de dessins, ou les programmes qui dessinent, peuvent être séquentialisées avec un point virgule. Par exemple, pour tracer un segment de droite entre les points de coordonnées xa,ya et xb,yb, il faut faire

  moveto xa ya ;
  lineto xb yb

Notez bien que ni moveto xa ya ni lineto xb yb ne renvoie de valeur utilisable. En fait, les deux expressions sont de type unit...

Vous pouvez vous reporter à la documentation en ligne pour les fonctions graphiques simples supplémentaires. (Vous n'en avez pas besoin pour ce TP.)

Que pensez vous de la précision des dessins ? Pouvez-vous l'améliorer ?