Vous êtes sur la page 1sur 4

3SI Guide pratique pour démarrer avec Prolog IA

Guide pratique pour démarrer avec Prolog

I. Introduction
Prolog pour PROgrammation LOGique, est un des premiers langages de ce paradigme, créé en 1972
par deux français, Alin Colmerauer et Philippe Roussel.
C’est un langage déclaratif basé sur la logique du premier ordre restreinte aux clauses de Horn.
Prolog contient un moteur d’inférences à chainage arrière, avec backtracking. On lui donne un
but (qui doit être un fait) qu’il va essayer de résoudre. Si ce but contient une variable, alors il
cherchera toutes les valeurs possibles pour celle-ci. Si le but contient un attribut, il confirmera ou
infirmera le fait.
Prolog fonctionne sur la base de prédicats. Chaque prédicat peut être soit un fait avéré, soit un fait
inféré grâce à des règles.
Le langage contient aussi des prédicats fournis, permettant par exemple d’écrire et lire dans la
console de Prolog, de charger, ou de manipuler des listes.
Plus qu’un langage, on peut considérer Prolog comme un système de démonstration et de résolution
de systèmes de contraintes
II. La syntaxe de Prolog
1. Variable : c’est une variable au sens logique ou mathématique. C’est l’équivalent d’une inconnue
en mathématique.
Syntaxe : c’est une chaine alphanumérique (majuscules, de minuscules, de chiffres et de blancs
soulignés), qui commence par une majuscule ou par un blanc souligné. Par exemple : X, Y, Liste,
_tag, X_67, Toto, _ sont des variables. La variable _ est très particulière. Elle est appelée variable
anonyme (désigne une variable dont la valeur ne nous intéresse pas).
2. Les termes élémentaires: représente un objet simple de l’univers. Un terme élémentaire est
soit : un nombre (entier ou réel), une variable, une constante symbolique (atome) ou un terme
composé.
En utilisant la notation BNF (Backus-Naur Form) un terme est donné par :
< 𝑡𝑒𝑟𝑚𝑒 >∷=< 𝑛𝑜𝑚𝑏𝑟𝑒 > | < 𝑎𝑡𝑜𝑚𝑒 > | < 𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒 > | < 𝑡𝑒𝑟𝑚𝑒 𝑐𝑜𝑚𝑝𝑜𝑠é >)
Il est possible de tester à quelle catégorie appartient un terme en utilisant les prédicats prédéfinis
suivants:
atom/1, var/1, nonvar/1, integer/1, float/1, number/1, atomic/1,
compound/1 et callable/1.
Syntaxe : chaine alphanumérique commençant par une minuscule (exemple : total, x, y23)
3. Les termes composés: un terme composé représente un objet structuré de l’univers. Il est
donné par :
Syntaxe : nomDeFonction (terme1, …, termeN) où : nomDeFonction est une chaine
alphanumérique qui commence par une minuscule. L’atome qui débute un terme composé est le
foncteur du terme. Par exemple calorie est le foncteur de calorie(salade,15).
Exemple de termes composés : adresse (’rue soudani boudjamma’, 30, Ville) c’est un terme composé
représentant l’adresse décrite par la chaine de caractères ’rue soudani boudjamma’, l’entier 30 et
la variable Ville.

Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 1/4


3SI Guide pratique pour démarrer avec Prolog IA

4. Constante : chaine de caractères commençant par une minuscule. C’est un atome ou un nombre
entier ou flottant.
5. Les nombres : on peut utiliser les entiers ou les flottants. 33, -33, 33.0
6. Les atomes : sont soit :
 Une chaine de caractères faite de majuscules, de minuscules, de chiffres et de blancs
soulignés qui commence par minuscule. Par exemple : marylin_monroe, joe.
 Une suite arbitraire de caractères entre des guillemets simples. Par exemple : ‘je suis un
atome’, ‘l’’arbre’.
 Une suite de caractères spéciaux. Par exemple ; , :- sont des atomes qui ont un sens
