Académique Documents
Professionnel Documents
Culture Documents
Travaux Pratiques 1
SATPLAN
Arnaud Lequen
1 Gripper
Dans cette partie, on s’intéresse au problème de planification classique suivant. Un robot peut se déplacer
d’une pièce à l’autre, et saisir des balles avec sa pince. Initialement, toutes les balles se trouvent dans la
même pièce. Le but est de lui faire déplacer une balle dans la seconde pièce.
1
Questions
1. A l’aide de la définition de F , décrivez formellement, au papier et au crayon, l’état initial I présenté
sur l’image plus haut.
2. Idem pour le but G.
Les opérateurs de (5) permettent à robby de se déplacer d’une pièce à l’autre, ceux de (6) de saisir une
balle si sa pince est vide, et ceux de (7) de poser une balle si possible.
Il s’agit ensuite de décrire chacun de ces opérateurs. Par exemple, pour un opérateur move_R_S de (5),
on aurait :
• Prec(move_R_S) = {at_robby_R}
• Add(move_R_S) = {at_robby_S}
• Del(move_R_S) = {at_robby_R}
Questions
1. Décrivez les opérateurs de la forme pick_X_R.
2. Idem pour les opérateurs de la forme drop_X_R.
Voici l’ensemble du code associé à un robot dans une seule pièce, avec une seule balle. Le but pour le
robot est simplement de saisir une balle. Cette base vous est fournie dans le fichier tp1_base.zip
2
;; Horizon
$length = 1
;; Operateurs et definitions
$O = [A_pick_ballA_roomG, A_drop_ballA_roomG]
Questions
1. Ouvrez le fichier tp1_base.touistl. Complétez-le de sorte à ce qu’il contienne les cinq règles pré-
sentées dans la figure ci-dessous. Les trois premières et la dernière sont déjà encodées dans le fichier,
et vous sont décrites ci-dessous.
(a) (Expliquer la contrainte encodée par la première règle)
(b) Si une action a est appliquée à la i-ème étape du plan, alors ses préconditions sont satisfaites à
l’état précédent, et ses effets sont appliqués à l’état courant.
(c) Un fluent f ne peut être détruit (i.e. passer de vrai à faux) à la i-ème étape que si une action qui
le détruit a été exécutée.
(d) Un fluent f ne peut être établi (i.e. passer de faux à vrai) à la i-ème étape que si une action qui
l’établit a été exécutée.
(e) Deux actions effectuées à la même étape du plan ne sont pas en concurrence sur leur préconditions
et effets négatifs.
Indication : A une étape i, si une action a2 ̸= a1 détruit un fluent f trouvé dans les préconditions
de a1 , alors a1 et a2 ne peuvent pas s’exécuter à l’étape i simultanément.
2. Votre fichier contient, de même, le code ci-dessus. Pour rappel, il décrit une version simplifiée du
problème qui nous intéresse. A l’aide de TouIST, trouvez un plan au problème.
Astuce : Si vous utilisez la version de TouIST avec interface, le logiciel vous permet de filtrer les
variables par nom et par valeur dans le modèle. Sur l’écran de présentation des modèles, déco-
chez "False" et entrez "A_" dans la barre de recherche, afin de ne sélectionner que les variables
représentant des actions effectuées.
3
4. Résolvez le problème de planification.
5. Changez le but afin que les deux balles soient dans la pièce de droite.
2 Parking
On se propose maintenant d’étudier le problème suivant. Des voitures sont initialement garées en double-
file dans une certaine configuration. On cherche à leur donner une autre configuration, en les déplaçant une
à une, éventuellement à l’aide de la place de stationnement libre.
Chaque voiture peut être soit garée sur une place de stationnement, soit garée contre une autre voiture.
Il n’est pas possible de garer de voitures en triple-file. De même, une voiture ne peut être déplacée que si :
1. elle est garée en double-file, ou
2. elle est garée contre le trottoir, et aucune voiture n’est garée en double-file contre elle.
Avant de procéder à l’encodage du problème avec TouIST, on le décrit au travers du langage STRIPS,
au papier et au crayon. On propose l’ensemble de fluents suivants :
F = {at_curb_C | C est une voiture} ∪ (8)
{at_curb_num_C_P | C une voiture, P un emplacement} ∪ (9)
{behind_car_C_D | C, D des voitures} ∪ (10)
{car_clear_C | C une voiture} ∪ (11)
{curb_clear_P | P un emplacement} (12)
4
Où l’on a la sémantique suivante :
— at_curb_C : la voiture C est garée sur un emplacement
— at_curb_num_C_P : la voiture C est à l’emplacement P
— behind_car_C_D : la voiture C est contre le trottoir, et la voiture D est garé à côté
— car_clear_C : il n’y a pas de voiture à côté de la voiture C
— curb_clear_P : l’emplacement de parking P est libre
Où move_car_to_car déplace une voiture C garée contre une autre voiture D vers une autre voiture E,
move_car_to_curb déplace une voiture C garée contre une autre voiture D vers un emplacement libre contre
le trottoir P, etc.
Questions
1. Comme précédemment, formalisez deux opérateurs du problème, de votre choix, dans le langage
STRIPS.
2. Modélisez sous TouIST le problème présenté dans l’image ci-dessus.
— Indication : Créez un script Python permettant de calculer toutes les combinaisons possibles d’ob-
jets, et créant le code TouIST. Voir Annexe B.
5
Annexe A : Prise en main de TouIST
TouIST (Toulouse Integrated Satisfiability Tool) permet d’encoder des problèmes formulés en logique
propositionelle 1 , à l’aide d’un langage riche. Ce dernier permet, entre autres, de quantifier des connecteurs
logiques sur des ensembles finis. Par exemple, la formule propositionnelle suivante
^ _ ^ ^
(pi,j,n → ¬pi,j,m )
i∈[1..9] j∈[1..9] n∈[1..9] m∈[1..9]
m̸=n
bigand $i in [1..9]:
bigor $j in [1..9]:
bigand $n,$m in [1..9],[1..9] when $m != $n:
p($i,$j,$n) => not p($i,$j,$m)
end
end
end
https://github.com/touist/touist/releases
TouIST dispose d’une interface graphique en Java (qui intègre l’outil de ligne de commande). Elle peut
être téléchargée sur la page des versions et est disponible pour Linux, Windows et macOS. Deux options sont
disponibles : le plain jar pour toute plate-forme ou la version native non signée pour macOS et Windows 2 .
Sous macOS Sierra, la version native de TouIST.app affichera un message d’erreur. Vous devez exécuter
sudo spctl -master-disable qui activera l’application.
Sous Windows 10, le fichier natif TouIST.exe ne peut être ouvert que si la fonction SmartScreen de
Windows Defender est désactivée. Vous pouvez toujours utiliser la version jar.
Afin de tester si votre installation fonctionne, vous pouvez lancer TouIST et son interface Java, entrer la
ligne suivante, représentant la formule p ∨ q, et vérifier, en appuyant sur le bouton "Solve" en bas à droite,
que le logiciel parvient à trouver trois modèles différents.
p or q
Pour ce TP, nous travaillerons rapidement avec des formules beaucoup trop conséquentes pour être gérées
par l’interface TouIST. Ainsi, nous aurons recourt à TouIST en ligne de commande. Une fois installé, un
ficher de type .touistl peut être exécuté et résolu avec la commande suivante :
Les fichiers .touistl peuvent être ouverts avec n’importe quel éditeur de texte. Il existe un plugin pour
VSCode permettant d’avoir la coloration syntaxique.
6
Annexe B : Automatisation de l’écriture des fluents et opérateurs
Le script Python suivant écrit, sur la sortie standard, le code TouIST associé à toutes les actions de la
forme move_R_S, telles que décrites dans la Section 1.1.2. Afin de rediriger l’entrée dans un fichier, vous
pouvez par exemple, sous Linux, utiliser la commande python generator.py > actions, pour rediriger la
sortie vers un fichier actions. Il ne reste plus ensuite qu’à effectuer un copier-coller des données du problème
dans TouIST.
A noter que la fonction product de la bibliothèque Itertools peut prendre n’importe quel nombre d’en-
sembles en arguments. Dans un même script Python, vous pouvez aussi automatiser l’écriture des ensembles
F et O.
Il reste toutefois nécessaire de spécifier les ensembles I et G manuellement.
import itertools as it
fluents = set()
operators = set()