Inverter의 Success↔Failure 변환 규칙 (Inverter’s Success↔Failure Conversion Rule)
1. 개요
Inverter 데코레이터의 핵심 동작은 자식 노드가 반환한 SUCCESS와 FAILURE 상태를 상호 교환(swap)하는 것이다. 이 변환 규칙은 명제 논리의 부정(negation) 연산에 직접 대응하며, 행동 트리에서 조건의 의미를 반전시키는 유일한 표준 메커니즘이다. 본 절에서는 이 변환 규칙의 정형적 정의, 동작 상세, 적용 시의 의미론적 함의를 다룬다.
2. 변환 규칙의 정형적 정의
2.1 상태 사상 함수
Inverter의 상태 사상(mapping) 함수 \iota는 다음과 같이 정의된다.
\iota : \mathcal{S} \rightarrow \mathcal{S}
\iota(\text{SUCCESS}) = \text{FAILURE}
\iota(\text{FAILURE}) = \text{SUCCESS}
\iota(\text{RUNNING}) = \text{RUNNING}
이 함수는 SUCCESS와 FAILURE에 대해 자기 역함수(self-inverse)이다.
\iota(\iota(s)) = s, \quad \forall s \in \mathcal{S}
이 성질은 이중 Inverter가 항등 변환이 됨을 수학적으로 보장한다.
진리표
| 자식 상태 | Inverter 출력 | 논리적 의미 |
|---|---|---|
| SUCCESS (참) | FAILURE (거짓) | \neg \text{T} = \text{F} |
| FAILURE (거짓) | SUCCESS (참) | \neg \text{F} = \text{T} |
변환의 의미론적 효과
조건 노드에 적용된 경우
조건 노드 C가 “조건 p가 참인가?“를 판정한다면, Inverter(C)는 “조건 p가 거짓인가?“를 판정한다.
| 원래 조건 | Inverter 적용 후 의미 |
|---|---|
IsObstacleDetected → SUCCESS | 장애물이 감지되지 않음 → FAILURE |
IsObstacleDetected → FAILURE | 장애물이 감지됨 → SUCCESS |
IsBatteryLow → SUCCESS | 배터리가 충분함 → FAILURE |
IsBatteryLow → FAILURE | 배터리가 부족함 → SUCCESS |
행동 트리 제어 흐름에 대한 영향
Sequence 내부에서 Inverter가 적용된 조건은 원래 조건과 반대 의미로 동작한다.
<!-- 원래: 장애물이 감지되면 정지 -->
<Sequence>
<Condition ID="IsObstacleDetected"/>
<Action ID="Stop"/>
</Sequence>
<!-- Inverter 적용: 장애물이 감지되지 않으면 전진 -->
<Sequence>
<Inverter>
<Condition ID="IsObstacleDetected"/>
</Inverter>
<Action ID="DriveForward"/>
</Sequence>
변환의 대칭성
SUCCESS→FAILURE 변환과 FAILURE→SUCCESS 변환은 동시에 적용되며, 하나만 선택적으로 적용할 수 없다. 한 방향의 변환만 필요한 경우에는 ForceSuccess나 ForceFailure를 사용한다.
| 필요한 변환 | 적합한 데코레이터 |
|---|---|
| SUCCESS↔FAILURE 양방향 반전 | Inverter |
| FAILURE→SUCCESS 단방향 | ForceSuccess |
| SUCCESS→FAILURE 단방향 | ForceFailure |
적용 시 주의 사항
의미의 명확성 확보
Inverter를 적용하면 조건의 의미가 반전되므로, 행동 트리의 가독성이 저하될 수 있다. 특히 이중 부정(double negation)이 발생하면 의미 파악이 어려워진다.
<!-- 이중 부정: 가독성 낮음 -->
<Inverter>
<Condition ID="IsNotReady"/>
</Inverter>
<!-- 의미: "준비되지 않지 않은 상태" = "준비된 상태" -->
<!-- 개선: 긍정적 조건 사용 -->
<Condition ID="IsReady"/>
액션 노드에 대한 적용
액션 노드에 Inverter를 적용하면 행동의 성공이 실패로, 실패가 성공으로 해석된다. 이는 의미론적으로 혼란을 초래할 수 있으므로, 명확한 이유가 없는 한 액션 노드에는 Inverter를 적용하지 않는 것이 권장된다.
Fallback과의 결합
Fallback 내에서 Inverter를 활용하면 조건이 거짓일 때 해당 분기가 선택되는 효과를 얻는다.
<Fallback>
<Sequence>
<Inverter><Condition ID="IsBatteryLow"/></Inverter>
<Action ID="NormalOperation"/>
</Sequence>
<Action ID="LowPowerMode"/>
</Fallback>
배터리가 충분하면(IsBatteryLow FAILURE → Inverter SUCCESS) 정상 운용, 부족하면 저전력 모드를 실행한다.
참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |