1314.47 액션의 테스트와 검증 전략

1. 테스트와 검증의 필요성

PDDL 도메인에서 액션의 정확성은 생성되는 계획의 품질과 실행 가능성에 직접적으로 영향을 미친다. 체계적인 테스트와 검증을 통해 액션의 전제 조건과 효과가 의도한 대로 동작하는지를 확인해야 한다.

2. 단위 테스트: 개별 액션 검증

각 액션을 독립적으로 테스트하여, 전제 조건의 정확한 평가와 효과의 올바른 적용을 확인한다.

2.1 긍정 테스트

모든 전제 조건이 충족된 상태에서 액션이 적용 가능한지, 효과가 의도한 대로 적용되는지를 확인한다:

테스트 케이스: move(robot1, wp1, wp2)
초기 상태: {(robot_at robot1 wp1), (connected wp1 wp2)}
예상 결과: 적용 가능
예상 상태: {(robot_at robot1 wp2), (connected wp1 wp2)}
확인: (robot_at robot1 wp1) 삭제됨, (robot_at robot1 wp2) 추가됨

2.2 부정 테스트

각 전제 조건을 하나씩 제거하여 액션이 적용 불가능하게 되는지 확인한다:

테스트 케이스: move(robot1, wp1, wp2) - robot_at 조건 불충족
초기 상태: {(robot_at robot1 wp3), (connected wp1 wp2)}
예상 결과: 적용 불가

2.3 경계 테스트

수치 전제 조건의 경계 값을 테스트한다:

테스트 케이스: move - 배터리가 정확히 필요량만큼 남은 경우
초기 상태: {(= (battery_level robot1) 10), (= (energy_cost wp1 wp2) 10)}
전제 조건: (>= (battery_level robot1) (energy_cost wp1 wp2))
예상: 적용 가능 (>= 이므로 동등일 때도 참)

3. 통합 테스트: 액션 시퀀스 검증

여러 액션의 연쇄가 올바르게 동작하는지를 확인한다.

3.1 전제 조건-효과 연쇄 테스트

시나리오: 이동 후 물체 집기
1. move(robot1, wp1, wp2)
   사전: {(robot_at robot1 wp1), (connected wp1 wp2), (object_at box1 wp2), (gripper_free robot1)}
   사후: {(robot_at robot1 wp2), (connected wp1 wp2), (object_at box1 wp2), (gripper_free robot1)}

2. pick_up(robot1, box1, wp2)
   사전: 위 사후 상태
   검증: (robot_at robot1 wp2) ✓, (object_at box1 wp2) ✓, (gripper_free robot1) ✓
   사후: {(robot_at robot1 wp2), (connected wp1 wp2), (holding robot1 box1)}

3.2 순환 테스트

동일 액션의 반복 적용이 일관된 결과를 산출하는지 확인한다:

시나리오: 이동 후 복귀
1. move(robot1, wp1, wp2) → (robot_at robot1 wp2)
2. move(robot1, wp2, wp1) → (robot_at robot1 wp1)
검증: 초기 상태와 동일한 위치로 복귀

4. 자동화된 검증 도구

4.1 VAL (Plan Validator)

VAL은 PDDL 계획의 정당성을 자동으로 검증하는 표준 도구이다(Howey, Long, & Fox, 2004):

./validate domain.pddl problem.pddl plan.txt

VAL은 계획의 각 단계에서 전제 조건의 충족 여부와 최종 상태의 목표 달성 여부를 검사한다.

4.2 PlanSys2 터미널을 이용한 대화적 검증

> get domain                    # 도메인 확인
> set instance robot1 robot     # 객체 등록
> set instance wp1 waypoint
> set predicate (robot_at robot1 wp1)
> set predicate (connected wp1 wp2)
> set goal (and (robot_at robot1 wp2))
> get plan                      # 계획 생성 및 확인
> run                           # 계획 실행

4.3 자동화된 테스트 스크립트

다양한 시나리오에 대해 자동으로 계획을 생성하고 검증하는 스크립트:

import subprocess

test_cases = [
    {"problem": "test_move.pddl", "expected_solvable": True},
    {"problem": "test_blocked.pddl", "expected_solvable": False},
    {"problem": "test_pickup.pddl", "expected_solvable": True},
]

for tc in test_cases:
    result = subprocess.run(
        ["planner", "domain.pddl", tc["problem"]],
        capture_output=True
    )
    solvable = result.returncode == 0
    assert solvable == tc["expected_solvable"], f"Failed: {tc['problem']}"

5. 검증 체크리스트

  1. 모든 액션에 대한 긍정/부정 테스트 수행
  2. 상호 배타적 술어의 일관성 확인
  3. 단일 값 술어의 유일성 확인
  4. 수치 플루언트의 유효 범위 확인
  5. 전제 조건-효과 연쇄의 완전성 확인
  6. 비도달 가능 목표의 부재 확인
  7. 듀레이티브 액션의 시간 주석 정합성 확인

6. 참고 문헌

  • Howey, R., Long, D., & Fox, M. (2004). “VAL: Automatic Plan Validation, Continuous Effects and Mixed Initiative Planning Using AI.” Proceedings of the 16th IEEE International Conference on Tools with Artificial Intelligence (ICTAI).
  • Haslum, P., Lipovetzky, N., Magazzeni, D., & Muise, C. (2019). An Introduction to the Planning Domain Definition Language. Morgan & Claypool Publishers.
  • Ghallab, M., Nau, D., & Traverso, P. (2004). Automated Planning: Theory and Practice. Morgan Kaufmann.