Vous êtes sur la page 1sur 47

Support de cours

Programmation et IA
Université de Kairouan
Dr. Imen JDEY
Imene.jdey@gmail.com
2023/2024
Séance 2. le 05/02/2024 2
Forme Clausale
Une forme clausale est une formule logique ne contenant que
des conjonctions de littéraux négatifs ou positifs.

A partir d’une forme normale prénexe G’ d’une fbf G on peut


produire une forme de clauses G” de G par les cinq
transformations a, b, c, d, e ci-après décrites.
a. Éliminer les quantificateurs existentiels:
Pour tout quantificateur Qi = ∃ :
1. s’il n’y a aucun ∀ à gauche de Qi alors supprimer (Qi Xi ) et
remplacer Xi par une constante non déjà existante
2. si Qj , Qj+1, ... Ql sont des quantificateurs (∀) à gauche de Qi
alors supprimer (Qi Xi ) et remplacer Xi par une fonction f de
Xj , Xj+1, ... Xl : f(Xj , Xj+1, ... Xl ).
Remarque:
Les constantes et fonctions introduites dans la formule sont
appelées respectivement constante et fonctions de Skolem

3
Forme Clausale

Exemples:

1. (∃ X) P(X) devient : P(a)


2. (∀X)(∃Y) SUIT(Y,X) devient : (∀X) SUIT(f(X), X)
3. la forme normale prénexe obtenu dans l’exemple précédent
devient :

(∀X) (∀Y) (∀U) (((┐P(X) ∨┐Q(X,a)) ∨ (R(X,b) ∧


(┐R(Y,g(X,Y)) ∨T(X,Y)))) ∨S(U))

4
Forme Clausale

b. Éliminer tous les quantificateurs

A la fin de a) il ne reste que des quantificateurs universel. On


allège la notation en les suppriment : on suppose désormais que
toutes les variables sont quantifiées universellement.

Exemple:
La formule de l’exemple précédent devient:
(┐P(X) ∨┐Q(X,a)) ∨ (R(X,b) ∧ (┐R(Y,g(X,Y)) ∨T(X,Y))) ∨S(U)

5
Forme Clausale

c. Passer sous Forme Normale Conjonctive:


Mettre la formule sous forme d’une conjonction de
disjonction de littéraux, c’est-à-dire sous la forme d’une
conjonction de clauses.

Exemple:
La formule de l’exemple précédent devient:
(┐P(X) ∨┐Q(X,a)∨S(U) ∨ R(X,b)) ∧ (┐P(X) ∨┐Q(X,a)∨
┐R(Y,g(X,Y)) ∨T(X,Y) ∨S(U))

6
Forme Clausale

d. Éliminer les connecteurs:


La conjonction de clauses obtenues à la fin de l’étape c)
est traditionnellement considérée comme un ensemble de
clauses.

Exemple:

{ (┐P(X) ∨┐Q(X,a)∨S(U) ∨ R(X,b)), (┐P(X) ∨┐Q(X,a)∨


┐R(Y,g(X,Y)) ∨T(X,Y) ∨S(U))}

7
Forme Clausale

e. Distinguer les variables de clauses distinctes:

Exemple:
Par exemple, pour l’expression précédente :

{(┐P(X)∨┐Q(X,a)∨S(U) ∨ R(X,b)), (┐P(H) ∨┐Q(H,a)∨


┐R(Z,g(H,Z)) ∨T(H,Z) ∨S(V))}

8
Forme Clausale

Exemple:
Soit la fbf
G = ((∃X) P(X)) → ┐(((∃Y) Q(Y)) →R)
G ≡((∀X) ┐P(X)) ∨┐(((∀Y)┐Q(Y)) ∨R)
≡((∀X) ┐P(X)) ∨(((∃Y) Q(Y))∧┐R)
≡(∃Y)(∀X) (┐P(X) ∨(Q(Y) ∧┐R)) F.N.Prenex
On remplace Y par une constante a
≡(∀X) (┐P(X) ∨(┐Q(a) ∧┐R))
≡(∀X) ((┐P(X) ∨┐Q(a)) ∧(┐P(X)∨┐R)) f.s.Skolem
=⇒
G ≡{┐P(X)∨┐Q(a) , ┐P(X) ∨┐R}

9
Clauses de Horn
Une clause de Horn: clause possédant au plus un littéral positif.
Trois types de clauses de Horn :

Faits : pas de littéral négatif


P(X, Y, f (X, Z))
Règles : un littéral positif et au moins un littéral négatif
P(X, Y, f (X, Z))∨ ┐Q(X, Y) ∨ ┐R(Y, Z)

Questions : pas de littéral positif


┐Q(X, Y)∨ ┐R(Y, Z)

10
De la logique à Prolog

Définition
Prolog (PROgrammation LOGique) est un langage de
programmation déclarative qui repose sur la logique des
prédicats restreinte aux clauses de Horn.

1. Formule logique: ∀X((∃Z, P(Z, X) ∧ Q(Z))) → Q(X))


2. Forme clausale: Q(X) ∨ ┐P(Z, X) ∨ ┐Q(Z)
3. Clause prolog: q(X) :- p(Z,X), q(Z).

Un programme Prolog est un ensemble de clauses de Horn.

11
De Horn à prolog
Exemple:
Écrire sous forme de clauses Prolog les clauses de Horn
suivantes.
1. P(x, y)
2. P(x, y) ∨ ┐Q(x)
3. P(x, y) ∨ ┐Q(x) ∨ ┐Q(y)
4. ┐Q(x)∨ ┐Q(y)
Remarque (éléments de la syntaxe Prolog)

12
Programmation Logique
prolog

• Langage logique (aussi appelé relationnel) basé sur la


logique du premier ordre restreinte aux clauses de Horn
• Langage déclaratif: dit quoi, non comment
• Langage interprété
• Adapté aux problèmes relevant de l’Intelligence
Artificielle: Planification Raisonnement automatique
(systèmes experts, diagnostic,...) Traitement de la langue
naturelle

13
Programmation Logique
Programme prolog

• un programme consiste en la déclaration d’une série de


faits (base de connaissances) et de règles de déduction.

ohomme(’ali’).
ohomme(’salah’).
ofemme(’fatma’).
ofemme(’zohra’).
Øhumain(X) :- homme(X).
Øhumain(X) :- femme(X).

14
Programmation Logique
Programme prolog

• Pour obtenir une information pouvant être déduite de cette base


de connaissances, on a besoin d’un moteur d’inférence et d’une
requête.
• Le moteur d’inférence met en œuvre une procédure
d’extraction de l’information à partir de la requête.

• L’information extraite est :


- soit explicitement présente dans la base (comme pour les bases
de données)
- soit déduite à partir de données explicitement présentes et de
règles de production qui s’appliquent à ces données (ou à celles
produites par d’autres règles).

15
Programmation Logique
Syntaxe de Prolog : les termes

Définition
un terme est défini par:
• Une variable est un terme
• Une constante est un terme
• f(t1,...,tn) est un terme si f est une fonction à n arguments et
t1,...,tn sont des termes

Exemple
b, Y2, succ(X), f(ass2, f(g(X1), toto)) sont des termes si succ, g et f sont
des symboles de fonctions, b, ass2 et toto sont des constantes et Y2,
X, X1 sont des variables.

16
Programmation Logique
Syntaxe de Prolog : Atomes (formules atomiques)

Définition:
si P est un symbole de prédicat d’arité n =≥ 1 et si t1,...,tn sont
des termes, alors P(t1,...,tn) est un atome (formule atomique)

Exemple:
• Amis(ali, salah)
• Aide(X, Y)
• P(succ(X), Y)

Remarque:
succ(X) n’est pas un atome

17
Programmation Logique
Syntaxe de Prolog : Formules bien formées (fbf)

Définition
Toute fbf est définie par:
• Tout atome est une fbf
• Si A et B sont des fbfs,
alors ┐A, (A→B), (A ↔B), (A ∨B) et (A∧B) sont des fbfs
• Si A est une fbf et si X est une variable quelconque, alors
∀X A(X) et ∃ X A(X) sont des fbfs

18
Programmation Logique
Syntaxe de Prolog : Variable libre et liée

Définition
Une variable X est dite liée dans une fbf si elle est dans le champ
d’un quantificateur (∀X) ou (∃X) ou si elle suit le quantificateur ∀
ou ∃. Autrement X est dite libre

Exemple
• (∀X (∃Y P(X, Y)∧ Q(X, Z)))∧ R(X)
• ∀X ((∃Y Q(X, Y))∧P(X, Y, Z))

Dans le premier exemple X est liée, liée libre, Y est liée liée et Z libre.
Dans le deuxième exemple X est liée liée liée, Y est liée liée libre et Z
est libre.

19
Programmation Logique
Syntaxe de Prolog : les clauses

Une clause correspond à une clause de Horn en logique des prédicats ( c-


à-d une disjonction d’atomes logiques dont un seul maximum peut être
positif).

Une clause p1 ∨ ┐ p2 ∨ ... ∨ ┐ pn peut se réécrire p2 ∧ p3 ∧ …∧ pn → p1

En prolog, on l’écrira sous la forme:


p1 :- p2, ..., pn. où les pi sont des atomes logiques de Prolog.

p1 : est la tête de la clause.


p2, ..., pn : est la queue de la clause.
S’il n’y a qu’un seul atome logique (positif) alors la clause est un fait et
s’écrit: p1. .

20
Programmation Logique
Syntaxe de Prolog : les clauses

L’apparition d’une variable dans un terme implique qu’elle est


quantifiée universellement dans la clause.

Exemple:
ancetre(X, Y) :- parent(X, Z), parent(Z, Y).
équivaut à :
∀ X, Y, Z : parent(X, Z)∧ parent(Z, Y ) → ancetre(X, Y )

21
Programmation Logique
Syntaxe de Prolog : Requête

Étant donné un programme Prolog (un ensemble de clauses),


on peut obtenir un résultat à partir d’une requête formulée
sous la forme d’une conjonction d’atomes logiques
?- p1, ..., pn. .

On demande à Prolog : "Peut-on instancier les variables avec


des termes tels que la requête devient une conséquence
logique du programme ?”

22
Programmation Logique
Syntaxe de Prolog : Requête

Exemple:
?- etudiant(E), date(D), appris(E, coursProlog, D).

A interpréter comme :
∃ E, D : etudiant(E) ∧ date(D) ∧ appris(E, coursProlog, D) ?
Si pas de variable : le moteur va simplement indiquer si la requête
est ou pas une conséquence logique.

23
Programmation Logique
Syntaxe de Prolog : Requêtes

Exemple:
Soit le programme:
homme(socrate).
mortel(X) :- homme(X).
• Les requêtes ?- homme(socrate). ou ?- mortel(socrate).
Retournent oui
• Les requêtes ?- homme(X). ou ?-mortel(X).
Retournent X=socrate.
• Les requêtes ?- homme(aristote). ?- mortel(platon). ou ?-
philosophe(X).
Retournent non

24
Programmation Logique
Substitution

Soit les clause C1 = P(X) v Q (X) et C 2 = ┐P(f(y)) v R(Y)


• On ne peut pas appliquer la résolution, car aucun littéral de C1
n’est la négation
• On voudrait pouvoir substituer f(y) à X dans C1, ce qui
donnerait par résolution Q(X)v R(Y)
• Une substitution consiste à remplacer un nombre fini de
variables par des termes. On note t1/v1, .. , tn/vn la substitution
qui remplace toute variable vi par le terme ti .
• L’application d’une substitution S à un ensemble de clauses E
est appelé instance de E selon S

25
Programmation Logique
Unification

Un ensemble {Ei }i d’expressions est unifiable par σ ou σ est


un unifieur de {Ei }i ssi tous les Ei σ sont identiques.
Nous noterons l’expression produite par un unifieur σ : {Ei }σ.
Exemple:
σ ={ a/X, c/Y, c/V, b/Z, b/U, g(b)/W } est un unifieur de
{Ei }i = {G(X, f(Y), g(b)), G(X,f(c),g(Z)), G(X, f(c), g(U)),
G(X,f(V),W) } puisque toutes les expressions sont instanciées
en G(a, f(c), g(b)).
Remaque:
On peut avoir plusieurs unifieurs pour un ensemble d’expressions
donné

26
Unification
Algorithme d’unification

On appelle l’algorithme par UNIFIER(E, σ). Où σ dénote la substitution


vide. L’algorithme utilise la notion d’ensemble de discordance noté D.
UNIFIER(E, σ)
1. Si E est un singleton ç-à-d tous les éléments sont identiques alors
arrêter en éditant σ comme unifieur.
2. Former l’ensemble D de discordance de E.
3. Si il existe deux éléments V et t de D tel que V est une variable, t un
terme et V ne figure pas dans t alors
début
• σ = σ ◦ {t/V}
• E=E{t/V}
• UNIFIER(E, σ)
fin
4. Arrêter : l’ensemble de départ n’est pas unifiable

27
Exemple
E = {P(a,X,f(g(Y))), P(Z,f(Z),f(U))}

1. E0 = E ; σ0 = ε
2. D0 = {a,Z} avec Z variable et a terme ne contenant pas Z
3. s1 = {a,Z}°σ0 = {a/Z}
E1 = E0.{a/Z} = {P(a,X,f(g(Y))), P(a,f(a),f(U))}
4. D1 = {X,f(a)}, V1 = X, t1 = f(a) terme ne contenant pas X
5. σ2 = {f(a)/X}°{a/Z} = {f(a)/X, a/Z}
E2 = E1.{f(a)/X} = {P(a,f(a),f(g(Y))), P(a,f(a),f(U))}
6. D2 = {g(Y)/U}, V2 = U, t2 = g(Y) terme ne contenant pas U
7. s3 = {g(Y)/U}°σ2 = {g(Y)/U, f(a)/X, a/Z}
E3 = E2.{g(Y)/U } = {P(a,f(a),f(g(Y)))}
8. E3 est un singleton ==> σ3 est l'unifieur de E
donc E est unifiable

