Vous êtes sur la page 1sur 34

C.U.

SOUK AHRAS

3eme Anne LMD Informatique

Chapitre 01 : Introduction

1. 1.1.

Prambules Systme expert Les experts d'un domaine ont pour caractristiques : d'tre rares, donc peu disponibles. d'tre comptents (si possible les meilleurs). d'tre souvent incapables d'expliquer leur dmarche. d'tre mortels. Les objectifs des systmes experts : rendre une expertise accessible tous. approcher au mieux la perfection. dcortiquer le raisonnement expert pour expliquer. rendre une connaissance experte insensible au temps.

En un mot, simuler le comportement d'un expert humain sans avoir les petits (et grands) dfauts de la nature humaine. D'une manire gnrale, un systme expert (SE) est un outil capable de reproduire les mcanismes cognitifs d'un expert, dans un domaine particulier, il s'agit de l'une des voies tentant d'aboutir l'intelligence artificielle. Plus prcisment, un systme expert est un logiciel capable de rpondre des questions, en effectuant un raisonnement partir de faits et de rgles connus. Il peut servir notamment comme outil d'aide la dcision. a) Structure gnrale d'un SE

Lors de la conception dun systme expert, on spare explicitement les connaissances spcifiques du domaine et les mcanismes dinterprtation. Pour simplifier, on peut structurer un systme expert de la manire suivante :

La base de faits: contient les informations concernant le problme particulier rsoudre. Cette base fournit les conditions initiales de rsolution, partir desquelles des connaissances pourront tre utilises. La base de rgles: rassemble lensemble des connaissances du domaine, exprimes sous une forme particulire.

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Le moteur dinfrence: simule le raisonnement de lexpert en enchanant les connaissances suivant une certaine logique. Il est en principe indpendant de la base et il est capable deffectuer des rapprochements entre les connaissances et le problme rsoudre.

Quand on lance le systme expert, le moteur dinfrence exploite la fois les faits et les connaissances et en tire de nouvelles informations grce au moteur dinfrence. Les faits de dpart, puis ceux rsultant des dductions produites par laction du moteur dinfrence sur la base de connaissances, viennent saccumuler dans la base de faits. Cette structure en trois parties est le principal avantage des systmes experts sur les programmes classiques. En effet, la base de connaissances peut tre dveloppe, modifie, agrandie sans quil ne soit ncessaire de modifier le moteur dinfrence. Expert

Acquisition du savoir

Base de Connaissance
Base de Faits Base de Rgles

Moteur d'infrenc es
Interface utilisateur

Utilisateur Les faits: Toute description d'une situation implique des entits lis par des relations.

Exemple: La relation est-un : est-un ( PHILOSOPHE, HOMME) La relation nationalit : nationalit ( J.P.SARTRE, FRANCAIS ) La relation mortel? : est-un ( x, HOMME) mortel? ( x, oui ) MOKDAD AROUS 2 Cours Programmation Logique

C.U. SOUK AHRAS Les rgles de production: Une rgle de production est compose d'une partie prmisse (SI): = condition logique que doivent vrifier des faits. d'une partie condition (ALORS): = actions oprer sur la base de faits. Les actions usuelles: ajouter, modifier, effacer des faits. Exemple : SI ET ET ET ET le site de la culture est le sang l'identit de l'organisme n'est pas connu avec certitude la coloration de l'organisme est GRAM ngatif la morphologie de l'organisme est btonnet le patient a t srieusement brl l'identit de l'organisme est Pseudomas (0.4)

3eme Anne LMD Informatique

ALORS b)

Stratgies de raisonnement:

Le moteur d'infrences est un mcanisme qui permet d'infrer des connaissances nouvelles partir de la base de connaissances du systme. On distingue essentiellement trois modes principaux de fonctionnement des moteurs d'infrences: le chanage avant le chanage arrire et le chanage mixte. La marche avant

Principe (dmarche dductive): Le mcanisme du chanage avant est trs simple: pour dduire un fait particulier, on dclenche les rgles dont les prmisses sont connues jusqu' ce que le fait dduire soit galement connu ou qu'aucune rgle ne soit plus dclenchable. Entre : une base de faits F, une base de rgles R Sortie : la base de faits F transforme Algorithme : rpter S = ensemble des rgles applicables de R si S alors a = choix d'une rgle de S application de la rgle choisie a marquer la rgle a finsi jusqu' S = (Une rgle applicable est une rgle : non marque et dont la prmisse est satisfaite) 3

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS La marche arrire

3eme Anne LMD Informatique

Principe (dmarche hypothtico-dductive): Le mcanisme de chanage arrire consiste partir du fait que l'on souhaite tablir, rechercher toutes les rgles qui concluent sur ce fait, tablir la liste des faits qu'il suffit de prouver pour qu'elles puissent se dclencher puis appliquer rcursivement le mme mcanisme aux faits contenus dans ces listes. Entre : une base de faits F, une base de rgles R, un ensemble P de faits prouver Sortie : la base de faits transforme F Algorithme : tantque P extraire (en l'effaant) de P un fait f si le fait f est absent de F alors S = ensemble des rgles concluant sur f si S alors a = choix d'une rgle de S prouver tous les faits en prmisse de a si a est applicable alors appliquer la rgle a finsi finsi finsi Fin du tant que (attention au problme du bouclage, donc de non
terminaison)

La marche mixte

L'algorithme de chanage mixte combine, comme son nom l'indique, les algorithmes de chanage avant et de chanage arrire. Son principe est le suivant: Entre: P ( dduire) Algorithme du chanage mixte Tant que P n'est pas dduit mais peut encore l'tre faire Saturer la base de faits par chanage avant (c'est--dire, dduire tout ce qui peut tre dduit) Chercher quels sont les faits encore ventuellement dductibles Dterminer une question pertinente a poser l'utilisateur et ajouter sa rponse la base de faits Fin du tant que

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS c) Types de moteurs d'infrence Moteur d'infrences d'ordre 0 - aucune notion de variable n'est autorise, - les seules actions autorises sont l'ajout et l'effacement de faits, - toute rgle applique est limine. exemple si et alors l'animal est un mammifre l'animal possde un pelage ray de noir et de blanc l'animal est un zbre.

3eme Anne LMD Informatique

Le fonctionnement du moteur d'infrences peut s'expliquer l'aide de la logique des propositions seule.

Moteur d'infrences d'ordre 0+

Moteur d'ordre 0 autoris modifier des faits (par exemple un compteur que l'on incrmente), et une rgle applique n'est pas ncessairement efface. Exemple si et alors la temprature est < 30C la consigne est 50 ajouter 2 la consigne.

Moteur d'infrences d'ordre 1 - notion de variable et d'appariement (unification), - une rgle applique reste toujours possiblement applicable.

Le fonctionnement du moteur s'explique avec la logique des prdicats :

Exemple si d) X est un homme alors X est mortel.

Conception des SE aujourd'hui Conception de A Z (programmation du moteur, etc) : de plus en plus rare Utilisation de gnrateurs de SE (moteurs d'infrences nus) : M1, OPS5, MP-LRO Usage de langages de programmation pour l'IA - Langages fonctionnels : LISP, ML, CAML - Langages logiques : PROLOG

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS e) Le langage PROLOG

3eme Anne LMD Informatique

Un langage idal pour construire rapidement des prototypes de SE. PROLOG en un exemple: Ecrire des faits: pre(pierre, michel) . pre(michel, paul) . Poser des questions (rduire des buts): ?- pre(X, Y). X = pierre Y = michel X = michel Y = paul ?- pre(michel, X). X = paul Ecrire des rgles: grand-pre(X, Z) :- pre(X, Y), pre(Y, Z) . ?- grand-pre(X, paul). X = pierre

1.2.

Paradigmes de programmation

La trs grande majorit des langages de programmation qui sont utiliss de nos jours se rpartissent selon 3 types de programmations : a) Programmation Imprative (Actionnelle): les oprations sont crites en termes de squences d'instruction. Le programme se droule en crasant les valeurs d'une zone mmoire par une nouvelle valeur. L'action de base dans la programmation imprative est l'affectation, c'est--dire la modification de la valeur associe une variable du programme. L'affectation va tre soit squence, soit choisie, soit itre selon les compositions dfinies par les algorithmes. Ce type de programmation est le plus pratiqu; c'est le plus proche du fonctionnement de la machine d'excution, o une mmoire change d'tat. Les langages de programmation bass sur ce principe sont les plus nombreux, et vont, historiquement, de l'assembleur Fortran, Algol, Pascal, C, Ada, etc. b) Programmation Fonctionnelle (Applicative): le calcul est considr en tant qu'valuation de fonctions mathmatiques. Dans la programmation applicative, l'action de base est le calcul d'une expression ou, plus prcisment, le calcul du rsultat d'une fonction pour des valeurs de ses arguments (on applique la fonction). Le grand anctre de cette classe de langage est Lisp dont sont issues de nombreuses variantes. 6

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Ces langages sont le plus souvent interprts, et ils sont utiliss de manire interactive, alors que les langages du type prcdent sont le plus souvent compils. Ils ont t trs utiliss en intelligence artificielle, mais on leur prfre maintenant la programmation logique ou la programmation par objets. Le langage fonctionnel le plus connu est ML dont il existe un standard SML. Ces langages sont peu utiliss pour le gnie logiciel, sans doute parce qu'ils ne sont pas trs efficaces et qu'ils n'offrent pas de vritable modularit. Ils sont surtout utiliss en milieu universitaire, des fins d'enseignement et de recherche, mais il y a des cas d'utilisation en milieu industriel des fins de prototypage. c) Programmation Dclarative (relationnelle): consiste crer des applications sur la base de composants logiciels indpendants du contexte et ne comportant aucun tat interne. La programmation dclarative est ainsi nomme car elle consiste noncer les proprit d'un systme de rsolution -programme- ( les dclarer) plutt qu' dcrire les opration effectuer comme dans le cas de la programmation imprative. Elle permet de sparer clairement les trois parties d'un logiciel:

Les connaissances sur le domaine d'application La formulation du problme rsoudre

Le mcanisme de rsolution du problme, gnral et indpendant des deux autres parties bien qu'oprant sur elles. Ce que l'on ne peut faire aussi nettement dans les autres modes de programmation. La programmation dclarative repose sur la logique. La programmation logique est base sur un principe trs diffrent des autres approches. Le but d'un programme logique est de permettre la rsolution d'une expression logique ou d'une conjonction de telles expressions. Par rsolution, on entend la recherche des valeurs des variables qui rendent l'expression vraie (les solutions). Il n'y a pas d'affectation. Des mcanismes d'unification sont mis en oeuvre. Le langage de programmation logique le plus connu est Prolog. Prolog est une forme de programmation dclarative. Son originalit est d'offrir un cadre homogne pour la description des connaissances ainsi que pour celle du problme rsoudre. Prolog inclus un moteur d'infrence d'ordre 1 permettant la rsolution du problme.

Paradigme Impratif (Actionnel) Fonctionnel (Applicatif) Dclaratif (relationnel)

Le programme est: Un ensemble d'actions squentielles Une fonction (composition) Un ensemble de rgles et de faits

L'excution consiste : Dclancher les actions et modifier l'tat de variables Evaluation de la fonction avec des paramtres effectifs Lancer une rsolution en tenant compte des rgles et de l'tat de la base de faits

Style: "fais a"

Langages Pascal, C, ADA, Fortran, LISP, ML, Caml, Prolog, SQL,..

"Evalue a"

"Que pense-tu de a?"

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS 2. La programmation logique

3eme Anne LMD Informatique

La programmation logique est une forme de programmation qui dfinit les applications l'aide d'un ensemble de faits lmentaires les concernant et de rgles de logique leur associant des consquences plus ou moins directes. Ces faits et ces rgles sont exploits par un dmonstrateur de thorme ou moteur d'infrence, en raction une question ou requte. Cette approche se rvle beaucoup plus souple que la dfinition d'une succession d'instructions que l'ordinateur excuterait. La programmation logique est considre comme une programmation dclarative plutt quimprative, car elle s'attache davantage au quoi qu'au comment, et elle est particulirement adapte aux besoins de lintelligence artificielle, dont elle est un des principaux outils. La programmation logique est le fruit des recherches menes par R. Kowalski et A. Colmerauer sur un sous ensemble de la logique des prdicats du premier ordre savoir les clauses de Horn. La programmation logique constitue un paradigme de programmation simple et dclaratif. Ce paradigme reflte une mthodologie de programmation parfaite, le fait qu'il distingue entre l'aspect logique et l'aspect contrle des programmes. Cette distinction n'est pas applique dans les autres styles de programmation. La principale diffrence entre les langages de programmation logique, tel que "Prolog", et les langages 'classiques', tel que "Pascal" est que : ces derniers sont de nature imprative : c--d il faut dcrire le problme rsoudre selon un algorithme, alors que les langages logiques, sont de nature dclarative, cela veut dire qu'il suffit d'indiquer au systme les donnes du problme traiter. Le moteur d'infrence qui permet de mettre en relation ces donnes, rend alors toutes les solutions. Ainsi avec cette nouvelle vision, on peut rsoudre des problmes complexes sans recourir des techniques algorithmiques. La programmation logique touche aujourd'hui des champs d'application trs varis tels que : 1 1- La conception de systmes experts dans le but de simuler l'expertise humaine. 2 2- La conception des SGBDR. 3 3- Le traitement du langage naturel. 4 4- L'enseignement assist par ordinateur 5 5- L'automatisme. 6 6- La lgislation. La souplesse de la programmation logique est assure grce aux concepts logiques qui utilisent une manire de spcification des informations dcrivant le problme rsoudre en se basant sur la logique du premier ordre. 3. Principales caractristiques de la Programmation Logique La programmation logique se base sur la syntaxe de logique de 1er ordre. Elle est considre comme une programmation dclarative plutt qu'imprative. Elle s'attache d'avantage au "quoi" qu'au "Comment". Elle rvle beaucoup plus soupe que la dfinition d'une succession d'instructions que l'ordinateur excuterait. La programmation interactive est une caractristique importante de la programmation logique: l'utilisateur peut crire un seul programme et peut l'interagir par moyen de requtes pour lesquelles des rponses sont produites. 8 Cours Programmation Logique

MOKDAD AROUS

C.U. SOUK AHRAS 4. 1

3eme Anne LMD Informatique

Elle est particulirement adapte aux besoins de l'intelligence artificielle, dont elle est un des principaux outils. Avantages et inconvnient de la Programmation Logique

Nous prsentons dans ces qui suit les principaux avantages de la programmation logique : 1- Simplicit : L'aspect dclaratif de la programmation logique offre une manire trs simple pour la rsolution des problmes. La tche du programmeur est rduite la description des connaissances et du problme rsoudre. 2- Puissance : La puissance de la programmation logique rside dans le fait d'utiliser le concept d'unification et de la rsolution pour infrer la solution du problme, partir des descriptions. 3- Procdures non directionnelles : Les procdures utilises dans la programmation logique sont diffrentes de celles utilises dans les langages conventionnels au sens o une procdure peut tre utilise pour rsoudre diffrentes types de problmes et cela selon l'instanciation de ses arguments. 1- Lenteur : La lenteur de la programmation logique est due essentiellement l'inadaptation du style logique vis vis du modle de Von-Neumann. Cela rpercute irrmdiablement sur le temps d'excution des programmes logiques. 2- Pauvret en reprsentation des donnes : La programmation logique n'est pas adapte la dfinition de nouveaux types de structures de donnes. Les structures existantes sont parfois inefficaces en comparaison avec des structures plus spcialises telle que les vecteurs par exemple.

2 3

Cependant la programmation logique connat quelques inconvnients : 1

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Chapitre 02 : Le Langage Prolog


Afin de voir l'application pratique des notions vues jusqu' maintenant, nous allons prsenter le langage Prolog, qui est le plus reprsentant des langages de programmation logique. 1. Prolog

Le nom Prolog est un acronyme de PROgrammation LOGique. Il a t cr par Alain Colmerauer et Philippe Roussel vers 1972. Le but tait de faire un langage de programmation qui permettait d'utiliser l'expressivit de la logique au lieu de dfinir pas pas la succession d'instructions que doit excuter un ordinateur. Prolog est utilis dans de nombreuses applications dintelligence artificielle, comme les systmes experts, l'analyse syntaxique du langage naturel, . Ses syntaxe et smantique sont considres comme trs simples et claires (le but original tait de procurer un outil pour les linguistes ignorant linformatique). Prolog est bas sur le calcul des prdicats du premier ordre. Cependant, il est restreint dans sa version initiale naccepter que les clauses de Horn (les versions modernes de Prolog acceptent des prdicats plus complexes). Lexcution dun programme Prolog est effectivement une application du thorme prouvant par rsolution du premier ordre. Prolog est un langage de programmation logique bas sur deux grands mcanismes: l'unification et le chanage arrire. L'unification est le fait d'essayer de rendre deux assertions identiques (un fait et une tte de rgle en gnral) en donnant des valeurs aux variables qu'elles contiennent. Le chanage arrire est le fait de partir du but recherch, de rechercher les rgles dont le but est la conclusion, puis, en prenant les conditions de ces rgles comme nouveaux sous buts, recommencer la recherche rcursivement. Ensuite, il ne reste plus qu' unifier les faits trouvs avec le but recherch.

L'unification est une opration de base dans un programme logique. Pour pouvoir appliquer la rgle de rsolution deux clauses, il est ncessaire de savoir si deux ou plusieurs formules atomiques peuvent tre unifies, i.e. s'il existe une substitution des variables de ces formules par des termes du langage qui permettent de les rendre gales. L'unification reprsente le processus par lequel tout langage logique met en correspondance un atome avec un fait, o la tte d'une rgle pour vrifier le but propos. L'algorithme utilis pour appliquer ce processus s'appelle algorithme d'unification. Exemple : 1 2 i) f(X1, X1) et f(a,b) ne sont pas unifiables. ii) f(X1, X2) et f(a,X3) sont unifiable avec l'unificateur = {X1/a, X2/X3}.

MOKDAD AROUS

11

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Prolog repose sur l'utilisation de la logique du premier ordre dans la rsolution des problmes. Un programme Prolog comporte une base de faits et un ensemble de rgles. La logique du premier ordre

Un prdicat est une proprit ou une relation. Un argument (de prdicat) est objet sur lequel porte un prdicat. Exemple : heureux (walid). Aime (walid, lalogique). Une clause est une phrase de systme exprimant que des conditions entranant des conclusions. Exemple : si Ali aime la logique, alors il est heureux ou fatigu Une clause de Horn est une clause constitue dune conclusion, ce sont les clauses manipules par Prolog. Exemple : si Ali aime la logique, alors il est heureux heureux(ali) :- aime (ali, lalogique). si Ali aime la logique, alors il est fatigu fatigue (ali) :- aime (ali, lalogique). Ce qui intresse un programmeur, est de rsoudre le problme pos d'une manire efficace. Dans ce style de programmation, la rsolution est une mthode de dmonstration automatique qui utilise un systme de dduction pour les formules du premier ordre qui sont sous forme de clauses. L'application de cette mthode ncessite pralablement, soit d'exprimer le problme directement sous forme de clauses, soit de transformer un ensemble de formules de premier ordre en un ensemble de clauses. L'algorithme d'unification permet ensuite d'appliquer la rgle de rsolution cet ensemble de clauses. Base de faits :

Les faits sont des clauses, qui expriment des connaissances qui sont inconditionnellement vraies. Exemple : les clauses suivantes constituent une base de faits exprimant des connaissances ariennes entre villes : liaison (alger, oran). liaison (oran, ghardaya). liaison (ghardaya, tamanraset). Base de Rgles:

Les rgles permettant de dfinir, sous forme de clauses compltes, de nouveaux concepts partir de faits ou de concepts prexistants. L'emploi des rgles est particulirement conomique en place mmoire. Exemple :
lien(Ville_depart, Ville_arriv) :-

MOKDAD AROUS

11

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

liaison(Ville_depart, Ville_inter), liaison(Ville_inter, Ville_arriv).

Questions :

La base des faits et l'ensemble des rgles constituent un programme dont on peut demander l'excution en posant des questions. Exemple : La question : ?- liaison (alger, oran). est une question, qui aura la rponse "Vrai". La rponse la question ?- liaison (oran, X). consiste trouver la valeur de X, qui rend le fait liaison(oran, X) vrai. L'inconnue X, sera lie (ou instancie) une constante (ghardaya). La rsolution en Prolog, revient explorer la base de faits afin de rpondre la question pose. 2. Syntaxe et terminologie Prolog

Un programme Prolog est constitu d'un ensemble de clauses, une clause est une affirmation portant sur des atomes logiques, un atome logique exprime une relation entre des termes, les termes sont les objets de l'univers. Dans cette section, on va successivement dfinir ce qu'est un terme, un atome logique, une clause et un programme Prolog. 2.1. Les termes Les objets manipuls par un programme Prolog (les "donnes" du programme) sont appels des termes. On distingue trois sortes de termes:

Les variables: reprsentent des objets inconnus de l'univers. Syntaxiquement, une variable est une chane alpha-numrique commenant par une majuscule (par exemple: Var, X, Var_longue_2) ou par un sous-lign (par exemple: _objet, _21). La variable anonyme est note "_'' et reprsente un objet dont on ne souhaite pas connatre la valeur. Attention: Une variable Prolog s'apparente plus une variable mathmatique qu' une variable informatique. Elle reprsente toujours le mme objet (inconnu) tout au long de sa dure de vie et ne peut pas changer de valeur.

