Transcript MIA – TME 4
1
MOTEUR DE PLANIFICATION STRIPS EN PROLOG
MIA – TME 4
Planification STRIPS en prolog
L’objectif de cette s´eances de TME est de programmer un moteur de planification STRIPS en
utilisant le langage Prolog.
1
Moteur de planification STRIPS en Prolog
Il s’agit de programmer l’algorithme de planification en chaˆınage arri`ere STRIPS vu en TD. On
rappelle que ce dernier se base sur trois ´el´ements : une pile de buts, un ´etat courant et un plan en
cours. Il s’agit de traiter la pile de buts avec les trois op´erations suivantes :
– Retrait : retirer le but s’il est d´ej`
a r´ealis´e dans la situation courante.
– D´eveloppement : remplacer le but par une action qui le r´ealiserait, en rajoutant les pr´econditions
de l’action avec celle-ci
– Ex´ecution : si le but est une action, l’ex´ecuter dans l’´etat courant, et mettre ainsi `a jour le plan
en cours et l’´etat courant avant de retirer l’action de la pile de buts.
Le seul point de choix de l’algorithme est donc l’op´eration de D´eveloppement. Il s’agira donc de bien
ce ce choix, en permettant des backtrack pour tester les autres options. En particulier, chaque action a
des param`etres qu’il faut instantier correctement. Le premier exercice se concentre sur l’instantiation
et le choix d’une action correcte pour un but donn´e. Nous verrons ensuite comment r´ealiser le moteur,
en traitant d’abord le d´eveloppement et les autres op´erations.
Exercice 1 - Choix et instantiation d’une action.
Une action sera repr´esent´ee par un fait action(Action, LPrecond, LDel, LAdd, LConstr), ou
Action est le nom de l’action (avec ses param`etres variables), LPrecond la liste de ses pr´e-conditions,
LDel la listes des pr´edicats retir´es par l’action, Ladd la liste des pr´edicats ajout´es par l’action et
LConstr la liste des contraintes sur les variables. Par exemple, on pourrait repr´esenter une action de
d´eplacement de X vers Y comme suit :
action(SeDeplacer(X,Y),[position(X)],[position(X)],[position(Y)],[X\=Y]).
L’id´ee est de choisir une action dont la liste LAdd contient un ´el´ement unifiable au but courant. Il
faut alors instantier le reste des variables et param`etres de l’action pour pouvoir l’appliquer. Pour ce
faire, on teste toutes les instantions des variables `a partir de l’´etat courant.
1. Programmer un pr´edicat diffs(+LVar, +LVal,-Diff) qui renvoie une liste Diff=LVal\LVar
correspondant `
a une instantiation (possiblement partielle) des variables de LVar, le backtrack
devant permettre de tester toutes les instantiations (quitte `a en avoir trop comme sur le 3`eme
exemple). Ainsi on doit obtenir :
?- diffs([p(X),q(X)],[p(a),q(b)],Res).
X = a, Res = [q(a)] ;
X = b, Res = [p(b)] ;
Res = [p(X),q(X)] ;
?- diffs([p(X),q(Y)],[p(a),q(b)],Res).
X = a, Y = b, Res = [] ;
X = a, Res = [q(Y)] ;
Y = b, Res = [p(X)] ;
Res = [p(X),q(Y)] ;
?- diffs([p(X),q(X)],[p(a),p(b),q(b)],Res).
X = a, Res = [q(a)] ;
X = b, Res = [] ;
Charg´es de TD/TME : BOURGNE Gauvain, BAZIN Alexandre
Responsable du cours : GANASCIA Jean-Gabriel
1
2
X = b, Res = [q(b)] ; ou
X = b, Res = [p(b)] ; ou
Res = [p(X),q(Y)] ;
APPLICATION ET TEST
X = b, Res = [] ;
X = b, Res = [] ;
On se servira du pr´edicat member(X,L).
2. Programmer un pr´edicat instantiate(+Act,+PreCond,+Etat,-RemainingPreCond) qui ´etant
donn´e une action Act avec une pr´e-condition PreCond, et un ´etat courant Etat, renvoie, pour
chaque instantiation compl`ete des variables de PreCond faite en s’appuyant sur l’´etat, la liste
RemainingPreCond des pre-conditions qu’il resterait `a assurer avant de pouvoir appliquer l’action
dans l’´etat courant.
On utilisera le pr´edicat Diffs/3 et le pr´edicat term variables(+T,-L), qui permet de r´ecup´erer
la liste L des variables (libres) qui apparaissent dans le terme T.
3. Programmer un pr´edicat checkConstr(+ConstraintList) qui n’est v´erifi´e que si toutes les
conditions/contraintes de la liste ConstraintList sont v´erifi´ees. Les contraintes sont donn´ees
sont la forme de conditions portant sur des variables, qu’on supposera avoir ´et´e instanci´ees `
a
une ´etape pr´ec´edente. On pourra utiliser le pr´edicat call(+C) pour v´erifier qu’une condition
C est v´erifi´ee. Dans notre exemple d’action de d´eplacement, par exemple, si l’on a d´ej`a tent´e
d’instantier les variables X et Y , la condition C=X\=Y a donc ´et´e instanti´ee en, par exemple
a\=b ou a\=a. Un appel `
a call(C) r´eussira dans le premier cas et ´echouera dans le second.
4. Programmer un pr´edicat trouverAction(+Etat,+But,-Act,-RemainingPreCond,-FullPreCond)
qui, ´etant donn´e un ´etat courant Etat, cherche une action Act permettant de r´ealiser le but
But, en donnant aussi les pr´e-conditions instanti´ees de cette action : aussi bien celles qui restent `a v´erifier vis `
a vis de l’´etat courant (RemainingPreCond) que les pr´e-conditions instanti´ees
compl`etes (FullPreCond).
Exercice 2 - Algorithme de planification.
1. Programmer un pr´edicat appliquerAction(+Etat, +Act, -NouvelEtat), qui d´etermine le nouvel ´etat NouvelEtat, obtenu en appliquant l’action Act `a l’´etat Etat. On pourra utiliser les
pr´edicats prolog subtract(L,Sub,LRes) et union(L1,L2,LRes) pour retrancher ou ajouter des
´el´ements `
a une liste.
2. Programmer un pr´edicat afficherOp(+Codeop, +Etat, +Buts, +Plan, +But) qui affiche une
´etape de r´esolution (Retrait, D´eveloppement ou Ex´ecution) avec les d´etails utiles au d´ebuggage.
3. Programmer un pr´edicat resoudre(+Etat,+Buts,+PlanCourant,-PlanFinal), qui trouve un
plan en fonction de l’´etat, de la listes de buts et du plan courant. Selon les cas, il applique l’une
des ´etapes de r´esolution possible. On peut l’´ecrire en une r`egle par type de r´esolution, plus une
r`egle de terminaison pour r´ecup´erer le plan final.
4. Programmer un pr´edicat plan(-Plan), qui trouve un plan permettant de rejoindre l’´etat final donn´e par le pr´edicat etat final(+F) en partant de l’´etat initial donn´e par le pr´edicat
etat initial(+I). Ces deux pr´edicats seront d´efinis ult´erieurement en fonction du probl`eme.
2
Application et test
Exercice 3 - Singe et banane simplifi´
e.
On consid`ere une version simple du probl`eme du singe et des bananes. Pour les constantes, on
a trois positions : a, b, c, un singe singe, une caisse caisse et des bananes bananes. Les pr´edicats
utilis´es pour repr´esenter les ´etats sont :
– position(O,L) indiquant que l’objet O (singe, caisse ou bananes) est `a l’emplacement L (a,b,
ou c).
– posssede(I,O) indiquant que l’individu I (singe) poss`ede l’objet O (bananes).
Initialement, le singe est en position a, les bananes en b et la caisse en c.
On definit 3 actions :
– d´
eplacer(P,Q) qui permet au singe d’aller de l’emplacement P `a l’emplacement Q.
Charg´es de TD/TME : BOURGNE Gauvain, BAZIN Alexandre
Responsable du cours : GANASCIA Jean-Gabriel
2
2
APPLICATION ET TEST
– pousser(U,V) qui permet au singe de pousser la caisse depuis l’emplacement U vers l’emplacement V. Le singe doit initialement ˆetre `a cˆot´e de la caisse (mˆeme emplacement).
– cueillir bananes(U) qui permet au singe de cueillir de cueillir des bananes `a l’emplacement
U en montant sur une caisse. Il faut pour cela que le singe et la caisse soit sous les bananes.
1. Ecrire un pr´edicat etat initial(+I), qui d´efinit l’´etat initial.
u le singe poss`ede les bananes.
2. Ecrire un pr´edicat etat final(+F), qui d´efinit l’´etat final o`
3. Ecrire les pr´edicats act(+Act, +Pre,+Ldel, +Ladd,+LContraintes) pour d´efinir les 3 actions
consid´er´ees.
4. Obtenir un plan en appelant le pr´edicat plan(P) d´efinit pr´ec´edemment. G´en´erer plusieurs plans
en backtrackant. Regarder l’influence de l’ordre des listes de pr´econditions dans les actions sur
l’ex´ecution de l’algorithme.
Exercice 4 - Singe et banane complet.
On prend maintenant la version du singe et des bananes vue en TD (avec des pr´edicats niveau,
des actions prendre et monteCaisse, etc...).
1. Ecrire un pr´edicat etat initial(+I), qui d´efinit l’´etat initial.
2. Ecrire un pr´edicat etat final(+F), qui d´efinit l’´etat final o`
u le singe poss`ede les bananes.
3. Ecrire les pr´edicats action(+Act, +Pre,+Ldel, +Ladd,+LContraintes) pour d´efinir les 3 actions consid´er´ees.
4. Obtenir des plans en appelant le pr´edicat plan(P) d´efinit pr´ec´edemment. Que constate-t-on ?
Comment l’expliquez vous ? Comment le corriger ?
5. Comparer votre algorithme avec l’algorithme propos´e en cours
(http://www-poleia.lip6.fr/ ganascia/MIA., t´el´echarger le fichier singe.pl). quels sont
les principales diff´erences ? Changer les actions et les pr´edicats d’´etats initiaux et finaux pour
mod´eliser le probl`eme du singe et des bananes dans sa version vue en TD, et ex´ecuter le programme.
Charg´es de TD/TME : BOURGNE Gauvain, BAZIN Alexandre
Responsable du cours : GANASCIA Jean-Gabriel
3