18.02.2013 Views

Systèmes de raisonnement automatique

Systèmes de raisonnement automatique

Systèmes de raisonnement automatique

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Logique <strong>de</strong>s Informations Imparfaites<br />

<strong>Systèmes</strong> <strong>de</strong> Raisonnement Automatique pour les Informations Imparfaites<br />

Intelligence Artificielle<br />

Abduction Induction<br />

\ /<br />

Raisonnement<br />

/ \<br />

Interrogation Déduction<br />

• Formalisation / théorie (logique)<br />

• Modélisation <strong>de</strong> problème<br />

• Développement d'un système<br />

‣ algorithme<br />

‣ heuristique<br />

‣ complexité<br />

Logique classique<br />

‣ incertitu<strong>de</strong><br />

‣ imprécision<br />

‣ exceptions<br />

LC => Raisonnement monotone<br />

IA Raisonnement par défaut (absence d'informations contraires)<br />

• Raisonnement typique<br />

• Règles avec exceptions<br />

Exemple 1<br />

+ tous les oiseaux volent<br />

sauf les autruches (ou les manchots, les jeunes, les oiseaux blessés…)<br />

+ pour un oiseau quelconque<br />

cet oiseau vole<br />

Exemple 2<br />

Tout accusé est présumé innocent sauf s'il est reconnu coupable.<br />

• on saute à la conclusion par <strong>de</strong>ssus un trou d'information<br />

• si l'information se précise et invali<strong>de</strong> la déduction faite, on doit revenir sur cette conclusion<br />

: NON MONOTONIE


II. Limites <strong>de</strong> la logique classique<br />

( ) ⊆ Th( B)<br />

{<br />

{<br />

}<br />

}<br />

La logique classique est monotone : A ⊆ B ⇒ Th A<br />

{ }<br />

{ }<br />

A = a,¬b,¬a ∨ c<br />

Th( A)<br />

= a,¬b,¬a ∨ c,c,…<br />

⎧∀X,oiseau(<br />

X ) → vole( X ) ⎫<br />

⎪<br />

⎪<br />

A = ⎨∀X,autruche(<br />

X ) → ¬vole( X ) ⎬<br />

⎪<br />

⎩<br />

oiseau( titi)<br />

⎪<br />

⎭<br />

A � vole titi<br />

( )<br />

{ ( ) }<br />

( ) ⎫⎪<br />

⎬ �⊥<br />

( )<br />

B = A ∪ autruche titi<br />

B � vole titi<br />

B � ¬vole titi<br />

⎭⎪<br />

B = A ∪ c → e<br />

Th( B)<br />

= B ∪ c,e,…<br />

{ }<br />

C = B ∪ ¬c<br />

Th( C)<br />

= C ∪ { c,⊥,…}<br />

�� � �� =⊥<br />

inconsistant<br />

⎧∀X,oiseau(<br />

X ) ∧ ¬autruche( X ) → vole( X ) ⎫<br />

⎪<br />

⎪<br />

A' = ⎨∀X,autruche(<br />

X ) → ¬vole( X )<br />

⎬<br />

⎪<br />

⎩<br />

oiseau( titi)<br />

⎪<br />

⎭<br />

A' � vole titi<br />

( )<br />

( )<br />

A' � ¬vole titi<br />

On n'obtient pas <strong>de</strong> conclusion "intéressante"<br />

car on n'a pas ¬autruche titi<br />

( )<br />

La logique classique ne permet pas le <strong>raisonnement</strong> par défaut.<br />

III. Limites <strong>de</strong> la programmation logique classique<br />

Soit X = a,b,oiseau( titi),…<br />

{ } un ensemble d'atomes.<br />

Un programme logique défini est un ensemble <strong>de</strong> règles <strong>de</strong> la forme<br />

b ← a 1 ,…,a n n ≥ 0 "j'ai b si j'ai a 1 et … et a n ", b et les a i sont <strong>de</strong>s atomes<br />

( )<br />

