7. Travailler dans Swish et diagnostiquer les réponses
7.1 Moteur et plateforme
SWI-Prolog est le moteur recommandé par le cours, avec sa documentation, ses modules et sa communauté : https://www.swi-prolog.org/. Swish est la plateforme web utilisée : https://swish.swi-prolog.org/. L’installation locale est facultative; la plateforme suffit aux bases travaillées cette semaine.
Pour une installation locale, le programme doit être chargé en mémoire de travail avant de résoudre les buts. Les dialectes Prolog peuvent différer : utiliser la version choisie dans le cours facilite la concordance des exemples. Dans la transcription automatique, « Prologue », « Switch » et une adresse web mal reconnue doivent être corrigés à l’aide des noms et des liens officiels.
7.2 Programme, but et résultats
L’interface de l’enregistrement comporte :
- l’éditeur du programme à gauche, créé avec Program, contenant faits et règles;
- la zone de requête à droite en bas, où saisir le but terminé par un point;
- la zone des résultats à droite au-dessus.
Run lance la recherche. Les exemples et l’aide sont accessibles par les menus. Un compte peut être créé pour sauvegarder des programmes, mais cette possibilité est facultative dans la démonstration. Les zones peuvent être agrandies pour voir les essais plus facilement. L’objectif reste de comprendre la logique appliquée, plutôt que maîtriser tous les menus.
Les indications décrivent l’interface montrée dans le matériel officiel. Aucune création de compte ou sauvegarde externe n’a été effectuée pendant la préparation de ce document.
7.3 Demander les autres réponses
Next demande une autre preuve. Stop interrompt la recherche. History permet de reprendre une requête précédente; les requêtes affichées peuvent être retirées de l’interface.
La démonstration utilise notamment :
| Requête, convention enfant→parent | Résultats ou rôle |
|---|---|
parent(nathalie,W). |
W=anne, puis W=jimmy avec Next |
parent(X,U). |
Énumère les paires de faits; première paire X=jean, U=sylvain; la démonstration interrompt ensuite la liste |
grandparent(jean,X). |
X=anne, puis X=jimmy |
soeur_frere(nathalie,W). |
Permet d’analyser les personnes admises et les preuves répétées |
L’interface peut montrer U avant X alors que X est le premier argument : lire le nom de la variable associé à sa valeur, pas seulement l’ordre d’affichage. Dans une console locale classique, ; demande la réponse suivante.
La vidéo explicative simplifie l’affichage web en parlant de toutes les réponses. La démonstration montre la recherche pilotée avec Next et Stop : une première réponse ou un arrêt volontaire ne constitue pas l’énumération complète.
7.4 Nathalie : distinguer deux problèmes et les corriger
Avec la règle initiale de §6.5, soeur_frere(nathalie,W) donne :
Code (text) · sélectionner pour copier
julie, nathalie, luc, julie, nathalie, luc
Pourquoi Nathalie apparaît-elle? Le premier sous-but choisit parent(nathalie,anne). Le second parent(W,anne) peut choisir à son tour parent(nathalie,anne). Rien n’impose que les personnes soient distinctes. Le programme initial démontre donc une relation de parent commun qui admet aussi l’identité.
Pourquoi les valeurs sont-elles répétées? Après les trois réponses par Anne, la recherche choisit Jimmy comme parent commun et retrouve les trois mêmes personnes. Deux preuves différentes peuvent fournir la même valeur de W. Le moteur n’assimile pas automatiquement l’ensemble des preuves à un ensemble de valeurs uniques.
L’enseignante ajoute la condition à la fin du corps :
Code (prolog) · sélectionner pour copier
soeur_frere(X,Z) :- parent(X,Y), parent(Z,Y), not(X=Z).
Après relance, les valeurs sont :
Code (text) · sélectionner pour copier
julie, luc, julie, luc
Nathalie est exclue; les doublons restent parce que les deux parents restent deux témoins de preuve. Exclusion de soi et déduplication sont deux problèmes distincts. La vidéo précise que le premier programme a été gardé simple pour permettre ce diagnostic. Les dessins ne montrant que Julie et Luc ne représentent pas tous les résultats du programme initial.
not(X=Z) teste l’échec de l’unification entre les deux personnes. Ici, parent/2 a déjà instancié les personnes, donc le test rejette l’identité. Placé avant ces appels sur deux variables libres, X=Z réussirait et sa négation échouerait. Ce test procédural n’est pas une contrainte abstraite de différence ni la négation logique classique.