prédéfini.
7. Les prédicats : Permet de décrire une relation entre des termes. Les prédicats peuvent avoir des
paramètres, qui sont entre parenthèses. Les paramètres sont séparés par une virgule, dans un
ordre qui possède un sens.
Syntaxe : nom_de_prédicat(terme1, terme2,…., termeN) où nom_de_predicat est le nom de la relation
qui lie les termes, c’est une chaine alphanumérique qui commence par une minuscule.
Exemples de prédicats :
manger (chat, souris). %relation de nom ’manger’ qui lie le constant chat et souris
fourrure(chat). %propriété de nom ‘fourrure’ sur l’objet chat
père (omar, ali) % relation de parent qui relie omar et ali
Habite (X, adresse(‘rue soudani boudjamma’, 30, Ville)) %relation de nom ‘habite’ qui lie la
variable X et le terme composé adresse.
L’arité d’un prédicat est le nombre d’arguments des têtes de clauses définissant ce prédicat. Par
exemple entrée est d’arité 1 et calorie est d’arité 2. Il est possible de définir plusieurs prédicats
d’arités différentes mais avec le même foncteur. On les distingue alors en utilisant la notation
Prédicat/Arité, représentant le profil du prédicat ou du terme. Par exemple calorie/2 est le profil
du prédicat calorie(X,Y).
SWI Prolog insiste pour que les différentes clauses d'un même prédicat soient consécutives. Si ce
n'est pas le cas, il faut le déclarer avant la définition avec :
:- discontiguous quelque_chose/2.

III. Vocabulaire de Prolog


1) Les faits
C’est une ligne de la forme𝒒𝒖𝒆𝒍𝒒𝒖𝒆_𝒄𝒉𝒐𝒔𝒆(…
: , … ).

Les faits sont des affirmations qui décrivent des relations ou des propriétés (relation comprend un
seul argument). Signifie que la relation est vraie et ce sans condition.
Syntaxe : prédicat
Exemples de faits: relation: (manger (chat, souris), père(farouk, jamel))/ propriété:
(masculin(jamel), féminin(sarah)).
Une base de faits est un ensemble de faits décrivant une connaissance donnée. Prolog considère
comme vrai tout fait cité dans la base de faits du programme, et considère comme faux tout ce qui
ne peut pas en être déduit. Corollairement, si le programme ne comporte que des faits, tout fait non
présent dans la base est considéré comme faux.
Exemple de base de faits:
entree(salade).
entree(avocat).

Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 2/4


3SI Guide pratique pour démarrer avec Prolog IA

dessert(raisin).
dessert(melon).
viande(steak).
viande(escalope).
poisson(daurade).
calories(salade,15).
calories(raisin,70).
calories(avocat,220).
calories(melon,27).
calories(steak,203).
calories(escalope,105).
calories(daurade,90).
2) Les règles
Décrit à quelle condition une relation est vraie. C’est un morceau du fichier de la forme :
𝒒𝒖𝒆𝒍𝒒𝒖𝒆_𝒄𝒉𝒐𝒔𝒆(… , … ): −
𝒂𝒖𝒕𝒓𝒆_𝒄𝒉𝒐𝒔𝒆(… , … ),
𝒆𝒕 𝒂𝒖𝒕𝒓𝒆_𝒄𝒉𝒐𝒔𝒆(… , … )
…,
𝒆𝒕𝒅𝒆𝒓𝒏𝒊𝒆𝒓_𝒕𝒓𝒖𝒄(… , … ).

