Vous êtes sur la page 1sur 16

Leçon 1 

:
Introduction à la
programmation
logique

Université Virtuelle de Côte d'Ivoire

Mai 2019
Table des
matières

I - Objectifs 3

II - Présentation de la programmation logique 4

1. Quelques modes de programmation ............................................................................................. 4

2. Constitution d'un programme PROLOG ..................................................................................... 5

3. Conventions de SWI-PROLOG .................................................................................................... 6

4. Exercice ......................................................................................................................................... 8

III - Utilisation de PROLOG 9

1. Prise en main de SWI-Prolog ....................................................................................................... 9

2. Requêtes ..................................................................................................................................... 10

3. Variables .................................................................................................................................... 10

4. Conjonction ................................................................................................................................ 11

5. Règles ......................................................................................................................................... 11

6. Correction du programme .......................................................................................................... 12

7. Exercice : Question 1 ................................................................................................................... 13

8. Exercice : Question 2 .................................................................................................................. 13

9. Exercice : Question 3 .................................................................................................................. 13

10. Exercice : Question 4 ................................................................................................................ 14

11. Exercice : Question 5 ................................................................................................................ 14

12. Exercice : Question 6 ................................................................................................................ 14

IV - Solutions des exercices 15


Objectifs

À la fin de cette leçon, l'apprenant sera capable de :


o présenter la notion de programmation logique;
o d'utiliser Prolog à partir de SWI-Prolog.

3
Présentation de la programmation logique

Présentation de la
programmation I
logique

1. Quelques modes de programmation


Programmation impérative

Cette programmation s'inscrit dans une démarche algorithmique qui décrit la façon de traiter les
données pour atteindre un résultat par une série d'actions. Celles-ci sont toujours de trois types : le
test, l'ordre (chaque instruction par laquelle le programme passe est impérative) et l'itération
(obtenue grâce aux branchement).
Le déroulement du programme est parfaitement déterministe.
Exemple de langages : Fortran, Pascal, C ...

Programmation fonctionnelle

Le résultat est ici comme la composition de fonctions. Pratiquement, elle est proche de la
programmation impérative ; cependant ses fondements (λ-calcul) ainsi que l'absence de branchement
et d'affectation (du moins dans sa forme théorique) en fait un mode de programmation à part.
Exemple : Caml, Scheme

Programmation logique

