본문으로 건너뛰기

존재 규칙과 체이스

📍 현재 위치: 4부 · 데이터로그와 체이스 — 13장. 데이터로그는 즉시 귀결 연산자(immediate-consequence operator)를 최소 고정점(least fixpoint)까지 끌어올려, 이미 테이블 위에 놓인 상수들로부터 따라 나오는 모든 사실을 도출했습니다. 이제 우리는 규칙의 머리(head)가 어떤 상수도 그것을 이름 붙이지 못할 때조차 무언가가 존재해야 한다고 주장하도록 허용하고, 새로운 엔진 — 체이스(chase) — 이 그 무언가를 발명해내는 모습을 지켜봅니다.

데이터로그(Datalog)는 강력하지만, 온톨로지에 있어서는 대단히 중요한 맹점 하나를 지니고 있습니다: 그것이 도출하는 모든 원자(atom)는 이미 존재하던 상수들로부터 만들어집니다. alice, bob, carol을 새로운 관계로 재배열할 수는 있지만, 이름 붙은 어떤 개체도 채우지 못하는 역할을 수행하는 누군가가 있다고 결론지을 수는 결코 없습니다. 서술 논리(description logic)는 이런 일을 끊임없이 합니다 — "모든 교수는 어떤 학생을 지도한다"는 존재 주장(existential claim)입니다 — 그러므로 온톨로지를 규칙으로 모델링하려면 머리가 알려진 상수를 넘어설 수 있는 규칙이 필요합니다. 이 장은 그러한 규칙 형태인 존재 규칙(existential rule)과, 이를 충족시키는 전방 추론(forward-reasoning) 절차인 체이스(chase)를 구축합니다.

쉽게 말하면

"모든 교수는 학생 옆자리에 앉아야 한다"고 적힌 손님 명단을 상상해 보십시오. 테이블을 훑어보니 alice는 교수인데, 그녀 옆자리는 비어 있습니다. 규칙은 어떤 학생인지는 말해 주지 않습니다 — 다만 한 명이 필요하다는 것만 알려 줍니다. 그래서 당신은 "학생 #1"이라고 적은 자리표(placeholder card)를 써서 그 자리에 놓습니다. 그 자리표가 바로 새로운 널(fresh null)입니다: 반드시 존재해야 하지만 아직 이름이 없는 누군가를 대신하는 것입니다. 체이스는 그저 테이블을 한 바퀴 돌면서, 어떤 규칙이 아직 거기 없는 동반자를 요구할 때마다 자리표를 하나 더 내려놓는 것에 지나지 않습니다 — 모든 규칙이 충족되거나, 혹은 규칙이 자리표를 위한 자리표를 영원히 요구한다는 것을 발견할 때까지 말입니다.

이 장에서 다루는 내용

  • 데이터로그로는 충분하지 않은 이유 — 데이터로그의 머리는 기존 상수들을 재조합할 뿐입니다; "모든 교수는 어떤 학생을 지도한다"에는 데이터 어디에도 이름이 없을 수 있는 증인(witness)이 필요합니다.
  • TGD 해독하기튜플 생성 종속성(tuple-generating dependency)으로서의 존재 규칙: 몸체(body) → 머리(head)이며, 머리는 몸체가 결코 묶지 않은 변수를 지닐 수 있습니다.
  • 체이스 단계 — 몸체를 매칭하고, 머리에만 있는 변수마다 새로운 널(_n1, _n2, …)을 발행합니다; 새 원자를 추가하고 발동 횟수를 세는 루프입니다.
  • 무심한 체이스 대 제한된 체이스 — 무심한 체이스는 매칭이 있을 때마다 발동합니다; 제한된 체이스는 먼저 증인이 이미 존재하는지 확인하고 존재하면 건너뜁니다 — 학계 인스턴스에서는 다섯 개가 아니라 세 개의 널입니다.
  • 표로 정리한 실제 실행 결과 — 제한된 체이스와 무심한 체이스를 나란히 놓고, 동반 코드가 출력하는 실제 발동 횟수와 널 개수를 함께 봅니다.
  • 체이스가 발산할 때 — 끝없이 증인을 발행하는 존재 순환(existential cycle, 모든 연구자는 어떤 연구자의 지도를 받았다)을 단계 상한 아래에서 실행하여, 발산이 눈에 보이되 유계로 유지되도록 합니다.
  • 확실한 답으로 이어지는 다리 — 무한하거나 거대한 체이스는 물질화(materialize)할 수 없지만, 우리는 여전히 질의 응답을 원합니다; 다음 장은 체이스 전체를 구축하지 않고도 그 답을 읽어냅니다.

데이터로그가 증인을 발명할 수 없는 이유

데이터로그 규칙은 혼 절(Horn clause)입니다: 논리곱으로 이루어진 몸체가 하나의 원자를 함의하며, 머리에 있는 모든 변수는 몸체에도 나타납니다. 이 마지막 요구사항 — 머리 변수는 곧 몸체 변수다 — 이야말로 데이터로그를 안전(safe)하게 만들고 그 고정점을 유한하게 유지하는 것입니다. 모든 머리 변수가 몸체 매칭에 의해 상수에 묶이기 때문에, 머리는 데이터가 이미 언급한 상수들 사이의 관계를 재진술할 수 있을 뿐입니다: 즉시 귀결 연산자를 영원히 돌려도 새로운 개체를 만들어내는 일은 결코 없으며, 오직 기존 것들 위에 새로운 튜플만 생길 뿐입니다.

그것이 바로 Professor ⊑ ∃advises.Student — "모든 교수는 어떤 학생을 지도한다" — 같은 온톨로지 공리(axiom)에는 맞지 않는 도구입니다. 규칙으로 읽으면, 그 머리는 설령 기록상 그 교수가 아무도 지도하지 않더라도 지도받는 학생의 존재를 주장해야 합니다. 1차 논리(first-order logic)로 그 공리는 다음과 같습니다.

Professor(x)    y.  advises(x,y)Student(y).\text{Professor}(x) \;\rightarrow\; \exists y.\; \text{advises}(x, y) \wedge \text{Student}(y).

기호 하나씩 해독하면: \rightarrow는 "함의한다"로 읽고, y\exists y는 "어떤 yy가 존재한다"로 읽으며, y\exists y 뒤의 점은 한정사(quantifier)와 그것이 지배하는 주장을 구분하고, \wedge는 "그리고"로 읽습니다. 변수 yy머리에만 나타납니다 — 몸체 Professor(x)의 어떤 것도 그것을 묶지 않습니다. 데이터로그 엔진은 이 규칙을 발동시킬 수 없는데, yy 대신 넣을 상수가 없기 때문입니다. 그것을 발동시키려면 우리는 기꺼이 하나를 발명해야 합니다.

TGD 해독하기

이런 모양의 규칙을 튜플 생성 종속성(tuple-generating dependency, TGD)이라 하며, 존재 규칙(existential rule)이라고도 부릅니다 [1]. 그 일반형은 몸체 원자들의 논리곱이 머리 원자들의 논리곱을 함의하는 형태이며, 머리는 몸체에는 없는 존재 한정된 변수(existentially quantified variable)를 도입할 수 있습니다.

ϕ(x,z)body    y.  ψ(x,y)head.\underbrace{\phi(\vec{x}, \vec{z})}_{\text{body}} \;\rightarrow\; \exists \vec{y}.\; \underbrace{\psi(\vec{x}, \vec{y})}_{\text{head}}.

여기서 x\vec{x}는 몸체와 머리가 공유하는 프런티어 변수(frontier variable)이고(이미 알려진 값을 건너편으로 실어 나릅니다), z\vec{z}는 몸체에만 있는 변수이며, y\vec{y}는 머리에만 있는 존재 변수(existential variable) — 즉 발명되어야 할 증인들입니다. 동반 파일에서 종료하는 예시는 이러한 규칙 두 개를 인코딩합니다(chase.py, 195–200번째 줄):

