Upload
noemie-simonin
View
107
Download
0
Embed Size (px)
Citation preview
Programmation Logique 2002
Programmation en LogiqueFI 3 - 2002
Cours Narendra Jussien TP Romuald Debruyne / Narendra Jussien
Programmation Logique NJ - 2002 - 2/127
Organisation du module
Enseignement Cours/TD 50% TP sur machine 50%
Langage support PROLOG Évaluations
Micro-évaluation (TD noté) Contrôle continu (envoi du code à chaque fin de TP) TP noté en fin de module
Programmation Logique 2002
Introduction
Programmation Logique NJ - 2002 - 4/127
Classes de langage
séquencement des calculs spécifié– contrôle total du flot d’exécution
objets du langage diversifiés– syntaxe riche (lourde :-))
exemples : Pascal, C, C+, C++, Java, …
Langages impératifs
Langages fonctionnels tout est fonction
– syntaxe dépouillée– base mathématique forte : -calcul
contrôle délégué à l’interprète– utilisation intensive de la récursivité
exemples : Lisp, Scheme, Haskell, …
Programmation Logique NJ - 2002 - 5/127
Une nouvelle classe
PROgrammation en LOGique tout est logique
– syntaxe simple et dépouillée– base théorique : calcul des prédicats
encore plus de contrôle donné à la machine– récursion– non déterminisme
exemple : Prolog
Programmation Logique NJ - 2002 - 6/127
Historique
1930 Calcul des prédicats (J. Herbrand) 1965 Principe de résolution (J. A. Robinson) 1970 Utiliser la logique comme langage de
programmationclauses de Horn R. KowalskiQ-systèmes A. Colmerauer
1972 Premier interprète PROLOG (A. Colmerauer et P. Roussel) Université d’Aix-Marseille
1977 Premier compilateur PROLOG (D. H. D. Warren) Université d’Édimbourg
1980 Projet japonais de 5e génération
1990 PROLOG évolue vers la Programmation par Contraintes
Programmation Logique NJ - 2002 - 7/127
Plan du cours
Bases théoriques (rappels de logique formelle) Calcul propositionnel Calcul des prédicats
Le langage PROLOG
PROLOG avancé
Programmation Logique NJ - 2002 - 8/127
En TP, vous apprendrez à ...
Utiliser PROLOG (premières séances)
Réaliser un système expert complet
Résoudre automatiquement des énigmes logiques exprimées en langage naturel
Programmation Logique 2002
Rappels de Logique
1. Calcul propositionnel2. Calcul des prédicats
Programmation Logique NJ - 2002 - 10/127
1. Calcul propositionnel
Comment écrire les formules ? Aspects syntaxiques
Comment déterminer la valeur de vérité d’une formule ? Aspects sémantiques
Comment démontrer de nouveaux résultats ? Aspects déductifs
Programmation Logique NJ - 2002 - 11/127
Syntaxe d’une formule
Données un ensemble P de variables propositionnelles
P = { p, q, r, … } énoncés élémentaires
un ensemble C de connecteursC = { , , , , }
Formules p est une formule si p P (H) est une formule si H est une formule (H) (K) est une formule si H et K sont des formules
et si C Règles de suppression des parenthèses
Calcul propositionnel
Programmation Logique NJ - 2002 - 12/127
Sémantique d’une formule
Logique bi-valuée faux (0) vrai (1)
Notion d’interprétation donner une valeur de vérité à une variable
extension à un opérateur extension à une formule
Calcul propositionnel
1,0)( p
Programmation Logique NJ - 2002 - 13/127
Tables de vérité : opérateurs
10
0 00 1
0 1 1 1
1 10 1
1 00 1
p p 0 1
0 101
0 10 1
0 101
0 101
Calcul propositionnel
Programmation Logique NJ - 2002 - 14/127
Formules particulières
Tautologies : formules toujours vraies La table de vérité ne contient que des 1 exemple : p p
p ( p) (p p) 0 1
10
11
0 1 1 1
0 10 1
Calcul propositionnel
Programmation Logique NJ - 2002 - 15/127
? )()( qpqp
p q ¬ p ¬ q p q ¬ ( p q ) (¬ p ¬ q) F
0 00 11 01 1
1100
1010
0 00 1
0 101
0 1110
0 1 1 1
0 10 1
1001
11
1 00 1
0 101
11110
Calcul propositionnel
Programmation Logique NJ - 2002 - 16/127
Catégories de formules
Tautologies : formules toujours vraies
Formules inconsistantes formules toujours fausses la table de vérité ne contient que des 0 exemple : p p
Formules consistantes formules non toujours fausses
1)(, F
Calcul propositionnel
Programmation Logique NJ - 2002 - 17/127
Formules particulières
Formules tautologiquement équivalentes les tables de vérité sont les mêmes
Condition nécessaire et suffisante :
(F) (H) est une tautologie (F) (H)
)()(, HF
Calcul propositionnel
Programmation Logique NJ - 2002 - 18/127
lois de De Morgan Propriétés de et associativité distributivité (dans les 2 sens) éléments neutres (0 pour et 1 pour ) éléments absorbants (1 pour et 0 pour )
Quelques équivalences utiles
)()( FGGFGF tauto GFGF tauto
FGGF tauto
1tautoFF
FF tauto
FGGF tauto
0tautoFF
GFGF
GFGF
tauto
tauto
)(
)(
Calcul propositionnel
Programmation Logique NJ - 2002 - 19/127
Formes normales
But avoir une représentation uniforme des formules du calcul propositionnel limiter le nombre de connecteurs différents utilisés limiter l’allure des formules rencontrées
Calcul propositionnel
Programmation Logique NJ - 2002 - 20/127
Formes normales
Une formule F est dite sous forme normale disjonctive ssi F est une disjonction de conjonctions de variables propositionnelles et de leur négation
Toute formule du calcul propositionnel est tautologiquement équivalente à une formule sous forme normale disjonctive
Une formule F est dite sous forme normale conjonctive ssi F est une conjonction de disjonctions de variables propositionnelles et de leur négation
Toute formule du calcul propositionnel est tautologiquement équivalente à une formule sous forme normale conjonctive
Calcul propositionnel
Programmation Logique 2002
Aspects déductifs
notion de conséquence logique notion de démonstration notion de règles de déduction
Calcul propositionnel
Programmation Logique NJ - 2002 - 22/127
Conséquence logique
Soit A = {F1, …, Fn} un ensemble de n formules
A G ssi (F1 … Fn) G
Notion de réfutation démonstration par l’absurde
A G ssi F1 … Fn G est inconsistante
Calcul propositionnel
Programmation Logique NJ - 2002 - 23/127
Système formel
Données un ensemble V de symboles un ensemble F de formules (F V*) un ensemble A d’axiomes (A F) un ensemble fini de règles de déduction
Une démonstration dans un système formel S est une suite d’énoncés A1, … An telle que : pour tout i, Ai est un axiome de S ou une conséquence
des énoncés précédents par application d’une des règles de déduction
Un théorème de S est le dernier énoncé d’une démonstration
Calcul propositionnel
Programmation Logique NJ - 2002 - 24/127
Énoncé déductible
Soit J un ensemble de formules Un énoncé A est dit déductible sous les
hypothèses J (noté J A) ssi il existe une suite finie A1, …, An d’énoncés telle que
– An = A
– pour tout i Ai est un axiome
ou Ai J ou Ai découle d’énoncés précédents par application
d’une règle d’inférence
Calcul propositionnel
Programmation Logique NJ - 2002 - 25/127
Quelques règles de déduction classiques
modus ponens p, p q q
modus tollens p q, q p
syllogisme p q, q r p r
Calcul propositionnel
Programmation Logique NJ - 2002 - 26/127
Propriétés d’un système formel
Un système formel est correct ssi
si A alors A
tout ce qui est démontrable est vrai
Un système formel est complet ssi
si A alors A
tout ce qui est vrai est démontrable
Calcul propositionnel
Programmation Logique NJ - 2002 - 27/127
Principe de résolution (Robinson) Définitions
– littéral positif ou négatif– une clause est une disjonction de littéraux
– la résolvante de C1 = l C’1 et de C2 = l C’2 est
C’1 C’2
Principe de résolution
l C’1 , l C’2 réso C’1 C’2
– le principe de résolution est valide– le principe de résolution généralise les autres règles
Une autre règle d’inférence
Calcul propositionnel
Programmation Logique NJ - 2002 - 28/127
Validité du principe de résolution
Il faut montrer que :
l C’1 , l C’2 C’1 C’2
ie (l C’1) ( l C’2 ) (C’1 C’2 )
Il suffit de montrer que si (l C’1) ( l C’2 ) vrai alors (C’1 C’2 ) n’est pas faux
Deux cas se présentent l est vrai
– nécessairement C’2 vrai et donc (C’1 C’2 ) aussi
l est vrai– nécessairement C’1 vrai et donc (C’1 C’2 ) aussi
0 00 1
0 101
0 1 1 1
0 10 1
1 10 1
0 101
Calcul propositionnel
Programmation Logique NJ - 2002 - 29/127
Propriétés du calcul propositionnel
Le calcul propositionnel muni du principe de résolution est correct et complet
Un ensemble S de clauses est insatisfaisable ssi
S reso �
Démonstration : par l’absurde (réfutation)
S C ssi S {C} reso �On peut toujours se ramener à une forme
normale conjonctive (forme clausale)Rappel
Calcul propositionnel
Programmation Logique NJ - 2002 - 30/127
Ce qu’il faut retenir
Intérêt d’une forme normale
Conséquence logique vs démonstration
Principe de résolution
Preuve par réfutation
Calcul propositionnel
Programmation Logique NJ - 2002 - 31/127
2. Calcul des prédicats
Comment écrire les formules ? Aspects syntaxiques
Comment déterminer la valeur de vérité d’une formule ? Aspects sémantiques
Comment démontrer de nouveaux résultats ? Aspects déductifs
Programmation Logique NJ - 2002 - 32/127
Limites du calcul propositionnel
Modéliser
Les chandelles sont faites pour éclairer Quelques chandelles éclairent très mal Quelques objets qui sont faits pour éclairer le font très
mal
Calcul des prédicats
Programmation Logique NJ - 2002 - 33/127
Une modélisation
Les chandelles sont faites pour éclairer
Quelques chandelles éclairent très mal
Quelques objets qui sont faits pour éclairer le font très mal
)()(, xéclaireMalxchandellex
)()(, xéclairexchandellex
)()(, xéclaireMalxéclairex
Calcul des prédicats
Programmation Logique NJ - 2002 - 34/127
Syntaxe
des connecteurs (, , , et )
des quantificateurs ( et )
des variables (x,y, …)
des relations (prédicats) (R, S, éclaire, …)
des symboles de fonctions (f, g, …) les fonctions d’arité 0 sont appelées des constantes
Calcul des prédicats
Programmation Logique NJ - 2002 - 35/127
Vocabulaire
Les termes les variables et les constantes sont des termes f(t1, …, tn) est un terme si
– les ti sont des termes
– f est un symbole de fonction d’arité n
Les atomes R(t1, …, tn) est un atome si
– les ti sont des termes
– R est un symbole de relation d’arité n
Calcul des prédicats
Programmation Logique NJ - 2002 - 36/127
Formules
Un atome est une formule Si F et G sont des formules et x une variable,
alors les expressions suivantes sont des formules
(F) (F) (G) et (F) (G) (F) (G) et (F) (G) x (F) et x (G)
Calcul des prédicats
Programmation Logique NJ - 2002 - 37/127
Occurrence d’une variable
Une occurrence d’une variable x dans une formule F est un endroit où x apparaît dans F sans être immédiatement précédée par ou
Une occurrence libre de x dans F est définie :
Calcul des prédicats
Programmation Logique NJ - 2002 - 38/127
Occurrence libre
Si F est un atome, toutes les occurrences de x sont libres
Si F = (G), les occurrences libres de x sont celles de G
Si F = (G) (H), les occurrences libres de x sont celles de G et celles de H
Si F = y(G) ou F = y(H) avec x distinct de y, les occurrences libres de x sont celles de G et celles de H
Si F = x(G) ou F = x(H), aucune occurrence de x dans F n ’est libre
Calcul des prédicats
Programmation Logique NJ - 2002 - 39/127
Caractéristiques des variables
Une variable est dite libre dans une formule F si elle a au moins une occurrence libre (sinon on dit qu’elle est liée)
Une formule n’ayant pas de variable libre est dite close
Calcul des prédicats
Programmation Logique 2002
Aspects sémantiques
Formules universellement valides Le théorème de Herbrand Principe de résolution adapté au calcul des prédicats
Calcul des prédicats
Programmation Logique NJ - 2002 - 41/127
Vers la notion de modèle
Soit L le langage du calcul des prédicats une interprétation de L c’est la donnée de :
– un ensemble E non vide appelé ensemble de base– pour chaque symbole de prédicat R d’arité n, d’un sous-
ensemble R’ de En
– pour chaque symbole de fonction f d’arité n, d’une application f’ de En vers E (y compris pour les constantes)
on peut alors calculer la valeur de tout terme clos (c’est un élément de E)
on peut donc associer une valeur de vérité à tout atome et donc par extension à toute formule close
Calcul des prédicats
Programmation Logique NJ - 2002 - 42/127
Exemple d’interprétation
xyz (P(x,y) Q(y,z) R(x,z)) xy ( (M(x,y) P(x,y) Q(x,y)) M(a,b) P(c,b) P(d,a) P(e,c)
E =
P’ =
a’ = anne b’ = bernard c’ = charles d’ = didier e’= éric
est le père deM’ = est la mère de Q’ = est un parent deR’ = est le grand-père de
{ anne, bernard, …}
Calcul des prédicats
Programmation Logique NJ - 2002 - 43/127
Modèle
Soit M une interprétation de L soit F une formule close. M est un modèle de F ssi la
valeur de vérité de F dans M est 1M F
soit F(x1, …, xk) une formule quelconque– F est dite universellement valide ssi
x1…xk F(x1, …, xk)est satisfaite dans toutes les interprétations de L
– F est dite insatisfaisable ssi il existe une interprétation pour laquelle
x1…xk F(x1, …, xk) est satisfaite
Calcul des prédicats
Programmation Logique NJ - 2002 - 44/127
Preuve et démonstration
Comment prouver une formule du calcul des prédicats ?
Prouver qu’elle est vraie– passer en revue toutes les interprétations !
Prouver qu’elle est fausse– trouver une interprétation qui invalide la formule
Calcul des prédicats
Programmation Logique NJ - 2002 - 45/127
Toutes les interprétations ?
Une représentation utile des formules forme clausale
Un théorème qui simplifie la vie théorème de Herbrand
Principe de résolution pour le calcul des prédicats vers une automatisation des démonstrations
Calcul des prédicats
Programmation Logique NJ - 2002 - 46/127
Transformation de formule
Forme normale prénexe quantificateurs en tête de la formule formule sous forme normale conjonctive
Forme standard de Skolem formule sous forme normale prénexe quantificateurs existentiels précédant quantificateurs
universels
Tout formule du calcul des prédicats est équivalente à une formule sous forme standard de Skolem
Calcul des prédicats
Programmation Logique NJ - 2002 - 47/127
Mise sous forme prénexe
Éliminer les connecteurs et
Transporter les devant les atomes en utilisant ( F F) et les lois de De Morgan
Transporter les quantificateurs en tête de la formule
Ne pas hésiter à renommer les variables
Calcul des prédicats
Programmation Logique NJ - 2002 - 48/127
Transport des quantificateurs
FxFx
Fx Fx
HFxHxFx
HFxHxFx
FxyFyx
FxyFyx
si H ne contient aucune occurrence de x
HFxHFx
HFxHFx
HHx
HHx
Calcul des prédicats
Programmation Logique NJ - 2002 - 49/127
Inversion de et de Skolemisation
Lorsqu’on a
on remplace y par une fonction g qui à x associe y
yxfyx )(
)()( xgxfxg
Skolemisation = expliciter l’implicite
Calcul des prédicats
Programmation Logique NJ - 2002 - 50/127
Une représentation utile des formulesForme clausale
On part de la forme standard de Skolem
On utilise les clauses avec : les variables quantifiées universellement conservées les fonctions de Skolem conservées les variables quantifiées existentiellement remplacées
par des constantes les variables renommées d’une clause à l’autre
),,(),( xyzqyxpzyx
),,(;),( 211 ayzqyap
Calcul des prédicats
Programmation Logique NJ - 2002 - 51/127
Univers de Herbrand
Soit S un ensemble de clauses Soit H0 l’ensemble des symboles de constantes ayant
au moins une occurrence dans S. On pose :
pour fn fonction d’arité n de S et tj éléments de Hi-1
H= limi Hi est appelé univers de Herbrand
On appelle instance de base d’une clause C toute clause obtenue en remplaçant les variables de C par des éléments de H
),,( 11 nnii ttfHH
Calcul des prédicats
Programmation Logique NJ - 2002 - 52/127
Théorème de Herbrand
Théorème Un ensemble S de clauses est insatisfaisable si et seulement si il existe un ensemble S’ d’instances de base insatisfaisable
Corollaire Un ensemble de clauses est satisfaisable si et seulement si tout ensemble fini d’instances de base est satisfaisable
Calcul des prédicats
Programmation Logique NJ - 2002 - 53/127
A quoi ça sert ? Validation de raisonnement
On cherche à valider le raisonnement suivant
Un dragon est heureux si tous ses enfants peuvent voler Les dragons verts peuvent voler Un dragon est vert s’il a au moins un parent vert ou rose Donc les dragons verts sont heureux
Calcul des prédicats
Programmation Logique NJ - 2002 - 54/127
Résolution du problème
Démarche générale Modéliser le problème (les prémisses et la conclusion) Démonstration par l’absurde, on montre que
P1 P2 P3 C est insatisfaisable– mettre la formule sous forme clausale– utiliser le théorème de Herbrand
Notations h(x) : x est heureux p(x,y) : x est parent de y vo(x) : x vole (peut voler) ve(x) : x est vert r(x) : x est rose
Calcul des prédicats
Programmation Logique NJ - 2002 - 55/127
Résolution du problème (suite)
P1 un dragon est heureux si tous ses enfants peuvent voler
P2 les dragons verts peuvent voler
P3 un dragon est vert s’il a au moins un parent vert ou rose
C les dragons verts sont heureux
les A sont BA B
)()(, xhxvex
)()(, xvoxvex
h(x)x (y, p(x,y)vo(y))
)()()(),(,, xveyryvexypyx
)()(, xvoxvex
)()(),(,, xhyvoyxpyx )()(),(,, xhyvoyxpyx )()(),(,, xhyvoyxpyx )()(),(,, xhyvoyxpyx )()()(),(,, xhyvoxhyxpyx )())(()())(,(,, xhxfvoxhxfxpxf
)()()(),(,, xveyryvexypyx )()()(),(,, xveyryvexypyx )()(),()(),(,, xveyrxypyvexypyx )()(),()()(),(,, xveyrxypxveyvexypyx
)()(, xhxvex négation
)()(, xhxvex )()(, xhxvex
Calcul des prédicats
Programmation Logique NJ - 2002 - 56/127
Forme clausale
)())(()())(,(,, xhxfvoxhxfxpxf )()(, xvoxvex
)()(),()()(),(,, xveyrxypxveyvexypyx
)()(, xhxvex
)())(,( 111 xhxfxp )())(( 22 xhxfvo
)()( 33 xvoxve )()(),( 4141 xveyvexyp
)()(),( 5252 xveyrxyp )(ave )(ah
Calcul des prédicats
Programmation Logique NJ - 2002 - 57/127
Validation du raisonnement
Univers de Herbrand H0 = {a} H1= {a, f(a)} H = {a, …, fn(a)}
Trouver un ensemble d’instances de base insatisfaisable intuition 1 : partir de la conclusion et essayer d’arriver
à une contradiction par déduction intuition 2 : utiliser le principe de résolution
Calcul des prédicats
Programmation Logique NJ - 2002 - 58/127
)())(,( 111 xhxfxp
Mise en œuvre
)())(( 22 xhxfvo
)()( 33 xvoxve )()(),( 4141 xveyvexyp
)()(),( 5252 xveyrxyp )(ave )(ah
)(ah ))(()( afvoah ax 2
))(())(( afveafvo )(3 afx
))(()())(,( 11 afveyveafyp
)(4 afx
))(,()( afapah ))(()())(,( afveaveafap 111 xyax
)(ave)(ah
)(3 afx
))(())(( afveafvo
ax 2
)())(( ahafvo
)(ah clause vide
Calcul des prédicats
Programmation Logique NJ - 2002 - 59/127
Résolution
On a un ensemble d’instances de base insatisfaisable
La formule P1 P2 P3 C est donc insatisfaisable Le raisonnement est donc valide
)(ah
))(()( afvoah
))(())(( afveafvo
))(,()( afapah ))(()())(,( afveaveafap
)(ave
)(ah
Calcul des prédicats
Programmation Logique NJ - 2002 - 60/127
unificateur axxy 111
Analysons un peu les choses
L’opération d’appariement de deux atomes s’appelle l’unification
Algorithme d’unification (vu plus tard) On peut donc appliquer le principe de
résolution sans problème
))(()())(,( 11 afveyveafyp
)())(,( 111 xhxfxp
Calcul des prédicats
Programmation Logique NJ - 2002 - 61/127
Propriétés du calcul des prédicats
Le calcul des prédicats muni du principe de résolution et de l’unification est complet toute formule close est vraie ou fausse
MAIS le calcul des prédicats est indécidable Il n’existe pas d’algorithme permettant de décider à
tout coup si une formule close est vraie ou fausse
En PROLOG, nous nous limiterons donc à un sous-ensemble du calcul des prédicats non restrictif en pratique
Calcul des prédicats
Programmation Logique NJ - 2002 - 62/127
Programmer en logique ?
Un petit exemple xyz (pere(x,y)parent(y,z) grand-pere(x,z) xy ((mere(x,y) pere(x,y)) parent(x,y) mere(a,b) pere(c,b) pere(d,a) pere(e,c)
Forme clausale pere(x1, y1) parent(y1, z1) grand-pere(x1,z1)
mere(x2, y2) parent(x2, y2)
pere(x3, y3) parent(x3, y3) mere(a,b) pere(c,b) pere(d,a) pere(e,c)
On veut prouver x, grand-pere(x,b) négation sous forme clausale : grand-pere(x,b)
Calcul des prédicats
Programmation Logique NJ - 2002 - 63/127
Programmer en logique ?
On part de grand-pere(x,b) si x = x1 et z1=b unification avec
pere(x1, y1) parent(y1, z1) grand-pere(x1,z1)
on obtient pere(x, y1) parent(y1, b)
si y3 = b et y1=x3 unification avec pere(x3, y3) parent(x3, y3)
on obtient pere(x, x3) pere(x3, b)
si x3 = c unification avec pere(c,b) on obtient pere(x, c) si x=e unification avec pere(e,c) on obtient QED
Calcul des prédicats
Programmation Logique NJ - 2002 - 64/127
Programmer en logique ?
On a réussi à prouver x, grand-pere(x,b)
On a réussi à calculer un x
Unification = calcul on donne des valeurs aux variables
Calcul = programmation on va pouvoir programmer avec la logique !!! on automatise complètement le processus PROLOG est un démonstrateur de théorème
Calcul des prédicats
Programmation Logique 2002
Le langage PROLOG
1. Premiers pas2. Arithmétique3. Listes4. Le contrôle PROLOG5. Termes structurés6. Méta-interprétation de PROLOG
Programmation Logique NJ - 2002 - 66/127
1. Premiers pas en Prolog
On se limite aux clauses de Horn au plus un littéral positif
– un seul littéral (positif) : fait– un littéral positif et au moins un littéral négatif : règle– pas de littéral positif : requête
Elles permettent de forcer le retour dans la base pour continuer la
démonstration de limiter le choix par clause
Le langage
Programmation Logique NJ - 2002 - 67/127
Univers PROLOG
L’univers PROLOG est une base de connaissances décrivant l’état du monde à l’aide de relations (prédicats) portant sur des entités (termes)
Un prédicat particulier (=) correspond à l’unification
Le langage
Programmation Logique NJ - 2002 - 68/127
Syntaxe de PROLOG
Considérons l’énoncé Socrate est un homme Tout homme est mortel Socrate est-il mortel ?
Calcul des prédicats Prolog
x, homme(x) homme(socrate).
x, homme(x) mortel(x) mortel(X) :- homme(X).
?- mortel(socrate).
Le langage
Programmation Logique NJ - 2002 - 69/127
La famille
masculin(tom). % tom est de sexe masculinmasculin(tim).masculin(bob).masculin(jim). % «paquet» de clauses
feminin(pam).feminin(liz).feminin(ann).feminin(pat).
enfant(bob,pam).enfant(bob,tom).enfant(liz,tom).enfant(ann,bob).enfant(pat,bob).enfant(tim,liz).enfant(jim,pat).
Le langage
Programmation Logique NJ - 2002 - 70/127
Premières requêtesmasculin(tom). masculin(tim).masculin(bob).masculin(jim).
feminin(pam).feminin(liz).feminin(ann).feminin(pat).
enfant(bob,pam).enfant(bob,tom).enfant(liz,tom).enfant(ann,bob).enfant(pat,bob).enfant(tim,liz).enfant(jim,pat).
Est-ce que pat est un enfant de bob ?
?- enfant(pat,bob).
Quels sont les enfants de tom ?
?- enfant(X,tom).
X = bob ;
Yes
X = liz ;
No
Le langage
Programmation Logique NJ - 2002 - 71/127
Lien avec le calcul des prédicats
Règles PROLOGa :- b,c,d.
Règles LOGIQUEa b c d
Requête PROLOG?- q.
Requête LOGIQUE q
UnificationFaire correspondre requête et tête de règle
Programmation Logique NJ - 2002 - 72/127
Écriture de prédicats
• Qui est le père de bob ?
?- enfant(bob,X), masculin(X).
masculin(tom). masculin(tim).masculin(bob).masculin(jim).
feminin(pam).feminin(liz).feminin(ann).feminin(pat).
enfant(bob,pam).enfant(bob,tom).enfant(liz,tom).enfant(ann,bob).enfant(pat,bob).enfant(tim,liz).enfant(jim,pat).
X=pam
échecretour
X=tom
X=tom
• Plus généralementpere(X,Y) :-
enfant(Y,X),masculin(X).
• Écrire le prédicat mere/2
Le langage
Programmation Logique NJ - 2002 - 73/127
À chacun son tour
Écrire les prédicats correspondant aux relations grand-pere/2 frere/2 tante/2 cousin/2
Le langage
Programmation Logique NJ - 2002 - 74/127
PROLOG
PROLOG est un langage déclaratif
on spécifie les propriétés du résultat du programme et non pas le processus pour arriver à ce résultat (aspect opérationnel)
Intérêts facilité de compréhension facilité d’écriture
Le langage
Programmation Logique NJ - 2002 - 75/127
Retour sur le retour arrière
Considérons la requête ?- frere(bob,liz).
masculin(tom). masculin(tim).masculin(bob).masculin(jim).
feminin(pam).feminin(liz).feminin(ann).feminin(pat).
enfant(bob,pam).enfant(bob,tom).enfant(liz,tom).enfant(ann,bob).enfant(pat,bob).enfant(tim,liz).enfant(jim,pat).
frere(X,Y) :- masculin(X), enfant(X,Z), enfant(Y,Z).
X = bob, Y = liz
Z=pam
échec
Yes
Z = tomretour
Le mécanisme de retour-arrière (backtrack) assure la complétude de la recherche
Demander une nouvelle solution revient à provoquer un échec fictif pour forcer le backtrack
Le langage
Programmation Logique NJ - 2002 - 76/127
Quelques propriétés
la recherche réalisée par PROLOG est une recherche en profondeur d’abord
on peut obtenir plusieurs solutions pour une même requête on appelle cela le non-déterminisme de PROLOG
un prédicat peut servir à autre chose que ce pour quoi il a été écrit on appelle cela la réversibilité de PROLOG
les seuls résultats possibles : yes ou no pas de fonction, les réponses sont obtenues par
unification uniquement
Le langage
Programmation Logique NJ - 2002 - 77/127
Récursivité
Écrire le prédicat ascendant/2
ascendant(X,Y) :- enfant(Y,X).
ascendant(X,Z) :- enfant(Z,Y), ascendant(X,Y).
Condition d’arrêten premier
Information discriminanteen premier
Le langage
Programmation Logique NJ - 2002 - 78/127
PROLOG = logique ?
Soit une relation binaire r. Comparer : récursion droite
fermeture(X,Y) :- r(X,Y).fermeture(X,Z) :- r(X,Y), fermeture(Y,Z).
récursion gauchefermeture(X,Y) :- r(X,Y).fermeture(X,Z) :- fermeture(Y,Z), r(X,Y).
Attention à la procédure de recherche !!! Règle de sélection du but
– le plus à gauche Règle de sélection de la clause
– la première
Le langage
Programmation Logique NJ - 2002 - 79/127
2. Arithmétique
Les opérateurs usuels existent : +, , /, mod attention il s’agit de symboles de fonctions !!!
?- X = 1 + 2.
X= 1+2 +(1,2)
• Un opérateur spécial is
?- X is 1 + 2.
X = 3
• L’argument de droite doit être complètement instancié à l’appel?- X is 1 + Y.
{INSTANTIATION ERROR}
Le langage
Programmation Logique NJ - 2002 - 80/127
Opérateurs arithmétiques
> et < >= et =< =:= égalité numérique =\= diségalité numérique
attention : les deux arguments doivent être instanciés à l’appel
Le langage
Programmation Logique NJ - 2002 - 81/127
Exemple: calcul du PGCD
Propriétés du PGCD D de X et Y si X et Y sont égaux, D vaut X si X < Y alors D est le PGCD de X et de Y - X si Y < X alors échanger le rôle de X et Y
pgcd(X, Y , D) :- X =:= Y , D is X.X=YX X ).
pgcd(X, Y , D) :- X < Y , pgcd(X,Y-X,D).Y1 is Y - X,pgcd(X,Y1,D).
pgcd(X, Y, D) :-X > Y,pgcd(Y,X,D).
oui, mais que se passe-t-il avec pgcd(1,1,2).
Le langage
Programmation Logique NJ - 2002 - 82/127
Attention …
X = Y réussit si X s’unifie avec Y sinon échec X is Y réussit si Y est une expression arithmétique
complètement instanciée à l’appel et X est une variable libre sinon il y a erreur
X =:= Y réussit si X et Y sont deux expressions arithmétiques de même valeur sinon, il y a échec ou erreur selon le cas
X == Y réussit si les termes sont identiques (pas simplement unifiables)
X \== Y réussit si les termes ne sont pas identiques
Le langage
Programmation Logique NJ - 2002 - 83/127
3. Listes
La liste vide : [] Les listes non vides :
[a, b, c] [a, [b, c], d]
Le constructeur de listes : | [Tete | Reste] [a] [a | [] ] [a, b] [a | [b |[]]] [a | [b] ]
Analogie avec Haskell | = : représentation arborescente
Le langage
Programmation Logique NJ - 2002 - 84/127
Analogie avec Haskell
A-t-on besoin de head et tail ? ?- [1,2,3,4] = [H|T].
On ne dispose pas des listes en compréhension pas réellement un problème
Le langage
Programmation Logique NJ - 2002 - 85/127
Prédicats de base
Longueur d’une liste : length/2
length([], 0).length([_ | Xs], N1) :-
length(Xs, N),N1 is N + 1.
Appartenance à une liste : member/2
member(X, [X|Ys]).member(X, [Y |Xs]) :-
member(X,Xs).
Ys ne sert à rien_Y ne sert à rien_
Le langage
Programmation Logique NJ - 2002 - 86/127
Prédicats de base (suite)
Suppression d’un élément d’une liste : efface/3
efface(_, [], []).efface(X,[X|Ys], Ys).efface(X,[Y|Ys], [Y|Zs]) :-
X \== Y,efface(X,Ys,Zs)
Comment effacer toutes les occurrences d’un élément ?
Le langage
Programmation Logique NJ - 2002 - 87/127
Prédicats de base (suite)
Concaténation de deux listes: append/3
append([], Ys, Ys).append([X|Xs], Ys, [X|Zs]) :-
append(Xs,Ys,Zs).
Une nouvelle version de member ?
member(X,L) :- append(_, [X|_], L).
Le langage
Programmation Logique NJ - 2002 - 88/127
Prédicats de base (suite)
Renversement d’une liste : reverse/2
reverse([], []).reverse([X|Xs], Ys) :-
reverse(Xs,Zs),append(Zs, [X], Ys).
Une autre version de reverse ?
nreverse([], L, L).nreverse([X|Xs], Ys, L) :-
nreverse(Xs, [X|Ys], L).nreverse(Xs, Ys) :-
nreverse(Xs, [], Ys).
Le langage
Programmation Logique NJ - 2002 - 89/127
Un prédicat plus délicat
Permutation d’une liste : permute/2
insere(X,Ys,[X|Ys]).insere(X,[Y|Ys], [Y|Zs]) :-
insere(X,Ys,Zs).
permute([], []).permute([X|Xs], Ys) :-
permute(Xs,Zs),insere(X,Zs,Ys).
Le langage
Programmation Logique NJ - 2002 - 90/127
A vous de jouer !
Les mutants …
mutant(Nouveau) :- animal(A1), animal(A2), A1 \== A2, name(A1,L1), name(A2,L2),
append(_, [X|Xs], L1), append([X|Xs], Fin, L2), append(L1, Fin, Mutant),
name(Nouveau,Mutant).
Le langage
Programmation Logique NJ - 2002 - 91/127
4. Le contrôle PROLOG
Contrôle du backtrack Soit une fonction f dont une définition Prolog peut être :
f(X, 0) :- X < 3.f(X, 2) :- 3 =< X, X < 6.f(X, 4) :- 6 =< X.
Que se passe-t-il si on pose la question ? ?- f(1,Y), 2 < Y.
Le langage
Programmation Logique NJ - 2002 - 92/127
?- f(1,Y), 2 < Y. f(X, 0) :- X < 3.f(X, 2) :- 3 =< X, X < 6.f(X, 4) :- 6 =< X.
Démonstration de f(1,Y)
Première règle : Y = 0Démonstration de 2 < Y :- échec
Deuxième règle : échec
Troisième règle : échec
Le langage
Programmation Logique NJ - 2002 - 93/127
La coupure : !
On appelle but père le but ayant permis d’unifier la clause contenant la coupure (! cut)
L’effet du cut est de couper tous les points de choix restant depuis le but père. Les autres alternatives restent en place
f(X, 0) :- X < 3, !.f(X, 2) :- 3 =< X, X < 6, !.f(X, 4) :- 6 =< X.
?- f(7,Y).
Le langage
Programmation Logique NJ - 2002 - 94/127
Si … alors … sinon
Le cut peut servir à exprimer des conditions mutuellement exclusives et ainsi simplifier l’écriture
La clause suivant un cut peut être considérée comme un sinon
f(X, 0) :- X < 3, !.f(X, 2) :- X < 6, !.f(X, 4).
?- f(1,2).
Le langage
Programmation Logique NJ - 2002 - 95/127
Un usage délicat
Green cut : la sémantique déclarative du programme n’est pas modifiée on peut enlever le cut le programme fonctionnera
toujours
Red cut : la sémantique déclarative du programme est modifiée Le retrait du cut conduit à un programme au
fonctionnement erroné Généralement, la version avec cut peut être prise en
défaut
Le langage
Programmation Logique NJ - 2002 - 96/127
Autres prédicats de contrôle
true est un but qui réussit toujours p(a,b). p(a,b) :- true.
fail est un but qui échoue toujours
call(X) est un méta but. Il considère X comme un but et essaie de le résoudre. ?- Y=b, X=member(Y, [a,b,c]), call(X).
Yes Note: call(X) X dans Sicstus Prolog.
Le langage
Programmation Logique NJ - 2002 - 97/127
Application : négation
Expression de la négation en Prolog different(X, Y) :-
X = Y, !, fail.different(X, Y).
Un prédicat plus général : not(P) :-
P, !, fail.not(_).
Le langage
Programmation Logique NJ - 2002 - 98/127
Problèmes avec le not !
?- q(X), p(X).
?- p(X), q(X).
r(a).q(b).p(X) :- not( r(X) ).
Le langage
Programmation Logique NJ - 2002 - 99/127
Théorie du monde clos
not(X) ne veut pas dire
– X est toujours faux veut simplement dire
– Je n’ai pas assez d’information pour prouver X
Prolog considère ce qui n’est pas vrai comme faux et vice-versa c’est la théorie du monde clos
A quoi peut servir : not(not(P)) ?
Le langage
Programmation Logique NJ - 2002 - 100/127
Typage en Prolog
var/1, nonvar/1
integer/1, float/1, number/1
atom/1, string/1, atomic/1
compound/1
ground/1
Le langage
Programmation Logique NJ - 2002 - 101/127
5. Termes structurés
Notion de foncteur
famille( indiv(tom, fox, date(7, mai, 1950), travail(emn, 7850)), indiv(ann, fox, date(9, mai, 1951), sans-emploi), [ indiv(pat, fox, date(5, mai, 1973), sans-emploi),
indiv(jim, fox, date(5, mai, 1973), sans-emploi) ])
On pourrait utiliser des listes (de listes …)mais on préfère structurer l’information
Le langage
Programmation Logique NJ - 2002 - 102/127
Utilisation de l’unification
Les familles à trois enfants :
famille(_,_,[_,_,_]).
Les femmes mariées ayant au moins trois enfants
famille(_,indiv(Prenom, Nom,_,_), [_,_,_|_]).
famille( indiv(tom, fox, date(7, mai, 1950), travail(emn, 7850)), indiv(ann, fox, date(9, mai, 1951), sans-emploi), [ indiv(pat, fox, date(5, mai, 1973), sans-emploi),
indiv(jim, fox, date(5, mai, 1973), sans-emploi) ])
Le langage
Programmation Logique NJ - 2002 - 103/127
Outils de manipulation
Consultation de termes structurés functor/3
?- functor(date(9, janvier, 1973), F, A)F = date, A = 3
arg/3?- arg(3, date(9, janvier, 1973), F)F = 1973
Construction/déconstruction de termes structurés =../2
?- X =.. [date, 9, janvier, 1973]X = date(9, janvier, 1973)
Le langage
Programmation Logique NJ - 2002 - 104/127
Opérateurs
On peut définir de nouveaux opérateurs. Il ne s’agit que d’une définition syntaxique pour faciliter l’écriture de termes.
:- op(80, fy, non).:- op(100, yfx, et).
non a et b est devenu un terme valide, il est équivalent à et(non(a), b)
Le langage
Programmation Logique NJ - 2002 - 105/127
Fonctionnement
Un opérateur possède une précédence (1..1200) par exemple : + a une plus forte précédence que / car
a+b/c se lit a+(b/c)
Un opérateur possède une politique de résolution des ambiguïtés : xfx correspond aux opérateurs infixes non associatifs
les deux sous-expressions ont un niveau de précédence inférieur à celui de l’opérateur
xfy correspond aux opérateurs associatifs à droite seule l’expression de gauche doit avoir un niveau inférieur à l’opérateur
yfx correspond aux opérateurs associatifs à gauche
Le langage
Programmation Logique NJ - 2002 - 106/127
6. Méta-interprétation
Méta-programmation
écrire des programmes qui analysent, transforment et simulent d’autres programmes
Prolog est un langage adapté à la méta-programmation car :
il y a identité entre programme et données
Le langage
Programmation Logique NJ - 2002 - 107/127
Méta-interprétation
Un méta-interprète d’un langage donné est un interprète du langage écrit dans le même langage
Le prédicat prouve(But) réussit si la requête But par rapport au programme que l’on cherche à interpréter
Le plus simple des méta-interprètes Prolog
prouve(But) :- But.
Le langage
Programmation Logique NJ - 2002 - 108/127
Outils pour la méta-interprétation
Le prédicat clause/2 (accès aux programmes)
append([],X,X).append([X|Xs], Ys, [X|Zs]) :-
append(Xs,Ys,Zs).
X = [], Y = _A1, Z=_A2, Corps = true ? ;
X = [_A1|_A2], Y = _A3, Z = [_A1|_A4],Corps = append(_A2, _A3, _A4) ? ;
no
?- clause(append(X,Y,Z), Corps).
Le langage
Programmation Logique NJ - 2002 - 109/127
Un premier interprète
prouve( true ).
prouve( (A,B) ) :- prouve(A), prouve(B).
prouve( But ) :- clause(But, Corps), prouve(Corps).
Le langage
Programmation Logique NJ - 2002 - 110/127
Améliorations
Gestion des prédicats prédéfinis
prouve( But ) :- predefini( But ), predefini( _ = _ ).
But. predefini( _ is _ ).
Gestion explicite de l’unification
prouve( But ) :- But =.. [Foncteur|Arguments], Tete =.. [Foncteur|AutresArguments], clause(Tete, Corps), unification(But, Tete), prouve(Corps).
Le langage
Programmation Logique NJ - 2002 - 111/127
Algorithme d’unification
unification( X, Y) :-var(X), !, Y = X. % nooccur(X,Y)
unification( X, Y) :- var(Y), !, X = Y. % nooccur(Y,X)
unification( X, Y) :-atomic(X), atomic(Y), X == Y.
unification( X, Y) :-X =.. [Foncteur|Arguments],Y =.. [Foncteur|AutresArguments],unificationListe(Arguments, AutresArguments).
unificationListe([], []).unificationListe([X|Xs], [Y|Ys]) :-
unification(X,Y),unficationListe(Xs,Ys).
Le langage
Programmation Logique NJ - 2002 - 112/127
Le test d’occurrence
Théoriquement, lors d’une unification il faut réaliser le test d’occurrence. Prolog ne le fait pas. En particulier :
?- X = f(X).
réussit mais ne peut afficher de résultat !
Exercice : écrire le test d’occurrence en Prolog
Le langage
Programmation Logique NJ - 2002 - 113/127
nooccur/2
noccur( _, Y) :-ground(Y).
noccur( X, Y) :-var(Y), X \== Y.
noccur( X, Y) :-Y =.. [_|Arguments],nooccurListe(X, Arguments).
nooccurListe(_, []).nooccurListe(X, [Y|Ys]) :-
nooccur(X,Y),nooccurListe(X,Ys).
Le langage
Programmation Logique 2002
PROLOG avancé
1. Structures incomplètes2. Listes de solutions3. Modifications de la base4. Indexation de clauses
Programmation Logique NJ - 2002 - 115/127
1. Structures incomplètes
Concaténation
Notoirement inefficace ! Le problème
– pas de « pointeur » sur le dernier élément– pas de possibilité de modification d’une variable logique
uniquement instanciation d’une inconnue
Prolog avancé
append([], Ys, Ys).append([X|Xs], Ys, [X|Zs]) :-
append(Xs,Ys,Zs).
Programmation Logique NJ - 2002 - 116/127
Une solution : listes de différences
Une nouvelle structure de liste idée : conserver une partie inconnue pour
instanciation au dernier moment Liste de différence
– on nomme la fin de la liste– [a,b,c] est représentée par [a,b,c|Xs]-Xs– la liste vide Xs-Xs
Concaténation en une opérationappend(Ls-Xs, Xs-Rs, Ls-Rs).
?- append([a,b,c|Xs]-Xs, [1,2,3|Ys]-Ys, R). R = [a,b,c,1,2,3|Ys]-Ys
Prolog avancé
Programmation Logique NJ - 2002 - 117/127
Une opération !?!
Ls - Xs a b c 1 2 3 ? ? ? - 1 2 3 ? ? ?Xs - Rs 1 2 3 ? ? ? - ? ? ?
Ls - Rs a b c 1 2 3 ? ? ? - ? ? ?
Merci l’unification !
Prolog avancé
Programmation Logique NJ - 2002 - 118/127
2. Listes de solutions
On veut la liste de tous les enfants de tarzan et leur âge.
pere(tarzan, X), age(X,A) ne donne les solutions qu’une par une
Comment les récupérer toutes dans une liste ?
pere(tarzan, fils).pere(tarzan, fille).
age(fils, 5).age(fille, 2).age(tarzan, 25).
Prolog avancé
Programmation Logique NJ - 2002 - 119/127
Prédicats « toutes solutions »
setof/3 résultat trié (fail si pas de solution) bagof/3 résultat tel que le backtrack (fail si pas de
solution) findall/3 résultat tel que le backtrack ([] si pas de
solution)
?- setof(X/A, (pere(tarzan, X), age(X,A)), L). L = [fils/5, fille/2]
findall(X, member(X/Y, [b/1, a/2]), L) --> [b,a]setof(X, member(X/Y, [a/1, b/2]), L --> L=[b] Y=1 ; L=[a] Y=2setof(X, Y^member(X/Y, [b/1, a/2]), L) --> [a,b]
Prolog avancé
Programmation Logique NJ - 2002 - 120/127
3. Modifications de la base
Besoin : résistance au backtrack
Ajout dans la base assert/1 asserta/1 assertz/1
Retrait dans la base retract/1 retractall/1
Prolog avancé
Programmation Logique NJ - 2002 - 121/127
4. Indexation de clause
Les clauses Prolog sont rangées dans une hashtable. Elles sont indexées par le foncteur et l’arité de leur premier argument
Pour écrire des programmes plus efficaces, mettre en tête l’argument le plus discriminant.
Prolog avancé
Programmation Logique 2002
Bilan
1. Cours2. Travaux pratiques3. A quoi ça sert ?
Programmation Logique NJ - 2002 - 123/127
Bilan du cours
Rappels de logique
Comment programmer avec la logique
Le langage PROLOG
Subtilités du langage
Bilan
Programmation Logique NJ - 2002 - 124/127
Bilan des TP
TP-1/TP-2: Mise en route, manipulations écriture rapide de fonctions sur les listes écriture rapide de petits outils
TP-3: Résolution d’énigmes logiques/de réflexion tester des idées, résoudre des problèmes non triviaux
TP-4: Écriture d’un système expert complet 4 heures pour un système complet, convivial et extensible à comparer avec 50h en Pascal …
TP-5 (noté)
Bilan
Programmation Logique NJ - 2002 - 125/127
PROLOG : à quoi ça sert ?
Principal langage de l’Intelligence Artificielle Systèmes experts
– cf. TP
Traitement du langage naturel – cf. GINA
Faire intervenir le raisonnement …
Bilan
Programmation Logique NJ - 2002 - 126/127
PROLOG pour l’Industrie
Programmation par Contraintes point de rencontre de diverses disciplines
– programmation logique (et IA au sens large)– recherche opérationnelle (graphes, prog. Linéaire, …)– analyse numérique
Pour résoudre des problèmes combinatoires complexes
– gestion de ressources (humaines ou non), – réseaux télécoms, …
Technologie française en plein boom !– ILOG SA, Cosytec (systèmes de PPC)– Bouygues SA, Bouygues Telecom, France Telecom R&D,
Air France, DGA, SNCF, …
Bilan
Programmation Logique NJ - 2002 - 127/127
PROLOG dans l’Industrie
Utilisé pour prototyper très rapidement, tester des idées …
Mais aussi pour développer des applications Dassault Électronique ECRC (Centre de recherche commun Bull, Siemens) …
Bilan