Vous êtes sur la page 1sur 21
Programmation Logique Dr. Chahrazed Mediani Département d’informatique Université Ferhat Abbas Sétif-1-

Programmation Logique

Dr. Chahrazed Mediani Département d’informatique Université Ferhat Abbas Sétif-1-

Historique  1930 Calcul des prédicats (J. Herbrand) Principe de résolution (J. A. Robinson) Utiliser

Historique

1930

Calcul des prédicats (J. Herbrand)

Principe de résolution (J. A. Robinson)

Utiliser la logique comme langage de programmation

Premier interprète PROLOG (A. Colmerauer et P. Roussel) Université d’Aix-Marseille

Premier compilateur PROLOG (D.H.D. Warren)

1965

1970

1972

1977

Université d’Édimbourg

Programmation logique versus programmation impérative  Dans la programmation impérative (ou programmation

Programmation logique versus programmation impérative

Dans la programmation impérative (ou programmation procédurale), un programme est une série d'instructions qui indiquent à la machine comment elle doit procéder pour résoudre un problème.

Dans la programmation logique (ou programmation déclarative), le programmeur ne se préoccupe plus de la marche à suivre pour résoudre le problème. Il se préoccupe surtout de définir les objets manipulés par son programme, et les relations qui existent entre ces objets, ou dont il veut prouver l'existence. Le mécanisme d'exécution d'un langage déclaratif passera en revue toutes les solutions du problème, c'est-à-dire toutes les configurations d'objets qui satisfont la ou les relations recherchées.



Programmation logique versus programmation impérative

Programmation logique

formule

ensemble de formules

requête

preuve

substitution (unification)

Programmation impérative

procédure

programme

appel de procédure exécution passage de paramètres

Le langage PROLOG  Langage d’expression des connaissances fondé sur le langage des prédicats du

Le langage PROLOG

Langage d’expression des connaissances fondé sur le langage des prédicats du premier ordre

Programmation déclarative :

L’utilisateur définit une base de connaissances

L’interpréteur Prolog utilise cette base de connaissances pour répondre à des questions

Les principales caractéristiques des langages de la Programmation Logique :

Logique : le langage est un sous-ensemble de la logique et une exécution est une

preuve.

Symbolique : les données manipulées sont principalement des symboles.

Déclaratif : le “que faire” plutôt que le “comment faire”.

Relationnel : un programme logique décrit un état du “monde” en termes de

données et de prédicats (relations) entre ces données.

Les domaines d’application de la Programmation Logique  Traitement Automatique du langage naturel  Intelligence

Les domaines d’application de la Programmation Logique

Traitement Automatique du langage naturel

Intelligence artificielle et modélisation des raisonnements (les Systèmes

experts, le Diagnostique, etc.)

Bases de données

Compilation

Automates formels déterministes et non déterministes

Vérification de programmes

Implémentation

  

usage privé. Et il en existe d'autres, en particulier GNU-Prolog .

SWI-PROLOG

http://www.swi-prolog.org

?- consult('myfile.pl').

Pour compiler le programme myfile

?- listing.

Pour consulter la base de connaissances

?- listing(père).

Pour consulter les clauses père

?- halt.

Pour quitter

Les conventions de SWI-PROLOG  Pour pouvoir fonctionner, un programme SWI-PROLOG doit obéir à certaines

Les conventions de SWI-PROLOG

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 « _ » (variable unanime).

Le nom des programmes Prolog ont pour extension pl (myfile.pl)

Durant le débogage les variables internes générées dynamiquement par

PROLOG commencent par « _ ».

A l’inverse, tout le reste commence par une minuscule.

Les commentaires sont mis entre « /* » et « */ » ou commencent par « % » et

se terminent sur la même ligne.

  

Constitution d’un programme PROLOG

Le principe de la programmation logique est de décrire le problème à résoudre. Dans le cas de PROLOG, cela est formalisé grâce à un langage dérivé du calcul des prédicats (ou calcul du premier ordre). Les prédicats servent à qualifier (donner les caractéristiques de) les objets du problème et à décrire les relations dans lesquelles ils sont impliqués.

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)

Ex : Ali est le père de Aicha se traduit par : père(ali,aicha).

Généralement, on place toutes les déclarations de faits au début du programme même si ce n’est pas obligatoire.

Les règles (clauses)

Un programme PROLOG contient presque toujours des règles, cependant ce n’est pas une obligation. Si les faits sont les hypothèses de travail de PROLOG, les règles sont des relations qui permettent à partir de ces hypothèses d’établir de nouveaux faits par déduction.

Ex : La relation telle que si X est le père de Y alors Y est l’enfant de X se traduit par la règle :

enfant(X,Y):-père(Y,X).

Bibliographie  I. Bratko. Prolog Programming for Artificial Intelligence. 3rd edition, Addison- Wesley Publishers,

Bibliographie

I. Bratko. Prolog Programming for Artificial Intelligence. 3rd edition, Addison- Wesley Publishers, 2001.

F. W. Clocksin and C. S. Mellish. Programming in Prolog. 5th edition, Springer-Verlag, 2003.

L. Sterling and E. Shapiro. The Art of Prolog. 2nd edition, MIT Press, 1994.

INTRODUCTION A PROLOG  Le "programme" se compose d'un ensemble de règles (sous la forme

INTRODUCTION A PROLOG

Le "programme" se compose d'un ensemble de règles (sous la forme :

conclusion IF conditions) et de faits (en général des affirmations : on précise ce qui est vrai, tout ce qui n'est pas précisé est faux ou inconnu).

)