TERMINATING_TGDS = [
([("Professor", "?x")],
[("advises", "?x", "?y"), ("Student", "?y")]),
([("Student", "?x")],
[("affiliated", "?x", "?z"), ("Institution", "?z")]),
]

각 TGD는 원자 목록으로 이루어진 (body, head) 쌍이며, 데이터로그 장과 동일한 항 표기 관례를 따릅니다(chase.py, 32–33번째 줄): 변수는 ?로 시작하고, 널은 _n으로 시작하며, 그 밖의 모든 것은 상수입니다. 첫 번째 규칙에서 ?x는 프런티어 변수이고(몸체와 머리 양쪽에 나타남) ?y는 존재 변수입니다 — 머리에만 나타납니다. 머리에만 있는 이러한 변수를 찾는 일은 작은 도우미 함수 하나가 담당합니다(chase.py, 84–92번째 줄):

def _existential_vars(body, head) -> list:
body_vars = {a for atom in body for a in atom[1:] if is_var(a)}
head_vars = [a for atom in head for a in atom[1:] if is_var(a)]
seen, out = set(), []
for v in head_vars:
if v not in body_vars and v not in seen:
seen.add(v)
out.append(v)
return out

이 함수는 몸체가 묶는 변수들의 집합을 모으고, 머리의 변수들을 순서대로 훑으면서, 몸체가 결코 묶지 않은 것들만 정확히 남겨 둡니다. 규칙 1에 대해서는 ["?y"]를, 규칙 2에 대해서는 ["?z"]를 반환합니다. 이들이 바로 체이스가 새로운 널로 채워야 할 변수들입니다.

체이스 단계: 새로운 널 발행하기

체이스(chase)는 TGD를 위한 전방 연쇄(forward chaining)입니다. 그것은 몸체 매칭 — 몸체 원자들로부터 현재 인스턴스로의 준동형사상(homomorphism) — 을 반복해서 찾아내고 규칙을 발동시킵니다. 발동한다는 것은 프런티어 바인딩을 머리에 적용하고, 존재 변수마다 다른 어디에도 나타나지 않는 완전히 새로운 널을 발행하는 것을 뜻합니다. 이 루프의 핵심(chase.py, 106–156번째 줄)이 바로 널을 발행하고 추가하는 블록입니다.

sub = dict(h)
for v in exvars:
null_ctr += 1
sub[v] = f"_n{null_ctr}"
new_atoms = [_apply(atom, sub) for atom in head]
added = [a for a in new_atoms if a not in inst]
if added:
inst.update(added)
steps += 1
changed = True

이것을 체이스 단계를 그대로 코드로 옮긴 것으로 읽으십시오. h는 몸체 매칭입니다(프런티어 변수가 기존 항에 묶여 있습니다). for v in exvars 루프는 _existential_vars가 찾아낸 머리 전용 변수들을 훑으면서, 각각에 대해 전역 카운터를 하나 올리고 새로운 널을 배정합니다 — 그래서 처음 발명되는 증인은 _n1, 다음은 _n2이며, 어떤 두 발동도 결코 충돌하지 않습니다. _apply는 프런티어 바인딩과 새 널 모두를 모든 머리 원자에 대입하고, added는 인스턴스에 진짜로 새로운 원자만 남기며, 무언가가 추가되었다면 인스턴스가 늘어나고 발동 횟수가 세어지며 changed = True가 바깥 루프를 계속 살아 있게 합니다. 한 번의 전체 순회(pass)가 아무것도 추가하지 못하면 changedFalse로 남고 체이스는 종료(terminate)합니다(chase.py, 152번째 줄) — 고정점 루프가 사용했던 "한 라운드가 아무것도 바꾸지 못했다"는 동일한 종료 판정을, 이제는 발명된 개체를 포함할 수 있는 인스턴스 위에서 적용한 것입니다.