A est un ensemble d'atomes clos par rapport à un programme P<br />

si ∀ la règle b ← a 1 ,…,a n ∈P, a 1 ,…,a n<br />

{ } ⊆ A ⇒ b ∈ A<br />

Le modèle <strong>de</strong> Herbrand <strong>de</strong> P noté Cn( P)<br />

est le plus petit ensemble d'atomes clos par rapport à P.<br />

L'opérateur T p : 2 X → 2 X est utilisé pour construire le modèle <strong>de</strong> Herbrand.<br />

T A p ( ) = { b / b ← a ,…,a ∈P et ∀i = 1,…,n a ∈ A<br />

1 n i }<br />

⎧<br />

⎪<br />

⎨<br />

⎩⎪<br />

T p<br />

T p<br />

0<br />

= Ø<br />

k+1 k<br />

= Tp ( Tp ) ∀k ≥ 0<br />

k ( ) = Tp Cn P<br />

�<br />

k≥0


Exemples<br />

⎧a<br />

← . ⎫<br />

⎪ ⎪<br />

P = ⎨b<br />

← a. ⎬<br />

⎪<br />

⎩d<br />

← c. ⎪<br />

⎭<br />

0<br />

T = Ø p<br />

1<br />

T = Tp Ø<br />

p<br />

2<br />

T = Tp a<br />

p { }<br />

3<br />

= Tp a,b<br />

T p<br />

( ) = { a}<br />

( ) = { a,b}<br />

{ }<br />

( ) = a,b<br />

Cn( P)<br />

= { a,b}<br />

{ a,b,c,d } et a,b<br />

{ a},<br />

{ b},<br />

c,d<br />

{ }←⎯ ⎯ point fixe<br />

⎧non_vole(<br />

X ) ← autruche( X ). ⎫<br />

⎪<br />

⎪<br />

P = vole X<br />

1 ⎨ ( ) ← oiseau( X ). ⎬<br />

⎪<br />

⎩<br />

oiseau( titi).<br />

⎪<br />

⎭<br />

{ } sont clos par rapport à P.<br />

{ } et Ø ne sont pas clos par rapport à P.<br />

Cn P 1<br />

P = P ∪ autruche titi<br />

2 1 { ( ) } Cn( P2 ) =<br />

⎧non_vole(<br />

X ) ← autruche( X ). ⎫<br />

⎪<br />

⎪<br />

P = vole X<br />

3 ⎨ ( ) ← oiseau( X ),non_ autruche( X ). ⎬<br />

⎪<br />

⎩<br />

oiseau( titi).<br />

⎪<br />

⎭<br />

Prolog et la négation par l'échec (negation by failure)<br />

⎧⎪<br />

vole( X ) : − oiseau( X ),not autruche( X ) a : − b.<br />

⎨<br />

⎩⎪ oiseau( titi<br />

b : − a.<br />

).<br />

a?<br />

↓<br />

vole( titi)<br />

? OK.<br />

b?<br />

↓<br />

↓<br />

oiseau( titi)<br />

,not autruche( titi)<br />

a?<br />

������� � ��������� �<br />

OK<br />

not OK<br />

������������ �<br />

↓<br />

OK<br />

b?<br />

↓<br />

…<br />

Il existe <strong>de</strong>ux formes <strong>de</strong> négation :<br />

• la négation forte (¬ a) e.g. traverser_rails si ¬ train<br />

• la négation faible (not a) e.g. traverser_rails si not train<br />

{ ( ),vole( titi)<br />

}<br />

( ) = oiseau titi<br />

⎧oiseau(<br />

titi),autruche(<br />

titi),<br />

⎫<br />

⎪<br />

⎪<br />

⎨vole(<br />

titi),non_vole(<br />

titi)<br />

⎬<br />

⎪�����������������<br />

� ⎪<br />

⎩<br />

contradition ⎭<br />

{ }<br />

( ) = oiseau( titi)<br />

Cn P3 Problème : il manque vole titi<br />

