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.