학계 인스턴스 위에서 벌어지는 체이스를 원자들이 자라나는 그래프로 그린 다이어그램. 왼쪽에는 네 개의 씨앗 상자가 있습니다: alice의 Professor, bob의 Professor, carol의 Student, 그리고 bob에서 carol로 향하는 advises 화살표. 가운데에서는 제한된 체이스가 professor 규칙을 발동시킵니다: alice가 아무도 지도하지 않으므로, '_n1'이라는 레이블이 붙은 초록색 자리표 노드가 발행되고, alice에서 그 노드로 향하는 advises 화살표와 Student 레이블이 붙습니다; bob은 회색으로 처리되어 건너뛰어지며 이미 carol을 지도하고 있다고 주석이 달립니다. 그런 다음 student 규칙이 두 번 발동되어, carol과 발명된 '_n1'로부터 각각 두 개의 추가 Institution 널로 향하는 affiliated 화살표가 그려집니다. oblivious chase라고 표시된 옆 패널은 같은 그림을 반복하지만 bob에게도 불필요한 증인을 추가로 발행하여, 제한된 체이스의 세 개에 비해 다섯 개의 널을 만듭니다. 하단의 빨간 띠는 발산하는 규칙을 보여줍니다: 한 연구자가 advisor 널을 낳고, 그것이 또 다른 것을 낳고, 또 다른 것을 낳아 'infinite regress'라는 레이블이 붙은 줄임표로 이어지며, 쉰 번의 발동에서 상한이 걸립니다. 체이스는 익명의 널을 발명함으로써 존재 규칙을 충족시킵니다; 제한된 체이스는 bob이 이미 한 학생을 지도하고 있으므로 그를 건너뛰지만, 무심한 체이스는 불필요한 증인을 발행하며, 존재 순환은 지도자를 끝없이 낳습니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

무심한 체이스 대 제한된 체이스

"몸체 매칭을 찾아 발동시킨다"는 말 속에는 선택지가 하나 숨어 있습니다. 체이스는 몸체가 매칭될 때마다 발동해야 할까요, 아니면 머리가 아직 충족되지 않았을 때만 발동해야 할까요? 이 두 대답이 각각 무심한 체이스(oblivious chase)와 제한된(표준) 체이스(restricted (standard) chase)이며 [2], 둘 다 루프의 한 분기 안에 살고 있습니다(chase.py, 123–131번째 줄):

for h in list(homomorphisms(body, inst)):
if restricted:
if _head_satisfied(head, h, inst):
continue
else: # oblivious
key = (ri, tuple(sorted(h.items())))
if key in fired:
continue
fired.add(key)

무심한 체이스(else 분기)는 서로 다른 (rule, body-match) 트리거마다 정확히 한 번씩 발동합니다 — 증인이 이미 존재하는지는 결코 묻지 않고 그냥 하나를 발행하되, 동일한 매칭을 두 번 발동시키지 않도록 그 트리거를 기억해 둡니다. 제한된 체이스(if restricted 분기)는 먼저 _head_satisfied를 호출하여, 머리가 이미 성립할 때는 발동을 건너뜁니다. 그 충족 검사 자체도 하나의 준동형사상 검사입니다(chase.py, 95–102번째 줄):

def _head_satisfied(head, h, instance) -> bool:
grounded = [_apply(atom, h) for atom in head]
for _ in homomorphisms(grounded, instance):
return True
return False

이 함수는 프런티어 매칭 h를 머리에 적용한 다음, 남은 존재 변수들을 인스턴스에 이미 있는 항에 묶는 준동형사상이 존재하는지 찾습니다. 하나라도 존재한다면 증인은 이미 있는 것이고, 발동은 그저 불필요한 익명 사본을 하나 더 추가할 뿐입니다. 이 검사 하나가 알뜰한 체이스와 낭비하는 체이스 사이의 차이 전부입니다.

