Prolog
TD n°1
Premier exercice
But : définir un arbre généalogique, et pouvoir lui poser des questions...
Ébauche papier
Réaliser un arbre généalogique quelconque, mais en respectant certaines contraintes pour pouvoir
l'exploiter facilement :
• Pour s'y retrouver à la main, prendre A comme initiale des ancêtres de plus haut niveau, B
comme initiale des ancètres du niveau suivant, etc.
• Au moins 4 niveaux (5 si on code arrière grand-père). Cela donnera par exemple :
andre+augustine
|__ bernard+becassine
| |__ clement+chantal
| | |__ dudulle
| | |__ damien
| | |__ daniela
|__ babar
| |__ celestine
|__ brigitte+baptiste
|__ cedric+charlotte
| |__ didier
| |__ dagobert
| |__ dominique
|__ caroline
Codage des faits
Pour décrire un arbre généalogique, il y a les faits (ce qui est particulier à chaque famille, par
exemple que « Bécassine est une femme » ou que « Dudulle est le fils de Chantal ») et les règles (ce
qui est vrai pour toutes les familles, par exemple que « le frère du père est l'oncle »). Il y a plusieurs
tactiques pour décrire les faits, certaines plus intelligentes que d'autres. Chaque choix influera sur
les règles qui seront à définir.
Réflexions à avoir avant et pendant la création :
• Avec quel ensemble minimal de prédicats peut-on décrire complétement les faits d'un arbre
généalogique ? Autrement dit, quels prédicats sont « basiques », indispensables, et lesquels
peuvent être définis par des règles à partir des autres ? Les faits seront déclarés avec ces
prédicats, les autres seront définis dans des règles.
• Les commentaires en prolog : ils sont encadrés par /* .... */
• Faire en sorte de ne pas mettre d'informations redondantes.
Attention :
• tout ce qui commence par une majuscule est une variable (attention avec les prénoms et les
noms de fichiers !) ;
• dans les prédicats à 2 arguments, l'ordre n'est pas imposé par Prolog, c'est une convention;
on prendra toujours la convention lien_parente(X,Y) signifie «X est lien_parente Y»;
mais l'ordre utilisé dans la définition doit être le même que celui utilisé pour les questions,
bien sûr (pas de commutativité des arguments) ;
• toutes les variantes de Prolog font la distinction majuscule/minuscule, mais toutes ne
traitent pas correctement les caractères spéciaux ou accentués du français : éviter d'en
mettre dans vos prénoms et dans vos prédicats ;
• en principe, le tiret haut est utilisable dans les noms de prédicats (grand-pere, etc.), mais ça
pose parfois des problèmes par-ci par-là (confusion avec la soustraction sans doute) :
préférer le tiret bas (« _ »).
Utilisation...
1. Écrire le fichier avec un éditeur, avec une extension ".pl".
2. En vous positionnant dans le dossier contenant votre fichier, lancer la ligne de commande
"gprolog" : l'interpréteur GNUProlog se lance et affiche : |?
3. Charger le fichier en tapant
Si votre fichier contient des erreurs syntaxiques, elles vous seront signalées.
4. Poser quelques questions fermées (à réponses Yes/No) : par exemple "Andre est-il un
homme/une femme ?", "Bernard est-il un enfant de Caroline ?" , etc. Après chaque
modification du fichier, sauvegarder et recharger.
5. Quelques questions ouvertes avec une seule variable : par exemple "Qui sont les enfants de
Babar ?", etc.
6. Quelques questions ouvertes avec plusieurs variables : par exemple "Qui est parent de
qui ?", "Quels couples homme/femme ont eu un enfant ensemble ?", etc.
Règles
La formule « ∀x ∀y [enfant(x,y) ⇒ parent(y,x)] » se traduira
« parent(Y,X) :- enfant(X,Y). ».
Expliciter sous forme de règles la définition des relations suivantes :
• parent (ou enfant, suivant le choix fait initialement)
• fils, fille, père, mère
• grand_parent, petit_enfant, grand_père, grand_mère, petit_fils, petite_fille
• frere_ou_soeur, frère, soeur
• oncle_ou_tante, oncle, tante
• cousin_ou_cousine, cousin, cousine
Règle récursive
Donner la définition de la relation de parenté "être un ancêtre de"
Traduire en interrogations prolog des questions formuléees en français
• Qui est le père de Dagobert ?
• Qui est la sœur du père de Dagobert ?
• Qui est la mère du cousin du père de Dagobert ?
• etc.