⎧a<br />

← b. ⎫<br />

P = ⎨ ⎬<br />

⎩b<br />

← a. ⎭<br />

Cn( P)<br />

= Ø<br />

( )<br />

Sémantique déclarative


IV. Programmes logiques normaux et sémantique <strong>de</strong>s modèles stables<br />

M. Gelford et V. Lifschitz, 1988<br />

Soit X un ensemble d'atomes.<br />

Un programme logique normal pln<br />

c<br />

� ← a1 ,…,an �� � �� ,not b1 ,…,not b n ≥ 0, m ≥ 0, c, a , b ∈ X<br />

m<br />

i j ������� tête<br />

corps +<br />

corps −<br />

( ) P est un ensemble <strong>de</strong> règles <strong>de</strong> la forme<br />

"Si j'ai chaque a i et aucun b j alors je peux conclure c."<br />

Le réduit d'un pln P par rapport à un ensemble d'atomes A est le programme linéaire défini<br />

P A = r + / r ∈P,corps − { ( r)<br />

∩ A = Ø}<br />

r + : tête( r)<br />

← corps + ( r)<br />

i.e. la partie positive <strong>de</strong>s règles <strong>de</strong> P qui ne sont pas bloquées par A.<br />

Définition (règle bloquée)<br />

Une règle r est bloquée par un ensemble d'atomes A si corps− r<br />

Exemple<br />

La règle r : c ← a,b,not e,not d est bloquée par a,e<br />

( ) ∩ A ≠ Ø.<br />

{ } mais n'est pas bloquée par b,k<br />

Définition (modèle stable)<br />

S<br />

Soit P un pln et S un ensemble d'atomes. S est un modèle stable <strong>de</strong> P si S = Cn( P ).<br />

Exemples<br />

⎧a<br />

← not b. ⎫<br />

P = 1 ⎨ ⎬<br />

⎩b<br />

← not a. ⎭<br />

S = Ø<br />

S ⎧a<br />

← . ⎫<br />

P = 1 ⎨ ⎬<br />

⎩b<br />

← . ⎭<br />

S = a<br />

S<br />

= a ← .<br />

S = b<br />

{ } P1 { } P1 { } P1 S = a,b<br />

P a 2 modèles stables : a<br />

1 { } et { b}<br />

⎧a<br />

← . ⎫<br />

⎪<br />

⎪<br />

P = c ← a,not b.<br />

2 ⎨<br />

⎬<br />

⎪<br />

⎩d<br />

← not c,not f. ⎪<br />

⎭<br />

S = { a,c}<br />

P2 P a un seul et unique modèle stable : a,c<br />

2 { }<br />

S ⎧a<br />

← . ⎫<br />

= ⎨ ⎬<br />

⎩c<br />

← a. ⎭<br />

S<br />

Cn( P1 ) = a,b<br />

{<br />

{<br />

}<br />

}<br />

S<br />

Cn( P1 ) = { a}<br />

= S<br />

S<br />

Cn( P1 ) = { b}<br />

= S<br />

{ }.<br />

{ } ≠ S<br />

S<br />

= b ← .<br />

S<br />

= Ø<br />

S<br />

Cn( P1 ) = Ø ≠ S<br />

S<br />

Cn( P2 ) = { a,c}<br />

= S


{ } S = Ø P S<br />

= a ← .<br />

3<br />

P 3 = a ← not a.<br />

S = a<br />

{ } P 3<br />

P 3 n'a pas <strong>de</strong> modèle stable.<br />

⎧b<br />

← not aa. ⎫<br />

⎪<br />

⎪<br />

P = c ← b,not bb.<br />

4 ⎨<br />

⎬<br />

⎪<br />

⎩aa<br />

← c,not cc. ⎪<br />

⎭<br />

P 4 n'a pas <strong>de</strong> modèle stable.<br />

S<br />

{ } Cn( P3 ) = a<br />

S<br />

= Ø<br />

{ } ≠ S<br />

S<br />