지금까지 다뤄온 예시에서 이것이 중요한 이유: 씨앗 인스턴스는 의도적으로 한쪽으로 치우쳐 있습니다(chase.py, 186–191번째 줄). bob은 이미 학생 carol을 지도하고 있지만, alice는 아무도 지도하지 않습니다. 그래서 professor 규칙을 검사할 때, _head_satisfiedbob에 대해서는 True를 반환하고(학생인 지도 학생이 존재하므로) alice에 대해서는 False를 반환합니다(그런 학생이 없으므로). 따라서 제한된 체이스는 alice에 대해서만 증인을 발명하며, 무심한 체이스는 carol이 바로 거기 서 있었음에도 bob에 대해서도 하나를 발행합니다.

실제 실행 결과

동반 모듈을 실행하면 네 개 원자로 이루어진 인스턴스를 두 방식 모두로 체이스하고 집계를 출력합니다. 다음은 실제로 커밋된 출력입니다.

Terminating TGD set on a 4-atom instance
restricted chase: terminated=True, 3 firings, 3 nulls, |result|=10
oblivious chase: terminated=True, 5 firings, 5 nulls, |result|=14
(oblivious mints a witness for bob too, though bob already advises carol)

두 체이스 모두 종료하지만, 서로 다른 크기의 인스턴스에 도달합니다.

체이스 방식종료 여부발동 횟수발행된 널결과 크기증인 대상
제한된 (표준)True3310alice만
무심한True5514alice bob

제한된 체이스의 세 번의 발동이 이야기 전부를 말해 줍니다. 첫째, Professor(alice)가 발동합니다 — alice는 아무 학생도 지도하지 않으므로 — _n1을 발행하고 advises(alice, _n1)Student(_n1)을 추가합니다. 둘째, Student(carol)이 발동하여 그녀의 소속 기관을 위해 _n2를 발행합니다. 셋째, 발명된 학생 _n1 자체가 하나의 Student이므로, 두 번째 규칙이 다시 발동하여 _n3을 발행합니다 — 널이 널에게 소속을 부여하는 것입니다. 그런 다음 한 번의 전체 순회가 아무것도 추가하지 못해 체이스가 멈춥니다: 씨앗 원자 44개에 새로운 원자 66개를 더하면 보고된 1010이 됩니다. Professor(bob)은 결코 발동하지 않습니다: _head_satisfiedcarol을 찾아내기 때문입니다.

무심한 체이스는 그 세 가지를 모두 수행하고 거기에 더해 두 가지를 더 수행합니다: Professor(bob)을 발동시켜(불필요한 지도 학생을 위해 _n을 발행) 그런 다음 그 학생의 소속을 처리하여, 55번의 발동, 55개의 널, 1414개의 원자에 도달합니다. 두 결과 모두 보편 모델(universal model)입니다 — 각각이 TGD의 모든 모델로 준동형사상 사상되므로, 둘 다 논리곱 질의(conjunctive query)에 동일하게 답합니다 [2] — 그러나 제한된 체이스가 도달하는 모델이 엄밀하게 더 작습니다. 체이스를 물질화해야 할 때, 그 여분의 널 두 개가 바로 실제 추론기가 피하려고 애쓰는 낭비입니다.

체이스가 발산할 때

종료는 공짜로 주어진 것이 아니었습니다; 그것은 규칙들이 지닌 성질이었습니다. 발명된 개체가 자신을 만들어낸 바로 그 규칙을 다시 촉발하도록 규칙을 바꾸면, 체이스는 결코 멈추지 않습니다. 동반 코드의 발산 예시는 한 줄입니다(chase.py, 204–208번째 줄):

NONTERMINATING_INSTANCE = {("Researcher", "alice")}
NONTERMINATING_TGDS = [
([("Researcher", "?x")],
[("advises", "?y", "?x"), ("Researcher", "?y")]),
]

