Académique Documents
Professionnel Documents
Culture Documents
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.
3
Forme Clausale
Exemples:
4
Forme Clausale
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
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
Exemple:
7
Forme Clausale
Exemple:
Par exemple, pour l’expression précédente :
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 :
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.
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
13
Programmation Logique
Programme prolog
ohomme(’ali’).
ohomme(’salah’).
ofemme(’fatma’).
ofemme(’zohra’).
Øhumain(X) :- homme(X).
Øhumain(X) :- femme(X).
14
Programmation Logique
Programme prolog
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
20
Programmation Logique
Syntaxe de Prolog : les clauses
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
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
25
Programmation Logique
Unification
26
Unification
Algorithme d’unification
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
30
Exemple de termes composés
31
Les listes Prolog
Syntaxe:
32
Les listes Prolog
Exemples:
33
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
35
Les listes Prolog
Appartenance à une liste
appartient(X, [X|_] ).
appartient(Y,[X|L]) :− X \== Y, appartient(Y,L).
Exemples:
36
Les listes Prolog
Écrire une liste
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
38
Les listes Prolog
Inversion d’une liste
39
Les listes Prolog
Préfixes d’une liste
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
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
42
Les listes Prolog
Insertion dans une 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
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
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
46
Utilisation de la coupure
47