Les termes lmentaires (ou termes atomiques): reprsentent les objets simples connus de l'univers. On distingue trois sortes de termes lmentaires:
o o

Les nombres: peuvent tres des entiers (34, -45, +12) ou des rels (-34.14, 0.987, -0.4e+2). Les identificateurs (parfois appels atomes): un identificateur est une chane alphanumrique commenant par une minuscule (par exemple: toto, aX12, jean_Paul_2), Les chanes de caractres entre guillemets (par exemple: "Toto est \#\{@", "123").

Les termes composs: reprsentent les objets composs (structurs) de l'univers. Syntaxiquement, un terme compos est de la forme: 12 Cours Programmation Logique

MOKDAD AROUS

C.U. SOUK AHRAS foncteur(t1 , ... , tn)

3eme Anne LMD Informatique

o foncteur est une chane alpha-numrique commenant par une minuscule, et t1, ..., tn sont des termes (variables, termes lmentaires ou termes composs). Le nombre d'arguments n est appel arit du terme. Par exemple adresse(18,"rue des lilas",Ville) est un terme compos de foncteur adresse et d'arit 3, dont les deux premiers arguments sont les termes lmentaires 18 et "rue des lilas" et le troisime argument est la variable Ville. De mme, cons(a,cons(X,nil)) est un terme compos de foncteur cons et d'arit 2, dont le premier argument est le terme lmentaire a et le deuxime argument le terme compos cons(X,nil). 2.2. Les relations (atomes logiques) Un atome logique exprime une relation entre des termes, cette relation peut tre vraie ou fausse. Syntaxiquement, un atome logique est de la forme: symbole-de-prdicat(t1, ... , tn ) o symbole-de-prdicat est une chane alpha-numrique commenant par une minuscule, et t1, ..., tn sont des termes. Le nombre d'arguments n est appel arit de l'atome logique. Exemple: pere(toto,paul) est une relation d'arit 2 entre les termes lmentaires toto et paul pouvant tre interprte par "toto est le pre de paul''. De mme, habite(X,adresse(12,"rue r",nice)) est une relation d'arit 2 entre la variable X et le terme compos adresse(12,"rue r",nice) pouvant tre interprte par "une personne inconnue X habite l'adresse (12,"rue r",nice)''. 2.3. Les clauses Une clause est une affirmation inconditionnelle (un fait) ou conditionnelle (une rgle). Un programme Prolog comporte des faits et des rgles.

Un fait est de la forme: A. o A est un atome logique, et signifie que la relation dfinie par A est vraie (sans condition). Par exemple, le fait pere(toto,paul). indique que la relation "toto est le pre de paul" est vraie. Une variable dans un fait est quantifie universellement. Par exemple, le fait egal(X,X).

MOKDAD AROUS

13

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

indique que la relation "X est gal X '' est vraie pour toute valeur (tout terme) que X peut prendre.

Les rgles expriment des relations conditionnelles entre les objets (clauses de Horn). Une rgle est de la forme: A0 :- A1 , ... , An. o A0, A1 , ... , An sont des atomes logiques. Une telle rgle signifie que la relation A0 est vraie si les atomes logiques A1, A2 ... et An sont vraies. A0 est appel tte de clause et A1, ... , An est appel corps (ou aussi Queue) de clause. La tte de la rgle exprime la consquence, la queue exprime une conjonction de conditions (ET implicite). Autrement dit une rgle : Tte :- Queue. peut se lire : "Pour que Tte soit vrifie il faut que les diffrentes conditions de Queue soient vrifies". Une variable apparaissant dans la tte d'une rgle (et ventuellement dans son corps) est quantifie universellement. Une variable apparaissant dans le corps d'une clause mais pas dans sa tte est quantifie existentiellement. Par exemple, la clause meme_pere(X,Y) :- pere(P,X), pere(P,Y). se lit: "pour tout X et pour tout Y, meme_pere(X,Y) est vrai s'il existe P tel que pere(P,X) et pere(P,Y) soient vrais''. Dans le corps d'une rgle, la virgule "," est le symbole reprsentant un "ET" logique : la conjonction de buts. Le symbole ";" reprsente le "OU" logique: le disjonction de buts. Par exemple : A :- B ; C . Est quivalente : A :-B. A :-C.

2.4. Les programmes Prolog Un programme Prolog est constitu d'une suite de clauses regroupes en paquets. Chaque paquet dfinit un prdicat et est constitu d'un ensemble de clauses dont l'atome de tte a le mme symbole de prdicat et la mme arit. Intuitivement, deux clauses d'un mme paquet sont lies par un ou logique. Par exemple, le prdicat personne dfini par les deux clauses: personne(X) :- homme(X). personne(X) :- femme(X). se lit "pour tout X, personne(X) est vrai si homme(X) est vrai ou femme(X) est vrai''. Beaucoup de Prolog demandent que toutes les rgles et tous les faits d'un mme prdicat soient contigus et groups ensemble dans le fichier du programme. On note un prdicat par son nom et son arit, par exemple: homme/1, femme/1, personne/1, pere/2. 2.5. Excution de programmes Prolog "Excuter" un programme Prolog consiste poser une question l'interprte Prolog. Une question (but ou activant) est une suite d'atomes logiques spars par des virgules (entre aprs linvite ?- ). La rponse de Prolog est "Yes'' si la question est une consquence logique du programme, ou "No'' si la question n'est pas une consquence logique du programme. ?- pere(toto,paul). MOKDAD AROUS 14 Cours Programmation Logique

C.U. SOUK AHRAS Yes ?- pere(toto,sara). No

3eme Anne LMD Informatique

Une question peut comporter des variables quantifies existentiellement. La rponse de Prolog est alors l'ensemble des valeurs des variables pour lesquelles la question est une consquence logique du programme. Par exemple, la question: ?- pere(toto,X). se lit "est-ce qu'il existe un X tels que pere(toto,X) soit vrais''. La rponse de Prolog est l'ensemble des valeurs de X qui vrifient cette relation (l'ensemble des enfants de toto, si toto est effectivement un pre), s'il n'existe pas aucune rponse Prolog affiche "No". Sinon, aprs chaque rponse l'utilisateur appuie sur ";" pour que l'interprteur affiche la rponse suivante, ou sur "entre" pour que l'interprteur termine l'excution. Les questions peuvent tre elles-mmes des conjonctions : ?- pere(toto,X), pere(X,Y). se lit "est-ce qu'il existe X et Y tels que pere(toto,X) et pere(X,Y) soient vrais''. Autrement dit, la rponse de Prolog cette question devrait tre l'ensemble des enfants et petits-enfants de toto. si toto est effectivement grand-pre. La variable "_" est appele la variable anonyme, elle indique Prolog que l'on ne s'intresse pas la valeur de cette variable, par exemple la requte ?- homme(_). Demande juste s'il existe un homme, peut importe son nom. 2.6. Mcanisme utilis pour rpondre une question (approche informelle) Prolog tente de faire correspondre la question avec les faits disponibles. Si un fait s'accorde avec la question alors les variables de la question prennent les valeurs ncessaires. On dit que l'on unifie la question avec le fait et que les variables sont instancies. Cette instanciation se fait par construction d'une substitution qui est un ensemble des couples (variable, valeur), gnralement reprsent sous la forme {Var1 = Val1, ..., Varn = Valn}. Dfinition : Une Substitution est une liste de couples (v,t) tels que le premier lment est une variable et le second un terme Prolog contenant ventuellement des variables. Dfinition : Instancier un prdicat P avec une substitution (on note P ), c'est remplacer dans P toutes les occurrences d'une variables de par son expression associe dans . Dfinition : Deux prdicat P et Q sont unifiables si on peut trouver une substitution telle que: P = Q. Exemple: Question Q: Fait F: pere(toto,X) pere(toto,paul)

Q et F sont unifiables par la substitution ={X=paul}. en instanciant Q par , c'est--dire en remplaant dans Q les variables par leurs valeurs dans la substitution , on obtient: Q = pere(toto,X){X = paul} = pere(toto,paul) = F Exemple : Soit P1 = aime(jean, A) et P2 = aime(B, laLogique). MOKDAD AROUS 15 Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

La substitution = {A = laLogique, B = jean} permet d'unifier P1 et P2.

MOKDAD AROUS

16

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

3.

Les Oprateurs en Prolog

Le langage Prolog considre les oprateurs comme des foncteurs et transforme les expressions en termes, par exemple: 2*3+4*2 est un terme identique : +(*(2,3),*(4,2))). 3.1. Rgles de prcdence et d'associativit Les oprateurs sont dfinis par leurs priorits et leurs associativits. L'associativit dtermine le parenthsage d'une expression: A op B op C : Si elle est gauche, on a : (A op B) op C Si elle est droite, on a : A op (B op C) Sinon elle est non associative, les parenthses sont obligatoires, et la syntaxe A op B op C est interdite. En tout cas, lemploi de parenthses permet de prciser lordre de lvaluation. Mais, en labsence de celles-ci, une expression comme 4 + 5 * 5 possde deux valuations possibles. Il faut donc prciser : - la prsance des oprateurs ; - lassociativit. La prsance se dfinit habituellement par un ordre de priorit. Habituellement, les oprateurs binaires * et / ont une priorit plus forte que + et - (mais attention loprateur unitaire + et aura une plus forte priorit que * et / ). Lassociativit permet de dire si lexpression 16/4/2 doit tre value comme (16/4)/2 (associatif gauche) ou comme 16/(4/2) (associatif droite). 3.2. Oprateurs logiques d'unification Le symbole = en Prolog signifie l'unification et pas l'affectation, le symbole = dans "X=Y" signifie "X s'unifie avec Y ". Exemple : ?- a(b,X,c)=a(b,Y,c). X = Y L'oprateur: \= dans " x\=Y" signifie " X ne s'unifie pas avec Y " Exemple : ?- a(b,X,c)\= a(b,Y,c). No 3.3. Oprateurs arithmtiques

Une expression arithmtique est un terme fait de nombre et de foncteurs ou oprations reprsentant des fonctions arithmtiques. Les principaux oprateurs sont: +, - , * , / (division relle), // (division entire) et mod (modulo: reste de la division).
Evaluer un terme reprsentant une expression arithmtique revient appliquer les oprateurs, ceci se fait par le prdicat prdfini is/2. Pour affecter une valeur numrique une variable, en valuant mathmatiquement le rsultat, il faut utiliser is . 17

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS Exemples : ?- M=1+1, N is 1+1. M = 1+1 N = 2 ; No ?- N is 1+1, M is N+3, P = N+M. N = 2 M = 5 P = 2+5 ; No ?- X is 1+1+a. ?- X is 1+1+Z. ?- 5 is (3*7+1)//4. Yes

3eme Anne LMD Informatique

% erreur car a n'est pas un nombre % erreur car Z n'est pas instancie

Les oprateurs suivants permettent de manipuler les expression arithmtiques : 1. Expr1 =:= Expr2 russit si les valeurs des deux expressions sont gales. Par exemple 2*3=:=1+5 russit mais: 2*3=:=5 choue. Il ne faut pas confondre ce prdicat avec le prdicat dunification . Par exemple 2*3=6 choue parce que les deux termes ne sont pas unifiables. Le terme 2*3 est un terme compos (en fait il correspond au terme *(2,3)) alors que 6 est un entier. 2. Exprl =\= Expr2 3. Exprl < Expr2 4. Exprl =< Expr2 5. Exprl > Expr2 6. Exprl >= Expr2 russit si les valeurs des deux expressions sont diffrentes. russit si la valeur de Exprl est strictement infrieure celle de Expr2. russit si la valeur de Exprl est infrieure ou gale celle de Expr2. russit si la valeur de Exprl est strictement suprieure celle de Expr2. russit si la valeur de Exprl est suprieure ou gale celle de Expr2.

Pour chacun de ces prdicats, si une des deux expressions nest pas valuable parce quelle contient des variables non instancies, Prolog retourne un message d'erreur. La requte X=:=3 produit un message derreur, alors que la requte X=3 , X=:=1+2 russit. Dans lexpression : ?- 1 + 2 < 3 + 4. Il y a valuation des 2 additions (celle de gauche puis celle de droite) avant dvaluer la comparaison. Il est important de distinguer les oprateurs numriques des oprateurs littraux, ainsi que dunification. Exemples ?- 1 + 2 =:= 2 + 1. Yes

MOKDAD AROUS

18

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

?- 1 + 2 = 2 + 1. No ?- 1 + 2 = 1 + 2. Yes ?- 1 + X = 1 + 2. X=2. ?- 1 + X =:= 1 + 2. somme(X,Y,S) :- S is X+Y. % X nest pas instancie

Exemple : Comment exprimer qu'on veut calculer la somme de deux nombres ? Exemple : Soient 2 entiers positifs X et Y, leur plus grand diviseur commun D, peut tre calcul en considrant 3 cas : 1. Si X et Y sont gaux alors D est gal X 2. Si X < Y alors D est gal au plus grand diviseur commun de X et de la diffrence X - Y 3. Si Y < X alors faire la mme chose que dans le cas 2 avec X et Y interchangs gcd(X,Y,D) est dfini par le programme prolog suivant:
gcd(X,X,X). gcd(X,Y,D) : X < Y, Y1 i s Y X, gcd(X,Y1,D) . gcd(X,Y,D) : Y < X, X1 i s X Y, gcd(X1,Y,D) . 3.4. Oprateurs littrales 1. 2. T1 == T2 T1 \== T2 russit si T1 est identique T2 (terme terme) russit si T1 nest pas identique T2

MOKDAD AROUS

19

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

L'oprateur == permet une comparaison littrale (terme terme), mais cette dernire nest pas restreinte aux constantes. Ainsi, dans le cas dune comparaison entre variables, la syntaxe de ces dernires constitue llment de comparaison (et non plus la valeur comme dans le cas dune constante). Ainsi, cette fonction prend comme valeur Yes si les deux termes sont identiques, No dans le cas contraire.

