PDDL

PDDL

PDDL jest językiem opisu problemów automatycznego planowania. Każdy problem jest w nim opisany dwoma plikami:

  • plikiem, zawierającym opis dziedziny problemu;
  • plikiem, zawierającym konkretną instancję problemu.

Przykładowy opis dziedziny:

(define
	(domain world-of-blocks)
	(:requirements :adl)
	(:predicates
		(on-top ?x ?y)
		(on-floor ?x)
		(clear ?x)
	)
        ; przesuń klocek na podłogę
	(:action move-to-floor
		:parameters (?x ?z)
		:precondition
		(and
			(clear ?x)
			(on-top ?x ?z)
		)
		:effect
		(and
			(not (on-top ?x ?z))
			(on-floor ?x)
			(clear ?z)
		)
	)
        ; przesuń klocek na inny kocek
	(:action move-to-block
		:parameters (?x ?y)
		:precondition
		(and
			(clear ?x)
			(clear ?y)
		)
		:effect
		(and
			(on-top ?x ?y)
			(not (clear ?y))
			(not (on-floor ?x))
		)
	)
)

Przykładowy opis problemu:

(define (problem p1)
	(:domain world-of-blocks)
	(:objects a b c)
	(:init
		(clear c)
		(on-top c b)
		(on-top b a)
		(on-floor a)
	)
	(:goal
		(and
			(clear a)
			(on-top a b)
			(on-top b c)
			(on-floor c)
		)
	)
)

Pora na QUIZ

Fast Downward i GUI4PDDL

Podczas zajęć będzie wykorzystywany Eclipse z pluginem GUI4PDDL i planerem Fast Downward. Opis instalacji, konfiguracji i pierwszego użycia znajduję się na odrębnej stronie.

Dodatkowe narzędzia i uwagi

Dodatkowe konstrukcje w PDDL

  1. Typy. Zmienne w PDDL mogą mieć przypisane typy, co nie tylko poprawia czytelność, ale (potencjalnie) ułatwia też proces planowania. W pliku z opisem dziedziny, pomiędzy requirements a predicates trzeba dopisać wyrażenie types:
    (:types location robot)

    Później trzeba te typy konsekwentnie wykorzystywać wszędzie tam, gdzie pojawiają się deklaracje zmiennych, np:

    (:predicates 
    (adjacent ?l1 ?l2 - location)
    (at ?r - robot ?l - location)

    czy

    (:action move-to
    :parameters (?r - robot ?l1 ?l2 - location)
    :precondition 
    (and 
         (at ?r ?l1)
         (adjacent ?l1 ?l2)
    )
    :effect
    (and 
        (not (at ?r ?l1)) 
        (at ?r ?l2)
    )
    )

    Uwaga: Fast Downward jest w tym miejscu dość wrażliwy na składnię i trzeba bardzo pilnować, żeby myślnik rozdzielający zmienną od typu był zawsze otoczony spacjami, tak, jak w powyższych przykładach.

  2. Dodatkowe warunki. W ramach efektów można wpisać dodatkowy warunek: (when (warunek) (cel)). Znaczenie tego jest następujące: jeżeli przy wykonywaniu efektów danego działania warunek jest spełniony, to wykonane zostaną również działania zapisane w celu. Przykład:
    (:action move-to
    :parameters (?r - robot ?l1 ?l2 - location)
    :precondition 
    (and 
         (at ?r ?l1)
         (adjacent ?l1 ?l2)
    )
    :effect
    (and 
        (not (at ?r ?l1)) 
        (at ?r ?l2)
        (when 
             (and (is-swamp ?l2) (not (is-dirty ?r)))
             (is-dirty ?r)
        )
    )
    )
  3. Dysjunkcja W obrębie warunków działania (oraz w obrębie celu planowania) można posłużyć się alternatywą (or (warunek1) (warunek2) ... (warunekN)). Przykład:
    (:action move-to
    :parameters (?r - robot ?l1 ?l2 - location)
    :precondition 
    (and 
         (at ?r ?l1)
         (or (adjacent ?l1 ?l2) (can-fly ?r))
    )
    :effect
    (and 
        (not (at ?r ?l1)) 
        (at ?r ?l2)
    )
    )
  4. Kwantyfikatory Niektóre działania mogą być dopuszczalne tylko wtedy, gdy istnieje bądź nie istnieje jakiś obiekt, albo gdy pewna własność zachodzi dla wszystkich obiektów. Przykłady:
    (:action move-to
    :parameters (?r - robot ?l1 ?l2 - location)
    :precondition 
    (and 
         (at ?r ?l1)
         (not (exists (?p - robot) (at ?p ?l2))
    )
    :effect
    (and 
        (not (at ?r ?l1)) 
        (at ?r ?l2)
    )
    )
    (:action call-backup
    :precondition (forall (?r - robot) (is-broken ?r))
    :effect (calling-backup)
    )

    Możne też się zdarzyć, że pewne działanie wpływa na wszystkie obiekty (danego typu). Przykład:

    (:action clean
    :parameters (?r - robot)
    :precondition (is-dirty ?r)
    :effect (forall (?p - robot) (not (is-dirty ?p)))
    )
  5. Stałe W danej dziedzinie mogą wystąpić stałe niezależne od konkretnej instancji problemu, np. paliki w wieżach Hanoi. Takie stałe mogą być używane wszędzie tam, gdzie trafiłby obiekt (w pliku problemu) lub związana zmienna (w pliku dziedziny). Przykład:
    (domain hanoi)
    (:requirements :adl)
    (:types disk rod)
    (:constants S1 S2 S3 - rod)
    (:predicates
    ....
  6. Predykaty pochodne Czasami zachodzi sytuacja, w której niewygodnie jest wpisywać ręcznie wszystkie informacje (np. ponieważ jest ich dużo), a mogą one być banalnie wywnioskowane z innych informacji. Dotyczy to np. domknięcia przechodniego, gdzie należałoby wpisać w pliku problemu relację pomiędzy każdą parą obiektów danego typu, czyli około \frac{1}{2}n^2. Z drugiej strony definiując relację tylko pomiędzy sąsiednimi obiektami (np. kolejnymi) wystarczy wprowadzić tylko n par, a dalsze wnioskowanie jest proste.
    Składnia:

    (:derived
        (deklaracja predykatu)
        (warunki występowania, takie jak w warunkach przy definicji działania)
    )

    Przykład:

    (:predicates ...)
    (:derived (less ?x ?y - disk)
    (or
         (lt ?x ?y)
         (exists (?z - disk) (and (lt ?x ?z) (less ?z ?y)))
    )
    )
    (:action ...)