Programmation en Logique
FI 3 - 2002
Cours Narendra Jussien
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
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é
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
1930 Calcul des prédicats (J. Herbrand) 1965 Principe de résolution (J. A. Robinson) 1970 Utiliser la logique comme langage de
programmation
clauses de Horn R. Kowalski Q-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
Plan du cours
Bases théoriques (rappels de logique formelle)
Calcul propositionnel Calcul des prédicats
Le langage PROLOG
Utiliser PROLOG (premières séances)
Réaliser un système expert complet
Résoudre automatiquement des énigmes
Rappels de Logique
1. Calcul propositionnel 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 ?
Syntaxe d’une formule
Données
un ensemble P de variables propositionnelles
P = { p, q, r, … } énoncés élémentaires
un ensemble C de connecteurs
C = { , , , , }
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
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
0
,
1
)
(
p
Tables de vérité : opérateurs
1 0 0 00 1 0 1 1 1 1 1 0 1 1 0 0 1 p p 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 Calcul propositionnelFormules 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 1 0 1 1 0 1 1 1 0 1 0 1
?
(
p
q
)
(
p
q
)
p q ¬ p ¬ q p q ¬ ( p q ) (¬ p ¬ q) F 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 Calcul propositionnelCaté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
)
(
,
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)
)
(
)
(
,
F
H
Calcul propositionnellois 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
) ( ) (F G G F G F tauto F G tauto F G F G G F tauto 1 tauto F F
F tauto F F G G F tauto 0 tauto F F G F G F G F G F tauto tauto ) ( ) (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
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
Aspects déductifs
notion de conséquence logique notion de démonstration
notion de règles de déduction
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
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
É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 A
i J
ou Ai découle d’énoncés précédents par application
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 propositionnelProprié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
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
Une autre règle d’inférence
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 1
0 1
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}
Ce qu’il faut retenir
Intérêt d’une forme normale
Conséquence logique vs démonstration
Principe de résolution
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 ?
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
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 ) ( ) ( , chandelle x éclaireMal x x ) ( ) ( , chandelle x éclaire x x ) ( ) ( , éclaire x éclaireMal x x
Syntaxe
des connecteurs (, , , et )
des quantificateurs ( et )
des variables (x,y, …)
des relations (prédicats) (R, S, éclaire, …)
des symboles de fonctions (f, g, …)
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
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)
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 :
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
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
Aspects sémantiques
Formules universellement valides Le théorème de Herbrand
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
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 de M’ = est la mère de Q’ = est un parent de R’ = est le grand-père de
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 1
M 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
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
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
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
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
Transport des quantificateurs
x
F
x
F
F
x
x
F
F
H
x
H
x
F
x
H
F
x
H
x
F
x
F
x
y
F
y
x
F
x
y
F
y
x
si H ne contient aucune occurrence de x
x
F
H
x
F
H
H
F
x
H
F
x
H
H
x
H
H
x
Inversion de
et de
Skolemisation
Lorsqu’on a
on remplace y par une fonction g qui à x associe y
y
x
f
y
x
(
)
)
(
)
(
x
g
x
f
x
g
Skolemisation = expliciter l’implicite
Une représentation utile des formules
Forme 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
p(x, y) q(z, y, x)
z y x
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
( 1, , )
1 n n
i
i H f t t
H
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
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
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é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 ) ( ) ( , ve x vo x x h(x) x (y, p(x,y)vo(y))
, ( , ) ( ) ( )
( ) , y p y x ve y r y ve x x ) ( ) ( , ve x vo x x
, ( , ) ( )
( ) , y p x y vo y h x x x,
y,p(x, y) vo(y)
h(x) ,xx,y,,
y
p,y
(,pxp(,(xyx,),yy))h(x)vovo
((yy))
vo
(hhy((x)x))h(x)
x
( , ( )) ( )
( ( )) ( )
, , x p x f x h x vo f x h x f
, ( , ) ( ) ( )
( ) , y p y x ve y r y ve x x x,
y,p(y,x)
ve(y)r(y)
ve(x) ,
( , ) ( )
( , ) ( )
( ) , y p y x ve y p y x r y ve x x , y,
p(y,x) ve(y) ve(x)
p(y, x) r(y) ve(x)
x
Forme clausale
( , ( )) ( )
( ( )) ( )
, , x p x f x h x vo f x h x f ) ( ) ( , ve x vo x x
( , ) ( ) ( )
( , ) ( ) ( )
, , y p y x ve y ve x p y x r y ve x x ) ( ) ( , ve x h x x ) ( )) ( , (x1 f x1 h x1 p vo( f (x2)) h(x2) ) ( ) (x3 vo x3 ve p(y1, x4) ve(y1) ve(x4) ) ( ) ( ) , (y2 x5 r y2 ve x5 p ve(a) h(a)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
) ( )) ( , (x1 f x1 h x1 p
Mise en œuvre
) ( )) ( ( f x2 h x2 vo ) ( ) (x3 vo x3 ve p(y1, x4) ve(y1) ve(x4) ) ( ) ( ) , (y2 x5 r y2 ve x5 p ve(a) h(a) ) (a h h(a) vo( f (a)) a x2 )) ( ( )) ( ( f a ve f a vo ) ( 3 f a x )) ( ( ) ( )) ( , (y1 f a ve y1 ve f a p ) ( 4 f a x )) ( , ( ) (a p a f a h x1 a y1 px(1a, f (a)) ve(a) ve( f (a)) ) ( 3 f a x )) ( ( )) ( ( f a ve f a vo a x2 ) ( )) ( ( f a h a vo ) (a h clause videRésolution
On a un ensemble d’instances de base insatisfaisable
La formule P1 P2 P3 C est donc insatisfaisable
) (a h )) ( ( ) (a vo f a h )) ( ( )) ( ( f a ve f a vo )) ( , ( ) (a p a f a h )) ( ( ) ( )) ( , (a f a ve a ve f a p ) (a ve ) (a h
unificateur y1 x1 x1 a
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
)) ( ( ) ( )) ( , (y1 f a ve y1 ve f a p ) ( )) ( , (x1 f x1 h x1 p
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
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)
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)
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
Le langage PROLOG
1. Premiers pas 2. Arithmétique 3. Listes 4. Le contrôle PROLOG 5. Termes structurés1. 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
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
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).
La famille
masculin(tom). % tom est de sexe masculin masculin(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). Le langage
Premières requêtes
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 ;
Lien avec le calcul des prédicats
Règles PROLOG a :- b,c,d. a Règles LOGIQUE b c d Requête PROLOG ?- q. Requête LOGIQUE q UnificationÉcriture de prédicats
• Qui est le père de bob ?
?- enfant(bob,X), masculin(X). 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 échec retour X=tom X=tom • Plus généralement pere(X,Y) :-enfant(Y,X), masculin(X).
À chacun son tour
Écrire les prédicats correspondant aux relations
grand-pere/2 frere/2
tante/2 cousin/2
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
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 = tom retourLe 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
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
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êt en premier Information discriminante en premier Le langage
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 gauche
fermeture(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
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ètementinstancié à l’appel
Opérateurs arithmétiques
> et <
>= et =<
=:= égalité numérique
=\= diségalité numérique
attention : les deux arguments
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 X ). X=Y pgcd(X, Y , D) :- X < Y , pgcd(X,Y-X,D). Y1 is Y - X, pgcd(X,Y1,D). pgcd(X, Y, D)
:-oui, mais que se passe-t-il
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)
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
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
Prédicats de base
Longueur d’une liste : length/2
length([], 0).
length([_ | Xs], N1) :-length(Xs, N),
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
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)
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) :-
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)
:-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
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).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.
?- 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 = 0 Démonstration de 2 < Y :- échec Deuxième règle : échecLa 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.
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).
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
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
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(_).
Problèmes avec le not !
?- q(X), p(X). ?- p(X), q(X). r(a). q(b). p(X) :- not( r(X) ).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)) ?
Typage en Prolog
var/1, nonvar/1
integer/1, float/1, number/1
atom/1, string/1, atomic/1
compound/1
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
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),
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]
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
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
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 :
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
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) ? ;
Un premier interprète
prouve( true ). prouve( (A,B) ) prouve(A), prouve(B). prouve( But ) clause(But, Corps), prouve(Corps). Le langageAmé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).
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([], []). Le langageLe 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 !
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), Le langage1. Structures incomplètes 2. Listes de solutions
3. Modifications de la base 4. Indexation de clauses
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
Prolog avancé
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :-append(Xs,Ys,Zs).
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ération
append(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
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é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).
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 ;
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
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.
1. Cours
2. Travaux pratiques 3. A quoi ça sert ?
Bilan du cours
Rappels de logique
Comment programmer avec la logique
Le langage PROLOG
Subtilités du langage
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 …
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 …
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, …
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) …