Le symbole :- peut se lire ‘si’. La règle énonce des conditions pour que 𝒒𝒖𝒆𝒍𝒒𝒖𝒆_𝒄𝒉𝒐𝒔𝒆(… , … ) soit
vrai. Les virgules " , " dans le corps de la règle sont des conjonctions.
Syntaxe : 𝑝𝑟é𝑑𝑖𝑐𝑎𝑡1 : − 𝑝𝑟é𝑑𝑖𝑐𝑎𝑡2, … , 𝑝𝑟é𝑑𝑖𝑐𝑎𝑡𝑁.
Exemple : papy(X,Y) :-père(X,Z), père(Z,Y)).
IV. Programmer en Prolog
Un programme Prolog rassemble les connaissances sur un domaine. Ces connaissances sont
constituées de faits et de règles relatives au domaine exprimées sous forme de clauses de Horn.
Programmer en prolog signifie donc:
1. Spécifier des faits (vérifiés) sur les objets et leurs relations ;
2. Définir des règles sur les objets et leurs relations ;
3. Poser des questions sur les objets et leurs relations.
1) Clauses de Horn
Une clause est une phrase du système exprimant que des conditions entrainant des conclusions. Un
littéral est dit positif s’il consiste en une seule lettre (sans négation), il est dit négatif dans le cas
contraire. Une clause de Horn est toute clause qui possède au plus un littéral positif. Une clause de
Horn est soit :
1. Règle (clause de Horn stricte): décrit à quelle condition une relation est vraie. C’est toute
clause qui possède exactement un littéral positif (autrement dit constituée au plus d’une
conclusion).
Syntaxe : prédicat1 :- prédicat2,….,prédicatN
Exemple : papy(X,Y) :- père(X,Y), père(Z,Y).
Les variables apparaissant dans la tête d’une clause sont quantifiées universellement ; et les
variables apparaissant dans le corps d’une clause sont quantifiées existentiellement.
2. Fait (clause unitaire positive) toute clause consistant en un littéral positif. Un fait signifie ce
que la relation est vrai et ce sans condition.
Syntaxe : prédicat
Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 3/4
3SI Guide pratique pour démarrer avec Prolog IA

Exemple : père(omar, ali)

2) Exécution d’un programme prolog


On exécute un programme prolog en posant une question à l’interpréteur. Une Question est un
prédicat Prolog dont on cherche à savoir s’il est vérifié ou non. Les questions en Prolog commencent
par ?-. Pour y répondre, Prolog va essayer d’unifier la question posée avec un des faits de sa base
de connaissance. S’il réussit (c’est-à-dire que la question est une conséquence logique du
programme), il répond ‘true’ or ’false’ dans le cas contraire. La réponse ‘false’ ne signifie pas que
c’est faux mais que sur la base des connaissances dont dispose Prolog, la question n’a pas pu être
unifiée donc n’est pas une conséquence logique du programme. De même, la réponse ‘true’
n’indique pas que cela est vrai dans le monde réel, mais que la question a pu être unifiée. Se présente
comme une clause de Horn sans littéral positif (père(jean, X), mere (annie, X).).
Le premier type de question c’est des questions fermées (ou des faits précis) dont la réponse est
binaire (oui ou non).
?- manger (chat, fromage).
false
?- manger(souris, fromage).
true

Le deuxième type, est de savoir des valeurs des inconnus, on utilise alors une variable dont le nom
doit commencer par une majuscule. Par convention, on utilise X, mais ce n’est pas une obligation
(on pourrait l’appeler MangeursDeFromage si on le souhaitait). L’interpréteur Prolog doit alors
unifier la question. L’ordre des réponses fournies par l’interpréteur est donc dépendant de l’ordre
des faits de la base de connaissance.
?- manger (X, fromage).
X=souris.

3) Débogage :
Pour comprendre ce qui se passe, nous allons utiliser les capacités de débogage de SWI-Prolog.
Entrez trace, votre requête. Ceci va donc lancer votre requête, mais en demandant en plus une
trace d’exécution. Prolog vous répondra quelque chose comme Call: (8) votre requête(_G157)?, ce
qui signifie qu’il a projet d’appeler le prédicat votre requête, tapez la barre entée pour continuer
la trace. Continuez à suivre pas à pas l’exécution de votre programme en frappant la barre
d’espacement chaque fois que nécessaire, jusqu’à la fin de l’exécution.
SWI-Prolog propose aussi une version graphique du débogueur. Dans le menu “Debug” choisissez
“Graphical Debugger”, puis relancez la commande ci-dessus. Une belle fenêtre apparaît vous
permettant de suivre l’exécution de votre programme.
Cela vous permet de comprendre ce qui cloche dans notre programme ?

Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 4/4

Vous aimerez peut-être aussi