Les modes de programmation décrits juste au-dessus sont dits procéduraux car ils cherchent à obtenir
le résultat grâce à une procédure (qui peut être une suite d'actions ou une composition de fonctions).
A cela on oppose la programmation logique qui est dite déclarative. En effet, ici on ne s'occupe pas
de la manière d'obtenir le résultat ; par contre, le programmeur doit faire la description du problème
à résoudre en listant les objets concernés, les propriétés et les relations qu'ils vérifient.
Ensuite, le mécanisme de résolution (pris entièrement en charge par le langage) est général et
universel. Il parcourt de façon non déterministe  toutes les possibilités du problème et peut donc
retourner plusieurs solutions.

Programmation orientée objet

Ce mode de programmation a été mis à part car il regroupe en fait tous les modes précédemment vus
en utilisant à la fois des techniques déclaratives et d'autres procédurale.
Exemple de langages : C++, Java ...

4
Présentation de la programmation logique

2. Constitution d'un programme PROLOG


Concepts de base

Termes
Objets de l'univers.
Exemple : 25, toto, X
Atome logique
Exprime une relation entre des termes.
Exemple : parent(toto, X).
Clause
Affirmation portant sur des atomes logiques.
Exemple :
parent(toto, ali).
enfant(X, Y) :- parent(Y, X).
Programme Prolog
Constitué d'un ensemble de clauses.
Exemple :
homme(toto).
femme(fatou).
parent(toto, ali).
enfant(X, Y) :- parent(Y, X).

Les faits

Les faits sont des données élémentaires qu'on considère vraies. Ce sont des formules atomiques
constituées du nom d'un prédicat (c'est à dire d'une relation (au sens mathématique du terme)) suivi
entre parenthèse d'une liste ordonnée d'arguments qui sont les objets du problème principal ou d'un
sous-problème.

Un programme PROLOG est au moins constitué d'un ou plusieurs fait(s).


Ces faits sont utilisés par PROLOG pour rechercher des preuves pour répondre aux requêtes de
l'utilisateur  ; ce sont en quelque sorte ses hypothèses de travail.

Exemple
beda est le père de affoua se traduit par : pere(beda,affoua).
affoua est la mère de yves se traduit par : mere(akoua,yves).
adam est l'ancêtre de tout le monde se traduit par : ancetre(adam,X).

Remarque
Généralement, on place toutes les déclarations de faits au début du programme.

Les règles

Les règles sont des relations qui permettent à partir des hypothèses (donc des faits) d'établir de
nouveaux faits par déduction.

5
Présentation de la programmation logique

Remarque
Un programme PROLOG contient presque toujours des règles, cependant ce n'est pas une obligation.

Exemple
La relation telle que si on est invincible, alors on est plus fort que tout le monde se traduit par la
règle : plusfort(X,Y):-invincible(X).

Les relations qui se traduisent en règle sont de la forme : H1 ? H2 ? ... Hn C


Où :
? peut être soit une disjonction () soit une conjonction ()
H1, H2,... Hn sont des formules atomiques ou des directives de contrôle
C est une formule atomique.

Exemple
La relation telle que si on est le père du père ou de la mère de quelqu'un alors on est son grand-père
se traduit par :
grandpere(X,Y):-pere(X,Z),pere(Z,Y).
grandpere(X,Y):-pere(X,Z),mere(Z,Y).
ou encore par :
grandpere(X,Y):-pere(X,Z),(pere(Z,Y);mere(Z,Y)).

Les variables utilisées dans une règle sont universellement quantifiées par PROLOG.

Exemple
grandpere(X,Y):-pere(X,Z),mere(X,Y). est quantifié ci-dessous :

Exemple de quantification

Exemple
plusintelligent(X,Y):-genie(X). est quantifié ci-dessous :

Exemple de quantification

3. Conventions de SWI-PROLOG
Il existe plusieurs éditeur/débuggeur PROLOG. Nous utiliserons dans ce cours SWI-PROLOG
développé par Jan Wielemaker à l'université d'Amsterdam et qui est distribué gratuitement.
Pour pouvoir fonctionner, un programme SWI-PROLOG doit obéir à certaines conventions :
Tous les faits et règles doivent se terminer par un « . ». 
Les variables utilisées dans les faits ou les règles commencent toujours par une majuscule ou «
_ ».
A l'inverse, tout le reste commence par une minuscule.

6
Présentation de la programmation logique

Il ne faut pas mettre d'espace entre le prédicat et la parenthèse ouvrante qui l'accompagne.
Les commentaires sont mis entre « /* » et « */ » ou commencent par « % » et se terminent
sur la même ligne.

Remarque
Mieux vaut faire commencer les variables classiques par des majuscules. En effet, cela permet de
différencier sans ambiguïté dans le mode débuggage les variables du programme, des variables
internes générées dynamiquement par PROLOG qui commencent par « _ ».

Remarque
Ces conventions s'appliquent également aux requêtes faites par l'utilisateur dans l'interpréteur de
commande de SWI-PROLOG.

7
Présentation de la programmation logique

4. Exercice
[Solution n°1 p 15]

Exercice : Question 1
La programmation logique est : (Choisir la bonne réponse)
A) une programmation déclarative

B) une programmation procédurale

C) une programmation fonctionnelle

Exercice : Question 2
Quels sont les termes dans la liste ci-dessous ?
A) 100

B) fils de Yao

C) Fils

D) Fils(Yao X)

E) X

F) f(X)

Exercice : Question 3
L'expression enfant(X, Y) :- parent(Y, X) est (choisir la bonne réponse) :
A) Un atome

B) Une Clause

C) Un atome logique

Exercice : Question 4
Dans la liste de faits ci-dessous, lesquels sont corrects ?
A) parent(ali,X)

B) homme(aline).

C) femme (yao).

D) fils(kassi,X) ;

E) parent(ali,X):-fils(X, ali)

F) parent(ali,X)-fils(X, ali).

G) parent(ali,X) :-fils(X, ali).

8
Utilisation de PROLOG

Utilisation de
PROLOG II

1. Prise en main de SWI-Prolog


Installation

Sous Windows, installer SWI-Prolog en téléchargeant le fichier d'installation pour votre plate-forme
sur http://www.swi-prolog.org/download/stable.
Sous Linux, installer avec la commande sudo apt-get install swi-prolog.

Base de faits

Dans un fichier texte, entrez le code suivant :

