6. Requêtes Prolog et sens des règles
6.1. Base de connaissances et variables partagées
Dans l’exercice, possede(P,V,C) signifie que P possède un véhicule de type V et de couleur C. Les faits sont :
Code (prolog) · sélectionner pour copier
possede(julie, auto, rouge).
possede(jean, auto, rouge).
possede(jean, auto, verte).
possede(marc, auto, rouge).
possede(jean, bicycle, bleu).
possede(nathalie, auto, noire).
possede(julie, bicycle, blanc).
L’énoncé ajoute qu’un propriétaire ne peut avoir plus d’un véhicule d’une même couleur. Cette hypothèse compte pour distinguer deux autos. Une conjonction partage une identité uniquement quand on réemploie la même variable : chaque variable anonyme _ est indépendante.
6.2. Propriétaire commun et véhicules distincts
Pour trouver la personne qui possède une auto rouge et un bicycle bleu :
Code (prolog) · sélectionner pour copier
?- possede(X, auto, rouge), possede(X, bicycle, bleu).
X doit satisfaire les deux buts. Julie et Marc ont une auto rouge, mais pas un bicycle bleu dans cette base; Jean est la réponse.
Pour demander si Nathalie a deux autos :
Code (prolog) · sélectionner pour copier
?- possede(nathalie, auto, C1),
possede(nathalie, auto, C2),
not(C1=C2).
Les deux premiers buts, seuls, peuvent réussir en utilisant deux fois le même fait. Ils ne prouvent donc pas deux véhicules distincts. La condition finale exige des couleurs différentes; elle suffit ici grâce à l’hypothèse d’unicité par couleur. Dans une base sans cette hypothèse, il faudrait une représentation permettant de distinguer les véhicules eux-mêmes.
Avec les faits donnés, les deux couleurs de Nathalie ne peuvent être que noire; le test échoue. Les couleurs sont instanciées par les deux premiers buts avant le test not(C1=C2). Déplacer une négation avant la recherche des valeurs change le comportement opérationnel attendu; on conserve l’ordre du corrigé.
6.3. Couleur commune sans propriétaire commun
Pour demander s’il existe une auto et un bicycle de même couleur :
Code (prolog) · sélectionner pour copier
?- possede(_, auto, C), possede(_, bicycle, C).
Le lien voulu porte sur C, pas sur le propriétaire. Les deux _ peuvent désigner des personnes différentes. Remplacer ces deux occurrences par le même X ajouterait une contrainte non demandée.
La requête échoue dans cette base : les autos sont rouges, verte ou noire; les bicycles sont bleu ou blanc. Le modèle utilise les atomes exactement tels qu’ils sont écrits; leur forme linguistique ne les rend pas égaux. Ces résultats sont obtenus ici par déroulement des faits, sans exécution d’un interpréteur.
6.4. Syntaxe et réutilisation de prédicats
La clarification sur SWISH distingue l’invite ?-, souvent déjà affichée par l’outil, du point terminal, qui appartient à la syntaxe et reste obligatoire. On peut omettre le préfixe fourni par l’interface; cela ne permet pas d’omettre le point final.
Une autre clarification autorise à réutiliser un prédicat déjà défini. Par exemple, avec parent(P,E) pour le parent P d’un enfant E et un prédicat soeur_frere adéquat :
Code (prolog) · sélectionner pour copier
tante_oncle(X,Y) :- soeur_frere(X,P), parent(P,Y).
P relie X au parent de Y. On peut utiliser cette composition ou écrire une autre formulation correcte, puis tester sa solution même si elle diffère du corrigé. À l’examen, une restriction doit être indiquée dans la question; l’existence d’un corrigé n’impose pas sa seule forme. Cette permission ne dispense pas de vérifier la bonne direction des arguments.
6.5. Correction officielle : relier les variables et orienter l’implication
La discussion Question 10 Quiz 2 corrige deux erreurs et explique une limite de la correction automatique.
Première erreur :
Code (prolog) · sélectionner pour copier
populaire(X) :- connait(Z,Y).
Cette règle ne dit pas que toute personne connaissant quelqu’un est populaire. X, la personne conclue populaire, est indépendant de Z, la personne qui connaît Y. Dès qu’un couple satisfait connait(Z,Y), le corps peut réussir sans restreindre X. Pour relier la condition à la bonne personne, la formulation voulue est :
Code (prolog) · sélectionner pour copier
populaire(X) :- connait(X,Y).
X est désormais commun à la conclusion et à la condition. Y désigne la personne connue; sa présence seulement dans le corps n’est pas, à elle seule, une erreur. Le défaut initial est l’absence du lien nécessaire sur X.
Deuxième erreur :
Code (prolog) · sélectionner pour copier
populaire(X) :- heureux(X).
Cette règle conclut la popularité à partir du bonheur. Pour traduire « les personnes populaires sont heureuses », il faut écrire :
Code (prolog) · sélectionner pour copier
heureux(X) :- populaire(X).
Dans Conclusion :- Condition., le corps à droite fournit la condition suffisante et la tête à gauche la conclusion. Une phrase « si A alors B » devient donc une règle de tête B et de corps A; inverser ces places change l’énoncé.
L’enseignante reconnaît une erreur dans le questionnaire et indique avoir ajusté les points, tout en précisant qu’elle ne peut pas changer les réponses automatiques affichées. Une indication automatique contradictoire ne doit donc pas être apprise comme une règle correcte. L’explication du forum fournit la correction conceptuelle. Le total de points de l’utilisateur n’a pas été inspecté et aucun ajustement individuel n’est attesté ici.