Exemples:
?- "1 + 2" == "1 + 2". Yes ?- 1 + 2 == 2 + 1. No ?- 1 + a == 1 + a. Yes ?- 1 + a \== a + 1. Yes ?- a(b,X,c) == a(b,Y,c). No ?- a(b,X,c) == a(b,X,c). Yes ? - A \== "hello". Yes ?- a(b,X,c) \== a(b,Y,c). Yes 3.5. Entres / Sorties Il existe quelques actions prdfinies comme: write() qui est applicable une constante, une variable ou une chane de caractres entre guillemets simples, read() qui permet la lecture partir de clavier, et nl pour passage la ligne. Par exemple : ?- write('bonjour'),nl,write('toi'). bonjour toi Yes MOKDAD AROUS 21 Cours Programmation Logique % A nest pas dj instancie

C.U. SOUK AHRAS

3eme Anne LMD Informatique

?- X is 2, write(X). 2 X = 2 ; No ?- write('Donner la valeur de N'), nl, write('N='), read(N). Donner la valeur de N N=20. N = 20 yes En Prolog, on ne dfinit pas de fonction ou de procdures mais des prdicats ( valeur dans {0,1}), ventuellement avec 0 argument. Donc :

Pour faire l'quivalent d'une procdure, on dit qu'un certain prdicat est vrai condition qu'un certain nombre d'actions soient faites, par exemple : affiche :- write('bonjour').

Pour dfinir une fonction f(X1,...,Xn)=Y, on dfinit un prdicat P(X1,X2,...,Xn,Y) qui est vrai si f(X1,...,Xn)=Y, par exemple : a_pour_successeur(X,Y) :- Y is X+1.

4.

Smantique des programmes Prolog

4.1. Dfinitions prliminaires : o Substitution

Une substitution (note ) est une fonction de l'ensemble des variables dans l'ensemble des termes. Par exemple : ={X=Y,Z=f(a,Y)} est la substitution qui "remplace'' X par Y, Z par f(a,Y), et laisse inchange toute autre variable que X et Z. Par extension, une substitution peut tre applique un atome logique. Par exemple : (p(X,f(Y,Z))) = p((X),f((Y), (Z))) = p(Y,f(Y,f(a,Y))) o Instance : Une instance d'un atome logique A est le rsultat (A) de l'application d'une substitution sur A. Par exemple : pere(toto,paul) est une instance de pere(toto,X). o Unificateur : Un unificateur de deux atomes logiques A1 et A2 est une substitution telle que (A1)=(A2). Par exemple : soit A1=p(X,f(X,Y)), et soit A2=p(a,Z), = { X = a, Z = f(a,Y) } est un unificateur de A1 et A2 car (A1)=(A2)=p(a,f(a,Y)). MOKDAD AROUS 21 Cours Programmation Logique

C.U. SOUK AHRAS o Unificateur plus gnral :

3eme Anne LMD Informatique

Un unificateur de deux atomes logiques A1 et A2 est le plus gnral (upg) si pour tout autre unificateur ' de A1 et A2, il existe une autre substitution '' telle que '=''(). Par exemple : ={X=Y} est un upg de p(X,b) et p(Y,b), tandis que: '={X=a,Y=a} n'est pas un upg de p(X,b) et p(Y,b). 4.2. Dnotation d'un programme Prolog La dnotation d'un programme Prolog P est l'ensemble des atomes logiques qui sont des consquences logiques de P. Ainsi, la rponse de Prolog une question est l'ensemble des instances de cette question qui font partie de la dnotation. Cet ensemble peut tre "calcul" par une approche ascendante, dite en "chanage avant" : on part des faits, et on applique itrativement toutes les rgles conditionnelles pour dduire de nouvelles relations ..., jusqu' ce qu'on ait tout dduit. Exemple: Considrons le programme Prolog P suivant: parent(paul,jean). parent(jean,anne). parent(anne,marie). homme(paul). homme(jean). pere(X,Y) :- parent(X,Y), homme(X). grand_pere(X,Y) :- pere(X,Z), parent(Z,Y). L'ensemble des relations vraies sans condition dans P est E_0 : E_0 = { parent(paul,jean), parent(jean,anne), parent(anne,marie), homme(paul), homme(jean) } partir de E_0 et P, on dduit l'ensemble des nouvelles relations vraies E_1: E_1 = { pere(paul,jean), pere(jean,anne) } partir de E_0, E_1 et P, on dduit l'ensemble des nouvelles relations vraies E_2: E_2 = { grand_pere(paul,anne), grand_pere(jean,marie) } partir de E_0, E_1, E_2 et P , on ne peut plus rien dduire de nouveau.

MOKDAD AROUS

22

Cours Programmation Logique

C.U. SOUK AHRAS L'union de E_0 , E_1 et E_2 constitue la dnotation de P.

3eme Anne LMD Informatique

Malheureusement, la dnotation d'un programme est souvent un ensemble infini et n'est donc pas calculable de faon finie. Exemple: Considrons le programme Prolog P suivant: plus(0,X,X). plus(succ(X),Y,succ(Z)) :- plus(X,Y,Z). L'ensemble des atomes logiques vrais sans condition dans P est : E_0 = { plus(0,X,X) } partir de E_0 et P, on dduit E_1 = { plus(succ(0),X,succ(X)) } partir de E_0, E_1 et P, on dduit E_2 = { plus(succ(succ(0)),X,succ(succ(X))) } partir de E_0, E_1, E_2 et P , on dduit E_3 = { plus(succ(succ(succ(0))),X,succ(succ(succ(X)))) } etc ..., dans cet exemple la dnotation du programme est un ensemble infini.