homme(john) .
femme(frida) .
femme(nelly) .
homme(donald) .
loves(john , frida) .
loves(frida , donald) .
loves(nelly , donald) .
loves(donald , nelly) .

Attention
Ne pas utiliser de majuscule pour les noms.

Un tel fichier s'appelle base de faits, parce qu'il regroupe des faits que l'on déclare être vrais.
Sauvez le fichier sous un nom avec l'extension .pl.
Exemple : exoprolog1.pl.

Si l'extension .pl est associée au compilateur swi-prolog, vous pouvez simplement double cliquer sur le
fichier exoprolog1.pl pour lancer Prolog. Sinon, trouvez le nom de l'exécutable (probablement pl ou
swipl sous Unix et plwin sous Windows) et tapez une commande du type swipl -s exoprolog1.pl
Prolog vous indique qu'il a chargé et compilé votre fichier et vous présente son invite de commande
comme le montre le paragraphe ci-dessous.

9
Utilisation de PROLOG

invite de commande prolog

2. Requêtes
L'invite de Prolog permet de poser des questions. Dans la terminologie Prolog, on les appelle des
requêtes.
Exemple :
? femme(nelly) .
Si tout va bien, Prolog devrait vous répondre
true.

Remarque
En cas de problème, vérifier que vous avez bien recopié la base de faits et la requête. Vérifiez en
particulier
1. Que vous n'avez pour l'instant utilisé aucune majuscule.
2. Que tout vos faits et votre requête se terminent par un point.

Pour quitter Prolog :


? halt .

3. Variables
Cette section introduit la noition de variable.
Ouvrons le fichier exoprolog1.pl pour relancer Prolog .
À l'invite de commandes, tapez
? homme(X) .
Prolog vous répond
X = john.
Ce dialogue pourrait se lire
– Connais-tu un X qui soit un homme ?
– Oui, John !
Ou plus précisément :
– “Connais-tu une valeur de X pour laquelle on peut prouver l'affirmation homme(X)?”
– “Oui, cela marche avec X=John.”

Autre exemple :
? femme(X) .
Prolog vous répond
X = frida

10
Utilisation de PROLOG

Remarque
Après les commandes homme(X) ou femme(X), Prolog ne revient pas immédiatement à l'invite.
Que s'est-il passé ?
1. Prolog a identifié X comme étant une variable car l'identificateur commence par une majuscule.
2. Il a cherché une affectation de la variable X permettant de vérifier l'affirmation femme(X) ou
homme(X).
3. En ayant trouvé une, il l'affiche. . .
4. . . . mais comme il a constaté qu'il pourrait y avoir d'autres possibilités, il attend votre avis (notez
l'absence de point après cette première réponse !). Si cette information vous suffit, tapez enter (ou a,
ou c) et Prolog arrêtera sa recherche.
5. Si vous voulez voir les alternatives restantes, tapez ; (ou n, r, barre d'espacement ou tabulation) et
Prolog continuera sa recherche.

4. Conjonction
Nous nous sommes pour l'instant limités à satisfaire un seul but à la fois, mais on peut aussi tenter
de les combiner : si l'on entre plusieurs buts séparés par des virgules, Prolog essaiera de tous les
satisfaire simultanément. Ainsi,
?− femme(X) ,loves(john , X) .
nous donne bien le X = frida ; que nous espérions, et
?− femme(X) ,homme(X) .
nous donne  No.

5. Règles
Jusque là, Prolog ressemble à une sorte de base de données, mais en moins pratique et plus lent !
Pour en faire un langage de programmation, il nous manque un ingrédient essentiel : les règles.
Créer un nouveau fichier contenant les lignes ci-dessous et enregistrer le sous le nom exoprolog2.pl.
On note que ce nouveau fichier contient deux nouvelles lignes par rapport au programme précédent.

homme(john) .
femme(frida) .
femme(nelly) .
homme(donald) .
loves(john , frida) .
loves(frida , donald) .
loves(nelly , donald) .
loves(donald , nelly) .
% and h e r e i s our f i r s t r u l e :
triste(X) :− loves(X , Y) , loves(Y , Z) .

Remarque
L'avant-dernière ligne est un commentaire, introduit par le caractère %.
La dernière ligne est une règle et signifie que la partie gauche (avant le :-) est vraie si la partie droite
est vérifiée.
Dans le cas particulier, cela nous donne quelque chose comme : X est triste si X aime Y et Y aime Z.

Enregistrez votre fichier, relancez Prolog sur cette nouvelle base4 et essayez de l'interroger sur

11
Utilisation de PROLOG

l'existence d'une personne triste.


triste(X) .
Si tout se passe normalement, Prolog vous proposera bien plus de réponses que prévu : non seulement
John et Frida sont tristes, ce qui est bien légitime, mais aussi Donald et Nelly.

6. Correction du programme
Si par exemple on décide de modifier notre programme en exigeant que les variables prennent des
valeurs différentes, on peut corriger la dernière ligne du programme pour exiger que les valeurs de X
et Z soient différentes :
triste(X) :− loves(X , Y) , loves(Y , Z) , X\=Z .

Pour recharger ce nouveau programme, vous avez plusieurs solutions à choix :


1. Quitter Prolog et double-cliquer à nouveau sur exoprolog2.pl.
2. Utiliser la commande : consult('o:/path/to/exoprolog2.pl').
3. . . . ou sa forme équivalente ['o:/path/to/exoprolog.pl'].
4. (Sous Windows) Dans le menu “file”, choisir “consult” puis sélectionner votre fichier.
(Sous Windows) Dans le menu “file” toujours, choisir “reload modified files”.

12
Utilisation de PROLOG

7. Exercice : Question 1
1. Écrivez le programme exoprolog3.pl suivant et compiler le.
homme(ali).
homme(kassi).
homme(kra).
femme(aya).
femme(noura).
femme(api).
parent(kra,kassi).
parent(kra,aya).
parent(api,kassi).
parent(api,aya).
parent(aya,ali).
parent(kassi,noura).
2) Dans les questions suivantes, Préd(X,Y) signifie “X est le/un Préd de Y”. Par exemple, enfant(X,Y)
signifiera “X est un enfant de Y”) .
Rajoutez à votre base (au programme de la question 1), des règles pour définir les prédicats suivants :
a) enfant, b) fils(X,Y), c) fille(X,Y), d) pere(X,Y), e) mere(X,Y), f) grand_parent(X,Y), g)
grand_pere(X,Y) et h) grand_mere(X,Y).
Voici les règles à ajouter:
a) enfant(X,Y):-parent(Y,X).
b) fils(X,Y):-homme(X),parent(Y,X).
c) fille(X,Y):-femme(X),parent(Y,X).
d) pere(X,Y):-homme(X),parent(X,Y).
e) mere(X,Y):-femme(X),parent(X,Y).
f) grand-parent(X,Y):-parent(X,Z),parent(Z,Y).
g) grand-pere(X,Y):-homme(X),parent(X,Z),parent(Z,Y).
h) grand-mere(X,Y):-femme(X),parent(X,Z),parent(Z,Y).

8. Exercice : Question 2
[Solution n°2 p 15]

Tester votre programme en déterminant les grand-parents.

9. Exercice : Question 3
[Solution n°3 p 16]

Tester votre programme en déterminant les pères.

13
Utilisation de PROLOG

10. Exercice : Question 4


[Solution n°4 p 16]

Tester votre programme en déterminant les mères

11. Exercice : Question 5


[Solution n°5 p 16]

Tester votre programme en déterminant la grand-mere de noura.

12. Exercice : Question 6


[Solution n°6 p 16]

Tester votre programme en déterminant les filles

14
Ressources annexes

Solutions des exercices

> Solution n°1 Exercice p. 8

Question 1
A) une programmation déclarative

B) une programmation procédurale

C) une programmation fonctionnelle

Question 2
A) 100

B) fils de Yao

C) Fils

D) Fils(Yao X)

E) X

F) f(X)

Question 3
A) Un atome

B) Une Clause

C) Un atome logique

Question 4
A) parent(ali,X)

B) homme(aline).

C) femme (yao).

D) fils(kassi,X) ;

E) parent(ali,X):-fils(X, ali)

F) parent(ali,X)-fils(X, ali).

G) parent(ali,X) :-fils(X, ali).

15
Solutions des exercices

Exercice p. 13
> Solution n° 2

kra et api.

> Solution n° 3 Exercice p. 13

kra et kassi.

> Solution n° 4 Exercice p. 14

api et aya.

> Solution n° 5 Exercice p. 14

api.

> Solution n° 6 Exercice p. 14

aya et noura.

16

Vous aimerez peut-être aussi