Cn( P3 ) = Ø ≠ S<br />

S<br />

S = Ø P = 4<br />

S = { b,c,aa}<br />

P4 ⎧b<br />

← . ⎫<br />

⎪ ⎪<br />

⎨c<br />

← b. ⎬<br />

⎪<br />

⎩aa<br />

← c. ⎪<br />

⎭<br />

S ⎧c<br />

← b. ⎫<br />

= ⎨ ⎬<br />

⎩aa<br />

← c. ⎭ Cn P S ( 4 ) = Ø ≠ S<br />

⎧⎪<br />

vole( X ) ← oiseau( X ),not autruche( X ). ⎫⎪<br />

P = 5 ⎨<br />

⎬<br />

⎩⎪ oiseau( titi).<br />

⎭⎪<br />

⎧<br />

S ⎪vole<br />

S = { oiseau( titi),vole(<br />

titi)<br />

}<br />

( X ) ← oiseau( X ). ⎫⎪<br />

P = 5 ⎨<br />

⎬<br />

⎩⎪ oiseau( titi).<br />

⎭⎪<br />

P a un unique modèle stable : oiseau titi<br />

5 ( ),vole( titi)<br />

{ }<br />

P = P ∪ autruche titi<br />

6 ( )<br />

{ }<br />

⎧<br />

S ⎪oiseau<br />

S = { oiseau( titi),autruche(<br />

titi)<br />

}<br />

( titi).<br />

⎫⎪<br />

P = 6 ⎨<br />

⎬<br />

⎩⎪ autruche( titi).<br />

⎭⎪<br />

P a un unique modèle stable : oiseau titi<br />

6 ( ),autruche titi<br />

=> NON MONOTONE<br />

{ ( ) }<br />

S<br />

Cn( P4 ) = { b,c,aa}<br />

≠ S<br />

S<br />

Cn( P5 ) =<br />

( ) =<br />

S<br />

Cn P6 ( )<br />

⎧⎪<br />

oiseau titi ⎫⎪<br />

⎨ ⎬ = S<br />

⎩⎪ vole( titi)<br />

⎭⎪<br />

( )<br />

( )<br />

⎧⎪<br />

oiseau titi ⎫⎪<br />

⎨<br />

⎬ = S<br />

⎩⎪ autruche titi<br />

⎭⎪<br />

Extension <strong>de</strong> Gelford Lifschitz, 1991 — Programmes logiques étendus (ple)<br />

cf. Answer set semantics<br />

Soit X un ensemble <strong>de</strong> littéraux a ou ¬a<br />

( ).<br />

On peut se ramener à un programme logique normal :<br />

1. on remplace tout littéral négatif ¬x par non_ x<br />

2. on ajoute les règles bug ← x,non_ x,not bug bug est un nouveau symbole<br />

( )<br />

On obtiendra les modèles stables qui correspon<strong>de</strong>nt aux ensembles <strong>de</strong> réponses consistants<br />

du ple d'origine<br />

ple -> pln<br />

|<br />

s1 -> as1<br />

sn -> asn


Exemple<br />

⎧vole(<br />

X ) ← oiseau( X ),not autruche( X ). ⎫<br />

⎪<br />

⎪<br />

⎪¬vole(<br />

X ) ← autruche( X ).<br />

⎪<br />

⎪<br />

⎪<br />

P = ⎨oiseau(<br />

titi).<br />

⎬<br />

⎪oiseau(<br />

toto<br />

⎪<br />

).<br />

⎪<br />

⎪<br />

⎩⎪<br />

autruche( titi).<br />

⎭⎪<br />

P ′ =<br />

Exercice<br />

⎧vole(<br />

X ) ← oiseau( X ),not autruche( X ). ⎫<br />

⎪<br />

⎪<br />

⎪non_vole(<br />

X ) ← autruche( X ).<br />

⎪<br />

⎪oiseau(<br />

titi).<br />

⎪<br />

⎨<br />

⎬<br />

⎪oiseau(<br />

toto).<br />