28
Résolution

Définition
Soient C1 et C2 deux clauses qui n’ont aucune variable commune.
Soient L1 et L2 deux littéraux de C1 et C2 respectivement. Si L1 et
L2 on un unifieur σ alors la clause C1/L1 union C2/L2 est appelée
résolvant binaire de C1 et C2.
Exemple
• C1= P(a,X) ∨ R(X) et C2 = ┐ P(T, f(T)) v Q(T,T)
{P(a,X), P(T,f(T))} possède un unifieur σ ={a/T, f(a)/X }
• C1= P(a,f(a))∨ R(f(a))
• C2= ┐P(a, f(a)) ∨ Q(a,a)
• C= R(f(a)) ∨ Q(a,a) est le résolvant de C1 et C2.

29
Les termes composés

Un terme composé permet de décrire des données structurées.


• Un terme composé (exemple : date(25,mai,1988)) est
constitué
²d’un atome (date)
²d’une suite de termes (arguments : (1, janvier,2000) ); le
nombre d’arguments (3) est appelé arité
• Le couple atome/arité (date/3) est appelé foncteur du
terme composé correspondant.

30
Exemple de termes composés

Foncteur Terme composé


date/3 date(1,janvier,2000)
état-civil/3 état-civil’(’ab’, ’h’,date(1,mars,1965))
c/2 c(3.4,12.7)

Terme composé ≡ Structure de données

31
Les listes Prolog

Il s’agit en fait d’un cas particulier de terme structuré

Syntaxe:

• [ ] est la liste vide


• [ Tête | Queue ] est la liste où le premier élément est Tête et
le reste de la liste est Queue
• [ a,b,c,3,’Coucou’ ] est une liste de constantes

32
Les listes Prolog

Exemples:

• [X|L] = [a,b,c] donne YES {X=a,L=[b,c]}


• [X|L] = [a] donne YES {X=a,L=[]}
• [X|L] = [] donne NO
• [X,L] = [a,b,c] donne NO
• [X,Y|L] = [a,b,c] donne YES {X=a,Y=b,L=[c]}
• [X|L] = [A,B,C] donne YES {X=A, L=[B,C]}

33
Les listes Prolog

Notations équivalentes pour les listes Prolog

• ’.’(a,’.’(b,’.’(c,[])))
• ≡ [a|[b|[c|[]]]]
• ≡ [a|[b|[c]]]
• ≡ [a|[b,c|[]]]
• ≡ [a|[b,c]]
• ≡ [a,b|[c|[]]]
• ≡ [a,b|[c]]
• ≡ [a,b,c|[]]
• ≡ [a,b,c]

34
Les listes Prolog
Listes imbriquées

Il est possible d’imbriquer les listes :


• [X|L] = [a,[]]. donne YES {X=a, L=[[]]}
• [X|L] = [a,[b,c],d]. donne YES {X=a, L=[[b,c],d]}
• [X] = [a|[]]. donne YES {X=a}
• [X,Y] = [a|[b|[]]]. donne YES {X=a, Y=b}
• [X,Y] = [a|[b]]. donne YES {X=a, Y=b}
• [X,a] = [b,Y]. donne YES {X=b, Y=a}

35
Les listes Prolog
Appartenance à une liste

Le prédicat indiquant si oui ou non un objet appartient à une liste.

appartient(X, [X|_] ).
appartient(Y,[X|L]) :− X \== Y, appartient(Y,L).
Exemples:

• appartient(a, [c, b, a]). → yes


• appartient(d, [c, b, a]). → no
• appartient(X, [c, b, a]). → X = c ; X = b ; X = a ; no

36
Les listes Prolog
Écrire une liste

• Affichages successifs des éléments d’une liste.


• On se sert ici d’un prédicat prédéfini write() qui ne
possède qu’un seul argument.

ecrire([])
ecrire([X | L]) :- write(X), write(’ ’), ecrire(L)
Exemple
ecrire([a, b, c, d]). → a b c d yes

37
Les listes Prolog
Concaténation de listes

• On peut définir la concaténation de deux listes par le


programme suivant:
concatenation([],L,L) .
concatenation([X, L1],L2,[X, L3]) :- concatenation(L1,L2,L3)

