Introduction à la programmation logique
Introduction à la programmation logique
Mme AMIROUCHE
Département Informatique
UMMTO
1
01/10/2019
Partie I
Introduction au paradigme de la
programmation logique
Principe général
L’idée de la programmation logique est d’utiliser
l’ordinateur pour tirer des conclusions à partir
de descriptions déclaratives d’un problème
donné.
De telles descriptions constituent le programme
logique.
Un programme logique est composé d’une suite
finie de formules logiques constituant des
axiomes à partir desquels un problème est résolu.
Dans la majorité des systèmes de programmation
logique, les axiomes sont formalisés dans la
logique des prédicats (ou logique de premier
ordre) par des clauses de Horn. 4
2
01/10/2019
Caractéristiques
Formalisation des informations :
Un programme logique est une description des objets et des
relations entre les objets de l’univers du discours.
La formalisation de cette description se fait dans un langage
dérivé de la logique.
Le mécanisme d’inférence :
La suite des actions à entreprendre pour trouver la solution
d’un problème donné n’est pas décrite à l’avance dans le
programme.
Le langage de programmation logique intègre un
mécanisme de raisonnement (dit mécanisme
d’inférence) qui se charge d’entreprendre les actions
nécessaires sur la description faite par le programmeur,
pour aboutir à une solution du problème décrit.
Ce mécanisme d’inférence est une procédure de résolution de
la logique mathématique.
5
Avantages
Il n’y a plus d’erreurs de programmation : En effet, le programmeur ne
décrit plus les mécanismes de résolution qui sont à la charge du
langage lui-même. Il se contente de décrire simplement l’univers du
discours.
Style de programmation adapté aux non informaticiens : la seule
aptitude requise pour programmer dans ce style, est une pensée
logique, rationnelle permettant de poser un problème en termes
d’hypothèses, de conclusions et d’axiomes disponibles.
La longueur des programmes diminue puisque toute la partie sensée
coder la démarche de résolution du problème est déléguée au langage
lui-même, et ne figure pas dans le programme.
Les modifications d’un programme, par ajout ou suppression de
données, n’affectent pas son exécution. En effet, toute nouvelle requête
(but) est examinée seulement en relation avec les informations
(données) existantes dans le programme. Le but réussit s’il est résolu
par les données du programme ; Il échoue sinon.
3
01/10/2019
Inconvénient
Il n’y a pas d’outils de contrôle de la validité de la
description :
même si la consistance et la complétude théoriques
peuvent être vérifiées dans un système logique
formel, on ne peut aucunement vérifier les
erreurs dues à une mauvaise maîtrise des
connaissances de l’univers du discours. Or une
mauvaise description du problème peut conduire à
des résultats erronés.
Concepts de base
Un programme logique est une suite finie de
clauses de Horn.
En programmation logique, les clauses se
classifient en faits, règles et requêtes.
Un programme logique est constitué d’une séquence
de faits et de règles.
Un programme logique est interrogé par des
requêtes (ou buts).
4
01/10/2019
Clauses de Horn
Une clause de Horn est une clause comportant
au plus un littéral positif. Elle est de la forme :
x1 x k A B1 , , Bl
A B1 , B2 , , Bn A si B1 , B2 , et Bn
La notation se lit
10
5
01/10/2019
Application
Etant donnés les énoncés suivants en langue
naturelle :
$1 : « les Sims » est un jeu
$2 : Amine aime le sport
$3 : Amine aime la télé
$4 : Nassim aime les Sims
$5 : Nassim aime tous ceux qui aiment la télé
$6 : Tout individu peut jouer à un jeu qu’il aime
12
6
01/10/2019
C1 : est_un_jeu(Les_Sims) ←
C2 : aime(Amine, le_sport) ←
C3 : aime(Amine, la_télé) ←
C4 : aime(Nassim, Les_Sims) ←
C5: aime(Nassim, x) ← aime(x, la_télé)
C6 : peut_jouer (x,y) ← est_un_jeu (y), aime(x, y)
7
01/10/2019
16
8
01/10/2019
Partie II
Le langage Prolog
Introduction à Prolog
créé, en France, vers 1972, par Alain Colmerauer et
Philippe Roussel de l’université d’Aix-Marseille.
9
01/10/2019
Caractéristiques
langage de programmation logique.
Implémentations
Le langage Prolog possède plusieurs
implémentations dont:
SWI-Prolog ([Link]
Open Prolog ([Link]/open-prolog)
Visual-Prolog ()
Turbo-Prolog ()
…
10
01/10/2019
1. Le programme Prolog
Un programme Prolog consiste en une suite de
données
Les données sont :
des Faits
ou = Base de connaissances
des Règles
Un programme Prolog est interrogé par une
requête (ou but).
Les données et les requêtes sont des clauses de
Horn.
11
01/10/2019
Les Faits
Un fait est une relation (prédicat) entre un certain
nombre d’objets, qui sont des termes de la logique des
prédicats.
Cette relation est inconditionnellement vraie.
12
01/10/2019
13
01/10/2019
Exemple
Soit la règle suivante:
Les Buts
Un but en Prolog est une requête liée aux prédicats
apparaissant dans la base de connaissances du
programme.
? X Y pere(X,Y).
14
01/10/2019
15
01/10/2019
Exercice 1
Combien de faits, règles, clauses et prédicats contient la
base de connaissances suivante. Identifier les têtes des
règles ainsi que les prémisses qu’elles contiennent.
femme(maria).
femme(sarah).
homme(amine).
personne(X) :- homme(X); femme(X).
aime(X, Y) :- connait(Y, X).
pere(Y, Z) :- homme(Y), fils(Z, Y).
pere(Y, Z) :- homme(Y), fille(Z, Y).
16
01/10/2019
Les variables
Les variables représentent des objets inconnus de l'univers.
Syntaxiquement, une variable est une chaîne alphanumérique commençant
par une majuscule ou par un souligné.
(1) X, Yy, Pere, _toto, A21 sont des variables,
(2) x, yy, pere, toto, 2A, « Pere », 321 ne sont pas des variables.
17
01/10/2019
18
01/10/2019
Les fonctions
Les fonctions sont des termes composés de l'univers du
programme.
Syntaxiquement, un terme composé est de la forme:
foncteur(t1, ..., tn)
foncteur est une chaîne alphanumérique commençant par
une minuscule,
t1, ..., tn sont des termes.
Exemple
adresse(18, "rue des Lilas", Ville)
est un terme composé de foncteur adresse d'arité 3, dont
les deux premiers arguments sont les termes élémentaires
18 et "rue des lilas" et le troisième argument est la variable
Ville.
Les prédicats
Un prédicat (ou atome logique) exprime une
relation ou une propriété de termes.
Syntaxiquement, un atome logique est de la forme:
pred(t1, ..., tn )
19
01/10/2019
20
01/10/2019
Les listes
La liste est composée d’une séquence de termes placés entre
crochets et séparés par des virgules.
Exemple : la séquence [vinaigre, toto, salade, football, X,
biscuit] est une liste.
21
01/10/2019
22
01/10/2019
Exemples
La liste [football, cinéma, pizza] peut se noter de manière
équivalente par :
. (football, .(cinéma, .(pizza, [])))
[football| [cinéma, pizza]]
[football , cinéma|[pizza]]
[football , cinéma, pizza|[]]
…
Le symbole ''.'' est considéré comme un prédicat généralisé, dont
la forme est inconnue. On ne peut pas l’utiliser dans une requête
Prolog.
Arithmétique en Prolog
Opérateur Numérique Littéral
(terme à terme)
égalité = := =@=
inégalité \= = \=@=
Plus petit que < @<
Plus petit ou égal à =< @=<
Plus grand que > @>
Plus grand ou égal à >= @>=
Unification = =
Non unification not(=) not(=)
23
01/10/2019
a. Égalité structurelle
term1=@= term2 est vraie si term1 est
`structurellement' égal à term2.
Remarque
On a:
24
01/10/2019
?- a =@= A
faux ?- X = 3, Y = 2+1, X =:= Y.
?- A =@= B false
vrai ?- 1 + 2 =:= 2 + 1.
?- x(A, A) =@= x(B, C) Yes.
faux ?- 1 + 2 = 2 + 1.
?- x(A, A) =@= x(B, B) No.
vrai ?- p(X,X) = p(1,1).
?- x(A, B) =@= x(C, D) X=1
vrai
?- p(X,X) = p(1,W).
?- X = 3, X = Y.
X=1, W=1
X = 3, Y = 3
?- X = 3, X =:= Y. ?- p(Y,fun(Y)) = p(toto,Z).
No Y = toto , Z = fun(toto)
?- X = 3, Y = 2+1, X = Y. ?- p(X,X,2) = p(1,W,W).
No No
b. Opérateurs arithmétiques
Prolog fournit les opérateurs arithmétiques
+ - * / mod
Ces opérateurs peuvent s’écrire :
25
01/10/2019
Remarque
+(2, *(3,5)) correspond au terme 2 + 3 * 5,
Cependant:
?- 17 = 2 + 3 * 5.
false
c. Affectation
l’opérateur "arithmétique" is/2 est l’opérateur
d’affectation.
Syntaxe:
X is exp.
Où exp est une expression arithmétique.
La valeur de l’expression exp est calculée puis la
variable X est instanciée avec le résultat.
Si l’expression exp contient des variables, celles-ci
doivent être d’abord instanciées avec une valeur
numérique.
26
01/10/2019
?- Y is 3+X.
Variable libre
error: is/2: Arguments are not sufficiently
instantiated
?- 5+2 is 3+4.
false.
X est une
expression
27
01/10/2019
?- 17 is 2 + 3 * 5.
?- X = 4, Y is 2 * X.
Yes.
X=4
?- is (17, +(2, *(3,5))). Y=8
Yes.
?- X = 7, X is 3 + 4.
?- X is 3+4. X=7
X=7
?- 7 is 3 + X. ?- X = 6, X is 3 + 4.
Error No
28
01/10/2019
Exemple 1
Ecrire le prédicat membre/2 Prolog qui est vrai si
un élément appartient à une liste.
Solution
29
01/10/2019
Exemple 2
Ecrire le prédicat non_membre/2 qui prenant un
élément et une liste en arguments, est vrai si et
seulement si l’élément n’appartient pas à la liste (le
symbole différent est noté \= =).
Solution
non_membre(I, [ ]).
non_membre(I, [ K |T]):- \== (I, K), non_membre(I, T).
Exemple 3
Ecrire le prédicat different/1 qui est vrai si tous les
éléments d’une liste sont (deux à deux) différents.
Solution
different([ ]).
different ([X |L]) :- non_membre(X,L), different (L).
30
01/10/2019
Exemple 4
Ecrire le prédicat concat/3 de concaténation de
deux listes.
Solution
concat([], L, L).
concat( [A|S], L, [A|R]) :- concat(S, L, R).
Exemple 5
Ecrire le prédicat long/2 qui calcule de la
longueur d’une liste.
Solution
long([ ], 0).
long([_ |L], N) :- long(L, P), N is P+1.
31
01/10/2019
Autres Exercice
1. Ecrire un prédicat prolog plus_un/2 qui reçoit en
entrée une liste d’entiers et qui retourne en sortie
une autre liste d’entiers dont les éléments sont
obtenus en ajoutant 1 à chacun des éléments de la
liste initiale.
plus_un([X],[Y]):-Y is X+1.
plus_un([X|L],[Y|T]):- Y is X+1, plus_un(L,T).
Exo2:
dedouble([],[]).
dedouble([X|L],[X,X|T]):- dedouble(L,T).
32
01/10/2019
Remarque
Il existe de nombreux prédicats de manipulation des listes
qui sont prédéfinis en Prolog, dont:
Append(List1,List2,List3) qui réussit si la liste List3 est le
résultat de la concaténation des listes List1 et List2 dans cet
ordre.
length(?List, N) qui réussit si N est le nombre d’éléments
de la liste List.
member(Elem, List) qui réussit si Elem peut être unifié
avec un membre de la liste List.
last(List, Elem) réussit si Elem s’unifie avec le dernier
élément de la liste List.
…
33
01/10/2019
Exercice 4
Donner la réponse de prolog à chacune des unifications suivantes :
[a, b, c, d] = [H | T].
[a, b, c, d] = [a, b, [c, d]].
[a, [b, c, d]] = [H | T].
[a, b, c, d] = [a, b | [c, d]].
[] = [H | T]. [a, b, c, d] = [a, b, c, [d]].
[a] = [H | T]. [a, b, c, d] = [a, b, c| [d]].
[prolog, 3, X, 'Logique?'] = [A, B | [a, b, c, d] = [a, b, c, d, []].
Z]. [a, b, c, d] = [a, b, c, d | []].
[[a, b, c], [d, e, f], [g, h, i]] = [H | [] = _.
T]. [] = [_].
[a(X, c(d, Y)), b(2, 3), c(d, Y)] = [] = [_ | []].
[H | T].
[a, b, c, d] = [a, [b, c, d]].
[a, b, c, d] = [a | [b, c, d]].
Exercice 5
Cinq maisons consécutives, de couleurs
différentes, sont habitées par des hommes de
différentes nationalités. Ils possèdent tous un
animal différent, ont chacun une boisson
préférée différente et fument des cigarettes
différentes.
On sait que:
34
01/10/2019
indications
Pour résoudre ce problème, on vous suggère d'écrire la
relation maison(C,A,B,F,N) où
C est une couleur qui prend sa valeur dans l’ensemble des 5
couleurs {rouge, bleu, jaune, verte, blanche},
A est un animal, qui prend sa valeur dans l’ensemble de 5
animaux {chien, renard, cheval,escargot, zèbre}
B est une boisson qui prend ses valeurs dans l’ensemble de 5
boissons {lait, thé, vin, eau, café}
F est une marque de cigarettes qui prend sa valeur dans
l’ensemble des marques de cigarettes {Kool, Craven, Old-
gold, chesterfield, gitane},
N est une nationalité qui prend sa valeur dans l’ensemble des
5 nationalités {norvégien, espagnol, ukrainien,
japonais,anglais}.
Le quartier est une liste de 5 maisons consécutives.
35
01/10/2019
Exercice 6
Dans l’énoncé suivant, chaque lettre représente un
chiffre et un seul. Trouver la ou les solutions à :
Le mécanisme de résolution de
Prolog
Prolog fonctionne en mode de chaînage
arrière:
Il démarre à partir des buts à démontrer et
cherche des faits permettant de les déduire (on
parle de raisonnement guidé par les buts).
La méthode de déduction utilisée est basée sur
le principe de résolution de la logique des
prédicats.
Son mode de fonctionnement est comme suit:
36
01/10/2019
G s A1' , s A2' ,..., s Am' , A2 , ... An
Prolog recommence ce processus jusqu’à ce que le but à
prouver soit vide.
37
01/10/2019
Notons que:
Remarque 1
Il peut exister plusieurs clauses candidates d’un
programme PROLOG, dont les têtes s’unifient avec un but
atomique donné.
Dans ce cas, PROLOG choisit la première clause
rencontrée dans le code du programme.
Si celle-ci mène à un échec, la règle suivante de même tête
est examinée.
Si elle mène à un succès, alors le but est résolu.
Prolog marque cette règle et tente ensuite de résoudre
le but suivant dans la liste des buts éventuels en
attente.
38
01/10/2019
Remarque 2:
La stratégie de recherche de PROLOG est dite recherche
en profondeur d’abord. Elle consiste ainsi à poursuivre un
but jusqu’à le démontrer.
Cette stratégie dépend:
d’une part de l’ordre de définition des clauses dans un
paquet (les clauses candidates sont considérées dans leur
ordre d'apparition dans le paquet),
et d’autre part de l’ordre des atomes logiques dans une
clause (on prouve les atomes logiques selon leur ordre
d'apparition dans la clause).
Un mauvais ordre peut conduire la stratégie de recherche à
boucler indéfiniment.
Remarque 3:
Lors de la résolution, PROLOG construit l’arbre
de preuve ou arbre de recherche.
39
01/10/2019
Un exemple d’application
Considérons le programme Prolog suivant:
Est_un_jeu (les_Sims).
est_un_jeu (half_life).
est_un_jeu (fifa-street).
aime(amine, la_télé).
aime(amine, fifa_street).
aime(nassim, les_Sims).
aime(nassim, half-life).
aime(nassim,X) :-aime(X, la_télé).
peut_jouer(X,Y) :-est_un_jeu(Y), aime(X, Y).
et soit le but
?- aime(X, Y).
- X= amine, Y= la_télé ;
- X= amine, Y= fifa-street ;
- X= amine, Y= la_télé ;
- X= nassim, Y= les-Sims ;
- X= nassim, Y= half-life ;
- X= nassim, Y= amine;
- false
Remarque :
On introduit le point virgule à la fin de chaque réponse
pour demander à Prolog d’affiche le résultat suivant.
Lorsqu’il n’y a plus de résultats à afficher, Prolog retourne
false.
40
01/10/2019
?-peut-jouer (X,Y).
X= nassim, Y= les-Sims ;
X= nassim, Y= half-life;
X= amine, Y= fifa-street ;
X= amine, Y= la_télé ;
41
01/10/2019
42
01/10/2019
p(X) :- a(X).
p(X) :- b(X), c(X), d(X), e(X).
p(X):- f(X). Et soit le but:
a(1). ?-p(X).
b(1).
b(2).
c(1). Réponses de Prolog:
X=1;
c(2).
X=2;
d(2).
X=3 ;
e(2). false
f(3).
Arbre de Résolution
Backtracking
43
01/10/2019
La coupure
La coupure est un mécanisme de contrôle des
retours-arrières en Prolog.
La coupure est implémentée par le prédicat cut,
noté !, qui permet d’élaguer (ie. de couper) des
branches de l’arbre de recherche, empêchant ainsi
la remontée dans l’arbre.
Le prédicat cut est toujours vrai.
Fonctionnement de la coupure
Supposons une règle de la forme :
q :- p1, p2, …, pn, !,r1, r2, …, rm.
44
01/10/2019
P(X) :- a(X).
P(X) :- b(X), c(X),!, d(X), e(X).
P(X):- f(X).
Et soit le but:
a(1).
b(1). ?-p(X).
b(2).
c(1).
c(2). La Réponse de Prolog:
X=1;
d(2). No.
e(2).
f(3).
Arbre de résolution
45
01/10/2019
Un autre exemple
Considérons le prédicat max(N,M,Max)qui est vérifié si Max
est le nombre maximum entre N et M.
Coupures vertes
• Les coupures qui ne changent pas le sens
d’un prédicat sont des coupures vertes.
• La coupure dans l’exemple max/3 ci-dessus
est une coupure verte :
– Le nouveau code donne exactement les
mêmes résultats que la version initiale
sans coupure,
– Mais est plus efficace.
on peut enlever la coupure verte le programme
fonctionnera toujours correctement.
46
01/10/2019
Coupure rouge
• Une coupure rouge est une coupure qui change
le sens d’un prédicat .
• Ainsi la coupure introduite dans le prédicat p/1
définit précédememnt (paragraphe: coupure)
est un exemple de coupure rouge:
– Les deux programmes avec et sans coupure ne sont
pas équivalents
Contrairement à la coupure verte, le retrait
d’une coupure rouge conduit à un programme
au fonctionnement erroné.
Utilisation du CUT
Le CUT peut être utilisé pour:
Rendre la recherche déterministe, à l’exemple
du prédicat Membre avec coupure:
? Membre(a,[a,b,c,a,d,a]). avec un tel but on
peut vouloir une seule solution et pas trois
exprimer la négation.
47
01/10/2019
Recherche déterministe
Considérons le prédicat:
membre(H, [H| _ ]).
membre(H, [ _ | T]):- membre(H, T).
Et le but:
? Membre (a, [a,b,c,a,d,a]).
Et le but:
? Membre (a, [a,b,c,a,d,a]).
48
01/10/2019
La conditionnelle
Implémentation du si-alors-sinon (désigné ici par
le prédicat if):
if(P,Q,R):-P,!,Q.
if(P,Q,R):-R.
if(P,Q,R):-P,!,Q.
if(P,Q,R):-R.
49
01/10/2019
Et soit le but:
?- homme(wassim).
50
01/10/2019
51
01/10/2019
52
01/10/2019
53