⎪<br />

⎪autruche(<br />

titi).<br />

⎪<br />

⎪<br />

⎪<br />

⎩⎪<br />

bug( X ) ← vole( X ),non_vole( X ),not bug( X ).<br />

⎭⎪<br />

⎧p<br />

: − q,not np. ⎫<br />

⎪np<br />

: − r,not p. ⎪<br />

⎪<br />

⎪<br />

Quels sont les modèles stables <strong>de</strong> P = ⎨q<br />

: − a. ⎬ ?<br />

⎪r<br />

: − a. ⎪<br />

⎪<br />

⎩a.<br />

⎪<br />

⎭<br />

A = Cn P A ( ) P A ⊇<br />

A = { a,q,r,p,np }?<br />

⎧q<br />

: − a. ⎫<br />

⎪ ⎪<br />

⎨r<br />

: − a. ⎬<br />

⎪<br />

⎩a.<br />

⎪<br />

⎭<br />

A = a,q,r,p<br />

1 { } P A ⎧p<br />

: − q. ⎫<br />

⎪q<br />

: − a. ⎪<br />

1 = ⎨ ⎬<br />

⎪<br />

r : − a.<br />

⎪<br />

⎩⎪<br />

a. ⎭⎪<br />

A est un modèle stable <strong>de</strong> P.<br />

1<br />

A = a,q,r,np<br />

2 { } P A ⎧np<br />

: − r. ⎫<br />

⎪q<br />

: − a. ⎪<br />

2 = ⎨ ⎬<br />

⎪<br />

r : − a.<br />

⎪<br />

⎩⎪<br />

a. ⎭⎪<br />

A est un modèle stable <strong>de</strong> P.<br />

2<br />

P ′ a un modèle stable unique :<br />

⎧oiseau(<br />

titi),oiseau(<br />

toto),<br />

⎫<br />

⎪<br />

⎪<br />

⎨autruche(<br />

titi),vole(<br />

toto),<br />

⎬<br />

⎪<br />

⎩<br />

non_vole( titi)<br />

⎪<br />

⎭<br />

Cn P A<br />

⎛ ⎧q<br />

: − a. ⎫⎞<br />

( ) ⊇ Cn⎜<br />

⎪ ⎪<br />

⎨r<br />

: − a. ⎬<br />

⎟<br />

⎜<br />

⎝ ⎪<br />

⎩a.<br />

⎪<br />

⎟<br />

⎭⎠<br />

Cn P A1 ( ) = { a,q,r,p } = A1 Cn P A2 ( ) = { a,q,r,np } = A2 = { a,q,r}


Représentation (Nixon diamond, paradoxe <strong>de</strong> Nixon)<br />

• p : pacifiste<br />

• np : non pacifiste<br />

• q : quaker<br />

• r : républicain<br />

• a : américain<br />

L’intersection <strong>de</strong>s modèles stables est un ensemble <strong>de</strong> conclusions sceptiques (pru<strong>de</strong>ntes).<br />

Chaque modèle stable est un ensemble <strong>de</strong> conclusions crédules.<br />

“Il existe une transformation modulaire <strong>de</strong> tout problème SAT en un programme logique<br />

normal. L’inverse n’est pas vrai.”<br />

Démonstration<br />

Une transformation τ <strong>de</strong> pln vers SAT<br />

( ) est modulaire si pour un pln P donné<br />

( ) ∪ F est satisfiable.<br />

et tout ensemble d'atomes <strong>de</strong> faits F, P ∪ F a un modèle stable ssi τ P<br />

pln<br />

P<br />

P ∪ F<br />

τ<br />

⎯ →⎯<br />

SAT<br />

τ P<br />

( )<br />

( ) ∪ F<br />

τ P<br />

Contre-exemple<br />

Soit P = { a : − not a}.<br />

Supposons que τ soit modulaire.<br />

P n'a pas <strong>de</strong> modèle stable ⇒ τ ( P)<br />

