Qui est le grand-parent de Cat ?
Dans un arbre généalogique, on le voit en remontant deux traits. Un programme écrit dans la plupart des langages aurait besoin d'instructions pas à pas pour faire pareil. Prolog fonctionne autrement : tu écris ce qui est vrai, puis tu poses une question et il trouve la réponse.
À la fin de cette leçon
Remarque
Je peux poser à un programme Prolog des questions sur des faits et des règles.
Mots clés
- Fait : quelque chose que l'on dit au programme être vrai.
- Règle : une affirmation vraie si d'autres affirmations le sont.
- Requête : une question que l'on pose au programme.
- Variable : un nom qui commence par une majuscule et désigne une réponse à trouver, comme
X. - Récursivité : une règle qui s'utilise elle-même.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. Si x + 2 = 5, que vaut x ? 2. Dans « s'il pleut, prends un parapluie », qu'est-ce qui doit être vrai avant de prendre un parapluie ? 3. Dans un arbre généalogique, qu'est-ce qu'un grand-parent ? Réponses : 3, car x représente un nombre qui rend l'égalité vraie ; il doit pleuvoir ; un parent d'un parent.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de la leçon et attends qu'il indique qu'il est en marche. Il y a un seul conteneur, prolog. Rien ne s'ouvre dans un navigateur, alors sers-toi du terminal, où docker exec prolog lance une commande à l'intérieur. Chaque commande charge un fichier, pose une question, puis s'arrête. Tout ce qui s'affiche est en anglais, quelle que soit la langue de cette page. Chaque bouton Exécuter ci-dessous tape sa commande dans le terminal de ton lab, l'une après l'autre, dans la même session. Pour suivre les commandes ou taper les tiennes, appuie sur Ouvrir le terminal (nouvel onglet) dans la barre.
Un fait est une ligne vraie
Cette commande affiche le fichier des faits. Chaque ligne comme parent(tom, ann). est un fait, lu « tom est un parent de ann », et se termine par un point. Les lignes qui commencent par % sont des commentaires. Prolog ne sait rien d'autre que ce que dit le fichier.
docker exec prolog cat facts.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une requête demande si quelque chose est vrai
Celle-ci charge facts.pl et demande si tom est un parent de ann. L'option -g est le but à exécuter, et -t halt arrête ensuite. Elle affiche yes, car le fait existe. La seconde demande si ann est un parent de dan. Ce n'est pas dans les faits : le but échoue et rien ne s'affiche. Pas de sortie veut dire « on ne peut pas montrer que c'est vrai ».
docker exec prolog swipl -q -g "parent(tom, ann), writeln(yes)" -t halt facts.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
docker exec prolog swipl -q -g "parent(ann, dan), writeln(yes)" -t halt facts.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une variable demande « qui ? »
Une majuscule crée une variable, que Prolog remplit en cherchant tous les faits qui conviennent. forall parcourt chaque réponse et writeln l'affiche. La première commande affiche les enfants de tom, ann puis ben, dans l'ordre où les faits sont écrits. La seconde inverse la question : qui est un parent de ben ? Elle affiche tom.
docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
docker exec prolog swipl -q -g "forall(parent(X, ben), writeln(X))" -t halt facts.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Vérifie
Astuce
Quels enfants ben a-t-il, et dans quel ordre s'afficheraient-ils ? Réponse : dan puis eve, car ces faits sont écrits dans cet ordre. Rien ne s'affiche pour une personne sans enfant.
Une règle est vraie si ses parties le sont
family.pl contient des règles. La règle grandparent(X, Z) :- parent(X, Y), parent(Y, Z). se lit « X est un grand-parent de Z si X est un parent d'un certain Y et que Y est un parent de Z ». Le :- veut dire « si » et la virgule « et ». Personne n'a écrit de fait sur les grands-parents. Cette commande demande les petits-enfants de tom et affiche cat, dan et eve.
docker exec prolog swipl -q -g "forall(grandparent(tom, X), writeln(X))" -t halt family.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une règle peut s'utiliser elle-même
Un ancêtre est un parent, ou un parent d'un ancêtre. Cette seconde règle s'appelle elle-même, donc elle suit l'arbre aussi bas qu'il va. findall rassemble toutes les réponses dans une liste. La première commande affiche [ann,ben,cat,dan,eve] et la seconde, pour ann, affiche [cat].
docker exec prolog swipl -q -g "findall(X, ancestor(tom, X), L), writeln(L)" -t halt family.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
docker exec prolog swipl -q -g "findall(X, ancestor(ann, X), L), writeln(L)" -t halt family.plAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu'un programme Prolog s'exécute de haut en bas, ligne après ligne, comme une recette. Ce n'est pas le cas. Les faits et les règles disent ce qui est vrai, et la question décide ce qui est calculé. Et une requête qui n'affiche rien ne veut pas dire que le programme est cassé ni que la réponse est fausse dans la vraie vie : cela veut dire que la réponse ne peut pas être prouvée à partir des faits écrits. Ajoute un fait et la même question peut réussir.
Vérification finale
Astuce
Réponds sans revenir en arrière. 1. Que dit parent(tom, ann). ? 2. Qu'est-ce qui différencie X de tom ? 3. Que signifie :- dans une règle ? 4. Comment appelle-t-on une règle qui s'utilise elle-même ? Réponses : tom est un parent de ann, et c'est un fait ; X commence par une majuscule, c'est donc une variable à trouver ; « si » ; la récursivité.
Pour les enseignants
Astuce
Cette leçon est un petit exemple de leçon qui se fait dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Le lab est un conteneur avec l'interpréteur SWI-Prolog et trois petits fichiers, et rien ici ne se corrige tout seul : l'élève rend les questions qu'il a posées avec la réponse de chacune, une règle à lui ajoutée à family.pl avec une question qui la montre en marche, et une phrase sur la différence entre un fait et une règle. Points clés : 1. Un fait est une affirmation vraie. 2. Une requête demande si quelque chose est vrai, et une variable demande « qui ». 3. Une règle est vraie si ses parties le sont. 4. Une règle qui s'utilise elle-même suit une structure aussi loin qu'elle va. Erreur fréquente : lire un programme comme une liste d'instructions, ou lire l'absence de sortie comme « faux ». Matériel : le lab et son terminal. Conseil : demandez aux élèves de prévoir les réponses avant de lancer la commande, puis d'ajouter un fait et de voir ce qui change. Les réponses sont exactes et identiques à chaque fois, dans l'ordre où les faits sont écrits. Les noms et tous les messages sont en anglais, quelle que soit la langue de la page.