4.3. Signification oprationnelle D'une faon gnrale, on ne peut pas calculer l'ensemble des consquences logiques d'un programme par l'approche ascendante: ce calcul serait trop coteux, voire infini. En revanche, on peut dmontrer qu'un but (compos d'une suite d'atomes logiques) est une consquence logique du programme, en utilisant une approche descendante, dite en chanage arrire. La smantique de Prolog est donc base sur une approche descendante de calcul : le chanage arrire (backward chaining). Pour prouver un but compos d'une suite d'atomes logiques (But = [A_1, A_2, ..., A_n]), l'interprte Prolog commence par prouver le premier de ces atomes logiques (A_1). Pour cela, il cherche une clause dans le programme dont l'atome de tte s'unifie avec le premier atome logique prouver (par exemple, la clause : A'_0 :- A'_1, A'_2, ..,A'_r. telle que upg(A_1,A'_0)=). Puis l'interprte Prolog remplace le premier atome logique prouver (A_1) dans le but par les atomes logiques du corps de la clause, en leur appliquant la substitution (). Le nouveau but prouver devient : But = [(A'_1), (A'_2), ..., (A'_r), (A_2), .., (A_n)] L'interprte Prolog recommence alors ce processus, jusqu' ce que le but prouver soit vide, c'est dire jusqu' ce qu'il n'y ait plus rien prouver. A ce moment, l'interprte Prolog a prouv le but initial ; si le but MOKDAD AROUS 23 Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

initial comportait des variables, il affiche la valeur de ces variables obtenue en leur appliquant les substitutions successivement utilises pour la preuve. Il existe gnralement plusieurs clauses dans le programme Prolog dont l'atome de tte s'unifie avec l'atome logique prouver. Ainsi, l'interprte Prolog va successivement rpter ce processus de preuve pour chacune des clauses candidates. Par consquent, l'interprte Prolog peut trouver plusieurs rponses un but. Ce processus de preuve en chanage arrire est rsum par la fonction prouver(But) suivante. Cette fonction affiche l'ensemble des instances de But qui font partie de la dnotation du programme:

fonction prouver(But: liste d'atomes logiques ) si But = [] alors le but initial est prouv afficher les valeurs des variables du but initial sinon soit But = [A_1, A_2, .., A_n] pour toute clause (A'_0 :- A'_1, A'_2, ..,A'_r) du programme: (o les variables ont t renommes)
<- upg(A_1 ,A'_0)

si echec alors
prouver([(A'_1), (A'_2),.. (A'_r), (A_2),.. (A_n)])

finsi finpour finsi fin prouver Quand on pose une question l'interprte Prolog, celui-ci excute dynamiquement l'algorithme prcdent. L'arbre constitu de l'ensemble des appels rcursifs la procdure prouver(But) est appel Arbre de Recherche. Prolog va chercher effacer tous les termes du but (rsolvant), il essaie par drivation successives d'obtenir une rsolvante vide, s'il y arrive alors il y a succs et la substitution obtenue donne les conditions de la succs. S'il n' y parvient pas il y a alors chec. Remarques

la stratgie de recherche n'est pas complte, dans la mesure o l'on peut avoir une suite infinie d'appels rcursifs, la stratgie de recherche dpend d'une part de l'ordre de dfinition des clauses dans un paquet (si plusieurs clauses peuvent tre utilises pour prouver un atome logique, on considre les clauses 24 Cours Programmation Logique

MOKDAD AROUS

C.U. SOUK AHRAS

3eme Anne LMD Informatique

selon leur ordre d'apparition dans le paquet), et d'autre part de l'ordre des atomes logiques dans le corps d'une clause (on prouve les atomes logiques selon leur ordre d'apparition dans la clause). Exemple 01: Prenons lexemple du calcul de la multiplication dun entier naturel X par un entier Y par additions successives (Multiplication Egyptienne). mlt(X,Y,R):-Y<0 , Y1 is -Y, mlt(X,Y1,R1),R is R1. mlt(_,0,0). mlt(X,1,X). /* r1 */ /* r2: 0 est lment absorbant de la multiplication*/ /* r3: 1 est lment neutre de la multiplication*/ /* r4 */

mlt(X,Y,R):- Y1 is Y-1, Y1>0, mlt(X,Y1,R1), R is R1+X.

Puisque la fonction prouver(But) est rcursif, la mme rgle peut tre utilise plusieurs fois dans la rsolution. Afin dviter toute confusion sur les variables telles que X, Y et R qui pourraient tre apparatre plusieurs fois, nous effectueront des renommage du type _iX, _iY et _iR. Ce renommage est effectu en interne par le moteur de rsolution de Prolog. Soit la requte suivante: ?- mlt(10,2,A). Le but prouver: But=[mlt(10,2,A)] tentative dunification avec r1 russie avec: 1 = { _1X=10, _1Y= 2, _1R=A }, on obtient: But =[-2<0, _1Y1 is --2, mlt(10,_1Y1,_1R1), A is -_1R1] 2<0 et _1Y1 is --2 sliminent (prouvs avec succs), et produisent: 2 = {_1Y1=2}. But =[mlt(10,2,_1R1), A is _1R1] tentative dunification avec r1 russie avec: 3 = {_2X = 10, _2Y = 2, _2R = _1R1} But =[2<0, _2Y1 is -2, mlt(10,_2Y1, _2R1), _1R1 is - _2R1, A is _1R1] backtrack (retour arrire) car 2<0 est faux. But =[mlt(10, 2, _R1), A is _1R1] tentative dunification avec r2 choue : 2 nest pas nul tentative dunification avec r3 choue : 2 nest pas gal 1 tentative dunification avec r4 russie avec : 3 = {_3X=10, _3Y=2, _3R= _1R1 } But =[_3Y1 is 2-1,_3Y1>0, mlt(10,_3Y1,_3R1),_1R1 is _3R1+10, A is -1R1] MOKDAD AROUS 25 Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

limination des deux premires clauses avec la substitution: 4 = {_3Y1 = 1}, donc: But =[mlt(10,1,_3R1), _1R1 is _3R1+10, A is -_1R1] tentative d'unification avec r1 russie avec: 5 = {_4X=10, _4Y=1, _4R=_3R1}, But =[ 1<0, _4Y1 is -1, mlt(10,_4Y1,_4R1), _4R1 is -_3R1, _1R1 is _3R1+10, A is -_1R1] backtrack car 1<0 est faux. But =[mlt(10,1,2_3R1),_1R1 is _3R1+10,A is -1R1] tentative d'unification avec r2 choue : 2 n'est pas nul tentative dunification avec r3 russie avec: 6 = {_3R1 = 10} But =[ _1R1 is 1O+10, A is _1R1] limination des deux derniers termes avec: 7 = {_1R1 = 20, A = 20}. On obtient finalement un but vide But =[]. Le but initiale donc russite, et la rponse de l'interprte Prolog cette question est donc Yes avec l'affichage de valeur de la variable A = -20. Exemple 02: Prenons le programme Prolog suivant : s(a). s(b). r(a,b). r(b,c). r(c,b). Soit la question suivante: ?- p(A,B). Larbre de rsolution de ce but: p(A,B) est le suivant : p(X,Y) :- q(X),r(X,Y). q(X) :- t(X). q(X) :- s(X).

MOKDAD AROUS

26

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

MOKDAD AROUS

27

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

5.

Les Listes

La liste est un terme compos particulier de symbole de fonction " . " et d'arit 2: le premier argument est l'lment de tte de la liste, et le deuxime argument est la queue de la liste. La liste vide est note: []. Notations: Le foncteur . est le foncteur de liste : .(a,.(b,[])) est quivalent : [ a , b ] .

la liste: .(X,L) est galement note: [X|L], la liste: .(X1,.(X2, L)) est galement note: [X1, X2|L], la liste: .(X1,.(X2, ...,.(Xn,L)... )) est galement note: [X1,X2,...,Xn|L], La liste vide est: [].

Par exemple, la liste: [a,b,c] correspond la liste: .(a,.(b,.(c,[]))) et contient les 3 lments: a , b et c. La liste: [a,b|L] correspond la liste .(a,.(b,L)) et contient les 2 lments: a et b, suivis de la liste (inconnue): L. L'oprateur | est un constructeur de liste et peut servir pour extraire la tte de la liste. Exemples ?- L = .(a,.(b,.(c,[]))). L = [a, b, c] ; No ?- [a|[b,c]] = L. L = [a, b, c] ; No ?- [a,b|[c]]=[a,b,c|[]]. Yes ?- [a,b|X]=[a,b,c|[]]. X = [c] ; No ?-[a,b]=[X|Y]. X = a Y = [b]; No ?-[a]=[X|Y]. X = a Y = []; No MOKDAD AROUS 28 Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

?-[a,[b]]=[X|Y]. X = a Y = [[b]]; No ?-[a,b,c,d]=[X,Y|Z]. X = a Y = b Z = [c, d]; No ?-[[a,b,c],d,e]=[X|Y]. X = [a, b, c] Y = [d, e]; No Une liste est une structure rcursive: la liste liste=[X|L] est compose d'un lment de tte X et d'une queue de liste L qui est elle-mme une liste. Par consquent, les relations Prolog qui "manipulent'' les listes seront gnralement dfinies par:

une ou plusieurs clauses rcursives, dfinissant la relation sur la liste [X|L] en fonction de la relation sur la queue de liste L, une ou plusieurs clauses non rcursives assurant la terminaison de la manipulation, et dfinissant la relation pour une liste particulire (par exemple, la liste vide, ou la liste dont l'lment de tte vrifie une certaine condition... etc.).

Dans la suit de cette section, nous prenons quelques exemples de prdicats de manipulation de listes (ces prdicats sont prdfinis dans Prolog et on peut les utiliser directement). 5.1. Prdicat member/2 Ce prdicat permet d'examiner l'appartenance d'un lment une liste. Premire faon d'crire ce prdicat: member(X,[Tete|Queue]) :- X = Tete. member(X,[Tete|Queue]) :- X \= Tete, member(X,Queue). Mais puisque les rgles dans Prolog sont excutes dans l'ordre qu'elles sont crites, on peut simplifier la dfinition du prdicat comme suit : member(X,[X|_]). member(X,[_|Queue]) :- member(X,Queue). Exemples ?- member(a,[b,c,a]). Yes ?- member(a,[c,d]). No 29

MOKDAD AROUS

Cours Programmation Logique

C.U. SOUK AHRAS ?- member(X,[a,b,c]). X = a; X = b; X = C; No 5.2. Prdicat append/3

3eme Anne LMD Informatique

Le prdicat append/3 permet de concatner deux listes (ou de vrifier qu'une liste est la concatnation de deux premires). append([],L,L). append([x|XS],YS,[x|Liste]):- append(XS,YS,Liste). Exemples ?- append([a,b,c],[d,e,f],[a,b,c,d,e,f]). Yes ?- append([a,b],[c,d],[e,f]). No ?- append([a,b],[c,d],L). L = [a,b,c,d]; No ?- append(L,[c,d],[a,b,c,d]). L = [a,b]; No ?- append(L1,L2,[a,b,c]). L1 = [] ,L2 =[a,b,c]; L1 = [a],L2 =[b,c]; etc., avec toutes les combinaisons. 5.3. Prdicat length/2 Ce prdicat permet de dtermine la longueur dune liste: length([] ,O). length([Tete | Queue] ,N) :- length(Queue,N1), N is N1 + 1. Exemples ?- length([a,b,c] ,3). Yes ?- length([a,[a,b],c], N). N= 3; No

MOKDAD AROUS

31

Cours Programmation Logique

C.U. SOUK AHRAS 6. Oprateur de Coupure

3eme Anne LMD Informatique

Par dfaut Prolog tente de prouver la requte de toutes les faons possibles (suivant le programme) jusqu ce quune preuve soit trouve, Si une preuve choue, Prolog fait un retourarrire pour tenter une autre ligne de preuve. Dans certains cas ce retour-arrire peut tre nuisible: 1. si le retour-arrire va rpter une solution. 2. si le retour-arrire na aucune chance de trouver une solution.
Exemple:

Soit la fonction "membre" qui vrifie quun lment est bien dans une liste. Premire solution :
membre1(X,[Y|L]) :- X = Y. membre1(X,[Y|L]) :- X \= Y, membre1(X,L).

Deuxime solution :
membre2(X,[X|_]). membre2(X,[_|L]) :- membre2(X,L).

Lide ici, cest que le cas dgalit a t trait avec la premire rgle et que lon na pas en tenir compte lors de lcriture de la deuxime rgle.
valuation du travail effectu

valuation avec le prdicat membre1.

valuation avec le prdicat membre2.

Conclusions

MOKDAD AROUS

31

Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Lcriture du programme a de grosses consquences sur son excution. Seule la premire occurrence de X dans L nous intressait ici. Nous aurions aim pouvoir spcifier que le programme devait sarrter ds la premire occurrence trouve.

5.1. Signification oprationnelle de la coupure La coupure, aussi appele "cut", est note " ! ". La coupure est un prdicat sans signification logique (la coupure n'est ni vraie ni fausse), utilise pour "couper" des branches de l'arbre de recherche. La coupure est toujours "prouve" avec succs . La "preuve" de la coupure a pour effet de modifier l'arbre de recherche: elle coupe l'ensemble des branches en attente cres depuis l'appel de la clause qui a introduit la coupure. l'oprateur de la coupure sert donc restreindre larbre de recherche en empchant le dveloppement de branches qui conduisent des checs ou des solutions que lon na pas besoin de connatre Principe : tete(...) :- pr1(...), pr2(...), !, pr3(...), pr4(...).

Si pr1 ne russit pas, on peut tenter de dmontrer tete avec une autre clause Si pr2 ne russit pas, on peut annuler l'unification de pr1 et tenter de dmontrer pr1 ou tete avec d'autres clauses Si pr1 et pr2 russissent, on franchit la coupure (qui russit toujours) et les unifications de pr1 et pr2 ne peuvent tre modifies (par contre si pr4 ne russit pas, on peut revenir sur pr3).
Exemple : Considrons l'exemple suivant qui concerne ma constitution du plat principale d'un repas, nous avons les clauses lies aux plats et celles lies aux viandes et aux poisons : poisson(truite). poisson(daurade). viande(steak). viande(escalope). plat(P) :- poisson(P). plat(V) :- viande(V). Dessinons larbre de rsolution de la question plat (P) , viande (P). qui fournit en rponse tons les plats qui sont de la viande. MOKDAD AROUS 32 Cours Programmation Logique

C.U. SOUK AHRAS

3eme Anne LMD Informatique

Dessinons l'arbre de rsolution de la question plat(P), viande(P), ! . qui fournit en rponse le premier plat qui est de la viande.

Dessinons l'arbre de rsolution de la question plat (P), ! ,viande(P). qui ne fournit aucune rponse.

Comme nous l'avons vu ci-dessus, le cut permet donc d'affiner une question. Exemple : ?- repas(E,P,D) ,poisson(P). /* quels sont les repas comprenant du poisson? */ MOKDAD AROUS 33 Cours Programmation Logique

C.U. SOUK AHRAS ?- poisson(P) ,repas(E,P,D). /* idem */

3eme Anne LMD Informatique

?- repas (E, P , D), ! , poisson(P). /* le premier repas de la base comprend-il du poisson? */ ?- poisson(P), ,repas(E,P,D) . /* construire un repas avec le premier poisson de la base */ ?- repas(E,P,D) ,poisson(P), ! . /* quel est le premier repas contenant du poisson? / ?- poisson(P) ,repas(E,P,D), ! . /* idem $/

?- ! ,repas(E,P,D) ,poisson(P). /* idem sans cut */ Exemple : Dans la recherche dappartenance dun lment une liste, la coupure permet darrter le programme lors de la dcouverte de la premire solution possible. membre(X,[X|_]) :- !. membre(X,[_|L]) :- membre(X,L). 5.2. Les applications de la coupure

Recherche de la premire solution Exprimer le dterminisme La ngation Le "si-alors-sinon" si-alors-sinon(C, P, Q) :- C, !, P. si-alors-sinon(C, P, Q) :- Q.

MOKDAD AROUS

34

Cours Programmation Logique