IFT3330/6330 Intelligence artificielle
Devoir 2 - planification
(à rendre avant midi le 21 novembre)
1. Description du problème
Ce devoir consiste à réaliser un algorithme de planification POP - Partial Order Planifier - en Prolog. Cet algorithme
est décrit dans le livre de référence Russell et Norvig. Le but de ce devoir est de vous permettre d'avoir un contact
concret avec la réalisation d'un tel algorithme.
2. Application
Nous considérons l'application dans le monde des blocs. Le problème est comme décrit dans le livre. Plus
précisément:
Il y a un certain nombre de blocs de même taille sur une table, et un bras mécanique. Ce bras mécanique peut
prendre un bloc si ce bloc est libre (i.e. aucun autre bloc n'est sur lui) et le déplacer à un autre endroit, soit sur la
table, soit sur un autre bloc libre. On suppose que la table est suffisamment grande, donc un bloc peut toujours être
mis sur la table. Le bras mécanique ne peut pas saisir plus d'un bloc à la fois.
Le programme de planification doit planifier une suite d'opérations par le bras mécanique pour transformer une
configuration de blocs en une autre.
3. Votre programme
L'algorithme de POP est décrit dans le livre (pp. 356). Cependant, cet algorithme ne donne pas tous les détails (e.g.
comment tester SOLUTION(plan), et comment faire SELECT-SUBGOAL(plan)). C'est à vous de compléter ces
détails selon vos jugements. Toue réalisation raisonnable de ces détails sont acceptés. L'objectif principal est la
réalisation globale de la planification. Il est aussi à noter qu'il est possible de modifier certains détails de l'algorithme
pour mieux l'adapter au langage Prolog.
En ce qui concerne la représentation d'une situation, on impose la façon suivante: Une situation est représentée
comme une liste de prédicats. Chaque prédicat décrit un aspect de la situation. Par exemple, la situation suivant:
est représentée par:
[on(a,b), clear(a), clear(c), on(b, table), on(c,table)].
Un plan est composé d'une liste d'opérations. Comme dans le livre, nous définissons les deux opérations suivantes:
move(B,X,Y): pour déplacer le bloc B de X à Y
move_to_table(B,X): pour déplacer le bloc B de X à la table.
Si la configuration finale est la suivante: