8. Exercices Prolog, réponses et démarches
8.1 Les cinq unifications
= teste l’unification de deux termes. Il faut comparer les structures et appliquer les substitutions partout où la même variable apparaît.
| Requête | Résultat | Justification |
|---|---|---|
a(X,X) = a(p(12,abc),p(Y,Z)) |
X=p(12,abc), Y=12, Z=abc | Le premier argument fixe X; le second doit être la même structure |
f(a,Z) = f(X,g(h(y))) |
X=a, Z=g(h(y)) | Même f/2; unification de chaque argument |
f(a,Z) = f(b,g(h(y))) |
false | a et b sont deux constantes différentes |
f(X,p(A,B)) = f(a,p(1,2,3)) |
false | p/2 et p/3 sont des structures différentes |
R = f(X,g(h(y))) |
R=f(X,g(h(y))) | R reçoit une structure; X reste libre |
Dans g(h(y)), y est un atome minuscule. Il ne reçoit pas une substitution comme une variable Y. L’échec sur p/2 contre p/3 demeure un échec même si l’unification de X avec a était possible dans l’autre argument.
8.2 Jardin communautaire : relier les faits par N
Les prédicats sont parcelle(N,P) pour la personne propriétaire, surface(N,S) pour les m² et culture(N,C) pour la culture. Chaque parcelle contient une seule culture. Les données sont :
Code (prolog) · sélectionner pour copier
parcelle(1,guy).
parcelle(2,roland).
parcelle(3,renee).
parcelle(4,renee).
parcelle(5,paule).
parcelle(6,roland).
surface(1,5).
surface(2,8).
surface(3,10).
surface(4,5).
surface(5,10).
surface(6,12).
culture(1,tomates).
culture(2,carottes).
culture(3,carottes).
culture(4,laitues).
culture(5,haricots).
culture(6,pommes_de_terre).
Le nom de Renée est normalisé en renee dans ce code. Les faits portent sur les mêmes six parcelles; la variable N lie les conditions d’une question.
| Question | Requête | Réponse |
|---|---|---|
| Y a-t-il des laitues? | culture(N,laitues). |
N=4, donc succès |
| Quels légumes Roland cultive-t-il? | parcelle(N,roland),culture(N,L). |
N=2/L=carottes; N=6/L=pommes_de_terre |
| Quelle est la surface de Paule? | parcelle(N,paule),surface(N,S). |
N=5, S=10 |
| Quelle surface Renée utilise-t-elle pour les carottes? | parcelle(N,renee),surface(N,S),culture(N,carottes). |
N=3, S=10 |
| Guy cultive-t-il des carottes sur 10 m²? | parcelle(N,guy),culture(N,carottes),surface(N,10). |
false; sa parcelle 1 contient des tomates et fait 5 m² |
Le corrigé écrit culture(C,laitues) pour la première question : C y est un numéro de parcelle malgré son nom. Dans les questions à plusieurs conditions, employer des variables de parcelle indépendantes permettrait de mélanger la personne d’une parcelle, la culture d’une autre et la surface d’une troisième. N doit donc rester commun.
8.3 Tracer a(R,T)
Le programme fourni comporte neuf clauses :
Code (prolog) · sélectionner pour copier
a(X,Y) :- b(X), c(X,X), d(Y). % 1
b(X) :- f(X). % 2
c(1,1). % 3
c(3,3). % 4
c(5,5). % 5
d(2). % 6
e(1). % 7
e(2). % 8
f(3). % 9
La trace de a(R,T) est :
| Étape | Buts restants | Clause et substitution |
|---|---|---|
| 0 | a(R,T) |
Requête |
| 1 | b(R),c(R,R),d(T) |
Règle 1, X↦R et Y↦T |
| 2 | f(R),c(R,R),d(T) |
Règle 2, variable locale liée à R |
| 3 | c(3,3),d(T) |
Fait 9, R↦3; substitution propagée |
| 4 | d(T) |
Fait 4, c(3,3) |
| 5 | Aucun but | Fait 6, T↦2 |
Réponse : R=3, T=2. Une fois R lié à 3, c(1,1) et c(5,5) ne conviennent pas. Les deux faits e ne sont sollicités par aucun sous-but. Le résultat doit être expliqué par les règles et substitutions, et pas seulement recopié de l’interpréteur.
8.4 Généalogie : orientation parent→enfant
Cet exercice impose parent(X,Y) : X est parent de Y. Utiliser cette base séparément de celle de §6.5.
| Enfant ou enfants | Parents |
|---|---|
| robert | pamela, thomas |
| elizabeth | pierre, marie |
| anne, patricia | robert, elizabeth |
| julie, nathalie, luc | anne, jimmy |
| jean | julie, sylvain |
| sylvie | luc, rachel |
| marc, kevin | patricia, martin |
| tom | sonia, kevin |
Les 24 faits du corrigé sont :
Code (prolog) · sélectionner pour copier
parent(pamela,robert).
parent(thomas,robert).
parent(pierre,elizabeth).
parent(marie,elizabeth).
parent(robert,anne).
parent(elizabeth,anne).
parent(robert,patricia).
parent(elizabeth,patricia).
parent(anne,julie).
parent(jimmy,julie).
parent(anne,nathalie).
parent(jimmy,nathalie).
parent(anne,luc).
parent(jimmy,luc).
parent(julie,jean).
parent(sylvain,jean).
parent(luc,sylvie).
parent(rachel,sylvie).
parent(patricia,marc).
parent(martin,marc).
parent(patricia,kevin).
parent(martin,kevin).
parent(sonia,tom).
parent(kevin,tom).
Les cinq questions deviennent :
| Question | Requête | Résultat dans la base |
|---|---|---|
| Marie est-elle la mère d’Élizabeth? | parent(marie,elizabeth). |
Succès pour le lien parental |
| Nathalie a-t-elle des enfants? | parent(nathalie,X). |
Aucun enfant représenté, donc échec |
| Qui sont les parents de Patricia? | parent(X,patricia). |
X=robert; X=elizabeth |
| Martin est-il grand-père? | parent(martin,X),parent(X,Y). |
Succès via X=kevin, Y=tom |
| Sylvie est-elle arrière-petite-fille de Robert? | parent(robert,X),parent(X,Y),parent(Y,sylvie). |
Succès via X=anne, Y=luc |
Chaque variable intermédiaire relie les générations. La dernière question suit Robert→Anne→Luc→Sylvie, soit trois relations parentales.
Le prédicat parent/2 ne code pas le sexe. La requête officielle sur Marie établit le lien parental; « mère », « grand-père » et « petite-fille » reposent sur le contexte de l’arbre, pas sur une propriété sexuée représentée dans le programme. L’échec pour Nathalie signifie qu’aucun enfant n’est décrit dans cette base, sans affirmer une vérité universelle sur le monde réel.
8.5 Les quatre relations demandées
Les conditions du corrigé sont conservées, avec des noms de prédicats normalisés :
Code (prolog) · sélectionner pour copier
soeur_frere(X,Y) :-
parent(P,X), parent(P,Y), not(X=Y).
tante_oncle(X,Y) :-
parent(GP,X), parent(GP,P1), not(P1=X), parent(P1,Y).
petit_enfant(X,Y) :-
parent(P,X), parent(Y,P).
cousin_cousine(X,Y) :-
parent(GP,P1), parent(GP,P2), not(P1=P2),
parent(P1,X), parent(P2,Y).
Fratrie. X et Y partagent un parent P et sont distincts. Un parent commun suffit, donc la relation inclut les demi-frères et demi-sœurs. Deux parents communs peuvent encore produire deux preuves.
Tante/oncle. GP est parent de X et de P1 : X et P1 sont frère/sœur. P1 est parent de Y, donc X est tante/oncle de Y. not(P1=X) empêche de choisir X comme son propre frère/sœur et de transformer la règle en simple parentalité.
Petit-enfant. P est parent de X et Y est parent de P. X est donc petit-enfant de Y. L’orientation des arguments est ici celle du nom petit_enfant, conformément à l’énoncé.
Cousin/cousine. GP est parent de P1 et P2, qui sont distincts. P1 est parent de X et P2 de Y; X et Y descendent ainsi de deux personnes de la même fratrie. Des parents ou grands-parents communs multiples peuvent créer plusieurs preuves de la même réponse.
Les tests not(...) sont placés après les relations qui instancient leurs arguments. Par exemple, not(X=Y) appliqué immédiatement à deux variables libres échoue, car X=Y pourrait réussir. Il ne remplit alors pas le rôle attendu d’une différence entre deux personnes choisies.
L’exercice demande de vérifier ces relations en posant des questions et en les confrontant à l’arbre. Pour la fratrie et le cousinage, les deux orientations doivent retrouver les relations attendues; pour une relation orientée comme petit-enfant, inverser les arguments change la question.
Unifier lien(X,f(X)) avec lien(a,Y). Comparer le premier argument impose X=a; le second devient f(a)=Y. Unificateur le plus général {X↦a,Y↦f(a)}. Les deux liens issus de X indiquent la même substitution dans les deux occurrences; la répétition ne crée pas deux variables différentes.
Source : Schéma original du portail, données autonomes; consolidation du 16 octobre 2026. · Maître S06 : 8.1 Les cinq unifications