1315.15 decrease 연산자의 활용과 구문

1. decrease 연산자의 정의

decrease 연산자는 수치 함수의 현재 값에서 지정된 양을 빼는 갱신 연산이다. 형식적으로:

s'[f] = s[f] - v

여기서 s[f]는 현재 값, v는 감소량, s'[f]는 갱신 후 값이다.

2. 구문

(decrease <function-instance> <numeric-expression>)

3. 기본 활용 패턴

3.1 상수 감소

(decrease (battery_level ?r) 10)
(decrease (remaining_attempts) 1)

3.2 함수 값에 의한 감소

(decrease (battery_level ?r) (energy_cost ?from ?to))
(decrease (current_load ?r) (weight ?obj))
(decrease (remaining_capacity ?container) (volume ?item))

3.3 산술 표현식에 의한 감소

(decrease (battery_level ?r) (* (distance ?from ?to) (energy_per_meter ?r)))
(decrease (fuel_level ?v) (* ?duration (fuel_consumption_rate ?v)))

4. 로봇 도메인에서의 주요 활용

4.1 에너지 소모 모델링

(:action move
    :parameters (?r - robot ?from - waypoint ?to - waypoint)
    :precondition (and
        (robot_at ?r ?from)
        (connected ?from ?to)
        (>= (battery_level ?r) (* (distance ?from ?to) (energy_per_meter ?r)))
    )
    :effect (and
        (not (robot_at ?r ?from))
        (robot_at ?r ?to)
        (decrease (battery_level ?r) (* (distance ?from ?to) (energy_per_meter ?r)))
    )
)

4.2 자원 소모 모델링

(:action use_consumable
    :parameters (?r - robot ?item - consumable)
    :precondition (and
        (carrying ?r ?item)
        (> (quantity ?item) 0)
    )
    :effect (and
        (item_used ?item)
        (decrease (quantity ?item) 1)
    )
)

4.3 적재량 해제

(:action unload
    :parameters (?r - robot ?cargo - object ?loc - waypoint)
    :precondition (and (robot_at ?r ?loc) (holding ?r ?cargo))
    :effect (and
        (not (holding ?r ?cargo))
        (object_at ?cargo ?loc)
        (decrease (current_load ?r) (weight ?cargo))
    )
)

4.4 듀레이티브 액션에서의 시간 비례 감소

(:durative-action move
    :parameters (?r - robot ?from ?to - waypoint)
    :duration (= ?duration (/ (distance ?from ?to) (speed ?r)))
    :effect (and
        (at end (decrease (battery_level ?r) (* ?duration (discharge_rate ?r))))
    )
)

5. 음수 방지를 위한 전제 조건 보호

decrease 연산의 결과가 음수가 되면 비현실적 상태가 발생한다. 이를 방지하기 위해 전제 조건에서 충분한 잔량을 확인해야 한다:

;; 안전한 패턴: 감소 전 충분성 확인
:precondition (>= (battery_level ?r) (energy_cost ?from ?to))
:effect (decrease (battery_level ?r) (energy_cost ?from ?to))

;; 위험한 패턴: 충분성 미확인
:precondition (robot_at ?r ?from)
:effect (decrease (battery_level ?r) (energy_cost ?from ?to))
;; → 배터리가 부족해도 감소 적용, 음수 발생 가능

6. increase와의 대칭적 사용

increasedecrease는 자원의 축적과 소모를 대칭적으로 모델링한다:

;; 적재: increase
(:action load :effect (increase (current_load ?r) (weight ?cargo)))

;; 하역: decrease
(:action unload :effect (decrease (current_load ?r) (weight ?cargo)))

;; 충전: increase (또는 assign)
(:action charge :effect (increase (battery_level ?r) (charge_amount)))

;; 소모: decrease
(:action move :effect (decrease (battery_level ?r) (energy_cost ?from ?to)))

7. 참고 문헌

  • Fox, M. & Long, D. (2003). “PDDL2.1: An Extension to PDDL for Expressing Temporal Planning Domains.” Journal of Artificial Intelligence Research, 20, 61–124.
  • Haslum, P., Lipovetzky, N., Magazzeni, D., & Muise, C. (2019). An Introduction to the Planning Domain Definition Language. Morgan & Claypool Publishers.