Projet
"Abraham engendra Isaac, Isaac engendra Jacob, ... "

Objectifs et modalités

Ce travail porte sur la mise en oeuvre de techniques de la programmation déclarative pour résoudre un problème plus conséquent que ceux proposés dans les séances d'exercices.

Les modalités sont les suivantes :

Concernant les programmes produits :

Enoncé

Le travail consiste à implémenter un système de représentation d'arbres dans le modèle du calcul déclaratif vu au cours. La partie principale du travail consistera à implémenter l'algorithme assignant des positions aux noeuds de l'arbre. Le système prendra en entrée un fichier contenant des relations père-fils, de la forme : "père engendra fils1 et fils2 et fils3". Comme résultat, le système devra afficher à l'écran l'arbre dessiné. Certaines parties ont déjà été implémentées pour vous. Afin de les récupérer efficacement, il vous est proposé de "découper" le système de la façon suivante (les différentes étapes sont illustrées sur la figure qui suit les explications) :

  1. Le fichier est passé à un parseur qui renvoie une liste de structure filiation(pere:Label fils:[Label1 Label2]), ayant comme champ le label du père (un atom), et une liste contenant les labels des fils (des atom également). Le parseur vous est fourni.
  2. A partir de cette liste, il faut en extraire une structure d'arbre, c'est à dire créer une arborescence de structure tree(label:Label fils:[tree(...) tree(...) ...]).
  3. On peut alors passer cette structure à l'algorithme qui va assigner une position aux noeuds de l'arbre. L'algorithme à implémenter est détaillé plus bas. Cet algorithme devra renvoyer une arborescence de structure posTree(label:Label xPos:XPos yPos:YPos fils:[...]).
  4. Cette arborescence est alors passée à l'afficheur d'arbre. L'afficheur vous est également fourni.

L'algorithme de positionnement des noeuds d'un arbre

Il existe plusieurs algorithmes de ce type. En général, il faut que l'arbre dessiné ait les propriétés suivantes : Enfin, l'arbre dessiné doit être aussi étroit que possible.

Cette dernière propriété peut être interprétée de deux manières différentes. Soit on admet que un noeud soit en dessous d'un noeud qui n'est pas son ancêtre (Algorithme 2), soit pas (Algorithme 1). Les deux figures ci-dessous montrent la différence pour les données suivantes :

   A engendra B et C
   B engendra D et E
   C engendra G et F
   F engendra H et I et J
   G engendra P et Q et R et S et T

On peut voir que dans le deuxième cas, D est au-dessus de J, alors qu'il n'y a pas de lien entre eux.

Algo 1

Résultat de l'algorithme 1


Algo 2

Résultat de l'algorithme 2


Pour ce projet, il vous est demandé d'implémenter la première version (Algorithme 1), dont l'algorithme est légèrement expliqué ci-dessous.
Les étudiants qui le souhaitent peuvent considérer, comme bonus la seconde version, un peu plus compliquée à implémenter.

L'algorithme 1