1315.10 수치 함수의 선언 구문
1. 기본 선언 구문
PDDL의 수치 함수는 도메인 파일의 :functions 절에서 선언된다. 기본 구문은 다음과 같다:
(:functions
(<function-name> <typed-variable-list>)
...
)
각 함수 선언은 함수 이름과 0개 이상의 타입 지정 매개변수로 구성된다.
2. 선언 형식의 변형
2.1 단일 매개변수 함수
(:functions
(battery_level ?r - robot)
(speed ?r - robot)
(weight ?obj - object)
(carrying_capacity ?r - robot)
)
2.2 다중 매개변수 함수
(:functions
(distance ?w1 - waypoint ?w2 - waypoint)
(energy_cost ?from - waypoint ?to - waypoint)
(travel_time ?from - waypoint ?to - waypoint)
(signal_strength ?r1 - robot ?r2 - robot)
)
2.3 무매개변수 함수 (전역 변수)
(:functions
(total_cost)
(total_distance)
(total_energy_consumed)
(mission_elapsed_time)
)
2.4 복수 타입 매개변수
동일 타입의 복수 매개변수를 일괄 선언할 수 있다:
(:functions
(distance ?from ?to - waypoint)
;; 동치: (distance ?from - waypoint ?to - waypoint)
)
3. 반환 타입의 명시
PDDL 2.1의 일부 확장에서는 함수의 반환 타입을 명시적으로 선언할 수 있다:
(:functions
(battery_level ?r - robot) - number
(distance ?from - waypoint ?to - waypoint) - number
)
- number는 함수가 수치 값을 반환함을 명시한다. 대부분의 PDDL 파서에서 수치 함수의 반환 타입은 암묵적으로 number로 간주되므로, 명시적 선언은 선택적이다. 그러나 PDDL 3.1의 객체 플루언트(object fluent)와 구분하기 위해 명시하는 것이 명확하다.
4. 함수 이름 규약
함수 이름은 술어 이름과 동일한 구문적 제약을 따른다:
- 알파벳 문자로 시작
- 알파벳, 숫자, 하이픈, 밑줄 사용 가능
- 대소문자 비구분
- PDDL 예약어와 동일한 이름 사용 불가
- 도메인 내에서 술어 이름과 함수 이름은 중복 가능하나, 가독성을 위해 구분하는 것이 권장됨
일반적인 명명 관례:
(:functions
;; 명사 + 명사 패턴: 속성_대상
(battery_level ?r - robot)
(max_speed ?r - robot)
(current_load ?r - robot)
;; 측정값 패턴
(distance ?from ?to - waypoint)
(travel_time ?from ?to - waypoint)
;; 누적 메트릭 패턴
(total_cost)
(total_distance)
)
5. 함수와 술어의 네임스페이스
PDDL에서 함수와 술어는 별도의 네임스페이스(namespace)에 존재한다. 따라서 동일한 이름의 함수와 술어를 동시에 선언할 수 있다:
(:predicates
(battery_ok ?r - robot) ;; 술어: 배터리가 충분한지 여부
)
(:functions
(battery_level ?r - robot) ;; 함수: 배터리 잔량 (수치)
)
그러나 동일 이름의 사용은 혼동을 야기할 수 있으므로, 함수와 술어에 서로 다른 이름을 부여하는 것이 권장된다.
6. 복합 도메인의 함수 선언 예시
(define (domain warehouse_logistics)
(:requirements :strips :typing :numeric-fluents)
(:types
robot waypoint cargo charging_station - object
)
(:functions
;; 로봇 속성
(battery_level ?r - robot)
(max_battery ?r - robot)
(current_load ?r - robot)
(max_load ?r - robot)
(speed ?r - robot)
(energy_per_meter ?r - robot)
;; 환경 속성
(distance ?from - waypoint ?to - waypoint)
;; 화물 속성
(weight ?c - cargo)
(priority ?c - cargo)
;; 충전 인프라
(charge_rate ?s - charging_station)
;; 전역 메트릭
(total_cost)
(total_distance)
(total_deliveries)
)
)
7. 선언 시 주의사항
-
모든 함수는 문제 파일에서 초기화해야 한다. 초기화되지 않은 함수를 참조하면 정의되지 않은 동작이 발생한다.
-
함수의 매개변수 수를 최소화하라. 3항 이상의 함수는 인스턴스 수가 급격히 증가한다.
-
함수 이름은 값의 의미를 명확히 전달해야 한다.
(f1 ?r)같은 약어 대신(battery_level ?r)같은 서술적 이름을 사용한다.
8. 참고 문헌
- 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.