The Planetary Lander Domain in PDDL+

The following domain encoding shows the PDDL+ model for the Planetary Lander problem discussed in Section 2.2. According to implementation details of systems designed to handle PDDL+ models, it might be necessary to introduce further events to manage the transition between charging and discharging, because imprecision of the system in measuring the values of the demand and supply might lead to difficulties at the boundary where supply and demand are equal.

(define (domain power)
 (:requirements :typing :durative-actions :fluents :time 
                :negative-preconditions :timed-initial-literals)
 (:types equipment)
 (:constants unit - equipment)
 (:predicates (day) (commsOpen) (readyForObs1) (readyForObs2) 
                    (gotObs1) (gotObs2)
                    (available ?e - equipment))
 (:functions (demand) (supply) (soc) (charge-rate) (daytime) 
             (heater-rate) (dusk) (dawn)
             (fullTime) (partTime1) (partTime2) 
             (obs1Time) (obs2Time) (obs1-rate) (obs2-rate) 
             (A-rate) (B-rate) (C-rate) (D-rate) (safeLevel) 
             (solar-const))


(:process charging
 :parameters ()
 :precondition (and (< (demand) (supply)) (day)) 
 :effect (and (increase (soc) (* #t (* (* (- (supply) (demand)) 
                                          (charge-rate))
                                       (- 100 (soc)))
                                  )))
)

(:process discharging
 :parameters ()
 :precondition (> (demand) (supply))
 :effect (decrease soc (* #t (- (demand) (supply))))
)

(:process generating
 :parameters ()
 :precondition (day)
 :effect (and (increase (supply) 
                    (* #t (* (* (solar-const) (daytime))
                             (+ (* (daytime) 
                                   (- (* 4 (daytime)) 90)) 450))))
              (increase (daytime) (* #t 1)))
)

(:process night-operations
 :parameters ()
 :precondition (not (day))
 :effect (and (increase (daytime) (* #t 1))
              (decrease (soc) (* #t (heater-rate))))
)

(:event nightfall
 :parameters ()
 :precondition (and (day) (>= (daytime) (dusk)))
 :effect (and (assign (daytime) (- (dawn)))
              (not (day)))
)

(:event daybreak
 :parameters ()
 :precondition (and (not (day)) (>= (daytime) 0))
 :effect (day)
)

(:durative-action fullPrepare
 :parameters ()
 :duration (= ?duration (fullTime))
 :condition (and (at start (available unit))
                 (over all (> (soc) (safelevel))))
 :effect (and (at start (not (available unit)))
              (at start (increase (demand) (A-rate)))
              (at end (available unit))
              (at end (decrease (demand) (A-rate)))
              (at end (readyForObs1))
              (at end (readyForObs2)))
)

(:durative-action prepareObs1
 :parameters ()
 :duration (= ?duration (partTime1))
 :condition (and (at start (available unit))
                 (over all (> (soc) (safelevel))))
 :effect (and (at start (not (available unit)))
              (at start (increase (demand) (B-rate)))
              (at end (available unit))
              (at end (decrease (demand) (B-rate)))
              (at end (readyForObs1)))
)

(:durative-action prepareObs2
 :parameters ()
 :duration (= ?duration (partTime2))
 :condition (and (at start (available unit))
                 (over all (> (soc) (safelevel))))
 :effect (and (at start (not (available unit)))
              (at start (increase (demand) (C-rate)))
              (at end (available unit))
              (at end (decrease (demand) (C-rate)))
              (at end (readyForObs2)))
)

(:durative-action observe1
 :parameters ()
 :duration (= ?duration (obs1Time))
 :condition (and (at start (available unit))
                 (at start (readyForObs1))
                 (over all (> (soc) (safelevel)))
                 (over all (not (commsOpen))))
 :effect (and (at start (not (available unit)))
              (at start (increase (demand) (obs1-rate)))
              (at end (available unit))
              (at end (decrease (demand) (obs1-rate)))
              (at end (not (readyForObs1)))
              (at end (gotObs1)))
)

(:durative-action observe2
 :parameters ()
 :duration (= ?duration (obs2Time))
 :condition (and (at start (available unit))
                 (at start (readyForObs2))
                 (over all (> (soc) (safelevel)))
                 (over all (not (commsOpen))))
 :effect (and (at start (not (available unit)))
              (at start (increase (demand) (obs2-rate)))
              (at end (available unit))
              (at end (decrease (demand) (obs2-rate)))
              (at end (not (readyForObs2)))
              (at end (gotObs2)))
)
)


Derek Long 2006-10-09