et des listes (mais

Le langage gère des variables simples (entiers, réels, pas les tableaux).

Les variables simples sont les entiers, les réels, les chaînes de caractères

(entre " ") et les constantes symboliques (chaînes sans espace ni caractères

spéciaux, commençant par une minuscule, mais ne nécessitant pas de ")

Les noms de variables commencent obligatoirement par une majuscule

(contrairement aux constantes symboliques), puis comme dans les autres

langages est suivi de lettres, chiffres, et

valeur est dite "liée" ou "instanciée", une variable de valeur inconnue est

dite "libre".

Un variable "contenant" une



INTRODUCTION A PROLOG

Exemple01

est_un_homme(omar).

est_un_homme(yacine).

est_le_mari_de(yacine, amal)./* 1er arg: sujet, puis complément */

est_le_père_de(yacine, omar).

/* l'argument est pour moi le sujet */

est_un_homme est un "prédicat". Il sera soit vrai, soit faux, soit inconnu. Dans

le "programme", toutes les règles concernant le même prédicat doivent être regroupées ensemble. Pour exécuter ce programme sous SWI-Prolog, il suffit de l'enregistrer dans un fichier texte (nomfic.pl), puis d'appeler pl, charger le fichier par "consult(nomfic)." (n'oubliez pas le .).

INTRODUCTION A PROLOG  On peut alors "exécuter" le programme, en fait on fait une

INTRODUCTION A PROLOG

On peut alors "exécuter" le programme, en fait on fait une requête :

?- est_un_homme(omar).

Yes

?- est_un_homme(sarah).

No

?- est_un_homme(ali).

No

Prolog cherche à prouver que le but (goal) demandé est vrai. Pour cela, il analyse les règles, et considère comme faux tout ce qu'il n'a pas pu

prouver.

   

INTRODUCTION A PROLOG

Quand le but contient une variable libre, Prolog la liera à toutes les possibilités :

?- est_un_homme(X).

X=omar

X=yacine

(entrez ; pour demander la solution suivante)

?- est_le_pere_de(Pere,omar).

Pere=yacine

?- est_le_mari(Pere,Mere), est_le_pere_de(Pere,omar).

Pere=yacine, Mere=amal

On peut combiner les buts à l'aide des opérations logiques et (,), ou (;) et non (not). Le but défini ci-dessus nous permet de trouver la mère de yacine.

INTRODUCTION A PROLOG

 
         

Exemple02 : algorithme d’Euclide

 

Il s'agit du calcul du plus grand commun diviseur à deux nombres. Soit à calculer le pgcd d de deux nombres entiers x et y.

Algorithme :

1) si x et y sont égaux, d est égal à x

 

2) si x est plus petit que y, alors d est le pgcd de x et de y-x

 

3) si x est plus grand que y, intervertir x et y et calculer leur pgcd.

Exemples:

pgcd (8,8)

d=8

pgcd (12,16)

pgcd (12,4) pgcd (4,12)

pgcd (4,8)

pgcd (4,4)

d=4

pgcd (3,7)

pgcd (3,4)

pgcd (3,1)

pgcd (1,3)

pgcd (1,2)

pgcd (1,1)

d=1

INTRODUCTION A PROLOG  Etudions brièvement la traduction de cet algorithme en Prolog : 

INTRODUCTION A PROLOG

Etudions brièvement la traduction de cet algorithme en Prolog :

/* PGCD ceci est un commentaire */

pgcd(X,X,X).

pgcd(X,Y,D):- X<Y, Nouvel_y is Y-X,

pgcd(X,Nouvel_y,D).

pgcd(X,Y,D):-

X>Y,

pgcd(Y,X,D).

INTRODUCTION A PROLOG  Exemples d'invocation et résultats obtenus (en gras)  ?- pgcd(15,255,Pgcd). 

INTRODUCTION A PROLOG

Exemples d'invocation et résultats obtenus (en gras)

?- pgcd(15,255,Pgcd).

?- pgcd(15,255,15).

Pgcd = 15

yes

On constate que le programme PROLOG est très proche de l'algorithme. Mais bien sûr il s'agit d'un algorithme très simple.



INTRODUCTION A PROLOG

Exemple de programme :

Fatiha

Ahmed

 
 
 
 

Ali

Ali
 Ali Zina

Zina

Aicha

Sarah

 

Bachir



INTRODUCTION A PROLOG

Parent(X,Y): X est parent de Y

parent(fatiha,ali).

parent(ahmed,ali).

parent(ahmed,zina).

parent(ali,aicha).

parent(ali,sarah).

parent(sarah,bachir).

femelle(fatiha).

femelle(zina).

femelle(sarah).

male(ahmed).

male(ali).

male(bachir).

INTRODUCTION A PROLOG  Exécution:  ?- parent(ahmed,ali).  vrai  ?- parent(ahmed,aicha). 

INTRODUCTION A PROLOG

Exécution:

?- parent(ahmed,ali).

vrai

?- parent(ahmed,aicha).

faux

?- parent(X,sarah).

X = ali

?- parent(X,ali).

X = fatiha ;

X = ahmed;

   Exécution:  père(X,ali).  mère(X,Y) 
 Exécution:
père(X,ali).
mère(X,Y)

INTRODUCTION A PROLOG

Définition de nouveaux prédicats:

père(X,Y) :- parent(X,Y),male(X).

mère(X,Y) :- parent(X,Y),femelle(X).

frère(X,Y) :- parent(Z,X),parent(Z,Y),male(X).

soeur(X,Y) :- parent(Z,X),parent(Z,Y),femelle(X).

X = ahmed X = fatiha, Y = ali ; X = sarah, Y = bachir;

X = ahmed X = fatiha, Y = ali ; X = sarah, Y = bachir;