n'a pas <strong>de</strong> modèle ( i.e. non satisfiable).<br />

⎧a<br />

: − not a⎫<br />

Or P ∪ { a}<br />

= ⎨ ⎬ a un modèle stable : { a}<br />

mais τ ( P)<br />

∪ a<br />

⎩a.<br />

⎭<br />

Donc ∃ <strong>de</strong> transformation modulaire <strong>de</strong> pln vers SAT.<br />

Inversement, <strong>de</strong> SAT vers pln<br />

{ } n'est pas satisfiable.<br />

Tout ensemble <strong>de</strong> formules <strong>de</strong> la logique propositionnelle peut se mettre sous la forme<br />

d’un ensemble <strong>de</strong> clauses Σ = c ∧ … ∧ c où ∀i = 1…n, c 1 n i =<br />

1<br />

x<br />

�i ∨ … ∨ x k−i<br />

i<br />

Exemple<br />

⎧a<br />

∨ b ∨ ¬c ⎫<br />

⎪<br />

⎪<br />

Σ = ⎨¬a<br />

∨ b ∨ ¬d ⎬<br />

⎪<br />

⎩¬b<br />

∨ c ∨ d ⎪<br />

⎭<br />

Σ<br />

?<br />

⎯ →⎯ P( Σ)<br />

une solution est ( a,b,c,d ) = ( T,T,T,T )<br />

littéral a ou ¬a<br />

Toute clause a 1 ∨ … ∨ a n ∨ ¬b 1 ∨ … ∨ ¬b m , n + m > 0 est transformée en une règle<br />

faux : − b 1 ,…,b m ,not a 1 ,…,not a n


Pour toute variable propositionnelle x, on crée 2 règles :<br />

⎧x<br />

: − not nx<br />

⎨<br />

⎩nx<br />

: − not x<br />

On ajoute une règle qui interdit les interprétations qui ne satisfont pas toutes les clauses :<br />

bug : – condition_ incorecte( i.e. faux),<br />

not bug.<br />

Soit A un modèle stable <strong>de</strong> P( Σ)<br />

alors x ∈ A ⇒ i( x)<br />

= V et<br />

⎧⎪<br />

x ∉ A ⇒ i x<br />

⎨<br />

⎩⎪ nx ∈ A ⇒ i x<br />

Démonstration<br />

− ∀A le modèle stable <strong>de</strong> P( Σ),<br />

faux ∉ A à cause <strong>de</strong> la règle bug : – faux,not bug<br />

– on a x ∈ A et nx ∉ A<br />

( ) = F<br />

( ) = F<br />

( )<br />

( ) ou ( x ∉ A et nx ∈ A)<br />

( à cause <strong>de</strong>s règles x : − not nx, nx : - not x)<br />

– Soit A un modèle stable <strong>de</strong> P Σ<br />

∃i ∈ 1…m<br />

( ). ∀ la règle faux : − b 1 ,…,b m ,not a 1 ,…,not a n on a<br />

{ } tel que b ∉ A ou ∃j ∈ 1…n<br />

i { } tel que a ∉ A j<br />

⇒ ∃i ∈{ 1…m}<br />

tel que nb ∈ A ou ∃j ∈ 1…n<br />

i { } tel que a ∈ A j<br />

⇒ ∃i ∈{ 1…m}<br />

tel que v ( bi ) = faux ou ∃j ∈{ 1…n}<br />

tel que v aj ⇒ i( a ∨ … ∨ a ∨ ¬b ∨ … ∨ ¬b 1 n 1 m ) = vrai<br />

⇒ ∀ la clause c ∈ Σ, v ( c)<br />

= vrai<br />

⇒ v est un modèle <strong>de</strong> Σ<br />

– Soit v un modèle <strong>de</strong> Σ. On définit A = x / v x<br />

Σ<br />

Σ ∪ a<br />

∀ la clause a 1 ∨ … ∨ a n ∨ ¬b 1 ∨ … ∨ ¬b m ∈ Σ<br />