말로 풀면: 모든 연구자는 어떤 연구자의 지도를 받았다 — Researcher(x)y.advises(y,x)Researcher(y)\text{Researcher}(x) \rightarrow \exists y.\, \text{advises}(y, x) \wedge \text{Researcher}(y). Researcher(alice)에서 시작합니다. 규칙이 발동하여 _n1을 발행합니다 — alice를 지도하는 연구자입니다. 그러나 _n1Researcher이므로, 규칙이 다시 발동하여 _n1을 지도하는 _n2를 발행합니다. 그리고 _n2도 연구자이니, 계속됩니다: 익명의 지도자의 지도자가 끝없이 이어지는 무한 퇴행(infinite regress)입니다. 제한된 체이스의 검사도 여기서는 우리를 구해 주지 못하는데, 왜냐하면 각각의 새로운 널은 다음 발동이 지도자를 공급해 줄 때까지는 진정으로 지도자가 없기 때문입니다; 머리는 결코 이미 충족되어 있지 않습니다. 동반 코드는 이를 max_steps=50 상한 아래에서 실행하여 발산이 눈에 보이되 유계로 유지되도록 합니다.

Non-terminating TGD (Researcher(x) -> ∃y advises(y,x) ∧ Researcher(y))
terminated=False after the 50-firing cap; 50 fresh advisors invented and still growing

terminated=False는 정직한 신호입니다: 체이스가 고정점에 도달한 것이 아니라 벽에 부딪힌 것입니다. 상한을 없애면 루프는 영원히 돌아갑니다. 이것은 버그가 아니라 존재 규칙이 지닌 진짜 특성입니다. 체이스 종료는 일반적으로 결정 불가능(undecidable)합니다: 어떤 알고리즘도 임의의 TGD 집합을 살펴보고 그 체이스가 멈출지 여부를 항상 올바르게 결정할 수는 없습니다 [3]. 그래서 규칙들의 전체 계열은 그것들이 만족하는 충분 조건 — 약한 비순환성(weak acyclicity), 가드성(guardedness), 그리고 그 친척들 — 을 통해 연구되며, 각 조건은 체이스가 유한하거나, 적어도 유한하지 않더라도 질의 응답이 결정 가능한 상태로 남는 부분집합(fragment)을 하나씩 도려냅니다 [3].

아직 풀리지 않은 부분

불편한 질문은 바로 이 발산 지점에 놓여 있습니다. 어떤 규칙 집합의 체이스가 무한할 수 있고 — 그것도 결정 불가능하게 무한할 수 있다면 — 우리는 대체 어떻게 그것에 대해 질의에 답할 수 있을까요? 모델 전체를 물질화하는 것은 애초에 선택지가 아닙니다: 붙잡아 둘 전체 모델이라는 것이 존재하지 않기 때문입니다. 그러나 "누가 어떤 연구자를 지도하는가?"라는 질의는 연구자 온톨로지 위에서 분명히 답을 가지고 있으며, 그 답이 우리가 무한한 구축을 끝마칠 수 없다는 사정에 좌우되어서는 안 됩니다. 두 가지 탈출구가 있으며, 어느 쪽도 공짜가 아닙니다. 하나는 규칙을 종료하는 부분집합으로 제한하고 표현력에서 대가를 치릅니다 — 바로 그 문제를 일으킨 순환 공리들을 포기하는 것입니다. 다른 하나는 표현력이 풍부한 규칙을 그대로 유지하되 체이스를 결코 구축하지 않고, 질의를 유한한 입력 데이터 위에서 직접 평가 가능한 형태로 재작성함으로써 답합니다. 어떤 시스템이 어느 탈출구를 택하는지, 그리고 그 대가가 무엇인지는 온톨로지 기반 질의 응답(ontology-based query answering) 분야 전체를 조직하는 미해결의 공학적 긴장이며 — 표현력, 결정 가능성, 규모라는 모든 축에서 동시에 이기는 단 하나의 선택은 존재하지 않습니다.

왜 중요한가

존재 규칙은 상징적 추론(symbolic reasoning)이 주어진 개체들을 그저 장부에 기록하는 일을 멈추고 주어지지 않은 개체를 상정하기 시작하는 지점입니다 — 이는 서술 논리가 그 ∃ 구성자(constructor)로써 밟는 바로 그 표현력의 도약이며, 체이스는 그 작동상의 의미입니다: 온톨로지가 누구인지 알지 못한 채로도 "alice가 누군가를 지도한다"를 함의할 수 있는 이유입니다. 신경-기호(neuro-symbolic) AI에게 이 교훈은 두 가지 방향으로 작동합니다. 체이스가 발명하는 널은 "모델이 필요로 하지만 이름을 붙일 수 없는 개체"라는, 명료하고 검증 가능한 개념입니다 — 이는 학습된 모델이 그럴듯하지만 이름 붙지 않은 채움말(filler)을 환각(hallucinate)할 때 더듬어 찾고 있는 바로 그 잠재 구조이며, 체이스는 그러한 채움말이 정확히 언제 정당화되는지를 말해 줍니다. 그리고 종료의 결정 불가능성은 어떤 신경망적 근사로도 뒤집을 수 없는 단단한 한계입니다; 제한된 체이스의 원칙 — 증인이 이미 존재하지 않을 때에만 발동한다 — 은 학습된 추론기가 이미 가지고 있는 증인을 또 발명하지 않도록 막아 주는 바로 그 안전장치입니다.

핵심 용어

  • 존재 규칙 / 튜플 생성 종속성(Existential rule / tuple-generating dependency, TGD) — 몸체 → 머리 형태의 규칙으로, 머리가 몸체는 결코 묶지 않은 존재 변수(existential variable)를 지닐 수 있는 것; 이름을 붙이지 않고도 무언가가 존재한다고 주장합니다.
  • 프런티어 변수(Frontier variable) — 몸체와 머리가 공유하며 알려진 값을 건너편으로 실어 나르는 변수; 발명되어야 할 증인인 존재(머리 전용) 변수(existential (head-only) variable)와 대비됩니다.
  • 새로운 널(Fresh null) — 필요하지만 이름 붙지 않은 개체를 나타내는, 발명된 자리표 상수(_n1, _n2, …); 다른 모든 상수 및 다른 모든 널과 구별됩니다.
  • 체이스(The chase) — TGD를 위한 전방 연쇄: 몸체를 매칭하고, 머리의 존재 변수마다 새로운 널을 발행합니다. 그 고정점(고정점이 존재할 경우)이 보편 모델(universal model)입니다.
  • 무심한 체이스(Oblivious chase) — 서로 다른 몸체 매칭마다 발동하며 항상 증인을 발행함; 단순하지만 낭비적입니다(여기서는 널 다섯 개).
  • 제한된(표준) 체이스(Restricted (standard) chase)_head_satisfied가 기존 증인을 찾으면 발동을 건너뜀; 더 적은 널(여기서는 세 개)을 만들고 더 많은 입력에서 종료합니다.
  • 보편 모델(Universal model) — 준동형사상으로 모든 모델에 사상되는 모델로, 이 모델 위에서 답해진 논리곱 질의는 모든 모델에 대해서도 답해진 것입니다.
  • 체이스 종료(Chase termination) — 체이스가 멈추는지 여부; 일반적으로 결정 불가능(undecidable in general)하며, 충분 부분집합(약한 비순환성, 가드성)을 통해 연구됩니다.

이 장이 이끄는 곳

체이스는 우리에게 보편 모델을 건네줍니다 — 그러나 때로는 무한하거나 실용적이지 않을 만큼 거대한 모델이어서, 그것을 질의하기 위해 언제나 메모리에 담아 둘 수는 없습니다. 다음 장인 확실한 답은 그 틈을 메웁니다: 질의의 확실한 답(certain answers)을 모든 모델에서 참인 튜플로 정의하고, 그것이 정확히 체이스로부터 읽어낸 널 없는 답과 같음을 보이며 — 결정적으로 — 체이스 전체를 물질화하지 않고도 그 답을 얻는 방법을 설명하여, 연구자 퇴행 같은 발산하는 규칙 집합조차 질의가 요구하는 유한하고 확실한 진실을 반환할 수 있도록 합니다.