• Réussit si la troisième liste est la concaténation de la


première et de la deuxième.
Alors la demande:
?- concatenation([a,b,c], [d,e], R) .
Donne [a,b,c,d,e]

38
Les listes Prolog
Inversion d’une liste

• Réussit si la deuxième liste est l’inverse de la première


renverse([],[]).
• renverse([X|L1],L2) :- renverse(L1,L3), concatenation(L3,[X],L2).
Exemples

o renverse([a,b,[c]],L). donne YES L=[[c],b,a]


o renverse([a,b,c],[X|Y]). donne YES X=c, Y=[b,a]
o renverse([a,b,c,d],[d,c|L]). donne YES L=[b,a]

39
Les listes Prolog
Préfixes d’une liste

Définir les clauses nécessaires à prefix(P, L). où P est une


sous-liste commençante de L, par exemple que prefix([a, b,
c], [a, b, c, d, e]) est vrai.

prefix([],_).
prefix([X | L], [X | M]) :- prefix(L, M).
Exemples
prefix([a, d], [a, b, c, d]) → no
prefix([a, b], [a, b, c, d]) → yes
prefix(P, [a, b, c, d]) → P = [] ; P = [a] ; P = [a, b] ; P = [a, b,c] ;
P = [a, b, c, d] ; no

40
Les listes Prolog
Suffixes d’une liste

Définir les clauses nécessaires à suffixe(S, L). où S est une


sous-liste finissante de L, par exemple que suffixe([d, e], [a, b,
c, d, e]) est vrai.

suffixe(L, L).
suffixe(S, [_ | L]) :- suffixe(S, L).
suffixe([c, d], [a, b, c, d]) → yes
suffixe([a, d], [a, b, c, d]) → no
suffixe(S, [a, b, c, d]).
S = [a, b, c, d] ; S = [b, c, d] ; S = [c, d] ; S = [d] ; S = [] ; no

41
Les listes Prolog
Dernier élément d’une liste

Réussit si le deuxième argument est le dernier élément de la


liste:
dernier([X],X).
dernier([_|L],X) :- dernier(L,X)
Exemples
dernier([a,b,c],[c]) donne YES
dernier([],X) donne NO
dernier(L,a) donne YES L=[a] ou L=[_,a]

42
Les listes Prolog
Insertion dans une liste

Réussit si la deuxième liste est le résultat de l’insertion du


terme dans la première liste.

insert(X,L,[X|L]).
insert(X,[Y|L1],[Y|L2]) :- insert(X,L1,L2).
Exemples
insert(a,[b,c],L) donne YES L=[a,b,c] ou L=[b,a,c] ou L=[b,c,a]
insert(X,[a,b,c],[a,b,d,c]) donne YES X=d
insert(a,L,[b,c,a]) donne YES L=[b,c]

43
Les listes Prolog
Permutation d’une liste

Réussit si la deuxième liste est une permutation de la première.


permutation([],[]).

permutation([X|L1],L2) :- permutation(L1,L3),insert(X,L3,L2).
Exemples
permutation([a,b,c],L) donne YES L=[a,b,c] ou L=[b,a,c]
permutation([a,b,c,d],[c,d,b,a]) donne YES

44
Utilisation de la coupure

Il est possible d’empêcher des retour-arrière au moyen d’un


prédicat prédéfini coupe (cut), noté "!". Si on a une telle coupe dans
la clause suivante:
P :- n1, n2, ... , ! , ... , np .

Tous les choix mémorisés depuis l’appel à la tête de clause jusqu’à


l’exécution du coupe sont supprimés. La coupure peut servir à
interdire l’exploration de certaines branches et à améliorer
l’efficacité d’un programme.

45
Utilisation de la coupure
Soit f définie par : f(x)=
• 0 si X < 3
• 2 si X >= 3, X <6
• 4 si X >=6

On définit un prédicat p(x,y) ⇐⇒ y=f(x)


Par l’ensemble de clauses suivant :
P(X,0) :- X < 3
P(X,2) :- X >= 3, X <6
P(X,4) :- X >=6
Exemple d’exécution: Résoudre ?- p(5, Y).
1.5 < 3 ; échec
2.3=<5, 5<6 ; succès ; avec Y=2
3.6=<5; échec

46
Utilisation de la coupure

On peut s’arrêter en cas de succès, ceci sera fait avec des


coupure:
P(X,0) :- X < 3, !.
P(X,2) :- X >= 3, X <6, ! .
P(X,4) :- X >=6, ! .
L’exécution devient:
1.5 < 3 ; échec
2.3=<5, 5<6 ; succès ; avec Y=2

47

Vous aimerez peut-être aussi