{ ( ) = vrai}<br />

∪ nx / v ( x)<br />

= faux<br />

{ }<br />

( ) = faux<br />

∃i ∈{ 1,…,n } tel que v ( ai ) = vrai ou ∃j ∈{ 1,…,m } tel que v bj ⇒ ∃i ∈{ 1,…,n } tel que a ∈ A ou ∃j ∈ 1,…,m<br />

i { } tel que nb ∈ A j<br />

⇒ ∃i ∈{ 1,…,n } tel que a ∈ A ou ∃j ∈ 1,…,m<br />

i { } tel que b ∉ A j<br />

P( Σ)<br />

A { x / x ∈ A}<br />

∪ { nx / nx ∈ A}<br />

= �{<br />

faux : − b ,…,b / ∃j ∈ 1,…,m<br />

1 m { } b ∉ A j } ∪ { bug : − faux. }<br />

Cn P( Σ)<br />

A<br />

= A ⇒ A est un modèle stable <strong>de</strong> P( Σ)<br />

{ }<br />

{ }<br />

Σ ∪ ¬b<br />

( )<br />

⎯ →⎯<br />

P( Σ)<br />

( ) ∪ { faux : − not a. }<br />

P( Σ)<br />

∪ { faux : − b. }<br />

P Σ<br />

( ) = vrai<br />

Résultat<br />

Déterminer si un pln possè<strong>de</strong> (ou non) un modèle stable est un problème NP-complet.<br />

Comme on peut le “co<strong>de</strong>r”, il existe une transformation polynomiale <strong>de</strong> SAT vers un pln.


La complexité est au moins celle <strong>de</strong> SAT.<br />

Soit A l’ensemble <strong>de</strong>s atomes apparaissant dans un pln. ∀A ∈2 A ( ∀A ⊆ A),<br />

tester si A est un modèle stable <strong>de</strong> P, i.e. si A = Cn P A ( ), se réalise en temps polynomial.<br />

La complexité du problème est au moins NP.<br />

Variables dans les règles<br />

Les symboles <strong>de</strong> fonctions ne sont pas permis.<br />

e.g. f ( 0),<br />

g( f ( 0),f<br />

( 0)<br />

), succ 0<br />

( ) = 1, succ succ( 0)<br />

( ) = 2 ne sont pas permis.<br />

Gar<strong>de</strong>r un ensemble fini <strong>de</strong> constantes pour gar<strong>de</strong>r la décidabilité<br />

Toute règle avec <strong>de</strong>s variables est remplacée par un ensemble <strong>de</strong> règles instanciées<br />

(ground) où chaque variable est remplacée par l’une <strong>de</strong>s constantes du langages.<br />

⎧q(<br />

1),<br />

q( 2),<br />

r( 1,3)<br />

⎫<br />

⎪<br />

⎪<br />

⎪p(<br />

1)<br />

: − q( 1),not<br />

r( 1,1)<br />

⎪<br />

⎪p(<br />

1)<br />

: − q( 1),not<br />

r( 1,2)<br />

⎪<br />

⎪<br />

⎪<br />

⎧p(<br />

X ) : − q( X ),not r( X,Y ) ⎫ ⎪p(<br />

1)<br />

: − q( 1),not<br />

r( 1,3)<br />

⎪ ⎧⎪<br />

q( 1),q<br />

( 2),r<br />

( 1,3)<br />

⎫⎪<br />

⎪<br />

⎪<br />

⎪q(<br />

1).<br />

⎪<br />

⎪<br />

⎪p(<br />

2)<br />

: − q( 2),not<br />

r( 2,1)<br />

⎪ ⎨<br />

⎬<br />

⎪<br />

P = ⎨<br />

⎬ ⎯ →⎯ P = ⎨<br />

⎬ ⇒ ⎩⎪ p( 1),p<br />

( 2)<br />

⎭⎪<br />

⎪r(<br />

1,3).<br />

⎪ ⎪p(<br />

2)<br />

