PDDL을 이용하여 원숭이와 바나나 문제를 해결해 보았다.

다음과 같이 원숭이, 바나나, 상자가 있고 바나나가 천장에 매달려 있다고 가정할 때, 원숭이는 어떻게 해야 바나나를 얻을 수 있는가?
domain.pddl
(define (domain monkey)
(:requirements :strips :typing)
(:types
monkey box banana - object
location)
(:predicates
(at ?obj - object ?location - location)
(on ?x - object ?y - object)
(getbananas) ;; bananas get!
)
(:action move
:parameters (?m - monkey ?from - location ?to - location)
:precondition (and (at ?m ?from))
:effect (and (at ?m ?to) (not (at ?m ?from)))
)
(:action push
:parameters (?m - monkey ?box - box ?banana - banana ?from - location ?to - location)
:precondition (and (at ?m ?from) (at ?box ?from) (at ?banana ?to))
:effect (and (at ?m ?to) (not (at ?m ?from))
(at ?box ?to)(not (at ?box ?from)))
)
(:action jump
:parameters (?m - monkey ?box - box ?banana - banana ?p - location)
:precondition (and (at ?m ?p)(at ?box ?p)(at ?banana ?p))
:effect (and (on ?m ?box))
)
(:action get
:parameters (?m - monkey ?box - box ?banana - banana ?p - location)
:precondition (and (on ?m ?box) (at ?banana ?p) (at ?box ?p))
:effect (getbananas))
)
problem.pddl
(define (problem pb)
(:domain monkey)
(:objects p1 p2 p3 - location
monkey1 - monkey
banana1 - banana
box1 - box)
(:init
(at monkey1 p1)
(at banana1 p2)
(at box1 p3)
)
(:goal (and (getbananas)))
)
action move
precondition(전제 조건) : 원숭이가 from에 있음
effect(효과) : 원숭이가 to에 있음
(:action move
:parameters (?m - monkey ?from - location ?to - location)
:precondition (and (at ?m ?from))
:effect (and (at ?m ?to) (not (at ?m ?from)))
)
초기 위치에서 이동

action push
precondition(전제 조건) : 원숭이가 from에 있음, 박스가 from에 있음, 바나나가 to에 있음
effect(효과) : 원숭이가 to에 있음, 박스가 to에 있음
(:action push
:parameters (?m - monkey ?box - box ?banana - banana ?from - location ?to - location)
:precondition (and (at ?m ?from) (at ?box ?from) (at ?banana ?to))
:effect (and (at ?m ?to) (not (at ?m ?from))
(at ?box ?to)(not (at ?box ?from)))
)
박스를 바나나가 있는 지점으로 push

action jump
precondition(전제 조건) : 원숭이가 p에 있음, 박스가 p에 있음, 바나나가 p에 있음
effect(효과) : 원숭이가 박스 위에 있음
(:action jump
:parameters (?m - monkey ?box - box ?banana - banana ?p - location)
:precondition (and (at ?m ?p)(at ?box ?p)(at ?banana ?p))
:effect (and (on ?m ?box))
)
박스 위로 jump

action get
precondition(전제 조건) : 원숭이가 박스 위에 있음, 바나나가 p에 있음
effect(효과) : 바나나 획득!
(:action get
:parameters (?m - monkey ?box - box ?banana - banana ?p - location)
:precondition (and (on ?m ?box) (at ?banana ?p) (at ?box ?p))
:effect (getbananas))
)

아직은 어려운 pddl의 세계 ...