1315.39 파생 술어 설계의 모범 사례

1. 설계 원칙 개요

파생 술어의 효과적인 설계는 도메인의 표현력, 가독성, 플래닝 효율성 간의 균형을 달성하는 데 있다. 다음의 모범 사례를 따르면 파생 술어의 이점을 극대화하면서 잠재적 문제를 최소화할 수 있다.

2. 사례 1: 반복 조건의 추상화

2개 이상의 액션에서 동일한 복합 조건이 반복되면, 파생 술어로 추출한다:

;; 모범: 반복 조건을 파생 술어로 추상화
(:derived (robot_operational ?r - robot)
    (and (robot_active ?r) (not (in_error ?r)) (>= (battery_level ?r) 10)))

(:action move :precondition (and (robot_at ?r ?from) (robot_operational ?r) ...))
(:action pick  :precondition (and (robot_at ?r ?loc) (robot_operational ?r) ...))
(:action scan  :precondition (and (robot_at ?r ?loc) (robot_operational ?r) ...))

3. 사례 2: 의미적 단위의 명명

파생 술어의 이름은 추상화하는 조건의 의미를 명확히 전달해야 한다:

;; 권장: 의미가 명확한 이름
(:derived (zone_safe ?z - zone) ...)
(:derived (robot_ready_for_mission ?r - robot) ...)
(:derived (task_achievable ?r - robot ?t - task) ...)

;; 비권장: 의미 불명확
(:derived (condition_1 ?x) ...)
(:derived (check ?r - robot ?z - zone) ...)

4. 사례 3: 재귀 사용의 절제

재귀적 파생 술어는 이행적 폐쇄가 진정으로 필요한 경우에만 사용한다. 정적 그래프의 도달 가능성은 기반 술어로 사전 계산하는 것이 효율적이다:

;; 정적 연결 그래프: 기반 술어로 사전 계산 (권장)
(:init (reachable wp1 wp3) (reachable wp1 wp4) ...)

;; 동적 연결 그래프: 재귀적 파생 술어 사용 (필요시에만)
(:derived (reachable ?from ?to - waypoint)
    (or (connected ?from ?to)
        (exists (?mid - waypoint) (and (connected ?from ?mid) (reachable ?mid ?to)))))

5. 사례 4: 계층 깊이 제한

파생 술어의 참조 계층을 3~4 수준으로 제한한다:

;; 적절한 계층 (3수준)
(:derived (sensor_ok ?r) ...)                    ;; 수준 1
(:derived (robot_healthy ?r) (... (sensor_ok ?r) ...))  ;; 수준 2
(:derived (mission_ready ?r ?loc) (... (robot_healthy ?r) ...))  ;; 수준 3

;; 과도한 계층 (5+수준, 비권장)
;; 재설계하여 중간 계층을 합치는 것을 고려

6. 사례 5: 부정의 신중한 사용

파생 술어 규칙에서 다른 파생 술어의 부정을 참조할 때 계층화(stratification) 가능성을 확인한다:

;; 안전: 기반 술어의 부정만 참조
(:derived (safe ?z) (not (hazard ?z)))  ;; hazard는 기반 술어

;; 주의: 다른 파생 술어의 부정 참조 시 계층화 확인
(:derived (available ?r) (and ... (not (busy ?r))))
;; busy가 파생 술어이면 계층화 필요

7. 사례 6: 효과에서의 부적절한 사용 방지

파생 술어를 액션 효과에 배치하는 오류를 방지한다:

;; 오류: 파생 술어를 효과에서 변경 시도
(:action make_safe :effect (zone_safe ?z))  ;; 파생 술어는 효과에서 사용 불가

;; 정확: 기반 술어를 변경하여 파생 술어에 간접 영향
(:action remove_hazard :effect (not (hazard_detected ?z)))
;; → zone_safe가 자동 재계산됨

8. 사례 7: 테스트 가능한 설계

파생 술어의 값을 다양한 상태에서 예측하고 검증할 수 있도록 설계한다:

테스트 절차:
1. 기반 술어만으로 구성된 상태를 설정
2. 파생 술어의 예상 값을 수작업으로 계산
3. 플래너 또는 검증 도구로 실제 값을 확인
4. 예상 값과 실제 값의 일치를 검증

9. 사례 8: 플래너 호환성 확인

파생 술어를 사용하기 전에 대상 플래너의 지원 여부를 확인한다:

플래너파생 술어 지원재귀 지원비고
Fast Downward지원지원공리(axiom)로 처리
LAMA지원지원Fast Downward 기반
FF / Metric-FF미지원미지원전제 조건 복제로 대체
POPF제한적미지원

미지원 플래너를 사용해야 하는 경우, 파생 술어를 전제 조건에 인라인(inline) 전개하는 전처리 스크립트를 활용한다.

10. 참고 문헌

  • Thiébaux, S., Hoffmann, J., & Nebel, B. (2005). “In Defense of PDDL Axioms.” Artificial Intelligence, 168(1–2), 38–69.
  • Helmert, M. (2009). “Concise Finite-Domain Representations for PDDL Planning Tasks.” Artificial Intelligence, 173(5–6), 503–535.
  • Haslum, P., Lipovetzky, N., Magazzeni, D., & Muise, C. (2019). An Introduction to the Planning Domain Definition Language. Morgan & Claypool Publishers.