: − q( 2),not<br />

r( 2,2)<br />

⎪ est le modèle<br />

⎪<br />

⎩<br />

q( 2).<br />

⎪ ⎪<br />

⎭<br />

p( 2)<br />

: − q( 2),not<br />

r( 2,3)<br />

⎪ stable <strong>de</strong> P<br />

⎪<br />

⎪<br />

⎪p(<br />

3)<br />

: − q( 3),not<br />

r( 3,1)<br />

⎪<br />

⎪p(<br />

3)<br />

: − q( 3),not<br />

r( 3,2)<br />

⎪<br />

⎪<br />

⎪<br />

⎩⎪<br />

p( 3)<br />

: − q( 3),not<br />

r( 3,3)<br />

⎭⎪<br />

Answer Set Programming<br />

Co<strong>de</strong>r un problème combinatoire par un programme logique normal.<br />

Exemple : 3-coloration d’un graphe (syntaxe lparse)<br />

vert(1), rouge(4), bleu(2), vert(3)<br />

• Règles : décrivant les données du problème<br />

sommet(1..4). arete(1,2). arete(2,3). arete(3,4). arete(1,4).<br />

• Espace <strong>de</strong> recherche : toutes les combinaisons possibles<br />

rouge(X ) : − sommet(X ), not bleu(X ), not vert(X ).<br />

vert(X ) : − sommet(X ), not rouge(X ), not bleu(X ).<br />

bleu(X ) : − sommet(X ), not vert(X ), not rouge(X ).<br />

• Contraintes à satisfaire<br />

bug : − arete(X,Y ), rouge(X ), rouge(Y ), not bug.<br />

bug : − arete(X,Y ), vert(X ), vert(Y ), not bug.<br />

bug : − arete(X,Y ), bleu(X ), bleu(Y ), not bug.


Algorithmes pour solveur ASP<br />

pln → SAT et utiliser un solveur SAT<br />

Algorithme <strong>de</strong> type backtrack sur un arbre <strong>de</strong> recherche binaire où les points <strong>de</strong> choix sont<br />

les “atomes” (cf. smo<strong>de</strong>ls, dlv). Après chaque choix, on a <strong>de</strong>s phases <strong>de</strong> propagation :<br />

{ } et la règle c : − r, not b.<br />

alors c doit être ajouté et la branche not c n’a pas à être explorée { a, c, not b}<br />

− Si on a a, not b<br />

{ } et une seule règle d : − not a.<br />

alors on peut choisir la branche not d et ignorer la branche d.<br />

− Si on a a, not b<br />

Points <strong>de</strong> choix sur les règles<br />

r est bloquée par A si corps – ( r)<br />

∩ A ≠ Ø<br />

r est supportée par A si corps + ( r)<br />

⊆ A<br />

R est un ensemble <strong>de</strong> règles enracinées si R = ri i∈I<br />

( { } )<br />

tel que ∀i ∈I, r i est supportée par Tête r i ,…,r i−1<br />

Exemple<br />

R1 R2 R3 R4 R i i=1…4<br />

a.<br />

b : − a, not c.<br />

1<br />

b : − a, not d.<br />

2<br />

e : − b , b . 1 2<br />

est enraciné<br />

Soit P un programme logique normal et A un ensemble d’atomes.<br />

L’ensemble <strong>de</strong>s règles génératrices <strong>de</strong> P par rapport à A est :<br />

GR( P,A)<br />

= { r ∈P / r est supportée par A et non bloquée par A}<br />

Résultat<br />

( ) est enraciné<br />

( ) +<br />

⎧GR<br />

P,A<br />

⎪<br />

A est un modèle stable <strong>de</strong> P ⇔ ⎨<br />

A = Cn GR P,A<br />

⎩<br />

⎪<br />

( )<br />

Algorithme<br />

Construire un ensemble maximal enraciné <strong>de</strong> règles qui ne se bloquent pas.<br />

Tête R<br />

( ) = modèle stable cherché

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!