Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Les bases de Prolog

La leçon complète est à lire ici. Créez un compte gratuit pour la pratiquer dans un labo en direct.

Labo de conteneurs11 min de lecture8 commandes

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.

Commande
docker exec prolog cat facts.pl

Affiché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 ».

Commande
docker exec prolog swipl -q -g "parent(tom, ann), writeln(yes)" -t halt facts.pl

Affiché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.

Commande
docker exec prolog swipl -q -g "parent(ann, dan), writeln(yes)" -t halt facts.pl

Affiché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.

Commande
docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.pl

Affiché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.

Commande
docker exec prolog swipl -q -g "forall(parent(X, ben), writeln(X))" -t halt facts.pl

Affiché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.

Commande
docker exec prolog swipl -q -g "forall(grandparent(tom, X), writeln(X))" -t halt family.pl

Affiché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].

Commande
docker exec prolog swipl -q -g "findall(X, ancestor(tom, X), L), writeln(L)" -t halt family.pl

Affiché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.

Commande
docker exec prolog swipl -q -g "findall(X, ancestor(ann, X), L), writeln(L)" -t halt family.pl

Affiché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.

À propos de ce labo et de sa source: Lab Prolog : programmation logique avec faits, règles et questions, dans le navigateur

Vous enseignez à une classe ? Proposez ces leçons à vos élèves avec correction et un labo pour chaque élève.