시간 추론: 앨런 대수와 PyReason
📍 현재 위치: 6부 · 주석·시간 논리 — 20장. 주석 논리는 모든 사실에 값을 매다는 법을 알려 주었습니다 — 출처(provenance) 토큰, 격자(lattice) 위의 신뢰도, 시간의 구간 같은 것들입니다. 이 장은 그 마지막 종류의 표지, 즉 구간을 가져와 그것을 우리가 추론하는 대상 자체로 만듭니다: "이것이 언제 참인가"가 아니라 "시간에 걸쳐 참인 두 사실이 서로 어떻게 나란히 놓이는가"이며, 그것이 추론기로 하여금 무엇을 결론짓게 하는지를 다룹니다.
온톨로지 안의 사실은 보통 시간에 얽매이지 않습니다: Professor(alice)는 성립하거나 성립하지 않거나 둘 중 하나입니다. 하지만 우리가 세계에 관해 아는 것 대부분은 한 시간대에 걸쳐 성립합니다 — alice는 박사 과정 학생이었다가, 박사후 연구원이었다가, 그다음 교수가 되었습니다 — 그리고 결정적으로, 우리가 실제로 아는 것은 정확한 날짜인 경우가 거의 없습니다. 우리가 아는 것은 그녀의 박사 과정이 박사후 과정이 시작될 때 끝났다는 것, 그리고 교수 시절이 그 둘 다음에 왔다는 것입니다. 시간 추론(temporal reasoning)이란 숫자가 빠져 있을 때 그러한 관계들을 가지고 계산하는 기예이며, 이를 위한 고유한 대수(algebra)를 갖추고 있습니다.
영화 보는 밤에 관해 세 가지를 전해 들었다고 상상해 보십시오: 예고편은 본편이 시작되기 바로 직전까지 상영되었고, 본편은 엔딩 크레디트가 시작되기 바로 직전까지 상영되었으며, 당신은 예고편이 엔딩 크레디트와 어떤 관계인지 알고 싶습니다. 당신은 시계상의 시각을 단 하나도 알지 못합니다. 그런데도 예고편이 엔딩 크레디트가 시작되기 전에 끝났다는 것을 확신할 수 있습니다 — "바로 직전까지"가 두 번 이어지면 오직 "이전"만을 뜻할 수 있기 때문입니다. 앨런의 대수(Allen's algebra)는 바로 이러한 연쇄를 정확하게 만들어 주는 장부 정리 체계입니다: 두 시간대가 나란히 놓일 수 있는 모든 방식에 이름을 붙이고, 각 짝짓기가 세 번째 것에 관해 무엇을 함의하는지를 표로 만드는 것입니다.
이 장에서 다루는 내용
- 시간에는 왜 고유한 대수가 필요한가 — 사실은 구간(interval)에 걸쳐 성립하며, 우리가 보통 아는 것은 끝점이 아니라 구간들이 서로 어떻게 관계 맺는가입니다; 열세 가지 관계는 여섯 개의 역관계 쌍과 하나의 동등 관계로 이루어져 있습니다.
- 열세 가지 관계, 해독하기 —
before/after,meets/met-by,overlaps/overlapped-by,during/contains,starts/started-by,finishes/finished-by,equals각각이 동반 코드의relation함수 안에서 정확한 끝점 검사 하나에 고정됩니다. - 이행적 추론으로서의 합성 — 이고 일 때, 로 여전히 가능한 관계는 무엇인가; 13×13 전체 표는 손으로 입력한 것이 아니라 구성을 통해 계산됩니다.
- 날짜가 매겨진 학계 세계 — alice와 bob의 경력 구간, 그리고 박사 과정이 박사후 과정을
meets하고 그것이 다시 교수 시절을meets함을 보여 주는 실제 실행 결과. - 많은 것을 말해 주는 두 가지 합성 —
compose(meets, meets)와compose(before, before)는 각각 하나의 확실한 답으로 수렴하는 반면,compose(before, after)는 열세 가지 전부로 폭발하여 추론기에게 아무것도 알려 주지 않는 항목이 됩니다. - 한 문단으로 보는 PyReason — 이 발상을 시간에 따라 진화하는 그래프 전체로 확장하는, 개방 세계(open-world) 주석 시간 논리 엔진입니다.
시간에는 왜 고유한 대수가 필요한가
구간(interval)이란 시작과 끝을 가진 한 시간대입니다. 이를 로 적으며, 여기서 는 시작, 는 끝이고, 언제나 입니다 — 구간은 언제나 양의 지속 시간을 가집니다 [1]. 어떤 사실은 구간에 걸쳐 "성립"합니다: phd(alice)는 단일 순간이 아니라 전체에 걸쳐 참입니다.
이제 핵심적인 수가 등장합니다. 우리는 와 를 달력상의 날짜로 아는 경우가 거의 없습니다. 우리가 아는 것은 한 구간이 다른 구간에 대해 상대적으로 어떻게 놓여 있는가입니다: 박사 과정이 박사후 과정이 시작된 바로 그 시점에 끝났는지, 아니면 그 사이에 간격이 있었는지, 혹은 둘이 겹쳤는지? 앨런의 구간 대수(Allen's interval algebra)는 작지만 완전한 하나의 사실을 증명함으로써 이 물음에 답합니다: 구간의 모든 순서쌍은 열세 가지 기본 관계 중 정확히 하나의 관계에 있다는 것입니다 [2]. "적어도 하나"도 아니고 "때로는 여러 개"도 아니라 — 언제나 정확히 하나입니다. 그러한 빠짐없음(exhaustiveness)이야말로 이 대수를 단순한 용어 목록이 아니라 진정한 분류 체계로 만들어 주는 것입니다.
이 열세 가지는 깔끔한 모양을 이룹니다: 여섯 개의 역관계(inverse relation) 쌍과 하나의 자기 역관계(self-inverse)입니다. 가 보다 before라면, 는 보다 after입니다 — 같은 배치를 반대편에서 읽은 것입니다. 자기 자신의 역관계인 유일한 관계는 equals입니다: 가 와 같다면, 도 와 같습니다. 여섯 쌍이 열둘을 이루고, 여기에 equals를 더하면 열셋이 됩니다. 표기법: 는 "구간 가 구간 에 대해 관계 에 있다"를 뜻하며, 그러므로 은 "박사 과정 구간이 박사후 과정 구간을 meets한다"로 읽습니다.
열세 가지 관계, 해독하기
동반 파일은 열세 가지 모두에 표준 두 글자 코드로 이름을 붙이고, 각 코드를 영어 이름과 짝짓습니다(annotated.py 204–210번째 줄):
ALLEN = ["b", "bi", "m", "mi", "o", "oi", "d", "di", "s", "si", "f", "fi", "eq"]
ALLEN_NAME = {
"b": "before", "bi": "after", "m": "meets", "mi": "met-by",
"o": "overlaps", "oi": "overlapped-by", "d": "during", "di": "contains",
"s": "starts", "si": "started-by", "f": "finishes", "fi": "finished-by",
"eq": "equals",
}
각 관계를 정밀하게 만드는 것은 영어 단어가 아니라 네 개의 끝점에 대한 검사입니다. 와 가 주어지면, relation 함수는 일련의 비교를 통해 단 하나의 관계를 결정합니다(annotated.py 213–238번째 줄):
def relation(I, J) -> str:
"""Allen relation of interval I=(a,b) to J=(c,d), with a<b and c<d."""
(a, b), (c, d) = I, J
if a == c and b == d:
return "eq"
if b < c:
return "b"
if d < a:
return "bi"
if b == c:
return "m"
if d == a:
return "mi"
if a == c:
return "s" if b < d else "si"
if b == d:
return "f" if c < a else "fi"
if a < c < b < d:
return "o"
if c < a < d < b:
return "oi"
if c < a and b < d:
return "d"
if a < c and d < b:
return "di"
raise ValueError(f"degenerate intervals {I}, {J}") # pragma: no cover
이 연쇄를 하나의 결정 목록(decision list)으로 읽으십시오: 먼저 두 끝점이 모두 같은 경우(equals); 그다음 "전혀 겹치지 않는" 두 경우, 즉 가 가 시작되기 전에 끝나는 경우(before)와 가 가 시작되기 전에 끝나는 경우(after); 그다음 "한 점에서 맞닿는" 두 경우, 즉 의 끝이 의 시작과 같은 경우(meets)와 그 반대(met-by); 그다음 시작을 공유하는 경우, 끝을 공유하는 경우, 그리고 마지막으로 엄격하게 서로 엮이는 경우들입니다. 모든 순서쌍은 정확히 하나의 return으로 떨어지며, 마지막의 raise는 제대로 된 구간에 대해서는 결코 도달할 수 없습니다 — "정확히 하나의 관계"라는 보장이 실행 가능한 코드로 옮겨진 것입니다. 다음은 전체 목록으로, 각 관계를 그 역관계 및 코드가 검사하는 정확한 끝점 조건과 함께 보여 줍니다:
| 관계 | 코드 | 역관계 | , 에 대한 끝점 조건 |
|---|---|---|---|
| before | b | bi | |
| after | bi | b | |
| meets | m | mi | |
| met-by | mi | m | |
| overlaps | o | oi | |
| overlapped-by | oi | o | |
| during | d | di | 이고 |
| contains | di | d | 이고 |
| starts | s | si | 이고 |
| started-by | si | s | 이고 |
| finishes | f | fi | 이고 |
| finished-by | fi | f | 이고 |
| equals | eq | eq | 이고 |
합성은 이행적 추론이다
목록은 관계에 이름을 붙일 뿐입니다; 힘은 추론에 있습니다. 어떤 지식 베이스가 당신에게 와 를 알려 주지만 와 에 관해서는 아무것도 직접 말해 주지 않는다고 합시다. 무엇을 결론지을 수 있을까요? 이것이 바로 합성(composition)이며, 전방 연쇄(forward chaining)를 이끄는 것을 우리가 보았던 이행적 폐쇄(transitive-closure) 단계의 시간적 사촌뻘입니다. 형식적으로, 두 관계의 합성이란 와 사이에 성립할 수 있는 기본 관계들의 집합입니다:
∘는 "~와 합성한"으로 읽고, ∃는 "~가 존재한다"로, ∧는 "그리고"로 읽습니다. 말로 풀면: 이 합성에 속한다는 것은 정확히, 세 구간의 어떤 구체적인 배치가 , , 를 동시에 모두 실현할 때입니다. 결과가 하나의 집합인 이유는 두 관계가 세 번째 것을 유일하게 확정하는 경우가 드물기 때문입니다 — 때로는 답 하나만 살아남고, 때로는 열세 개 모두가 살아남습니다.
대부분의 교재는 이 13×13 표를 손으로 입력한 격자로 인쇄합니다. 동반 코드는 그 대신 이를 계산해 내며, 존재 정의(existential definition)를 구체적인 작은 정수 구간들에 대한 루프로 곧바로 바꾸어 놓습니다(annotated.py 241–252번째 줄):
def composition_table(n: int = 6):
"""Compute the full 13×13 Allen composition table *by construction*: for every
triple of small integer intervals I, J, K, record that the relation I→K is
achievable given the relations I→J and J→K. The result is the exact table."""
intervals = [(a, b) for a in range(n + 1) for b in range(a + 1, n + 1)]
table = {(r1, r2): set() for r1 in ALLEN for r2 in ALLEN}
for I in intervals:
for J in intervals:
r1 = relation(I, J)
for K in intervals:
table[(r1, relation(J, K))].add(relation(I, K))
return table
이것은 정의 속 를 말 그대로 코드로 옮긴 것입니다: intervals는 끝점이 범위에 있는 모든 구간을 모아 놓은 유한한 재고이며, 삼중 루프가 모든 배치를 증언합니다. 각 삼중항에 대해 와 를 읽어 낸 다음, 관측된 를 셀 table[(r1, r2)]에 추가합니다. 여섯 개의 서로 다른 끝점 값이면 세 구간의 모든 상대적 배치를 실현하기에 충분합니다 — 세 시간대의 어떤 구성도 여섯 개보다 많은 경계점을 필요로 하지 않습니다 — 그러므로 모든 삼중항에 대한 관측의 합집합은 손으로 옮겨 적은 것이 아니라 계산된, 정확히 그 합성 표입니다: 손으로 입력하는 일도, 오타가 날 가능성도 없습니다. 구간 재고가 이미 충분히 포화되어 있다는 것은 경험적으로 쉽게 확인할 수 있습니다 — 으로 만든 표는 로 만든 표와 셀 하나하나까지 동일합니다. 한 줄짜리 compose 래퍼는 그저 셀 하나를 찾아볼 뿐입니다(annotated.py 255–259번째 줄).
이 표를 손에 넣고 나면 시간 추론은 얼마나 어려울까요? 각 쌍 사이에 확정된 관계가 있다면, 합성은 표 찾아보기에 지나지 않고 연쇄는 저렴합니다. 그러나 실제 지식은 선언적(disjunctive)입니다 — 어떤 제약은 가 보다 before 또는 meets라고 말할 수도 있습니다 — 그리고 그러한 제약들로 이루어진 네트워크 전체가 함께 충족 가능한지를 결정하는 일은 NP-완전(NP-complete)이 됩니다. 앨런의 원래 방법은 합성된 관계들을 반복적으로 교집합함으로써 제약을 전파합니다(경로 일관성(path consistency)이라 불리는 절차로, 구간 개수에 대해 세제곱 시간이 걸립니다) — 이는 건전(sound)하지만 완전(complete)하지는 않습니다: 일부 비일관성을 탐지하지 못할 수 있습니다 [2]. 확실성은 저렴하지만, 일관성이라는 일반적인 물음은 그렇지 않습니다.
앨런의 열세 가지 구간 관계와 그 합성: alice의 박사 과정이 박사후 과정을 meets하고 그것이 다시 교수 시절을 meets하므로, meets와 meets를 합성하면 박사 과정이 교수 임용보다 엄격히 이전임이 증명됩니다 — 반면 before와 after를 합성하면 열세 가지 전부로 무너져 내려 추론기에게 아무것도 알려 주지 않습니다.
저자가 AI의 도움을 받아 직접 제작한 원본 도해.
날짜가 매겨진 학계 세계
이제 이를 구체화해 봅시다. 동반 코드는 진행 중인 예시의 개체들에 경력 구간을 붙입니다 — 여러 해에 걸쳐 성립하는 사실입니다(annotated.py 264–269번째 줄):
INTERVAL_FACTS = {
("phd", "alice"): (2005, 2010),
("postdoc", "alice"): (2010, 2012),
("faculty", "alice"): (2012, 2025),
("phd", "bob"): (2008, 2013),
}
alice의 세 단계는 완벽하게 맞닿아 있습니다: 박사 과정은 2010년에 끝나고, 박사후 과정은 2010년에 시작됩니다; 박사후 과정은 2012년에 끝나고, 교수 시절은 2012년에 시작됩니다. 끝점 검사에 따르면 이는 두 번 거듭된 meets입니다(두 경우 모두 ). 모듈을 실행하면 이를 확인해 주고, 그런 다음 두 개의 meets를 합성하여 우리가 결코 직접 진술한 적 없는 그 쌍에 관한 결론을 이끌어 냅니다:
Allen interval algebra (13 relations):
phd(2005, 2010) vs postdoc(2010, 2012): meets
postdoc(2010, 2012) vs faculty(2012, 2025): meets
compose(m, m) = ['b'] ⟹ phd is 'before' faculty
compose(b, b) = ['b'] (transitivity of 'before')
compose(b, bi) = 13 relations (the total-uncertainty entry)
셋째 줄이야말로 이 장 전체의 핵심이라고 읽으십시오: 그 누구도 박사 과정이 교수 시절과 어떤 관계인지 적어 두지 않았지만, compose(m, m) = {b}는 그것이 오직 before일 수밖에 없음을 증명합니다. 이것은 날짜가 전혀 필요 없는, 관계만으로부터의 진정한 추론입니다 — advises의 연쇄로부터 grandAdvisor를 이끌어 낸 것의 시간적 메아리입니다. (여기서 날짜는 동반 코드가 자신의 답을 스스로 검증할 수 있도록 있을 뿐입니다; 날짜를 지워도 합성 결과는 그대로 성립합니다.) 또한 alice의 박사 과정 과 bob의 박사 과정 은 meets가 아니라 overlaps라는 점에도 주목하십시오 — 같은 기계 장치가 서로 맞닿은 경력과 부분적으로 나란히 진행되는 경력을 깔끔하게 구별해 냅니다.
모든 것을 말해 주는 두 합성과 아무것도 말해 주지 않는 하나
위에서 인쇄된 표의 세 셀은 합성이 무엇을 사 주고 어디서 멈추는지에 관한 이야기 전체를 들려줍니다:
| 합성 | 결과 | 해석 |
|---|---|---|
compose(meets, meets) | {before} | 연달아 두 번 맞닿으면 첫 번째 시간대가 세 번째 시간대보다 엄격히 이전이 되도록 강제됩니다 |
compose(before, before) | {before} | before는 이행적(transitive)입니다 — 여느 순서 관계처럼 홀로 확실한 답입니다 |
compose(before, after) | 열세 가지 전부 | 총체적 불확실성: 이 합성은 아무것도 제약하지 않습니다 |
처음 두 셀은 좋은 소식입니다: 합성은 가능성을 하나의 관계로 줄일 수 있으며, 그렇게 되면 당신은 증명을 손에 넣은 것입니다. 세 번째는 정직한 나쁜 소식입니다. 가 보다 before이고 가 보다 after라면(즉 도 보다 이전이라면), 와 는 둘 다 의 어딘가 왼쪽에 있습니다 — 하지만 그 둘을 서로 묶어 주는 것은 아무것도 없습니다. 열세 가지 관계 하나하나가 모두 실현 가능하므로, 합성은 전체 집합을 반환하고 추론기는 새로 배운 것이 아무것도 없습니다. 그러나 이런 완전한 손사래는 드뭅니다: 앨런의 169개 셀 중 오직 세 개만이 열세 가지 관계 전부를 반환합니다 — before ∘ after, after ∘ before, during ∘ contains입니다 — 반면 표의 절반 이상(169개 셀 중 97개)은 답을 단일한 확실한 관계로 고정하며, 셀 하나의 평균 가능성 개수는 겨우 2.42개입니다. 합성은 기하학적 구조가 무언가를 확정 지어 주는 바로 그 지점에서 강력하며, 그렇지 못한 몇 안 되는 셀에서만 침묵합니다. 어떤 셀이 유익한 정보를 주는지를 아는 것이야말로 이 대수를 잘 사용하는 법의 절반입니다.
PyReason: 실용적 후예
앨런의 대수는 소수의 구간들을 따로 떼어 놓고 추론합니다. 이 발상을 규모 있게 확장해 나르는 현대적 엔진이 바로 PyReason입니다: 각 사실이 경계(bound) — 신뢰도 구간과 그 사실이 성립하는 시간 단계(time-step)의 범위 — 를 지니는 그래프 전체에 걸쳐 규칙을 실행하고, 이산적인 시간 단계 하나하나마다 그 주석이 달린 시간부여 사실들을 고정점에 이를 때까지 그래프 전역으로 전파하는, 개방 세계(open-world) 주석 시간 논리 추론기입니다 [3]. 이는 이 부(part)를 이루는 세 가닥의 직접적인 합집합입니다: 앞 장의 격자 값 신뢰도, 이 장의 구간 시간이 부여된 사실, 그리고 이 권 전체의 그래프 형태 지식 베이스입니다. 동반 코드가 네 개의 장난감 구간 위에서 하나의 합성 표를 계산하는 반면, PyReason은 시간에 따라 진화하는 수백만 개의 엣지 위에서 "어떤 노드가 이 규칙을 만족하는가, 어떤 신뢰도로, 어느 시각에"에 답합니다 — 같은 구간 직관을 산업 규모로 확장한 것입니다.
아직 풀리지 않은 부분
주석 — 출처, 신뢰도, 시간 — 은 지식 베이스를 더 풍부하게 만들지만, 동시에 그것이 실패할 수 있는 새로운 두 가지 방식도 함께 건네주며, 앨런의 대수는 그중 더 날카로운 쪽을 축소판으로 보여 줍니다. 첫째, 더 풍부해진 사실은 비일관적(inconsistent)이 될 수 있습니다: 충분히 많은 사실에 구간을 붙이고 충분히 많은 관계를 부과하면, 그 제약들이 애초에 어떤 공동의 해도 갖지 못할 수 있습니다 — 그 구간들을 하나의 직선 위에 배치할 방법이 전혀 없는 것입니다. 이를 탐지하는 일은 정확히 위에서 본 NP-완전 충족 가능성 문제이며, 앨런 자신의 다항 시간 전파 방법조차 이를 놓칠 수 있어서, 몰래 비일관적인 네트워크를 "일관적"이라고 인증해 버릴 수 있습니다. 둘째, 그 반대 방향으로, 개방 세계 가정(open-world assumption) 아래에서 시간 지식 베이스는 그저 침묵할 수도 있습니다: compose(before, after)가 열세 가지 관계 전부를 반환하는 것은 추론기가 더 이상 좁혀낼 수 없다는 것을 정직하게 보고하는 것이며, 아무리 합성을 더 거듭해도 그 무승부는 깨지지 않습니다. 그러므로 주석은 우리를 두 가지 실패 양상 사이에 남겨 둡니다 — 너무 많이 말해서 스스로 모순되는 지식 베이스, 아니면 너무 적게 말해서 기권하는 지식 베이스입니다. 그중 무엇에 대해 추론기가 무엇을 해야 하는지 — 모순을 복구해야 하는지, 아니면 기권을 받아들여야 하는지 — 는 이 대수가 제기하지만 스스로 답할 수는 없는 물음입니다.
왜 중요한가
신경-기호 시스템은 점점 더 시간 도장이 찍히고, 스트리밍되며, 불확실한 데이터 — 센서 로그, 임상 타임라인, 이벤트 그래프 — 를 다루는데, 이때 유용한 신호는 거의 언제나 정확한 시계 값이 아니라 시간대들 사이의 관계입니다. 앨런의 열세 가지 관계는 그러한 시스템의 기호적 절반에게 그 관계들에 관한 완전하고 결정 가능한(decidable) 어휘를 제공하며, 합성은 그 위에서의 정확한 추론을 제공합니다 — 여기서는 그것이 (주장되는 것이 아니라) 계산되므로 모든 셀이 검증 가능합니다. 그 선명한 시간적 목표야말로 시계열 데이터 위의 학습된 모델이 근사하려고 애쓰는 바로 그것이며, PyReason 같은 하이브리드 엔진이 신뢰도 경계와 함께 엮어 내는 바로 그것이기도 합니다. 시간은 논리에 나중에 덧붙인 부차적인 것이 아닙니다; 그것은 고유한 대수를 지닌 일급(first-class) 구조이며, 그 대수가 어디서 날카로운지(단일 관계 합성)와 어디서 손사래를 치는지(총체적 불확실성 셀)를 아는 것이야말로 시간 추론기가 무엇을 약속할 수 있는지를 정확히 아는 것입니다.
핵심 용어
- 구간(Interval) — 를 만족하는 시간대 ; 사실은 한 순간이 아니라 구간에 걸쳐 성립합니다.
- 앨런의 구간 대수(Allen's interval algebra) — 구간의 모든 순서쌍이 열세 가지 기본 관계 중 정확히 하나에 있음을 증명하는 분류 체계입니다.
- 열세 가지 관계 — 여섯 개의 역관계 쌍(
before/after,meets/met-by,overlaps/overlapped-by,during/contains,starts/started-by,finishes/finished-by)과 자기 역관계인equals로 이루어지며, 각각은 끝점 검사에 의해 고정됩니다. - 역관계(Inverse relation) — 같은 배치를 다른 구간 쪽에서 읽은 것: 인 것과 인 것은 동치입니다.
- 합성(Composition, ) — 이고 일 때 와 사이에 가능한 관계들의 집합; 이행적 추론의 시간적 형태입니다.
- 총체적 불확실성 셀(Total-uncertainty cell) — 결과가 열세 가지 관계 전부인 합성(예:
before∘after)으로, 추론이 공허해집니다; 표의 169개 셀 중 이런 셀은 단 세 개뿐입니다. - 경로 일관성(Path consistency) — 앨런의 세제곱 시간 제약 전파 방법: 건전하지만 완전하지는 않은데, 일반적인 구간 네트워크의 충족 가능성이 NP-완전이기 때문입니다.
- PyReason — 구간 및 신뢰도 추론을 시간에 걸친 그래프 전체로 확장하는 개방 세계 주석 시간 논리 엔진입니다.
이 장이 이끄는 곳
합성은 때로는 가능성을 단일한 확실한 관계로 좁혀 주고, 때로는 열세 가지 전부를 반환합니다 — 기권하는 추론기가 되는 것입니다. 그리고 주석이 달린 지식 베이스는 반대 방향으로도 밀고 나가, 침묵을 지나 노골적인 모순에까지 이를 수 있습니다. 두 결과 모두 이 부(part)가 쌓아 올려 온 것과 똑같은 개방 세계, 주석 달린 설정의 귀결입니다. 다음 장인 개방 세계와 비일관성: 기권과 복구는 이 문제들을 정면으로 마주합니다: 지식 베이스가 아무것도 함의하지 않을 때(기권)나 모든 것을 함의할 때(모순 — 고전 논리에서는 이로부터 모든 사실이 한꺼번에 도출됩니다) 추론기는 무엇을 해야 하는지, 그리고 좋은 사실들을 나쁜 것들과 함께 내버리지 않으면서 지식 베이스를 다시 온전한 상태로 복구하는 방법은 무엇인지를 다룹니다.