강의 1

유한 오토마타와 정규 표현식 입문

메모리가 유한한 기계가 할 수 있는 일은 어디까지인가.

1. 계산이란 무엇인가

“계산”이라는 단어는 일상에서 너무 자주 쓰여 오히려 무덤덤하게 들린다. 그러나 계산이론(theory of computation)이 던지는 질문은 결코 무덤덤하지 않다. 어떤 문제가 기계로 풀릴 수 있는가, 그리고 풀린다면 얼마만큼의 자원이 필요한가. 이 질문에 정직하게 답하려면 먼저 “기계”라는 말의 뜻부터 못박아야 한다.

철학적인 만담으로 빠지기 전에 한 가지 영리한 결정을 내려 두자. 우리는 가장 강력한 모델, 예컨대 임의 크기의 메모리를 가진 튜링 기계(Turing machine)부터 시작하지 않는다. 오히려 그 반대다. 가장 단순한 모델—메모리가 유한한 작은 기계—에서 출발한다. 단순한 세계에서 무엇이 가능하고 무엇이 불가능한지 정확히 그려낸 다음, 한 단계씩 능력을 키워 가며 그 경계가 어떻게 변하는지를 추적할 것이다. 작은 사다리부터 차례로 밟는 것이 절벽을 단번에 넘는 것보다 훨씬 멀리 데려다 준다.

그 가장 단순한 모델이 바로 유한 오토마타(finite automaton)다. 신호등의 상태 전환, 자동판매기의 잔돈 계산, 어휘 분석기의 토큰 인식—이런 것들이 본질적으로 유한 오토마타의 작동 방식이다. 너무 단순해 보일지 모르지만, 단순하다는 것은 곧 명료하게 분석할 수 있다는 뜻이기도 하다.

한 줄 메모. 단순한 모델을 먼저 정복하는 이유는 야망이 부족해서가 아니다. 그 단순한 세계에 이미 비자명한 한계가 존재하며, 그 한계를 정확히 짚어내는 것이 더 큰 모델을 이해하는 열쇠가 된다.

2. 알파벳, 문자열, 언어

기계가 다루는 입력을 형식화해 두자. 알파벳(alphabet) Σ는 유한하고 공집합이 아닌 기호들의 집합이다. 흔히 Σ = {0, 1} (이진 알파벳), Σ = {a, b}, 혹은 Σ = {a, b, ⋯, z}와 같이 쓴다. 문자열(string)은 Σ의 원소를 유한 번 이어 붙인 수열이며, 길이 0인 빈 문자열은 ε로 표기한다. 문자열 w의 길이는 |w|로 쓴다.

정의. 알파벳 Σ에 대하여 Σ* = {w : w는 Σ의 기호로 이루어진 유한 길이 문자열}로 정의한다. 즉 Σ*는 ε을 포함한 모든 유한 문자열의 집합이다. 언어(language)란 Σ*의 부분집합 L ⊆ Σ*이다.

정의가 살짝 김빠질 수 있다. “언어”라는 거창한 단어 뒤에 숨은 것이 결국 문자열들의 집합 하나라니. 그러나 이 가벼운 정의가 무거운 일을 한다. 우리가 “문제를 푼다”라고 말하는 행위가 “주어진 입력 w가 어떤 정해진 집합 L에 속하는지 결정한다”라는 행위와 일대일로 대응되기 때문이다. 소수 판별 문제도, 문법 검사도, 컴파일러의 토큰 인식도 모두 이 형태로 다듬을 수 있다. 언어를 다루는 기계를 이해하면 결국 “문제를 푸는 기계”를 이해하게 된다.

예제. Σ = {0, 1}일 때 L1 = {w ∈ Σ* : w는 짝수 개의 1을 포함}, L2 = {0n1n : n ≥ 0}는 모두 Σ*의 부분집합이다. 둘 다 형식적으로 “언어”이지만, 곧 보겠지만 이 둘은 기계의 능력 면에서 완전히 다른 무게 등급에 속한다.

3. 결정적 유한 오토마타(DFA)

유한 오토마타의 가장 절제된 형태부터 보자. 결정적 유한 오토마타(DFA, Deterministic Finite Automaton)는 입력 문자열을 왼쪽에서 오른쪽으로 한 글자씩 읽으며, 각 단계에서 “현재 상태”라는 하나의 정보만을 기억한다. 상태의 수는 유한하다. 다음 상태는 현재 상태와 읽은 글자에 의해 유일하게 결정되므로 이름에 “결정적(deterministic)”이라는 수식이 붙는다.

정의. DFA는 5-튜플 M = ⟨Q, Σ, δ, q0, F⟩이다.
  • Q: 상태들의 유한 집합
  • Σ: 입력 알파벳
  • δ: Q × Σ → Q, 전이 함수(transition function)
  • q0 ∈ Q: 시작 상태(start state)
  • F ⊆ Q: 받아들임 상태들의 집합(accept states)
입력 w = a1a2⋯an에 대해 상태 수열 r0, r1, ⋯, rn을 r0 = q0, ri = δ(ri−1, ai)로 정의하자. rn ∈ F이면 M은 w를 받아들인다(accepts)고 한다. M이 받아들이는 모든 문자열의 집합을 L(M)이라 쓰고, 이를 M이 인식하는 언어라 부른다.

전이 함수는 이름은 거창해도 결국 “상태와 글자의 쌍을 다음 상태로 보내는 표”에 불과하다. 머릿속으로 그리려면 다음과 같은 그림이 편하다. 동그라미는 상태, 화살표는 전이, 화살표 머리에 입력 글자를 적는다. 시작 상태에는 어디서 들어오는 화살이 하나 있고, 받아들임 상태에는 이중 동그라미를 두른다.

예제 1. Σ = {a, b}에서 “문자열이 정확히 ab로 끝나는” 언어 L = {w ∈ {a,b}* : w = xab, x ∈ {a,b}*}를 인식하는 DFA를 구성한다. 핵심 통찰은 “직전에 본 글자가 무엇인가”만 기억하면 충분하다는 점이다.
  • q0: 아직 의미 있는 접미사 없음(또는 직전 글자가 a, b가 아님)
  • q1: 직전 글자가 a
  • q2: 직전 두 글자가 ab (받아들임 상태)
전이는 다음과 같이 둔다.
       a            b
q0 ─────▶ q1   q0 ─────▶ q0
q1 ─────▶ q1   q1 ─────▶ q2
q2 ─────▶ q1   q2 ─────▶ q0
F = {q2}, q0이 시작 상태다. 잠시 손으로 “aab”, “abb”, “bab”을 추적해 보면 정확히 ab로 끝나는 입력만 q2에서 멈춘다는 사실이 확인된다.
예제 2. Σ = {0, 1}에서 “1의 개수가 3의 배수인” 언어를 인식하는 DFA. 상태 rk(k ∈ {0,1,2})를 “지금까지 읽은 1의 개수 mod 3 = k”로 둔다.
  • δ(rk, 0) = rk (0은 카운터를 건드리지 않음)
  • δ(rk, 1) = r(k+1) mod 3
시작 상태는 r0, 받아들임 상태도 F = {r0}. 빈 문자열 ε도 1의 개수가 0이므로 받아들여진다. 단 세 개의 상태로 이론상 임의로 긴 입력의 1을 “3으로 나눈 나머지” 정보를 정확히 유지한다는 점이 인상적이다. 유한한 메모리가 무한한 입력 위에서 어떤 식으로 정보를 압축해 끌고 가는지를 잘 보여 준다.

4. 정규 언어

이렇게 만든 모델로 표현 가능한 언어들에 이름을 붙여 두자. 이 클래스가 앞으로 몇 강의 동안 우리의 주된 무대가 된다.

정의. 어떤 DFA M이 존재하여 L = L(M)이면, L을 정규 언어(regular language)라 한다.

정의를 보고 “DFA로만 정의되는 클래스인데 왜 이름을 따로 짓는가” 하는 의문이 들 수 있다. 그 답은 다음 두 강의에 걸쳐 자연스럽게 드러난다. 같은 클래스가 비결정적 모델로도, 정규 표현식으로도, 닫힘 연산의 결과로도 등장한다. 같은 산을 동·서·남쪽에서 각각 올라가 모두 같은 정상에 닿는 셈이다.

5. 정규 표현식

이제 같은 정상에 가는 또 다른 등산로를 살짝 엿본다. 정규 표현식(regular expression)은 언어를 구문론적으로, 즉 작은 표현식을 결합해 서서히 키우는 방식으로 정의한다.

정의. 알파벳 Σ 위의 정규 표현식(regex)은 다음 규칙으로 귀납적으로 정의된다.
  1. ∅은 정규 표현식이고, L(∅) = ∅.
  2. ε은 정규 표현식이고, L(ε) = {ε}.
  3. a ∈ Σ에 대해 a는 정규 표현식이고, L(a) = {a}.
  4. R1, R2가 정규 표현식이면 (R1 ∪ R2)도 정규 표현식이고, L(R1 ∪ R2) = L(R1) ∪ L(R2).
  5. (R1R2)도 정규 표현식이고, L(R1R2) = {xy : x ∈ L(R1), y ∈ L(R2)}.
  6. (R1*)도 정규 표현식이고, L(R1*) = {x1x2⋯xk : k ≥ 0, xi ∈ L(R1)}. 특히 ε ∈ L(R*) (k=0인 경우).

합집합 ∪, 연결(concatenation), 그리고 클레이니 스타(Kleene star) *—이 셋이 정규 표현식의 세 가지 기본 연산이다. 같은 표현식이라도 괄호와 우선순위 약속에 따라 외양이 달라진다. 통상적으로 *가 가장 강하게 결합하고, 그 다음이 연결, 마지막이 ∪이다.

예제. Σ = {0, 1}에서
  • (0 ∪ 1)*: 모든 이진 문자열의 집합 Σ*.
  • (0 ∪ 1)*1: 1로 끝나는 이진 문자열들.
  • 0*10*10*: 정확히 두 개의 1을 포함하는 이진 문자열들.
  • (00)*: 짝수 길이의 0-반복 문자열들 {ε, 00, 0000, ⋯}.
  • ∅*: 정의에 따라 {ε}이다. 공집합을 0번 이어 붙인 결과는 빈 문자열이라는 묘한 사실이다.
한 줄 메모. ∅과 ε은 흔히 헷갈린다. ∅은 “문자열이 하나도 없는 언어”, ε은 “길이 0짜리 문자열을 단 하나 가진 언어 {ε}”. 비유하자면 ∅은 빈 봉투조차 없는 상태이고, ε은 빈 봉투 하나가 들어 있는 상자다.

6. 다음 강의 예고

여기까지 우리는 결정적 기계와 구문적 표현식이라는 두 갈래 길을 깔아 두었다. 다음 강의에서는 길을 하나 더 추가한다. 한 상태에서 동시에 여러 곳으로 갈라질 수 있는 비결정적 유한 오토마타(NFA)가 그것이다. 처음에는 “편법 같다”는 느낌이 들겠지만, 놀랍게도 NFA가 인식할 수 있는 언어 클래스는 DFA의 그것과 정확히 같다는 사실을 증명할 것이다. 거기에 정규 표현식까지 같은 클래스로 합류하면, 정규 언어라는 한 봉우리에 세 개의 등산로가 모두 닿게 된다.

강의 2

비결정성, 폐쇄성, 정규표현식 → 유한 오토마타

갈래길에서 동시에 모든 길을 가는 기계, 그리고 그것이 결국 결정적 기계와 같다는 놀라움.

1. 비결정성이라는 사고 실험

지난 강의의 DFA는 모범생이었다. 매 단계 정확히 한 곳으로만 움직였고, 같은 입력에 대해 같은 답을 내놓았다. 이번에는 그 모범생 옆에 약간 수상한 선배 한 명을 앉혀 보자. 같은 입력 글자를 보고도 여러 상태로 동시에 갈라질 수 있는 기계, 심지어 입력을 한 글자도 읽지 않고도 상태를 바꿀 수 있는 기계. 이 선배가 바로 비결정적 유한 오토마타(NFA, Nondeterministic Finite Automaton)이다.

비결정성을 사람의 비유로 풀자면 이렇다. DFA는 길이 갈라질 때마다 한쪽을 “골라야” 한다. NFA는 그런 선택을 거부한다. 모든 갈래길에서 분신술을 써서 모든 갈래로 동시에 들어간다. 어느 한 분신이라도 끝까지 살아남아 받아들임 상태에 도달하면, 전체 NFA는 그 입력을 받아들였다고 선언한다. 한 분신이 막다른 골목에 부딪혀 사라지더라도, 다른 분신이 골인하면 그만이다.

한 줄 메모. 비결정성을 “미래를 미리 보는 마법사”로 묘사하기도 한다. 마법사는 정답으로 가는 분신만 살려 두는 듯이 보이지만, 사실은 모든 분신을 동시에 굴리고 그중 하나라도 성공하면 만세를 부른다. 결과만 보면 마법처럼 보이지만, 메커니즘은 평행 탐색일 뿐이다.

2. NFA의 형식 정의

형식적으로 비결정성을 어떻게 표현할까. 두 가지 변화가 필요하다. 첫째, 한 상태와 한 글자에서 갈 수 있는 다음 상태가 여러 개일 수 있어야 한다. 둘째, 글자를 읽지 않고도(즉 ε으로) 이동할 수 있어야 한다.

정의. Σε = Σ ∪ {ε}이라 하자. NFA는 5-튜플 N = ⟨Q, Σ, δ, q0, F⟩이며, 단 전이 함수가 δ: Q × Σε → P(Q)이다. 여기서 P(Q)는 Q의 멱집합이다.

입력 w ∈ Σ*가 주어졌을 때, w를 어떤 식으로 ε들을 사이사이 끼워 w = y1y2⋯ym (yi ∈ Σε)로 쪼갤 수 있고, 상태열 r0, r1, ⋯, rm가 r0 = q0, ri ∈ δ(ri−1, yi), rm ∈ F를 만족하면 N은 w를 받아들인다고 한다.

전이 함수의 공역이 Q가 아니라 P(Q)인 점이 핵심이다. δ(q, a) = ∅이라는 것은 “이 상태에서 a를 보면 갈 곳이 없다”라는 뜻이고, 이 분신은 거기서 사라진다. 반대로 δ(q, a) = {p1, p2, p3}이면 분신 셋이 동시에 태어난다.

예제. Σ = {0, 1}에서 “끝에서 세 번째 글자가 1인” 언어를 인식하는 NFA를 생각해 보자. DFA로 짜려면 “마지막 세 글자가 무엇이었는지” 모두 기억해야 하므로 8개에 가까운 상태가 필요하다. 그러나 NFA는 다음과 같이 단 4개의 상태로 끝낸다.
        0,1
       ┌──┐
       ▼  │
   ──▶ q0 ──1──▶ q1 ──0,1──▶ q2 ──0,1──▶ q3((accept))
q0에서 자기 자신으로 가는 0,1 루프는 “아직 결정적 시점이 오지 않았다”라고 늑장을 부리는 분신이다. 어느 순간 1을 읽고 q1으로 갈라져 나가는 분신이 정답 분신이 된다. 정답 분신이 끝까지 살아남으려면, 우리가 갈라져 나간 그 1이 끝에서 세 번째 글자여야 한다. NFA는 “언제 갈라져야 정답인가”를 미리 알고 있는 양 행동하지만, 실제로는 모든 가능한 갈림길을 평행하게 시도하고 있을 뿐이다.

3. 부분집합 구성: NFA를 DFA로 흉내 내기

비결정성이 진짜로 새로운 능력을 추가했는가. 답은 “아니다”이다. 매 시점에 NFA의 상태가 “여러 분신의 집합”이라는 점에 착안하면, 그 집합 자체를 새로운 단일 상태로 보면 된다. 즉 NFA의 상태 집합 Q에 대해 그 멱집합 P(Q)를 새로운 DFA의 상태 집합으로 삼는다. 이를 부분집합 구성(subset construction)이라 부른다.

정리. 모든 NFA N = ⟨Q, Σ, δ, q0, F⟩에 대해 L(M) = L(N)인 DFA M이 존재한다.
증명 스케치. 임의 R ⊆ Q에 대해 ε-폐포 E(R)을 “R에서 ε-전이만으로 도달 가능한 상태들의 집합”으로 정의한다. M = ⟨Q', Σ, δ', q0', F'⟩를 다음과 같이 잡는다.
  • Q' = P(Q)
  • q0' = E({q0})
  • δ'(R, a) = E( ⋃q ∈ R δ(q, a) )
  • F' = {R ∈ Q' : R ∩ F ≠ ∅}
입력 w를 읽는 동안 M의 상태는 정확히 “지금 이 시점에 NFA의 어느 상태 분신들이 살아 있는가”의 집합과 일치한다. 받아들임 상태의 정의도 그에 맞춰 “살아 있는 분신 중 하나라도 받아들임이면 받아들이라”로 옮겨 둔 것뿐이다. 귀납으로 동치성을 어렵지 않게 확인할 수 있다. ∎

구성 자체는 깔끔하지만 대가가 있다. NFA의 상태가 n개라면 DFA의 상태는 최대 2n개까지 부풀 수 있다. 이를 상태 폭발(state explosion)이라 한다. 실제로 위 “끝에서 세 번째가 1” 예제에서, 부분집합 구성을 끝까지 적용하면 도달 가능한 부분집합만 따져도 23 = 8 정도의 상태가 등장한다. NFA는 진정 새로운 능력을 가진 것이 아니라, 같은 능력을 더 압축된 형태로 표현하는 표기법인 셈이다.

따름정리. 어떤 언어 L이 어떤 NFA에 의해 인식되는 것과, L이 정규 언어인 것은 동치다. 즉 NFA와 DFA는 인식 능력에서 정확히 같다.

4. 정규 언어의 폐쇄성

같은 클래스를 두 가지 방식으로 표현할 수 있다는 사실은 단순한 미학적 결과를 넘어선다. 어떤 연산에 대해 클래스가 닫혀 있는지 보일 때, 어느 모델이든 편리한 쪽을 골라 쓸 수 있게 되기 때문이다.

정리. 정규 언어의 클래스는 다음 연산에 대해 닫혀 있다: 합집합, 교집합, 여집합, 연결, 클레이니 스타, 역(reversal).
증명 스케치.
  • 합집합: NFA를 사용한다. L1, L2를 인식하는 NFA N1, N2에 새 시작 상태 s를 두고 ε-전이로 두 NFA의 시작 상태에 동시에 분기시킨다. 분신 둘 중 하나만 받아들이면 충분하다.
  • 연결: 같은 N1, N2에 대해 N1의 모든 받아들임 상태에서 N2의 시작 상태로 ε-전이를 추가하고, N2의 받아들임만을 받아들임으로 둔다. “먼저 L1을 끝낸 뒤 L2를 시작” 시나리오를 그대로 그림으로 옮긴 것이다.
  • 스타: N1에 새 시작 상태 s′을 두고 받아들임으로 지정해 ε(빈 문자열)을 인정한다. s′에서 N1의 시작 상태로 ε-전이를 두고, N1의 모든 받아들임 상태에서 다시 N1의 시작으로 ε-전이를 보낸다. 한 바퀴를 돌 때마다 새로운 한 조각이 이어진다.
  • 여집합: DFA를 사용한다. 받아들임 집합 F를 Q ∖ F로 뒤집으면 끝난다. 이 단순함은 “모든 입력에 대해 정확히 한 경로가 존재하는” 결정성 덕분이다. 같은 트릭을 NFA에 그대로 적용하면 망한다.
  • 교집합: 곱 구성(product construction). DFA M1, M2에 대해 상태를 (q1, q2) ∈ Q1 × Q2로 두고 두 기계를 병렬로 굴린다. 두 기계가 모두 받아들이는 쌍이 받아들임 상태다. 또는 드모르간으로 합집합과 여집합으로부터 끌어낼 수도 있다.
  • : NFA에서 모든 화살의 방향을 뒤집고, 받아들임과 시작의 역할을 바꾼다. 다중 받아들임을 처리하기 위해 새 시작 상태와 ε-전이가 필요할 수 있다.
각 경우 모두 새로 만든 기계가 원하는 언어를 정확히 인식함을 귀납으로 확인하면 된다. ∎
한 줄 메모. 합집합·연결·스타에는 NFA가, 여집합·교집합에는 DFA가 편하다. 같은 클래스를 둘로 표현해 두는 가치가 여기서 빛난다. 모델은 상황에 맞게 갈아 끼우면 된다.

5. 정규 표현식 → NFA: 톰슨 구성

정규 표현식과 유한 오토마타가 같은 클래스를 표현한다는 큰 정리의 한쪽 방향을 처리하자. 즉 임의의 정규 표현식 R로부터 L(N) = L(R)인 NFA N을 만들 수 있음을 보인다. 정규 표현식의 정의가 귀납적이므로 구성도 귀납적이다. 이 방법을 톰슨 구성(Thompson’s construction)이라 한다.

정리. 모든 정규 표현식 R에 대해 L(N) = L(R)인 NFA N이 존재한다. 따라서 정규 표현식이 표현하는 모든 언어는 정규 언어다.
증명 스케치. R의 구조에 대한 귀납.

기저. R = ∅이면 받아들임 상태가 없는 두 상태 NFA. R = ε이면 시작 상태가 곧 받아들임 상태이며 모든 a ∈ Σ에 대한 전이가 비어 있다. R = a (a ∈ Σ)이면 시작에서 a 화살로 받아들임으로 가는 두 상태 NFA.

귀납. R1, R2에 대해 NFA N1, N2를 이미 가졌다고 하자.

  • R1 ∪ R2: 새 시작 상태에서 N1, N2의 시작 상태로 각각 ε-전이를 두 갈래 보낸다. 두 NFA의 받아들임을 그대로 받아들임으로 유지한다.
  • R1R2: N1의 받아들임을 받아들임에서 풀고, 거기서 N2의 시작으로 ε-전이를 보낸다. N2의 받아들임만 새로운 받아들임이 된다.
  • R1*: 새 시작 상태 s′을 두고 동시에 받아들임으로 지정하여 ε(0회 반복)을 처리한다. s′에서 N1의 시작으로 ε-전이를 보내고, N1의 모든 받아들임에서 다시 N1의 시작으로 ε-전이를 두어 “여러 번” 반복할 수 있게 한다.
각 단계마다 ε-전이로 두 부분 NFA를 끼워 맞추는 모양새가 마치 작은 부품을 클레이니로 조립하는 모양이다. 부품이 망가지지 않도록 “시작 상태로 들어오는 화살 없음, 받아들임 상태에서 나가는 화살 없음”이라는 불변량을 유지하는 것이 깔끔한 구성의 비결이다. ∎
예제. R = (ab)*는 다음 부품 조립으로 얻어진다. 먼저 a, b 각각의 두 상태 NFA를 만들고, 연결로 ab의 NFA를 만든다. 거기에 스타 구성을 한 번 적용해 (ab)*의 NFA를 얻는다. ε-전이가 다소 무성하게 자라지만, 부분집합 구성을 굳이 거치지 않더라도 NFA 그대로 시뮬레이션할 수 있으니 실용상 문제없다.

6. 다음 강의 예고

이 시점에서 우리는 정규 언어를 향한 두 갈래 등산로—DFA/NFA와 정규 표현식—를 한쪽 방향(정규 표현식 → NFA)으로 연결했다. 다음 강의에서는 반대 방향(DFA → 정규 표현식)을 매듭짓고, 더 무거운 질문 하나를 들고 온다. 정규 언어가 아닌 언어가 존재하는가, 있다면 어떻게 증명하는가. 그 답은 비둘기집 원리가 살짝 변장한 모습으로 등장하는 펌핑 보조정리에서 나온다. 그 다음에는 한 단계 더 큰 사다리에 발을 올려, 균형 괄호처럼 정규 언어가 도저히 잡지 못하는 언어들을 잡아내는 문맥 자유 문법(CFG)으로 이행할 것이다.

강의 3

정규 펌핑 보조정리, 유한 오토마타 → 정규표현식, 문맥 자유 문법

유한한 메모리의 한계를 폭로하고, 그 너머의 풍경으로 한 발 내딛는다.

1. 펌핑 보조정리: 한계의 증명서

지금까지의 강의는 “할 수 있는 것”을 늘어놓는 자리였다. 이번 절은 자세를 바꾼다. 정규 언어가 할 수 없는 일을 명시적으로 증명하기 위한 도구를 만든다. 이름은 거창하지만 그 본질은 한 줄로 요약된다. 유한한 메모리는 결국 같은 상태를 반복하게 되어 있다.

정리(정규 언어의 펌핑 보조정리). L이 정규 언어이면 어떤 정수 p ≥ 1(펌핑 길이, pumping length)이 존재하여, |s| ≥ p인 모든 s ∈ L은 다음을 만족하도록 s = xyz로 쪼갤 수 있다.
  1. 모든 i ≥ 0에 대해 xyiz ∈ L
  2. |y| > 0
  3. |xy| ≤ p
증명 스케치. L을 인식하는 DFA M이 있다고 하자. M의 상태 수를 p로 둔다. |s| ≥ p인 임의 s ∈ L에 대해 M이 s를 처리하며 거치는 상태열을 r0, r1, ⋯, r|s|라 하면, 처음 p+1개의 상태 r0, ⋯, rp 중 어딘가는 같은 상태가 두 번 나타난다(비둘기집 원리). 즉 j < k ≤ p인 j, k에 대해 rj = rk.

이제 s = xyz를 x = s1⋯sj, y = sj+1⋯sk, z = sk+1⋯s|s|로 잡자. y는 rj에서 rk로 가는 사이클을 그리고, rj = rk이므로 이 사이클은 0번 돌든 100번 돌든 무관하게 같은 출발/도착 상태를 유지한다. 따라서 임의 i ≥ 0에 대해 xyiz를 읽었을 때 결국 r|s| ∈ F에 도달한다. |y| > 0(j < k), |xy| = k ≤ p가 모두 성립한다. ∎

한 줄로 다시 적어 두자. 유한 상태 기계가 충분히 긴 입력을 처리하면 같은 상태를 두 번 거치게 되며, 그 사이의 부분 문자열은 마음대로 펌프질해도(반복하거나 통째로 지워도) 받아들임 여부가 변하지 않는다. 비둘기집 원리가 자동기계의 옷을 갈아입은 모습이다.

한 줄 메모. 펌핑 보조정리는 “정규성이면 펌핑 가능”의 한 방향만 말한다. 그 역은 거짓이다. 펌핑이 가능하다고 정규인 것은 아니다. 따라서 이 보조정리는 “비정규성을 증명하는” 무기로만 쓰는 것이 안전하다.

2. 비정규성의 살벌한 시범: { anbn : n ≥ 0 }

도구를 손에 쥐었으니 시연을 한 번 해 보자. Σ = {a, b}에서 L = {anbn : n ≥ 0}이 정규가 아님을 증명한다. 직관적으로 이 언어를 인식하려면 a를 몇 개 봤는지 정확히 세어 두어야 하는데, 유한 메모리로는 임의로 큰 카운터를 흉내낼 수 없다는 것이 핵심이다. 이를 펌핑 보조정리로 정밀하게 표현한다.

주장. L = { anbn : n ≥ 0 }은 정규 언어가 아니다.
증명. 모순을 위해 L이 정규라 가정하자. 펌핑 보조정리로 어떤 펌핑 길이 p가 존재한다. 문자열 s = apbp를 고른다. |s| = 2p ≥ p, s ∈ L이므로 보조정리의 가설을 만족한다.

보조정리에 따라 s = xyz, |xy| ≤ p, |y| > 0, ∀i xyiz ∈ L이 되도록 쪼갤 수 있다. 그런데 |xy| ≤ p이므로 xy는 모두 a들로만 이루어져 있다. 즉 y = ak(어떤 k ≥ 1)이다.

이제 i = 2를 적용해 보자. xy2z = ap+kbp는 a의 개수와 b의 개수가 더 이상 같지 않다(p+k ≠ p, k ≥ 1). 따라서 xy2z ∉ L. 그러나 보조정리는 xy2z ∈ L이어야 한다고 단언했으므로 모순. 가정이 틀렸다. ∎

증명 한 토막에서 가져갈 교훈. 펌핑 보조정리는 “적이 길이 p를 골라 주면 우리가 도전 문자열 s를 골라야 한다”는 일종의 이인 게임이다. s를 영리하게 고르면(가능한 한 “나누기 어려운” 문자열로) 적이 어떻게 쪼개든 i를 적당히 골라 모순을 만들 수 있다. 이 책에서는 자주 등장하는 패턴이니 손에 익혀 두는 편이 좋다.

한 줄 메모. 비슷한 방법으로 { ww : w ∈ {0,1}* }, { 0n1n2n }, 그리고 “회문(palindrome) 전체” 같은 언어들이 비정규임을 보일 수 있다. 공통 주제는 “두 곳 사이의 동일성을 임의로 큰 범위에서 강제”하는 구조라는 점이다. 유한 상태로는 결코 잡히지 않는 종류의 제약이다.

3. DFA → 정규 표현식: GNFA 상태 제거법

지난 강의에서 정규 표현식을 NFA로 옮기는 톰슨 구성을 보았다. 이번엔 반대 방향이다. 일반화 NFA(GNFA, Generalized NFA)를 거쳐 DFA에서 정규 표현식을 뽑아낸다.

GNFA란 화살의 라벨이 단일 글자가 아니라 임의의 정규 표현식인 NFA다. 추가로 다음 정형(normal form)을 가정해 두면 작업이 깔끔해진다.

  • 유일한 시작 상태 s′가 있고, 이 상태로 들어오는 화살이 없다.
  • 유일한 받아들임 상태 a′가 있고, 이 상태에서 나가는 화살이 없으며 s′ ≠ a′이다.
  • s′, a′이 아닌 임의의 두 상태 사이에는 정확히 하나의 화살(라벨이 정규 표현식)이 있고, 자기 자신으로 가는 화살도 정확히 하나 있다(없는 자리는 ∅으로 라벨).

주어진 DFA M으로부터 시작 상태 s′와 받아들임 상태 a′를 새로 추가하고 ε-전이로 연결하면, 어렵지 않게 위 정형의 GNFA를 얻을 수 있다. 이제 핵심 보조 명제는 다음이다.

보조정리(상태 제거). GNFA G가 위 정형을 만족하고 상태 수가 ≥ 3이면, G에서 어떤 한 상태 qrip(s′, a′이 아닌)을 “지워 버리는” 새로운 GNFA G′을 만들 수 있다. G′의 상태 수는 G보다 하나 적으며 L(G′) = L(G)다.
증명 스케치(한 단계 워크스루). 지울 상태를 qrip라 하자. qrip를 거치는 모든 경로는 “어떤 다른 상태 qi에서 qrip로 들어와, qrip에서 자기 자신으로 임의 횟수 머문 뒤, 어떤 qj로 빠져나가는” 형태다. 라벨 정규 표현식을 각각 R1 = (qi → qrip), R2 = (qrip → qrip), R3 = (qrip → qj), R4 = (qi → qj의 기존 라벨)이라 하자.

G′에서 (qi → qj)의 새 라벨을

R4 ∪ R1 R2* R3

로 둔다. 이 표현식은 “qrip를 거치지 않고 가는 길(R4) 또는 qrip를 통과해 가는 길(R1 다음 R2를 임의 회 반복한 뒤 R3)” 양쪽을 정확히 모두 포착한다. 모든 i, j 쌍에 대해 동시에 이 갱신을 한 다음 qrip와 그에 인접한 모든 화살을 통째로 지워 버리면 된다. 동치성은 임의 입력 w가 G에서 받아들여지는 길과 G′에서 받아들여지는 길이 일대일 대응됨을 길의 모양에 따라 case 분석하면 확인된다. ∎

이 절차를 qrip를 하나씩 골라가며 상태가 둘(시작 s′와 받아들임 a′)만 남을 때까지 반복한다. 마지막에 남은 (s′ → a′) 화살의 라벨이 곧 L(M)을 표현하는 정규 표현식이다.

예제(미니 워크스루). 상태 q0(시작/받아들임), q1로 이루어진 두 상태 DFA가 다음 전이를 가진다고 하자. δ(q0, a) = q1, δ(q1, a) = q0, δ(q0, b) = q0, δ(q1, b) = q1. 이 DFA는 “a가 짝수 개 있는 {a,b}* 위 문자열”을 인식한다. 새 시작 s′와 받아들임 a′을 ε으로 연결한 GNFA를 만들고 q1을 제거하면, q0 → q0의 자기 루프 라벨이

b ∪ a b* a

가 된다. 이어서 q0도 제거하면 s′ → a′의 라벨이

(b ∪ a b* a)*

로 나온다. 곱씹어 보면 “b를 마음대로 끼워 넣되, a들은 짝을 이뤄 b로 패딩된 채 나타난다”라는 직관과 정확히 들어맞는다.
정리. 어떤 언어 L에 대해 다음 셋은 동치다.
  1. L은 정규 언어다(어떤 DFA가 인식한다).
  2. L은 어떤 NFA가 인식한다.
  3. L은 어떤 정규 표현식이 표현한다.

이로써 우리는 정규 언어라는 봉우리에 오르는 세 등산로—DFA, NFA, 정규 표현식—가 모두 같은 정상에 닿는다는 그림을 완성했다. 펌핑 보조정리는 그 정상의 고도가 어디까지인지(즉 무엇을 못 하는지) 알려준다.

4. 더 큰 사다리: 문맥 자유 문법

{ anbn }이 정규가 아니라는 사실은 두 가지 반응을 부른다. 한쪽은 “그러면 됐다, 우리는 정규 언어만으로 충분하다”라고 손을 털 것이고, 다른 한쪽은 “그렇다면 그 너머를 잡아내는 더 강한 모델이 필요하다”라고 팔을 걷어붙일 것이다. 후자의 길로 들어선 첫 정류장이 문맥 자유 문법(CFG, Context-Free Grammar)이다. 균형 괄호, 산술식의 결합 구조, 프로그래밍 언어의 구문—이 모든 것이 CFG의 영역이다.

정의. CFG는 4-튜플 G = ⟨V, Σ, R, S⟩이다.
  • V: 변수(variable, 비단말 nonterminal)들의 유한 집합
  • Σ: 단말(terminal) 기호들의 유한 집합. V ∩ Σ = ∅
  • R: 규칙(rule)들의 유한 집합. 각 규칙은 A → α 형태이며 A ∈ V, α ∈ (V ∪ Σ)*
  • S ∈ V: 시작 변수(start variable)
문자열 u, v, w ∈ (V ∪ Σ)*에 대해 u가 v를 규칙 한 번에 의해 치환해 얻어졌다면 u ⇒ v라 쓴다. 0번 이상의 단계로 얻어졌다면 u ⇒* v라 쓴다. G가 생성하는 언어는 L(G) = {w ∈ Σ* : S ⇒* w}.

유도(derivation)란 시작 변수 S에서 규칙을 차례로 적용해 단말 문자열에 도달하는 한 편의 이야기다. 같은 단말 문자열 w를 만들어 내는 유도가 여러 가지일 수 있는데, 그중 “서로 다른 트리 모양에 해당하는” 본질적으로 다른 유도가 둘 이상 존재할 때 그 문자열은 G에서 모호(ambiguous)하다고 한다. 그리고 유도의 트리 모양 자체를 파스 트리(parse tree)라 부른다. 트리의 뿌리는 S, 내부 노드는 변수, 잎은 단말이며, 각 내부 노드의 자식들은 그 노드에서 적용된 규칙의 우변과 일치한다.

예제 1(균형 괄호). Σ = { (, ) }, V = {S}, 시작 S, 규칙

S → (S) | SS | ε

이 G는 모든 균형 잡힌 괄호 문자열들의 언어를 생성한다. 예를 들어 “(())()”의 유도는

S ⇒ SS ⇒ (S)S ⇒ ((S))S ⇒ (())S ⇒ (())(S) ⇒ (())().

한편 이 문법은 모호하다. 같은 “()()()” 같은 문자열에 대해 SS를 어디서 쪼개느냐에 따라 본질적으로 다른 트리가 여러 개 만들어진다. 모호성은 종종 의미 해석의 골칫거리가 되므로 실제 컴파일러용 문법에서는 모호성을 제거하도록 설계한다.
예제 2({ anbn : n ≥ 0 }). 펌핑 보조정리로 정규가 아님을 보였던 그 언어가, CFG에서는 단 두 줄로 우아하게 잡힌다.

S → aSb | ε

유도를 보면 매 단계마다 a 하나와 b 하나가 정확히 짝을 이루어 추가되므로 결과 문자열의 a 개수와 b 개수가 항상 일치한다. 정규 언어가 도저히 셀 수 없었던 그 짝 맞춤을, “문법”이라는 더 풍부한 형식이 단번에 처리해 버린다.
정의. 어떤 CFG가 생성하는 언어를 문맥 자유 언어(CFL, Context-Free Language)라 한다. 모든 정규 언어는 CFL이지만(증명: DFA를 흉내 내는 우선형 문법으로 옮기면 된다), 그 역은 거짓이다(예: { anbn }).
한 줄 메모. 모호성은 “언어의 성질”이 아니라 “문법의 성질”이다. 같은 언어를 생성하는 문법 중 모호한 것과 모호하지 않은 것이 동시에 있을 수 있다. 한편 어떠한 모호하지 않은 CFG로도 생성될 수 없는 본질적으로 모호한(inherently ambiguous) CFL도 존재한다는 사실은 별도의 정리로 다룬다.

5. 다음 강의 예고

이번 강의로 정규 언어의 영토를 사방에서 둘러보고, 그 너머에 펼쳐진 문맥 자유 언어라는 새 대륙으로 첫발을 디뎠다. 다음 강의에서는 CFG에 대응하는 자동기계인 푸시다운 오토마타(PDA)를 도입해 “스택이라는 한 줄짜리 무한 메모리”가 어떤 능력을 추가해 주는지 살핀다. 그리고 CFL에도 그들만의 펌핑 보조정리(흔히 문맥 자유 펌핑 보조정리)가 있어, 이번에는 CFL이 아닌 언어의 존재—예컨대 { anbncn }—를 증명할 무기로 사용된다는 점도 보게 될 것이다. 사다리는 아직 끝나지 않았다.

강의 4

푸시다운 오토마타와 CFG ↔ PDA

유한 오토마타에 스택 한 개를 끼워 넣으면, 어디까지 갈 수 있을까?

1. 스택 한 개의 차이

지난 강의에서 우리는 문맥 자유 문법(CFG)을 익혔다. 이번에는 그 문법이 만들어 내는 언어를 기계로 받아들이는 장치를 짚어 본다. 결정적 유한 오토마타(DFA)는 기억 용량이 정확히 상태 개수만큼이라, aⁿbⁿ처럼 a의 개수를 b가 다 끝날 때까지 들고 있어야 하는 문제 앞에서 무력했다. 해법은 의외로 소박하다. 카페에서 접시를 쌓아 올리듯, 오토마타 옆에 무한 스택 하나를 두는 것이다.

이 장치를 푸시다운 오토마타(pushdown automaton, PDA)라 부른다. 입력을 한 글자씩 읽으면서 스택의 맨 위(top)를 보고, 거기에 무엇을 새로 쌓을지(push) 혹은 무엇을 걷어 낼지(pop)를 결정한다. 흥미로운 점은 PDA는 본디 비결정적(nondeterministic)이라는 사실이다. 결정적 모델은 표현력을 잃기에, 처음부터 분기를 허용한다.

정의 (PDA). 푸시다운 오토마타는 6-튜플 ⟨Q, Σ, Γ, δ, q0, F⟩ 이다. 여기서
  • Q는 유한 상태 집합,
  • Σ는 입력 알파벳, Γ는 스택 알파벳(서로 같을 필요 없음),
  • q0 ∈ Q는 시작 상태, F ⊆ Q는 수락 상태 집합,
  • 전이 함수 δ : Q × (Σ ∪ {ε}) × (Γ ∪ {ε}) → ℘(Q × (Γ ∪ {ε})) 는 (현재 상태, 읽을 입력 글자 또는 ε, 스택 top에서 꺼낼 기호 또는 ε)을 받아 (다음 상태, 스택에 새로 쌓을 기호 또는 ε)들의 유한 집합을 돌려준다.
입력을 모두 소비하고 어떤 수락 상태에 있을 수 있으면 PDA는 그 입력을 수락한다.

전이 함수가 ε을 세 자리 모두에 허용한다는 점에 주목하자. 입력을 안 읽고도 움직일 수 있고, 스택을 안 건드려도 되고, 스택에 안 쌓아도 된다. 이 자유도가 비결정적 분기를 빚어낸다.

한 줄 메모. 어떤 교과서는 한 번에 여러 기호를 푸시할 수 있게 정의하지만, 일반성에는 차이가 없다. 한 번에 한 글자씩 ε-전이로 나누어 쌓으면 그만이기 때문이다.

2. 첫 예제: { aⁿbⁿ : n ≥ 0 }

고전 중의 고전. 아이디어는 단순하다. a를 읽을 때마다 스택에 표식 A를 쌓고, b가 시작되면 a 하나마다 A를 하나씩 걷어 낸다. 입력 끝에서 스택이 처음 상태로 돌아와 있으면 a와 b의 개수가 같다.

구현 디테일 하나. 스택이 비었는지 검사하는 표준 트릭은, 시작과 동시에 바닥 표시 $를 깔아 두는 것이다. 그러면 "스택이 비었음"을 직접 묻는 대신 "$가 top에 있음"을 물으면 된다.

상태:    qstart --(ε, ε → $)--> q1
         q1     --(a, ε → A)--> q1          (a를 읽고 A 푸시)
         q1     --(ε, ε → ε)--> q2          (b 단계로 비결정적 전환)
         q2     --(b, A → ε)--> q2          (b를 읽고 A 팝)
         q2     --(ε, $ → ε)--> qaccept     (바닥이 보이면 수락)

입력 a a a b b b 의 진행:
  스택        남은 입력
  $           a a a b b b
  A $         a a b b b
  A A $       a b b b
  A A A $     b b b
  A A A $     b b b      ← q1 → q2 ε-전이 (분기)
  A A $       b b
  A $         b
  $           ε
  ε           ε          ← 수락
    

"q1에서 언제 q2로 넘어가야 하는가"라는 결정은 비결정성에 맡긴다. 어떤 분기든 입력 끝에서 수락할 수 있는 길이 하나라도 있으면 PDA는 그 문자열을 받아들인다.

예제 (균형 괄호). Σ = { (, ) } 위에서 균형 잡힌 괄호 언어 또한 같은 기법으로 인식된다. 여는 괄호는 스택에 푸시, 닫는 괄호는 top의 여는 괄호와 짝이 맞으면 팝. 입력 끝에서 바닥 $만 남아 있으면 수락이다. 중첩된 (())와 나란히 놓인 ()()을 같은 자료구조 위에서 자연스레 다루는 점이 핵심이다.

3. CFG → PDA: 유도를 스택 위에서 시뮬레이션

이제 큰 정리로 향하는 한 방향, "CFG가 만든 언어는 어떤 PDA가 인식한다"를 보자. 발상은 깔끔하다. 스택을 유도의 작업대로 쓴다. 좌측 유도(leftmost derivation)는 항상 "맨 왼쪽 비단말을 한 번 펼친다". 그러므로 스택 top에 비단말이 있으면 그것을 규칙의 우변으로 바꿔 치우면 된다.

정리. 모든 문맥 자유 문법 G에 대해 L(G)를 인식하는 PDA M이 존재한다.
증명 스케치. G = ⟨V, Σ, R, S⟩가 주어졌다고 하자. 세 상태 qstart, qloop, qaccept 만으로 충분하다.
  1. qstart에서 ε-전이로 시작 변수 S를 푸시하고(아래에 바닥 표시 $도 함께) qloop으로 간다.
  2. qloop에서 두 종류의 동작을 비결정적으로 고른다.
    • 확장: top이 비단말 A이면, 어떤 규칙 A → α를 골라 A를 팝한 뒤 α를 (역순으로) 푸시한다. 그래야 α의 첫 글자가 다시 top에 오기 때문이다.
    • 대조: top이 단말 a이고 다음 입력 글자가 a이면, 입력 a를 읽고 a를 팝한다. 글자가 어긋나면 그 분기는 죽는다.
  3. 입력을 다 읽고 스택 top이 $이면 qaccept로 ε-전이.
어떤 입력 w가 G에서 좌측 유도되면, 위 PDA의 비결정적 분기 가운데 정확히 그 유도를 따라가는 분기가 존재하고, 그 분기는 w를 수락한다. 역도 마찬가지로, 수락하는 실행은 좌측 유도를 추출해 낸다.

한 번에 여러 기호를 푸시한다는 표현은 앞서 언급한 대로 ε-전이 연쇄로 풀어 쓰면 된다. 스택을 "역순으로" 쌓아야 한다는 점이 학생들이 자주 놓치는 자리다. α = X1X2X3이라면 X3을 먼저, 그 위에 X2, 그 위에 X1을 쌓아야 X1이 top에 온다.

4. PDA → CFG: Apq 비단말로 구간 분해

역방향은 한 차례 정신을 단단히 차려야 한다. 임의의 PDA가 인식하는 언어를 어떻게 문법으로 환원할 수 있을까? 그 핵심 발상은 다음과 같다.

PDA의 동작에서 한 토막을 떼어 보자. 시점 A에서 상태 p에 있고 스택의 어떤 기호 X가 top이며, 시점 B에서 상태 q에 있고 그 X가 마침내 팝되어 사라지는 순간이라고 하자. 그 사이 스택은 X를 일단 떠받친 채 위로 더 쌓였다 다시 무너져 내렸을 것이다. 즉, 시작과 끝 사이의 스택 높이는 X 위로만 변동했다. 이 구간 동안 PDA가 읽은 입력을 한 비단말 Apq로 부르자.

일반성을 위해 PDA를 약간 표준화한다. (i) 유일한 수락 상태가 하나이고, (ii) 수락은 스택이 비었을 때만 일어나며, (iii) 모든 전이는 푸시 또는 팝 가운데 정확히 하나만 한다. 이렇게 정리하면, 임의의 수락 실행은 "처음에 무언가를 푸시 — 그 위에서 사다리꼴이 오르내림 — 결국 그것을 팝"의 형태로 분해된다.

정리. 모든 PDA가 인식하는 언어는 어떤 CFG가 생성한다.
증명 스케치. 표준화된 PDA의 각 상태 쌍 (p, q)마다 비단말 Apq를 둔다. 의도된 의미: Apq가 유도하는 문자열 = 상태 p에서 스택이 어떤 높이일 때 시작해, 상태 q에서 정확히 그 높이로 돌아오는 동안 PDA가 읽을 수 있는 입력. 시작 변수는 Aq0qaccept로 잡는다.

규칙은 두 종류로 나온다.

  • 케이스 1 — 스택을 비웠다 다시 채우는 경우. 구간 (p, q)가 중간 시점 r에서 한 번 같은 스택 높이로 돌아왔다고 하자. 그러면 (p, r) 구간과 (r, q) 구간으로 잘린다. 이를 규칙 Apq → Apr Arq 로 모든 r ∈ Q에 대해 추가한다.
  • 케이스 2 — 처음 푸시가 끝까지 함께 가는 경우. 구간이 시작에 푸시한 기호가 마지막 한 번에야 팝되는 형태일 때다. 즉 첫 전이가 (p, a, ε) → (r, X)로 X를 푸시하고, 마지막 전이가 (s, b, X) → (q, ε)로 그 X를 팝한다고 하자. 그 사이 (r, s) 구간은 X 위에서만 놀았으므로 스택 X를 보지 않는 PDA의 한 동작과 같다. 따라서 규칙 Apq → a · Ars · b 를 가능한 모든 (a, b, X, r, s)에 대해 추가한다. (a 또는 b는 ε일 수 있다.)
  • 마지막으로, 자명한 빈 구간을 위해 모든 p에 대해 App → ε.
이 문법이 PDA의 수락 실행을 정확히 흉내 낸다는 사실은 실행 길이에 대한 귀납으로 보인다. 짧은 구간(0-스텝)이 ε에 대응하고, 긴 구간은 두 케이스 가운데 하나로 반드시 분해된다는 점이 핵심이다.

증명은 길어 보여도 분해 원리는 한 문장이다. 스택은 결국 자기가 쌓은 것을 자기가 다 치우고 가야 한다. 그 "쌓고 치움"의 기록을 비단말 Apq가 저장하는 것이다.

5. 동치성 정리와 결정적 PDA

정리 (CFL ↔ PDA). 언어 L이 문맥 자유 언어인 것은 어떤 PDA가 L을 인식하는 것과 동치다.

두 방향의 구성을 합치면 위 정리가 된다. 이제 우리는 같은 사물을 두 가지 언어로 말할 수 있다. 문법으로 묘사하거나, 기계로 묘사하거나. 어느 쪽이 편한지는 문제마다 다르다. 폐쇄성(합집합·연결·* 연산에 대한 닫힘)은 문법 쪽이 다루기 쉽고, 인식 알고리즘과 파싱은 기계 쪽이 다루기 쉽다.

한 줄 메모. 결정적 푸시다운 오토마타(DPDA)는 모든 비결정성을 버린 변종으로, 인식하는 언어 부류는 CFL의 진부분집합이다. 예컨대 회문 언어 { wwR }는 CFL이지만 어떤 DPDA로도 받아들일 수 없다 — 가운데가 어디인지 미리 알 길이 없기 때문이다.

다음 강의에서는 CFL의 한계를 가르는 도구, 즉 문맥 자유 언어 펌핑 보조정리를 들고 와서 "이 언어는 CFL이 아니다"를 증명하는 법을 배운다. 그리고 마침내 스택 한 개의 천장을 뚫고, 무한 테이프라는 새 풍경 — 튜링 기계 — 으로 발을 들인다.

강의 5

CF 펌핑 보조정리와 튜링 기계

스택 하나로는 닿지 않는 곳, 그리고 무한 테이프가 열어 주는 새 지평.

1. 스택 한 개의 한계를 어떻게 증명할까

정규 언어를 다룰 때 우리는 펌핑 보조정리(pumping lemma)로 한계선을 그었다. CFL에도 같은 정신의 도구가 있다. 다만 한 군데를 늘리는 정규판과 달리, 문맥 자유판은 두 군데를 동시에 부풀린다. 이유는 곧 드러난다. 충분히 긴 문자열의 파스 트리(parse tree)에는 같은 비단말이 어떤 경로 위에 두 번 등장할 수밖에 없기 때문이다.

보조정리 (CF 펌핑). L이 문맥 자유 언어이면 어떤 펌핑 길이 p ≥ 1이 존재해, 길이 |s| ≥ p인 모든 s ∈ L은 다음 분할

s = u v x y z

을 가진다.
  1. 모든 i ≥ 0에 대해 u vi x yi z ∈ L,
  2. |v y| > 0,
  3. |v x y| ≤ p.

조건 1은 v와 y를 같은 횟수만큼 동시에 늘리거나 줄여도 언어 안에 머무른다는 뜻. 조건 2는 적어도 한쪽은 비어 있지 않다는 뜻으로, "0번 펌프"가 무의미한 분할이 되는 것을 막는다. 조건 3은 v와 y가 서로 너무 멀리 떨어져 있지 못하도록 묶어 둔다.

한 줄 메모. v와 y는 같은 비단말의 두 등장 사이에서 자라난 부분이라, 자식과 손자, 손자의 손자 식으로 같은 규칙을 임의 횟수 끼워 넣을 수 있다. 그래서 둘이 함께 펌프된다.

2. 직관: 깊은 트리에는 같은 비단말이 두 번 나타난다

증명의 핵심 발상을 보자. 촘스키 정규형(Chomsky normal form)으로 옮긴 문법 G의 비단말 개수를 b개라 하고, 분기수가 최대 2인 이진 파스 트리를 생각하자. 깊이 h인 이진 트리의 잎 개수는 최대 2h이므로, 잎이 충분히 많으면 트리도 깊어야 한다. 길이 |s| ≥ 2b+1인 문자열의 파스 트리에는 길이 b+1을 넘는 어떤 뿌리-잎 경로가 존재하고, 그 경로 위에는 비둘기집 원리로 같은 비단말 R이 적어도 두 번 등장한다.

경로 위쪽의 R을 R, 아래쪽의 R을 R아래라 하자. R아래가 만들어 내는 부분 문자열을 x, R는 만들지만 R아래는 만들지 않는 양옆의 부분 문자열을 v와 y, R 바깥의 좌우를 u와 z로 두면 s = u v x y z가 된다. 이제 R의 자리에 R아래의 부분 트리를 끼워 넣거나(0회 펌프) R의 부분 트리를 자기 자신 안에 거듭 끼워 넣어(i회 펌프) 새 파스 트리를 얻는다. 모두 G의 합법적 유도이므로 u vi x yi z ∈ L이다. 적절한 깊이에서 같은 비단말의 두 번째 등장을 처음 발견한다고 가정하면 |v x y|를 적당한 상수 p 이하로 묶을 수 있다.

펌핑 길이 p는 보통 2b+1 정도로 잡는다. 우리가 이 보조정리를 쓰는 데에 정확한 값은 거의 필요 없다 — 존재만 보장되면 충분하다.

3. 비-CFL 증명: { aⁿbⁿcⁿ : n ≥ 0 }

고전적인 비-CFL의 증인이다. CFG가 a와 b의 개수는 맞출 수 있어도, 거기에 더해 c의 개수까지 동시에 맞추는 것은 스택 하나로 감당이 안 된다는 직관을 펌핑 보조정리가 증명으로 굳혀 준다.

정리. L = { anbncn : n ≥ 0 } 은 문맥 자유 언어가 아니다.
증명 스케치. L이 CFL이라고 가정하고 모순을 끌어낸다. 펌핑 길이 p를 잡고 s = apbpcp를 고르자. |s| = 3p ≥ p이므로 보조정리가 적용된다. 어떤 분할 s = uvxyz가 세 조건을 모두 만족해야 한다.

조건 |vxy| ≤ p에 의해 vxy는 s 안에서 길이 p를 넘지 않는 한 토막을 차지한다. 따라서 vxy는 a-블록과 b-블록에 걸치거나, b-블록과 c-블록에 걸치거나, 한 블록 안에만 머무를 수밖에 없다. 어느 경우든 v, y에는 세 글자 a, b, c 가운데 적어도 한 종류는 들어 있지 않다.

이제 i = 2로 펌프해 본다. uv2xy2z를 보면 v와 y가 합쳐서 적어도 한 글자는 늘렸지만(조건 |vy| > 0), 누락된 그 글자의 개수는 그대로다. 그러면 a, b, c 셋의 개수가 어긋나며, 결과 문자열은 더 이상 akbkck 꼴이 아니다 — 즉 L에 속하지 않는다. 이는 보조정리 조건 1과 모순이다. 따라서 L은 CFL이 아니다.

같은 기법으로 { ww : w ∈ {0,1}* } 또한 비-CFL임이 보인다. 이쪽은 분할 자리를 따라가며 케이스 분석을 좀 더 신중하게 해야 한다.

4. 무한 테이프로 한 발 나아가다 — 튜링 기계

스택 한 개의 천장이 보였으니, 천장을 들어 올릴 차례다. 답은 의외로 단순하다. 읽기 전용 입력 테이프와 따로 떨어진 스택 대신, 읽고 쓰는 한 줄짜리 무한 테이프를 두자. 헤드(head)가 좌우로 자유로이 움직이며 어떤 칸이든 다시 들여다볼 수 있다. 이것이 1936년 앨런 튜링이 그린 그림이다.

정의 (튜링 기계). 튜링 기계 M은 7-튜플 ⟨Q, Σ, Γ, δ, q0, qaccept, qreject⟩이다.
  • Q: 유한 상태 집합, 단 qaccept와 qreject는 서로 다르다.
  • Σ: 입력 알파벳, 빈칸 기호 ␣ ∉ Σ.
  • Γ: 테이프 알파벳, Σ ⊆ Γ이고 ␣ ∈ Γ.
  • q0 ∈ Q: 시작 상태.
  • 전이 함수 δ : (Q ∖ {qaccept, qreject}) × Γ → Q × Γ × {L, R}.
δ(q, a) = (q′, b, D)는 "상태 q에서 헤드가 a를 보면, b를 덮어 쓰고 헤드를 D 방향(좌 L, 우 R)으로 한 칸 옮긴 뒤 q′로 간다"는 뜻이다.

테이프는 양쪽 또는 한쪽으로 무한히 뻗어 있다 — 어느 쪽으로 정의하든 표현력은 같다. 입력은 처음에 테이프의 왼쪽 끝부터 차례로 적혀 있고, 그 뒤로는 모두 빈칸 ␣이다. 헤드는 입력의 첫 칸을 본 채로 시작한다.

초기 테이프와 헤드:

   ⌊ 0 0 1 1 ␣ ␣ ␣ ␣ ⌋ ...
     ^
     헤드, 상태 q0
    

5. 구성, 계산, 그리고 세 가지 결말

한 시점에 TM이 무엇을 하는지 적어 두려면 세 정보가 필요하다. (i) 현재 상태, (ii) 테이프 내용, (iii) 헤드의 위치. 이 셋을 묶어 구성(configuration)이라 부르고, "상태 기호 직전에 끼워 넣은 한 줄"의 표기 u q v로 압축한다 — 헤드는 v의 첫 칸을 본다는 뜻이다.

한 구성에서 다음 구성으로 한 걸음 옮아가는 관계를 ⊢로 적는다. 시작 구성에서 출발해 ⊢로 이어지는 (유한 또는 무한) 열을 계산(computation)이라 한다. 계산의 결말은 정확히 셋이다.

  • qaccept에 들어가면 즉시 멈추고 수락한다.
  • qreject에 들어가면 즉시 멈추고 거부한다.
  • 둘 다 들지 않으면 영원히 굴러간다 — 무한 루프.
정의 (인식 가능 vs 결정 가능). TM M이 받아들이는 문자열들의 집합 L(M) = { w : M이 w에서 qaccept로 멈춤 }을 M이 인식(recognize)하는 언어라 한다. 어떤 TM이 L을 인식하면 L은 튜링 인식 가능(Turing-recognizable, 또는 recursively enumerable)이다. 그 TM이 추가로 모든 입력에서 반드시 멈추면(거부도 분명히 거부로 멈추면) L은 결정 가능(decidable, recursive)하다.

차이는 단어 하나에 있다. "수락하지 않음"이 "거부로 멈춤"인지 아니면 "멈추지 않을 수도 있음"인지. 이 한 끗의 간격이 다음 강의들의 풍경을 거의 다 결정짓는다.

한 줄 메모. 결정 가능 ⊆ 인식 가능 임은 즉시 보이지만, 그 포함이 진부분집합임 — 즉 인식만 가능하고 결정은 불가능한 언어가 존재함 — 은 튜링이 정지 문제로 보였다. 이 강의에서 곧 만난다.

6. 첫 TM 예제: { 0n1n : n ≥ 0 } 결정하기

테이프와 좌우 이동의 위력을 가장 단순한 예에서 맛보자. 우리는 0과 1의 개수가 같은 언어 { 0n1n }이 결정 가능함을 직접 TM을 만들어 확인한다. (이 언어는 CFL이지만, 결정 가능하기도 하다.)

예제. 다음 알고리즘을 TM으로 구현한다.
  1. 왼쪽 끝의 첫 칸을 본다. 빈칸이면 입력은 ε이므로 수락하고 멈춘다.
  2. 0이면 그 칸을 표식 X로 덮어 쓰고 오른쪽으로 이동, 가장 오른쪽의 1을 찾아 표식 Y로 덮어 쓴다. 1을 찾기 전에 빈칸이나 다른 X를 만나면 거부.
  3. 다시 왼쪽 끝까지 돌아온다.
  4. 2-3을 반복하다가, 1단계에서 첫 칸이 0이 아니면 다음을 검사한다. 남은 글자가 모두 X와 Y뿐이고 1이나 0이 더 없으면 수락, 그렇지 않으면 거부.
한 발짝의 진행을 그려 보자.
시작:        ⌊ 0 0 1 1 ␣ ⌋   상태 q0, 헤드는 첫 0
1회 한 쌍:  ⌊ X 0 1 Y ␣ ⌋   상태 q왼쪽, 헤드는 X
2회 한 쌍:  ⌊ X X Y Y ␣ ⌋   상태 q점검, 헤드는 첫 X
점검 통과:  ⌊ X X Y Y ␣ ⌋   상태 qaccept → 수락
      
모든 입력에서 위 절차는 유한 단계 안에 멈춘다 — 한 번 순회할 때마다 0과 1 한 쌍이 X와 Y로 표시되어 작업 대상이 줄어들기 때문이다. 따라서 이 TM은 { 0n1n }을 결정한다.

좀 더 야심 찬 예로 { wcw : w ∈ {0,1}* }를 들 수 있다. 이쪽은 c 양쪽의 두 부분이 글자별로 같은지 비교해야 한다. 한 글자씩 표식을 남기며 좌우를 오가는 동작은 TM의 자유로운 헤드 움직임이 없으면 흉내 내지 못한다 — 어떤 PDA로도 결정할 수 없는 언어다.

7. 다음 풍경 — Church-Turing 명제

튜링 기계의 정의는 미니멀하다. 그러나 다중 테이프, 비결정성, 이차원 테이프, 무작위 접근 같은 어떤 변종을 가져다 붙여도 결정 가능한 언어 부류는 변하지 않는다. 더 놀라운 사실은 람다 대수, μ-재귀 함수, 마르코프 알고리즘 등 전혀 다른 출발점에서 시작된 계산 모형들이 모두 같은 언어 부류를 결정한다는 것이다. 이 합치를 한 문장으로 요약한 것이 Church-Turing 명제다 — 직관적으로 "알고리즘으로 풀 수 있는 문제"란 정확히 튜링 기계가 결정할 수 있는 문제이다.

다음 강의부터는 이 무한 테이프 기계 위에서 결정 가능한 문제들을 사냥하고, 결정 불가능한 영역의 첫 표본 — 정지 문제 — 을 향해 다가간다. 펌핑 보조정리가 우리에게 "할 수 없음"의 첫 맛을 보여 주었다면, 다음에 만날 대각화는 그 맛을 한층 깊이 다듬어 줄 것이다.

강의 6

튜링 기계의 변형들과 처치-튜링 명제

테이프를 늘리고, 갈래를 치고, 결과만 토해내도 — 결국 우리는 같은 산에 오른다.

1. 변형이라는 유혹

지난 강의에서 정의한 단일 테이프 결정적 튜링 기계(deterministic Turing machine, DTM)는 분명 강력하지만, 그 위에서 알고리즘을 직접 짜본 사람이라면 누구나 한 번쯤은 이렇게 외친다: "테이프 하나로는 못 해 먹겠다." 입력은 그대로 두고 작업 공간은 따로 쓰고 싶고, 결과는 또 다른 곳에 적고 싶다. 갈래마다 다른 추측을 시도해보고 싶고, 때로는 입력을 받지 않고 그냥 모든 출력을 토해내는 기계가 더 자연스럽기도 하다.

이 강의의 결론은 한 문장으로 요약된다: 이 모든 변형은 표준 단일 테이프 TM과 동치이다. 표현력은 같지만 사고의 편의는 천양지차이므로, 우리는 앞으로 증명에서 가장 편한 모델을 골라 쓸 권리를 얻는다. 그리고 이 권리의 철학적 일반화가 바로 처치-튜링 명제(Church-Turing thesis)이다.

2. 다중 테이프 튜링 기계

정의 6.1 (다중 테이프 TM). k-테이프 튜링 기계는 k개의 양방향 무한 테이프와 각각 독립적으로 움직이는 k개의 헤드를 갖는다. 입력은 1번 테이프에 쓰여 있고 나머지 테이프는 빈 칸(␣)으로 시작한다. 전이 함수는

δ : Q × Γk → Q × Γk × {L, R, S}k

이며, 한 단계에서 k개의 헤드 아래 기호를 동시에 읽고, k개의 기호를 쓰고, 각 헤드를 독립적으로 좌(L)·우(R)·정지(S) 중 하나로 움직인다.

S(정지) 옵션이 등장했다고 당황할 필요는 없다. 우리는 곧 이 모델을 단일 테이프 모델로 시뮬레이션하면서 어차피 표현력이 같음을 보일 것이고, 실제로 단일 테이프 모델에서도 두 단계로 쪼개면 정지를 흉내 낼 수 있다.

정리 6.2. 모든 다중 테이프 TM은 어떤 단일 테이프 TM과 동치이다. 즉, 같은 언어를 인식한다.
증명 스케치. k-테이프 TM M이 주어졌을 때, 단일 테이프 TM S는 한 줄에 모든 정보를 압축한다. 핵심 아이디어는 두 가지다.
  1. 트랙 인터리빙. Sk개의 테이프 내용을 구분 기호 #로 잘라 한 줄에 늘어놓는다. 입력이 w1w2wn이라면 초기 테이프는
    #w1w2wn#␣#␣#…#
    형태가 된다. 각 # 사이의 구간이 M의 한 테이프에 대응한다.
  2. 헤드 위치 마커. M의 각 헤드 위치를 표시하기 위해 알파벳을 두 배로 늘려 "점이 찍힌" 버전 Γ̇를 도입한다. i번째 구간에서 단 하나의 칸에만 점을 찍어 헤드의 위치를 기록한다.
SM의 한 단계를 다음과 같이 흉내 낸다. 먼저 테이프를 처음부터 끝까지 한 번 훑어 k개의 점 찍힌 기호를 메모리(즉, 상태)에 기록한다. δ를 적용해 새 기호와 이동 방향을 결정한다. 다시 테이프를 훑으며 k개 위치에 새 기호를 쓰고 점을 옆 칸으로 옮긴다. 만약 어떤 점이 자신의 # 경계에 부딪히면, 그 구간 오른쪽 전체를 한 칸씩 밀어 새 빈 칸을 삽입한다 — 이것이 양방향 무한 테이프를 단일 테이프 위에서 흉내 내는 비용이다.

Mt(n)단계 동안 사용하는 공간은 O(t(n))이므로, S의 한 단계는 O(t(n))시간이 걸리고 전체적으로 O(t(n)2)시간이면 충분하다. 시간 복잡도는 제곱으로 늘지만, 인식되는 언어 자체는 한 글자도 바뀌지 않는다.
한 줄 메모. "여러 테이프 = 빠른 단일 테이프"이다. 알고리즘 설계 시에는 다중 테이프로 사고하고, 이론 증명 시에는 단일 테이프로 환원하는 것이 표준 워크플로우다.

3. 비결정적 튜링 기계

정의 6.3 (NTM). 비결정적 튜링 기계(nondeterministic TM, NTM)는 전이 함수가

δ : Q × Γ → 𝒫(Q × Γ × {L, R})

인 점만 다르다. 한 구성에서 가능한 다음 구성이 여럿일 수 있고, NTM N적어도 하나의 계산 분기가 수락 상태에 도달하면 입력을 수락한다. NTM의 계산은 트리이다 — 뿌리는 시작 구성이고 각 노드의 자식은 그 구성에서 가능한 다음 구성들이다.
정리 6.4. 모든 NTM은 어떤 결정적 TM과 동치이다.
증명 스케치. NTM N이 주어지면 3-테이프 결정적 TM D를 만든다. 1번 테이프는 입력을 그대로 보존하고, 2번 테이프는 현재 시뮬레이션 중인 분기의 작업 공간이며, 3번 테이프는 분기 주소(address)를 담는다.

각 분기 주소는 어떤 정수의 수열 b1b2bm로, "1단계에서 b1번째 선택지, 2단계에서 b2번째 선택지, …"라는 의미다. D는 다음을 반복한다.
  1. 3번 테이프에 적힌 주소를 따라 N을 시뮬레이션한다. 도중에 주소가 가리키는 선택지가 존재하지 않으면(δ가 그만큼의 갈래를 갖지 않음) 이 분기를 포기하고 다음 주소로 넘어간다.
  2. 그 분기가 수락 구성에 도달하면 D도 수락한다.
  3. 그렇지 않으면 3번 테이프의 주소를 사전식 다음(lexicographically next) 문자열로 갱신한다.
이것은 본질적으로 계산 트리에 대한 너비 우선 탐색(breadth-first search, BFS)이다. 깊이 우선 탐색(DFS)은 왜 안 되는가? 어떤 분기가 무한 루프에 빠지면 영영 돌아오지 못해, 옆 가지에 있을지 모를 수락 분기를 발견하지 못하기 때문이다. BFS는 모든 깊이 d의 노드를 깊이 d+1로 넘어가기 전에 다 방문하므로, 수락 분기가 어딘가에 있다면 유한 시간 안에 반드시 만난다.

마지막으로 정리 6.2를 적용하면 3-테이프 결정적 TM은 단일 테이프 결정적 TM으로 환원된다. 결국 NTM ≡ DTM.
한 줄 메모. 시간으로 환산하면 결정적 시뮬레이션은 분기 수에 대해 지수적으로 비용을 치른다. P vs NP의 진앙지는 바로 여기다.

4. 열거기와 인식 가능성의 또 다른 얼굴

정의 6.5 (열거기). 열거기(enumerator) E는 입력 없이 작동하는 튜링 기계 변형으로, 작업 테이프와 별개의 출력 테이프를 가진다. E는 작동 도중 임의의 시점에 출력 테이프에 쓴 문자열을 특수 표시 #로 끝내며 "출력했다"고 선언한다. E가 열거하는 언어는 E가 언젠가 출력하는 모든 문자열의 집합이다(중복은 허용되며, 순서도 임의다).
정리 6.6. 언어 A가 튜링 인식 가능(Turing-recognizable)인 것과 A가 어떤 열거기에 의해 열거되는 것은 동치이다.
증명 스케치.

(⇐) EA를 열거한다고 하자. TM M은 입력 w에 대해 E를 시뮬레이션하면서 E가 새 문자열을 출력할 때마다 그것을 w와 비교한다. 같으면 수락하고, 아니면 계속 시뮬레이션한다. wA면 언젠가 Ew를 출력하므로 M은 수락한다. wAM은 영원히 멈추지 않는다 — 인식의 정의에 부합한다.

(⇒) TM MA를 인식한다고 하자. 입력 알파벳을 사전식으로 정렬해 s1, s2, … 로 두고, 열거기 E는 다음과 같이 동작한다.

i = 1, 2, 3, … 에 대해, Ms1, …, si 각각에 대해 i단계까지 시뮬레이션한다. 그동안 i단계 안에 수락하는 입력이 있으면 출력한다.

이른바 대각선식 시간 분배(dovetailing)다. Mwk단계에 수락한다면, i ≥ max(k, |w|+1)인 모든 라운드에서 w가 출력된다. 따라서 E는 정확히 A를 열거한다. 단순히 "s1에 대해 M을 끝까지 돌리고, 다음에 s2로…"라는 순진한 방법은 M이 첫 입력에서 멈추지 않으면 영원히 갇히기 때문에 통하지 않는다.
예제 6.7. 모든 짝수 길이 이진 회문(palindrome)의 집합을 인식하는 TM은 쉽게 만들 수 있다. 같은 집합을 열거하는 열거기도 쉽다 — 길이순으로 모든 이진 문자열을 생성하면서 회문인 것만 출력한다. 두 모델 사이의 환원이 무엇처럼 느껴지는지 직관을 갖자.

5. 처치-튜링 명제

지금까지 살펴본 변형은 빙산의 일각이다. 사람들은 "현실적인 계산 모델"이라 부를 만한 거의 모든 것을 정의해보았다.

  • 람다 계산(λ-calculus). 알론조 처치(Alonzo Church)가 1930년대에 정의한, 순수 함수 추상화와 적용만으로 이루어진 형식 체계. 모든 계산을 함수 (λx.x) 같은 항으로 표현한다.
  • 회귀 함수(recursive functions). 괴델-에르브랑-클레네의 부분 회귀 함수 클래스. 0, 후행자, 사영, 합성, 원시 회귀, 최소화 연산자(μ-operator)로 닫힌 함수들의 모임.
  • 무제한 레지스터 머신(unlimited register machine, URM). 자연수 레지스터 무한 개와 증가·감소·점프 명령으로 동작하는 추상 컴퓨터. 셰퍼드슨-스터지스가 정리한 모델이다.
  • 마르코프 알고리즘, 태그 시스템, 회로 패밀리, 세포 자동자(cellular automaton) 등.

놀랍게도 이 모든 모델은 정확히 같은 함수 클래스 — 부분 회귀 함수, 곧 튜링 계산 가능 함수 — 를 정의한다. 1936년 처치와 튜링은 이 사실을 다음 명제로 결정화했다.

처치-튜링 명제. "직관적 의미에서 알고리즘으로 계산 가능한 함수"의 클래스는 정확히 튜링 기계가 계산하는 부분 함수의 클래스와 같다.

이것은 정리가 아니다. 좌변의 "직관적"이라는 말 때문에 수학적으로 증명할 대상이 아니라, 직관적 개념과 형식적 개념을 동일시하자는 명제이자 약속이다. 그러나 90년이 지난 지금도 어떤 반례도 발견되지 않았고, 위에서 본 다양한 모델들의 등가성이 강력한 경험적 증거를 제공한다. 우리는 이제 "어떤 알고리즘이 존재한다"는 진술을 "어떤 튜링 기계가 존재한다"로 자유로이 바꿔 쓸 수 있는 면허를 갖게 된다.

한 줄 메모. 양자 컴퓨터도 처치-튜링 명제를 깨지 않는다. 양자 회로는 — 비효율적이긴 해도 — 고전 TM으로 시뮬레이션 가능하다. 무엇이 깨질지 모를 후보는 "효율적" 처치-튜링 명제(다항식 시간 버전), 곧 강처치-튜링 명제뿐이다.

6. 모델은 옷이고 알고리즘은 사람이다

강의를 마치며 한 가지만 기억하자. 단일 테이프든, 다중 테이프든, 비결정적이든, 람다 항이든, 우리가 "이것은 알고리즘이다"라고 부를 수 있는 것은 어떤 모델에서 표현해도 같은 함수를 계산한다. 모델은 알고리즘에 입히는 옷이다. 옷이 다양해도 사람은 한 명이다.

이것이 이론적으로 의미하는 바는 분명하다. 다음 강의부터 우리는 "결정 가능"과 "결정 불가능"을 자유롭게 말할 것인데, 이 개념들은 어떤 모델을 골라도 변하지 않는다. 다음 강의에서는 이 자유를 활용해 정규 언어와 문맥 자유 언어에 대한 수많은 결정 문제를 — 의외로 평이하게 — 알고리즘으로 풀어낼 것이다. 이후 강의 8에서 비로소 결정 불가능의 첫 풍경을 만나게 된다.

강의 7

오토마타와 문법의 결정 문제

"이 기계가 이 문자열을 받아들이나요?" — 답할 수 있는 질문들의 카탈로그.

1. 결정 문제라는 장르

결정 문제(decision problem)란 예/아니오로 답이 떨어지는 질문이다. 우리는 이 질문들을 언어로 인코딩한다. 예컨대 "DFA B가 문자열 w를 수락하는가?"는 다음 언어의 멤버십 문제와 같다.

ADFA = { ⟨B, w⟩ : B는 DFA이고 Bw를 수락한다 }

여기서 ⟨B, w⟩는 DFA B의 형식적 표현과 입력 w를 한 문자열로 인코딩한 것이다. 어떤 인코딩 규약이든 — 예컨대 상태와 전이 함수를 ASCII 표로 적고 # 같은 구분자로 잇든 — 합리적이기만 하면 결정 가능 여부는 바뀌지 않는다(처치-튜링 명제의 일상적 활용 사례다).

이번 강의의 모든 정리는 같은 골격을 따른다: "어떤 TM이 입력을 받아 알고리즘적 절차를 수행하고 항상 멈추며, 답이 예일 때 정확히 수락한다." 이러한 TM이 존재함을 보이면 해당 언어는 결정 가능(decidable)이다.

2. ADFA: 시뮬레이션 한 번이면 끝

정리 7.1. ADFA는 결정 가능하다.
증명. 다음 TM MA·DFA를 정의한다.

입력 ⟨B, w⟩에 대해:
  1. 인코딩이 잘 형성되었는지 검사한다. 아니라면 거부한다.
  2. B의 시작 상태 q0를 현재 상태로 둔다.
  3. w의 각 글자 wi에 대해 차례로 현재 상태를 δ(q, wi)로 갱신한다.
  4. 입력을 다 읽은 뒤 현재 상태가 수락 상태이면 수락, 아니면 거부.
DFA는 입력 한 글자당 한 단계만 진행하므로 n = |w|에 대해 O(n)단계 이하로 항상 멈춘다. 따라서 MA·DFA는 결정자(decider)다. ∎

이 증명은 거의 무의미해 보일 정도로 평이하다. 그러나 메시지는 분명하다: 유한한 자원만으로 정의되는 모델을 흉내 내는 일은 항상 결정 가능하다. 이 패턴이 이번 강의 절반의 동력이 된다.

3. EDFA: 그래프 탐색의 변장

EDFA = { ⟨B⟩ : B는 DFA이고 L(B) = ∅ }

DFA가 어떤 문자열도 수락하지 않는다는 것은, 시작 상태에서 어떤 수락 상태에도 도달할 수 없다는 것과 동치이다. 그리고 도달 가능성은 그래프에서 너비 우선 탐색(BFS)이면 된다.

정리 7.2. EDFA는 결정 가능하다.
증명.

입력 ⟨B⟩에 대해:
  1. B의 상태 집합 가운데 시작 상태 q0만 표시(mark)한다.
  2. 표시된 어떤 상태로부터 한 전이로 도달하는 상태가 있으면, 그 상태도 표시한다. 더 이상 새로 표시할 상태가 없을 때까지 반복한다.
  3. 표시된 상태 중에 수락 상태가 하나라도 있으면 거부, 없으면 수락.
상태 수가 유한하므로 단계 2의 반복은 유한 번 만에 끝난다. 표시된 집합은 정확히 시작 상태에서 도달 가능한 상태들이고, 그 안에 수락 상태가 없을 때 정확히 L(B) = ∅이다. ∎
한 줄 메모. 마지막 줄에 "수락"과 "거부"가 뒤집힌 것에 주목하자. EDFA는 "L이 비어 있다"가 예인 언어이므로, 수락 상태에 도달할 수 있으면 비어 있지 않으므로 거부해야 한다.

4. EQDFA: 대칭차의 마법

EQDFA = { ⟨A, B⟩ : A, B는 DFA이고 L(A) = L(B) }

두 언어가 같음을 직접 비교하는 것은 어렵다 — 무한히 많은 문자열에 대해 일치를 확인해야 할 것 같다. 하지만 집합론적 정체성 하나로 문제가 단번에 풀린다.

L(A) = L(B) ⟺ (L(A) ∖ L(B)) ∪ (L(B) ∖ L(A)) = ∅

이 우변에 등장하는 집합을 두 언어의 대칭차(symmetric difference)라 부르고 L(A) △ L(B)로 적는다. 두 언어가 다르면, 한 쪽에는 있고 다른 쪽에는 없는 어떤 문자열이 반드시 존재한다 — 그 문자열이 대칭차에 들어 있다.

정리 7.3. EQDFA는 결정 가능하다.
증명.

입력 ⟨A, B⟩에 대해:
  1. 정규 언어가 합집합·교집합·여집합 연산에 대해 닫혀 있으므로(강의 1·2의 결과), L(A) △ L(B)를 인식하는 DFA C를 곱 구성(product construction)으로 만든다.
  2. 정리 7.2의 알고리즘을 ⟨C⟩에 적용해 L(C) = ∅인지 판정한다.
  3. C⟩가 EDFA에 속하면 수락, 아니면 거부.
모든 단계가 결정 가능한 절차이므로 전체도 결정 가능하다. ∎
한 줄 메모. 두 결정 가능 언어를 도구로 또 다른 결정 가능 언어를 푼다. 결정 가능성은 모듈식으로 조립된다.

5. NFA와 정규 표현식: 변환 한 단계 추가

ANFA = { ⟨N, w⟩ : Nw를 수락 },    ENFA = { ⟨N⟩ : L(N) = ∅ }

정리 7.4. ANFA, ENFA, EQNFA는 모두 결정 가능하다. 또한 정규 표현식 R에 대한 AREX = { ⟨R, w⟩ : Rw를 생성 }도 결정 가능하다.
증명 스케치. 각 입력을 받아 부분 알고리즘으로 DFA로 변환한 뒤 정리 7.1–7.3을 호출한다. NFA → DFA 변환은 부분집합 구성(subset construction)으로, 정규 표현식 → NFA 변환은 톰슨 구성(Thompson's construction)으로 수행한다. 두 변환 모두 알고리즘적이고 항상 멈춘다. ∎

변환의 비용(상태 수가 지수적으로 폭발할 수 있음)은 결정 가능성에는 영향을 주지 않는다. 결정 가능성은 "유한 시간 안에 답이 나오느냐"의 문제이지 "얼마나 빠르냐"의 문제가 아니다. 후자는 복잡도 이론의 영역이다.

6. 문맥 자유 문법으로

ACFG = { ⟨G, w⟩ : CFG Gw를 생성 }

여기서 첫 번째 함정이 등장한다. 순진하게 "G가 가능한 모든 유도(derivation)를 시도해보자"고 하면 끝없이 늘어나는 유도가 무한히 많을 수 있어 절차가 멈추지 않는다. 그러나 한 가지 관찰로 문제가 풀린다.

정의 7.5 (촘스키 정규형, CNF). CFG G가 촘스키 정규형(Chomsky normal form)이라 함은 모든 규칙이 다음 형태 중 하나일 때이다.
  • ABC    (단, B, C는 시작 변수가 아닌 변수)
  • Aa    (단, a는 단말 기호)
  • S → ε    (필요 시 시작 변수에 한해)

모든 CFG는 같은 언어(필요시 ε 처리만 분리)를 생성하는 어떤 CNF로 알고리즘적으로 변환할 수 있다(보조 변수 도입, 단위 규칙 제거, ε 규칙 제거 단계의 조합). 이제 결정적 사실 하나가 마법을 부린다.

보조정리 7.6. CNF인 CFG G가 길이 n ≥ 1인 문자열 w를 생성한다면, 어떤 유도든 정확히 2n − 1 단계로 이루어져 있다.

이유는 직관적이다. CNF에서 단말은 "Aa" 규칙으로만 나타나므로 길이 n인 문자열에는 단말 규칙이 정확히 n번 적용된다. 비단말 규칙 "ABC"는 변수 한 개를 두 개로 늘리므로 변수 수를 1 증가시킨다. 시작 변수 1개에서 출발해 변수 n개까지 늘리려면 정확히 n − 1번 적용되어야 한다. 합치면 (n − 1) + n = 2n − 1.

정리 7.7. ACFG는 결정 가능하다.
증명.

입력 ⟨G, w⟩에 대해:
  1. G를 동치인 CNF G′로 변환한다.
  2. w = ε이면 G′에 S → ε이 있는지 보고 그에 따라 수락/거부한다.
  3. 그 외에는 G′의 규칙을 사용해 길이 2|w| − 1 이하의 모든 유도를 나열하고, 그 가운데 w를 생성하는 것이 있는지 확인한다.
  4. 있으면 수락, 없으면 거부.
나열할 유도 후보의 수는 유한하므로 절차는 항상 멈춘다. ∎

실용적인 사람들은 단계 3을 그렇게 야만적으로 짜지 않는다. 동적 계획법으로 만든 CYK(Cocke-Younger-Kasami) 알고리즘은 O(n3)시간에 같은 문제를 푼다 — 길이 k의 모든 부분 문자열이 어떤 변수에서 유도되는지를 작은 k부터 채워 올라간다. 결정 가능성을 보이는 데에는 야만적인 나열로 충분하지만, 컴파일러를 짤 때는 CYK 또는 LR(1) 같은 더 빠른 파싱이 등장한다.

7. ECFG: 단말 도달 가능성

ECFG = { ⟨G⟩ : CFG G이고 L(G) = ∅ }

이 문제도 도달 가능성의 변장이다. 다만 이번 그래프는 변수와 규칙의 그래프다.

정리 7.8. ECFG는 결정 가능하다.
증명.

입력 ⟨G⟩에 대해:
  1. 처음에는 어떤 변수도 표시되지 않은 상태로 시작한다.
  2. "규칙 AX1X2Xk의 모든 Xi가 (단말이거나) 이미 표시된 변수일 때, A를 표시한다." 새로 표시할 변수가 없을 때까지 반복한다.
  3. 시작 변수 S가 표시되었으면 거부, 아니면 수락.
"표시된 변수" = "어떤 단말 문자열을 적어도 하나 생성할 수 있는 변수". 따라서 S가 표시되지 않는 것이 정확히 L(G) = ∅과 동치이다. 변수 수가 유한하므로 단계 2는 유한 번 만에 종료된다. ∎

8. 풀 수 없는 한 가지: EQCFG

여기까지 보면 도구를 충분히 갖춘 듯 느껴진다. 그러면 EQCFG = { ⟨G1, G2⟩ : L(G1) = L(G2) }도 같은 트릭으로 풀릴까? 두 문맥 자유 언어의 대칭차도 결정 가능한 비어 있음 검사로 환원할 수 있을까?

아쉽게도 안 된다. 문맥 자유 언어는 합집합과 연쇄에는 닫혀 있지만 교집합과 여집합에는 닫혀 있지 않다. 따라서 대칭차 트릭이 무너진다. 이것은 단순히 우리의 구성이 통하지 않는다는 뜻이지만, 더 깊은 진실은 다음과 같다.

정리 7.9 (예고). EQCFG는 결정 불가능(undecidable)하다.

이 정리의 증명은 환원(reduction) 기법을 본격적으로 다룬 뒤에야 가능하다. 한편 모든 문맥 자유 언어가 (CYK가 보여주듯) 결정 가능한 멤버십을 가지므로 EQCFG는 결정 가능 언어 사이의 동치 문제다. 결정 가능 언어 두 개의 동치성마저 일반적으로는 결정 불가능할 수 있다는 사실을 살짝 미리 들고 가자.

한 줄 메모. 또 하나, ACFG·ECFG가 결정 가능하다는 사실의 따름정리 — 모든 문맥 자유 언어는 결정 가능하다. CFG가 주어지면 멤버십을 항상 알고리즘적으로 판단할 수 있다.

9. 다음 강의로

지금까지 우리는 결정 가능의 풍요로운 정원을 거닐었다. 거기에는 시뮬레이션, 그래프 탐색, 곱 구성, 정규형 변환 같은 점잖은 도구들이 있었다. 다음 강의 8에서는 정원의 담장을 처음으로 넘는다 — 결정 불가능한 언어가 존재함을, 심지어 우리에게 가장 친숙한 질문 "Mw를 수락하는가?"가 일반적으로는 알고리즘으로 풀리지 않음을 보일 것이다. 도구는 단 하나, 칸토어의 대각선 논법이다.

강의 8

결정 불가능성

알고리즘이 풀 수 없는 첫 번째 문제 — 그리고 그것이 왜 피할 수 없는 운명인가.

1. 무대 설정: 가산과 비가산

결정 불가능한 문제가 존재한다는 사실의 가장 우아한 증명은 단 한 줄짜리 개수 세기다. "알고리즘은 가산(countable)이다. 그러나 언어는 비가산(uncountable)이다. 그러므로 알고리즘이 짝지어줄 수 없는 언어가 — 사실은 거의 모든 언어가 — 존재한다." 이 직관을 정리해두자.

정의 8.1. 집합 S가산이라 함은, S가 유한하거나 자연수 집합 ℕ과 일대일 대응(전단사, bijection)이 있다는 뜻이다. 그렇지 않으면 S비가산이다.
예제 8.2. ℤ는 0, 1, −1, 2, −2, … 의 순서로 ℕ과 일대일 대응되므로 가산이다. ℚ도 분수를 행렬처럼 나열한 뒤 대각선 순회하면 가산임을 보일 수 있다. 유한 알파벳 Σ에 대한 모든 문자열의 집합 Σ* 또한 가산이다 — 길이순, 같은 길이 안에서는 사전식으로 나열하면 된다.
정리 8.3 (칸토어). 실수의 집합 ℝ은 비가산이다. 더 일반적으로, 임의의 무한 집합 X의 멱집합 𝒫(X)는 X와 일대일 대응될 수 없다.
증명 스케치 (대각선 논법). ℝ의 부분 집합 [0, 1)이 가산이라고 가정하자. 그러면 그 안의 모든 수를 r1, r2, r3, … 으로 나열할 수 있고, 각 ri의 십진 전개를 ri = 0.di,1di,2di,3… 으로 적는다. 이제 새 수 x = 0.e1e2… 를 정의하자. 단, eidi,i이고 ei ∈ {3, 5}로 잡자(애매한 0.999… = 1.000… 같은 사례를 피하기 위해). 그러면 x는 모든 ri와 적어도 i번째 자리에서 다르므로 어떤 ri와도 같지 않다. 그러나 x ∈ [0, 1)이므로 우리의 나열에 포함되어야 한다 — 모순. ∎

이 한 번의 대각선화를 우리는 이 강의에서 두 번 더 본다. 형태는 늘 같다: "모든 후보가 나열되었다고 가정하고, 그 나열의 대각선을 비틀어 새로운 대상을 만들어 모순을 일으킨다."

2. 인식 불가능 언어의 존재

이제 위 정리를 계산이론으로 옮긴다.

정리 8.4. 알파벳 Σ가 비어 있지 않을 때, 인식 불가능한(non-Turing-recognizable) 언어 L ⊆ Σ*가 존재한다.
증명.
  • TM은 가산이다. 모든 TM은 — 합리적 인코딩 규약에서 — 어떤 유한 문자열 ⟨M⟩으로 표현된다. ⟨M⟩은 Σ*의 원소이고 Σ*는 가산이므로, TM의 집합도 가산이다. 따라서 인식 가능 언어의 집합 Re = { L(M) : M은 TM }도 가산이다.
  • 언어는 비가산이다. Σ*의 모든 부분 집합의 집합 𝒫(Σ*)이 곧 모든 언어의 집합이다. 정리 8.3에 의해 𝒫(Σ*)는 비가산이다.
  • 가산 집합은 비가산 집합을 덮을 수 없으므로, 인식 가능하지 않은 언어가 존재한다. ∎

아름답지만 답답한 증명이다. "그래서 그 인식 불가능 언어가 무엇인가?"에 답하지 못한다. 다음 절에서 우리는 구체적으로 흥미로운 결정 불가능 언어를 손에 쥐게 된다.

3. ATM: 보편 시뮬레이터의 한계

ATM = { ⟨M, w⟩ : M은 TM이고 Mw를 수락한다 }

정리 8.5. ATM은 튜링 인식 가능하다.
증명. 보편 튜링 기계(universal TM) U는 입력 ⟨M, w⟩를 받아 Mw에 대해 동작하는 모습을 한 단계씩 시뮬레이션한다. M이 수락하면 U도 수락하고, M이 거부하면 U도 거부한다. M이 멈추지 않으면 U도 멈추지 않는다 — 그러나 그것이 인식자(recognizer)의 정의에 위배되지는 않는다. 따라서 UATM을 인식한다. ∎

U의 존재가 곧 "프로그램으로서의 컴퓨터"라는 폰 노이만식 패러다임의 이론적 토대다. 그러나 U가 인식자일 뿐 결정자는 아니라는 점이 결정적이다. 다음 정리가 그 이유를 알려준다.

정리 8.6 (튜링 1936). ATM은 결정 불가능하다.
증명 (대각선 논법). 결정자 TM H가 존재해 모든 ⟨M, w⟩에 대해

H(⟨M, w⟩) = 수락 (Mw를 수락) / 거부 (Mw를 거부하거나 멈추지 않음)

을 항상 멈추며 답한다고 가정한다. 우리의 목표는 모순을 도출하는 것이다.

H를 부품으로 새 TM D를 다음과 같이 정의한다.

D(⟨M⟩):
  1. 입력 ⟨M⟩을 받는다(즉, 어떤 TM의 인코딩).
  2. H를 ⟨M, ⟨M⟩⟩에 대해 호출한다 — "기계 M이 자기 자신의 인코딩에 대해 어떻게 동작하는가?"를 묻는다.
  3. H가 수락하면 D는 거부한다. H가 거부하면 D는 수락한다.
H가 결정자이므로 D도 결정자다. 이제 D를 자기 자신에게 적용해보자. D(⟨D⟩)는 어떤 답을 내놓을까?
  • D(⟨D⟩) = 수락 ⟹ H(⟨D, ⟨D⟩⟩) = 거부 ⟹ D가 ⟨D⟩를 수락하지 않는다 ⟹ D(⟨D⟩) = 거부.
  • D(⟨D⟩) = 거부 ⟹ H(⟨D, ⟨D⟩⟩) = 수락 ⟹ D가 ⟨D⟩를 수락한다 ⟹ D(⟨D⟩) = 수락.
두 경우 모두 모순이다. 따라서 가정한 H는 존재할 수 없다. ∎
한 줄 메모. 이것은 칸토어의 대각선 논법을 그대로 옮겨온 것이다. 실수의 자리표 di,i가 "기계 i가 입력 i에 대해 무엇을 하는가"로 바뀌었을 뿐, 비트는 동일한 동작을 한다. 자기 참조라는 칼날이 자기 자신을 베는 순간이다.

4. 보조정리: 인식과 여인식의 결합

다음 절로 가기 전에 작은 보조정리 하나가 필요하다. 이는 인식 가능성과 결정 가능성 사이의 다리다.

보조정리 8.7. 언어 L이 결정 가능 ⟺ L과 그 여집합 L = Σ* ∖ L이 모두 인식 가능.
증명.

(⇒) L이 결정 가능하면 결정자 M이 있어서 항상 멈추고 정확한 답을 준다. L의 인식자는 M 자신이고, L의 인식자는 M의 수락·거부를 뒤집은 M′이다. 둘 다 항상 멈추므로 인식자다.

(⇐) M1L을, M2L을 인식한다고 하자. 결정자 M을 다음과 같이 만든다. 입력 w에 대해 M1M2를 동시에(예: 두 테이프에서 한 단계씩 번갈아) 시뮬레이션한다. M1이 수락하면 M도 수락한다. M2가 수락하면 M은 거부한다. wL이거나 L 중 하나에 정확히 속하므로 둘 중 하나는 반드시 유한 시간 안에 수락한다. 따라서 M은 항상 멈춘다 — 결정자다. ∎

대우 형태로 읽으면 더 강력하다: L이 인식 가능이고 결정 불가능이면, L은 인식 가능조차 아니다.

5. ATM의 여집합: 인식 불가능의 첫 사례

정리 8.8. ATM = { ⟨M, w⟩ : M이 TM이고 Mw를 수락하지 않는다 }은 인식 불가능하다.
증명. 정리 8.5에서 ATM이 인식 가능임을 보았다. 정리 8.6에서 ATM이 결정 불가능임을 보았다. 만약 ATM도 인식 가능이라면, 보조정리 8.7에 의해 ATM이 결정 가능해야 하므로 모순이다. 따라서 ATM은 인식 불가능. ∎

이 정리에서 인식 가능 언어의 클래스(통상 RE 또는 Re로 표기)는 여집합 아래에서 닫혀 있지 않다는 사실이 따라온다. 정규 언어와 결정 가능 언어와는 달리, 인식 가능 언어 한 개를 뒤집으면 클래스 밖으로 튀어나갈 수 있다. 이 비대칭이 결정 가능과 인식 가능을 가르는 가장 깊은 차이다.

한 줄 메모. 이로써 우리는 세 종류의 언어를 손에 쥔다 — 결정 가능, 인식 가능하지만 결정 불가능(ATM), 인식 가능조차 아닌 것(ATM). 풍경에 처음으로 깊이가 생겼다.

6. HALTTM: 환원 기법의 첫 시연

HALTTM = { ⟨M, w⟩ : Mw에 대해 (수락이든 거부든) 멈춘다 }

정리 8.9. HALTTM은 결정 불가능하다.
증명 (ATM으로부터의 환원). HALTTM의 결정자 R이 존재한다고 가정하자. 그러면 R을 부품으로 ATM의 결정자 S를 만들 수 있다.

S(⟨M, w⟩):
  1. R을 ⟨M, w⟩에 대해 호출한다.
  2. R이 거부하면(즉 Mw에 대해 멈추지 않음), S는 거부한다 — 멈추지 않는 기계는 수락할 수 없으므로.
  3. R이 수락하면(즉 Mw에 대해 멈춤), 보편 TM UMw에 대해 시뮬레이션한다. 멈춤이 보장되므로 유한 시간 안에 결과가 나온다.
  4. U의 결과가 수락이면 S도 수락, 거부면 S도 거부한다.
S는 항상 멈추고 ATM의 멤버십을 정확히 답한다 — 정리 8.6과 모순. 따라서 R은 존재하지 않는다. ∎

이 증명에 등장한 작은 패턴 — "B의 결정자가 있으면 A의 결정자를 만들 수 있다, 따라서 A가 결정 불가능이면 B도 결정 불가능" — 이 다음 강의의 주인공인 매핑 환원(mapping reduction)의 비공식 형태다. 환원은 결정 불가능성을 한 문제에서 다른 문제로 옮겨 심는 묘목 이식 기술이며, 우리는 이미 그 첫 한 그루를 심었다.

한 줄 메모. 컴퓨터 과학 입문 시간에 들었을 "정지 문제(halting problem)는 풀리지 않는다"는 바로 이 정리 8.9를 말한다. 단, 보다 정확히 하자면 결정 불가능한 것은 일반적인 정지 문제이지 — 어떤 특정한 M이나 어떤 특정한 w의 문제가 아니라 — 모든 ⟨M, w⟩에 답하는 일반 알고리즘이다.

7. 풍경 정리와 다음 강의

이번 강의에서 본 그림을 한 장으로 정리하자. 모든 언어의 우주 𝒫(Σ*) 안에는 다음과 같은 동심원이 있다.

  • 가장 안쪽: 정규 언어 ⊊ 문맥 자유 언어 ⊊ 결정 가능 언어.
  • 그 다음: 인식 가능 언어. 결정 가능 언어를 진정으로 포함한다(포함 사례: ATM).
  • 밖: 인식 불가능 언어. 결정 가능 + 인식 가능을 합쳐도 채울 수 없다(포함 사례: ATM).
  • 그리고 사실은, 정리 8.4가 말하듯 거의 모든 언어가 가장 바깥 동심원에 산다 — 알고리즘은 가산이지만 언어는 비가산이므로.

다음 강의에서는 환원 기법을 정식화한다. HALTTM의 증명에서 본 비공식 환원을 매핑 환원으로 다듬고, 그 도구로 ETM(공어 문제), EQTM(동치 문제), 그리고 — 충격적이게도 — 라이스의 정리(Rice's theorem)를 만나게 된다. 라이스 정리는 한 문장으로 요약된다: "튜링 기계가 인식하는 언어의 어떤 비자명한 성질도 결정 불가능이다." 결정 불가능의 풍경이 얼마나 광대한지를 보여주는 정리다.

강의 9

환원성 — 결정 불가능성의 전염

ATM이라는 한 알의 잉크가 어떻게 계산 이론 전체를 물들이는가

1. 환원이라는 사고방식

지난 강의에서 우리는 ATM = { ⟨M, w⟩ : M이 w를 수락한다 }가 결정 불가능함을 대각선 논법으로 증명하였다. 그러나 결정 불가능한 문제가 세상에 단 하나뿐일 리는 없다. 만약 어떤 새로운 문제 B를 마주쳤을 때 또다시 대각선 논법을 처음부터 펼쳐야 한다면, 이론은 매우 비효율적인 학문이 될 것이다. 다행히 우리에게는 더 영리한 무기가 있다 — 바로 환원(reduction)이다.

환원의 직관은 이중적이다. 한편으로는 "어려운 문제를 쉬운 문제로 풀어버리기"이고, 다른 한편으로는 "쉬운 문제의 결정 불가능성을 어려운 문제로 끌어올리기"이다. 일상에서 길을 잃었을 때 우리는 도로 주소를 GPS 좌표로 환원해 길찾기 알고리즘에 넘긴다. 알고리즘 설계자에게 환원은 도구이지만, 결정 불가능성을 증명하려는 우리에게 환원은 무기다. 만약 A를 푸는 일이 B를 푸는 일로 변환된다면, B를 푸는 기계가 있을 경우 A도 풀 수 있다. 따라서 A가 풀리지 않는다면 B도 풀릴 수 없다. 한 줄의 대우가 결정 불가능성을 폭포처럼 퍼뜨린다.

"문제 A는 문제 B만큼 어렵다"라는 일상어를 형식화한 것이 환원이다. 정확히는 "A는 B만큼 어렵거나 그보다 쉽다"이다. 부등호의 방향에 늘 주의하자 — 학생들이 가장 자주 헷갈리는 지점이다.

2. 매핑 환원의 정의

여러 종류의 환원 가운데 가장 깔끔한 것이 매핑 환원이다. 입력을 입력으로 변환하는 단순한 함수 하나로 모든 의미가 끝난다.

정의 9.1 (계산 가능 함수). 함수 f : Σ* → Σ*가 계산 가능(computable)하다는 것은, 모든 입력 w에 대해 f(w)를 테이프에 남기고 정지하는 튜링 기계 Mf가 존재함을 의미한다.

정의 9.2 (매핑 환원, ≤m). 언어 A가 언어 B로 매핑 환원 가능하다는 것은, 다음 조건을 만족하는 계산 가능 함수 f : Σ* → Σ*가 존재함을 뜻한다.

w ∈ A ⇔ f(w) ∈ B (모든 w에 대하여)

이때 f를 A로부터 B로의 환원(reduction)이라 부르고, A ≤m B로 표기한다.

핵심은 동치(⇔)이다. 단순히 "w가 A에 있으면 f(w)가 B에 있다"만 보장하면 부족하다. 반대 방향, 즉 "w가 A에 없으면 f(w)도 B에 없다"가 함께 성립해야 환원이 의미를 갖는다. 이 양방향 보장이 없다면 환원은 정보를 잃어버린 데이터 압축에 불과하다.

정리 9.3 (환원의 핵심 정리). A ≤m B라 하자.

  1. B가 결정 가능하면 A도 결정 가능하다.
  2. B가 튜링 인식 가능하면 A도 튜링 인식 가능하다.

대우로 표현하면 더 유용하다.

  1. A가 결정 불가능하면 B도 결정 불가능하다.
  2. A가 튜링 인식 불가능하면 B도 튜링 인식 불가능하다.

증명 (1). MB를 B의 결정자, Mf를 f를 계산하는 기계라 하자. A의 결정자 MA는 다음과 같다. 입력 w에 대해 Mf를 돌려 f(w)를 얻고, MB를 f(w)에 대해 돌린 후 그 결과를 그대로 출력한다. 정의에 의해 w ∈ A ⇔ f(w) ∈ B이므로 MA는 정확히 A를 결정한다. (2)도 같은 구성에서 MB가 결정자 대신 인식자일 뿐이다. ∎

이 정리는 마치 도미노와 같다. 한 번 A를 결정 불가능한 문제로 세워두면, A ≤m B를 보일 때마다 B가 도미노처럼 넘어진다. 이번 강의의 나머지는 그 도미노 행렬이다.

3. HALTTM — 정지 문제

가장 유명한 결정 불가능 문제, 정지 문제부터 시작한다.

정의 9.4. HALTTM = { ⟨M, w⟩ : M이 입력 w에서 정지한다 }.

정리 9.5. HALTTM은 결정 불가능하다.

증명 (ATMm HALTTM). 환원 함수 f를 다음과 같이 정의한다. 입력 ⟨M, w⟩에 대해 새 기계 M'을 만든다.

M' = "입력 x에 대해: M을 w에 대해 시뮬레이션한다. M이 수락하면 수락한다. M이 거부하면 무한 루프에 진입한다."

그리고 f(⟨M, w⟩) = ⟨M', w⟩로 정한다 (입력 부분은 사실 무엇이든 상관없으나, 형식을 맞춘다).

이제 검증하자.

  • ⟨M, w⟩ ∈ ATM이면 M이 w를 수락하므로 M'은 정지(수락으로) → ⟨M', w⟩ ∈ HALTTM.
  • ⟨M, w⟩ ∉ ATM이면 M이 거부하거나 루프 → 거부 시 M'은 의도적으로 루프에 빠짐, 루프 시 M'도 그대로 멈추지 않음 → ⟨M', w⟩ ∉ HALTTM.

f는 명백히 계산 가능하다(M의 기술에 거부 상태 처리 코드 한 줄을 덧붙이는 일이다). 따라서 ATMm HALTTM이고, ATM이 결정 불가능하므로 HALTTM 또한 결정 불가능하다. ∎

주목할 만한 트릭이 있다. M'은 M이 거부할 때 일부러 영원히 루프에 빠진다. "이상하다 — 거부도 정지의 한 형태가 아닌가?"라고 물을 수 있다. 그렇다. 그래서 우리가 HALT를 가두려면 거부를 "비정지"로 바꿔야 한다. 환원이란 본질적으로 의미를 약간씩 비틀어 모양을 맞추는 일이다.

4. ETM — 빈 언어 문제

정의 9.6. ETM = { ⟨M⟩ : L(M) = ∅ }.

빈 언어 문제는 환원의 방향성을 흥미롭게 보여준다. 자연스럽게 시도하면 ATMm ETM를 보이고 싶지만, 막상 만들면 부등호 방향이 뒤집어진다. 그래서 우리는 차라리 ATM의 여집합과 ETM를 연결한다.

정리 9.7. ETM은 결정 불가능하다. 더 나아가, ETM은 튜링 인식조차 불가능하다.

증명. ATM의 여집합을 코ATM이라 쓰고, 코ATMm ETM를 보인다. 입력 ⟨M, w⟩에 대해 다음 M'을 구성한다.

M' = "입력 x에 대해: x ≠ w이면 거부한다. x = w이면 M을 w에 대해 시뮬레이션하여 그 결과를 따라간다."

이렇게 하면 L(M')은 다음과 같이 양분된다. M이 w를 수락하면 L(M') = {w}, 그렇지 않으면 L(M') = ∅이다.

  • ⟨M, w⟩ ∈ 코ATM ⇔ M이 w를 수락하지 않음 ⇔ L(M') = ∅ ⇔ ⟨M'⟩ ∈ ETM.

따라서 코ATMm ETM이다. ATM은 인식 가능하지만 코ATM은 인식 불가능하다(이는 별도의 논증을 필요로 하나, ATM도 인식 가능하고 코ATM도 인식 가능하면 ATM이 결정 가능하게 됨을 활용한다). 그러므로 ETM도 인식 불가능하고, 자연히 결정 불가능하다. ∎

여집합으로 환원을 잡는 것은 인식 가능성까지 함께 부순다는 점에서 특별히 가치가 있다. 결정 불가능성보다 인식 불가능성이 한 단계 더 강한 결론이다.

5. REGULARTM — TM이 정규 언어를 생성하는가

정의 9.8. REGULARTM = { ⟨M⟩ : L(M)이 정규 언어이다 }.

이 문제는 일견 풀릴 법도 하다. 우리에게는 펌핑 보조정리도 있고, DFA의 깔끔한 구조도 있지 않은가. 그러나 임의의 TM에 대해 그 인식 언어가 정규인지 묻는 일은 결정 불가능하다.

정리 9.9. REGULARTM은 결정 불가능하다.

증명 (ATMm REGULARTM). 우리는 정규 언어와 비정규 언어의 대표 한 쌍을 사용한다. {0n1n : n ≥ 0}은 비정규, Σ*는 정규이다. 환원 함수는 다음 M'을 만든다.

M' = "입력 x에 대해: x가 0n1n의 형태이면 수락한다. 그렇지 않으면 M을 w에 대해 시뮬레이션하여, M이 수락할 경우에만 수락한다."

L(M')의 모습을 따져보자.

  • M이 w를 수락한다면, M'은 모든 입력을 수락하게 된다(0n1n 검사를 통과하지 못한 입력도 결국 M의 수락을 보고 통과). 따라서 L(M') = Σ* — 정규.
  • M이 w를 수락하지 않는다면, M'은 정확히 0n1n꼴 입력만 수락한다(다른 입력은 시뮬레이션에 빠져 영원히 끝나지 않거나 거부). 따라서 L(M') = {0n1n : n ≥ 0} — 비정규.

그러므로 ⟨M, w⟩ ∈ ATM ⇔ ⟨M'⟩ ∈ REGULARTM이다. ∎

예제. M이 입력 w를 받으면 머리를 한 번 움직이고 정지한다고 하자. 그러면 M은 명백히 결정 가능한 단순 기계이지만, 위 환원 구성에 의해 만들어진 M'의 언어가 정규인지 결정할 수 없다고 단정 지을 수 없다 — 이 질문은 ⟨M, w⟩가 무엇이었는지에 따라 달라진다. 환원은 일반적인 결정 불가능성에 관한 것이지, 특정 사례의 어려움에 관한 것이 아님을 명심하자.

6. EQTM — 두 TM이 같은 언어를 인식하는가

정의 9.10. EQTM = { ⟨M1, M2⟩ : L(M1) = L(M2) }.

정리 9.11. EQTM은 결정 불가능하다.

증명 (ETMm EQTM). M을 모든 입력을 거부하는 고정된 TM이라 하자(L(M) = ∅). 함수 f를 f(⟨M⟩) = ⟨M, M⟩로 정의한다.

그러면 ⟨M⟩ ∈ ETM ⇔ L(M) = ∅ ⇔ L(M) = L(M) ⇔ ⟨M, M⟩ ∈ EQTM이다. f는 매우 단순하게 계산 가능하다 — M의 기술 옆에 미리 정해둔 M의 기술을 갖다 붙일 뿐이다. ∎

이 환원의 매력은 뻔뻔스러운 단순함에 있다. 빈 언어 검사기가 있다면 동치성 검사기는 자명하게 만들 수 있고, 동치성 검사기가 있다면 빈 언어 검사기도 마찬가지다. 두 문제는 사실상 같은 문제의 두 얼굴이다.

7. 라이스 정리 — 의미의 결정 불가능성

지금까지 본 모든 결정 불가능 문제는 공통점이 있다. REGULAR, E, EQ — 모두 TM의 코드가 아니라 그 의미(언어)에 관한 질문이다. 라이스(Henry G. Rice)는 1953년 이 패턴을 정리 하나로 일반화하였다.

정리 9.12 (라이스의 정리, 비공식). P를 TM이 인식하는 언어들의 어떤 성질이라 하자. 즉 P ⊆ {모든 튜링 인식 가능 언어}이다. P가 비자명(non-trivial)하다는 것은 P가 공집합도 아니고 모든 인식 가능 언어의 집합도 아님을 의미한다. 그러면 다음 문제는 결정 불가능하다.

LP = { ⟨M⟩ : L(M) ∈ P }

다시 말해, "TM이 어떤 성질의 언어를 받아들이는가"라는 형태의 질문은 — 그 성질이 자명한 두 극단(아무것도 아니거나 모든 것)이 아닌 한 — 알고리즘으로 결코 답할 수 없다.

라이스 정리로 즉시 따라오는 결정 불가능 문제들.

  • L(M)이 정규인가? (P = 정규 언어)
  • L(M)이 유한한가? (P = 유한 언어)
  • L(M)이 결정 가능한가?
  • L(M)에 문자열 "01010"이 속하는가?
  • L(M)이 회문(palindrome)들로 이루어져 있는가?

반면 라이스 정리가 적용되지 않는 질문도 있다 — 예를 들어 "M이 5단계 안에 정지하는가?"는 의미가 아니라 구문(syntax)에 관한 질문이라 결정 가능할 수 있다.

라이스 정리의 정확한 증명은 본질적으로 환원이지만, 비자명성에서 모순을 끌어내는 멋진 추상화가 들어 있다. 흥미가 있는 학생은 이 정리를 회귀 정리(강의 11)와 함께 다시 만나게 된다.

8. 마무리

환원이라는 한 단어로 우리는 결정 불가능성의 행성계 전체를 그릴 수 있게 되었다. ATM이 태양이라면, HALTTM·ETM·REGULARTM·EQTM은 그 주위를 도는 행성들이다. 라이스 정리는 더 멀리, "TM의 의미적 성질이라면 무엇이든"이라는 광활한 영역을 한꺼번에 어둠 속으로 밀어 넣는다. 다음 강의에서는 환원의 도구함을 한 단계 키운다 — 계산 이력이라는 강력한 무기를 손에 넣고 LBA, CFG, 도미노 게임에까지 결정 불가능성의 영향을 확장한다.

강의 10

계산 이력 방법 — 시간을 문자열로 펼치기

LBA, CFG, 그리고 도미노가 모두 같은 함정에 빠지는 이유

1. 시간을 문자열로 묶다

지난 강의의 환원들은 대체로 "M이 무언가 수락하면 ~을 한다" 식의 한 줄 트릭으로 끝났다. 그러나 우리가 결정 불가능성을 더 작고 더 약한 계산 모델로 — 예를 들어 선형 유계 오토마타(LBA)나 문맥 자유 문법(CFG)으로 — 가져가려 할 때, 그런 트릭만으로는 부족하다. 이 모델들은 임의의 튜링 기계를 시뮬레이션할 만큼 똑똑하지 않기 때문이다.

해법은 의외다. 우리는 시간을 문자열로 펼친다. TM의 계산 한 번 — 시작에서 끝까지 — 을 통째로 하나의 문자열로 적어두면, 그 문자열을 검사하는 일은 훨씬 단순한 모델로도 가능해진다. 이 기법을 계산 이력 방법(computation history method)이라 부른다. 시간이 약점이라면 시간을 공간으로 환산해버리자는 것이다.

정의 10.1 (구성과 계산 이력). TM M의 구성(configuration)은 어떤 순간의 테이프 내용, 헤드 위치, 현재 상태를 나타내는 문자열이다. 흔히 uqv 형식으로 적는데, 여기서 q는 상태이고 헤드는 v의 첫 글자 위에 있다.

입력 w에 대한 M의 수락 계산 이력(accepting computation history)은 다음 조건을 만족하는 구성들의 시퀀스

C0, C1, ..., Ck

이다.

  • C0은 입력 w에 대한 시작 구성이다.
  • 각 i에 대해 Ci ⊢ Ci+1 (Ci가 한 단계 만에 Ci+1로 옮겨갈 수 있다).
  • Ck는 수락 구성이다.

거부 계산 이력은 Ck가 거부 구성인 경우이다.

핵심 관찰은 이렇다. M이 w를 수락하는가 묻는 것은 곧 "C0에서 시작해 한 단계씩 합법적으로 옮겨가며 수락 구성에 도달하는 시퀀스가 존재하는가"를 묻는 것과 같다. 그리고 "한 단계 합법성"은 굉장히 국소적인 검사이다 — Ci와 Ci+1이 헤드 주변 두세 글자만 다르고 나머지는 동일하면 된다. 국소성은 약한 모델이 다룰 수 있는 친구이다.

2. 선형 유계 오토마타

정의 10.2 (LBA). 선형 유계 오토마타(linear bounded automaton)는 입력 길이만큼의 테이프 칸만 사용하는 튜링 기계이다. 더 정확히, 입력 양 끝에 마커가 있어 헤드가 그 바깥으로 나갈 수 없다.

LBA는 강력하다 — 모든 문맥 의존 언어를 인식한다. 그러나 동시에 약한 면도 있다. 사용 가능한 공간이 입력으로 제한되므로, 가능한 구성의 수가 유한하다. 이 유한성이 모든 차이를 만든다.

보조정리 10.3. 상태 집합 Q, 테이프 알파벳 Γ, 입력 길이 n인 LBA의 가능한 구성 수는 |Q| · n · |Γ|n개로 유한하다.

증명 스케치. 구성은 (상태, 헤드 위치, 테이프 내용)의 삼중쌍이다. 상태는 |Q|가지, 헤드 위치는 n가지(왼쪽 끝부터 오른쪽 끝까지), 테이프 내용은 각 칸이 |Γ| 중 하나이므로 |Γ|n가지이다. 곱하면 위의 식이 나온다. ∎

정리 10.4. ALBA = { ⟨M, w⟩ : M은 LBA, M이 w를 수락 }은 결정 가능하다.

증명. 결정자 D는 다음과 같이 동작한다. 입력 ⟨M, w⟩에 대해 |Q| · n · |Γ|n단계까지 M을 시뮬레이션한다. 만약 그 안에 수락하면 수락. 만약 그 안에 거부하거나 같은 구성이 두 번 나타나면 거부. 시뮬레이션이 위의 한계를 넘어가면 — 비둘기집 원리에 의해 — M은 어딘가에서 같은 구성을 두 번 거쳤을 것이다. 즉 LBA는 무한 루프에 갇혔다. 따라서 거부한다. ∎

여기까지는 LBA가 다른 어떤 TM 종류보다도 다루기 쉽다는 좋은 소식이다. 그러나 LBA의 보다 풍부한 질문은 — 마치 TM에서처럼 — 곧장 결정 불가능 영역으로 들어간다.

3. ELBA — LBA가 빈 언어를 인식하는가

정의 10.5. ELBA = { ⟨M⟩ : M은 LBA이고 L(M) = ∅ }.

정리 10.6. ELBA는 결정 불가능하다.

증명 (ATMm ELBA). 핵심 아이디어 — LBA가 일반 TM의 계산 이력을 검사하도록 만든다. 임의의 ⟨M, w⟩가 주어졌을 때 LBA B를 다음과 같이 구성한다.

B의 입력 형식: 후보 시퀀스 #C0#C1#...#Ck#.

B는 다음을 차례로 검사한다.

  1. C0이 M의 w 시작 구성과 일치하는가?
  2. 각 인접 쌍 (Ci, Ci+1)이 한 단계 합법적인 천이인가?
  3. Ck가 M의 수락 구성인가?

이 모든 검사는 입력 길이 안에서 충분히 수행된다 — B는 입력 위를 좌우로 이동하며 # 사이의 두 구성을 비교하기만 하면 된다. 그러므로 B는 진짜로 LBA이다.

이제 정확히 다음이 성립한다.

L(B) ≠ ∅ ⇔ M의 w에 대한 수락 계산 이력이 존재 ⇔ M이 w를 수락 ⇔ ⟨M, w⟩ ∈ ATM.

대우로, ⟨M, w⟩ ∉ ATM ⇔ ⟨B⟩ ∈ ELBA이다. 환원 함수 f(⟨M, w⟩) = ⟨B⟩는 계산 가능하다. 따라서 코ATMm ELBA이고 ELBA는 결정 불가능하다. ∎

이 환원의 묘미는 약한 모델(LBA)에 강한 모델(임의의 TM)의 모든 행동을 텍스트로 압축해 떠넘긴다는 점이다. LBA는 시뮬레이션할 수 없지만 검산은 할 수 있다. 검산이라는 가벼운 일조차 결정 불가능을 부른다.

4. ALLCFG — CFG가 모든 문자열을 생성하는가

이번에는 도구를 한 단계 더 약화시킨다 — 문맥 자유 문법으로.

정의 10.7. ALLCFG = { ⟨G⟩ : G는 CFG이고 L(G) = Σ* }.

정리 10.8. ALLCFG는 결정 불가능하다.

증명의 핵심은 영리한 뒤집기이다. CFG는 일반적으로 "잘못된 계산 이력"의 집합 — 합법적이지 않은 시퀀스의 모임 — 을 표현할 수 있다. 그러면 "잘못된 이력의 집합이 Σ* 전부인가"라는 질문은 "올바른 이력이 단 하나도 없는가"와 같고, 이는 곧 "M이 w를 거부하는가"이다.

증명 스케치 (ATMm 코ALLCFG). 입력 ⟨M, w⟩에 대해 다음 언어를 생성하는 CFG G를 만든다.

L(G) = { x ∈ Σ* : x는 M의 w에 대한 수락 계산 이력이 아니다 }.

이렇게 잡으면 L(G) = Σ* ⇔ 수락 이력이 하나도 없음 ⇔ M이 w를 수락하지 않음이 된다.

왜 "올바르지 않다"는 CFG로 표현 가능한가? 후보 문자열이 #C0#C1#...#Ck# 모양이라 가정하면, 그것이 수락 이력이 아닐 조건은 다음 중 적어도 하나이다.

  • (A) 모양 자체가 틀렸다 (#로 구분된 블록이 아니다).
  • (B) C0이 시작 구성이 아니다.
  • (C) 어떤 i에서 Ci가 Ci+1로 합법적으로 옮겨가지 못한다.
  • (D) Ck가 수락 구성이 아니다.

(A), (B), (D)는 정규 언어에 가깝고 — 따라서 CFG로 — 표현 가능하다. 진짜 트릭은 (C)이다. CFG는 본래 "Ci와 Ci+1가 다르다"고 직접 말하기 어렵다. 푸시다운 자동기는 한 번에 두 개의 구성을 동시에 비교할 수 없기 때문이다.

홀짝 구성 뒤집기 트릭. 우리는 계산 이력의 형식을 살짝 비튼다 — 짝수 번째 구성은 그대로 적고, 홀수 번째 구성은 역순으로 적는다. 즉 #C0#C1R#C2#C3R#... 와 같이. 이렇게 하면 인접한 두 구성 Ci와 Ci+1R이 서로 마주보고 거울처럼 적힌다. 이 거울 형식은 푸시다운 스택으로 처리할 수 있다 — Ci를 푸시한 뒤 Ci+1R를 비교하면서 팝하면 된다. 비교 도중 단 한 곳이라도 한 단계 천이 규칙에 어긋나는 차이를 발견하면 그 후보는 (C)에 의해 "수락 이력이 아니다"로 분류된다.

이 G를 잘 설계하면 정확히 "올바르지 않은 이력들"을 받는다. M이 w를 수락하지 않으면 어떤 후보도 수락 이력일 수 없으므로 L(G) = Σ*. M이 수락하면 그 단 하나의 진짜 수락 이력은 G가 받지 않으므로 L(G) ≠ Σ*. 따라서 ⟨M, w⟩ ∈ 코ATM ⇔ ⟨G⟩ ∈ ALLCFG이고, ALLCFG는 결정 불가능하다. ∎

왜 뒤집어야 하는가. CFG로 ww 같은 언어 — "두 번 똑같이 적은 문자열" — 는 만들 수 없지만, wwR — "두 번째 절반을 거꾸로 적은 회문 모양" — 은 매우 자연스럽게 만들 수 있다. 계산 이력의 인접 구성을 비교하려면 똑같은 형태가 필요한데, 마침 푸시다운 스택은 회문을 좋아한다. 이 우연이야말로 환원이 통하는 비밀이다.

5. Post 대응 문제(PCP)

마지막으로, 계산과는 전혀 관련 없어 보이는 — 도미노 퍼즐의 — 문제를 본다.

정의 10.9 (PCP). 도미노 모음을 다음과 같이 적자.

P = { [t1/b1], [t2/b2], ..., [tn/bn] }

각 도미노는 윗변 ti와 아랫변 bi가 적힌 카드이다. 대응(match)이란 (중복 사용 허용) 도미노들의 시퀀스 [ti1/bi1], ..., [tik/bik]로서

ti1 ti2 ... tik = bi1 bi2 ... bik

가 성립하는 것을 말한다. PCP = { ⟨P⟩ : P는 대응을 갖는다 }.

작은 예제. P = { [b/ca], [a/ab], [ca/a], [abc/c] }. 시퀀스 [a/ab], [b/ca], [ca/a], [a/ab], [abc/c]를 차례로 놓으면 윗줄과 아랫줄이 모두 abcaaabc로 일치한다. 이런 대응을 손으로 찾아본 학생이라면 — 일반적인 PCP가 얼마나 어려운지 직감했을 것이다.

정리 10.10 (Post, 1946). PCP는 결정 불가능하다.

증명 직관 (ATMm PCP). 임의의 ⟨M, w⟩가 주어졌을 때, 그 수락 계산 이력에 정확히 대응하는 도미노 시스템 P를 설계한다. 도미노들은 다음 역할을 갖도록 정한다.

  • 시작 도미노: 윗줄에 "#"만, 아랫줄에 "#C0#"를 적어, 아랫줄이 먼저 한 구성만큼 앞서 나가게 한다.
  • 천이 도미노들: 각 가능한 한 단계 천이 (헤드 주변의 짧은 변환)에 대해, 윗줄에 "이전" 부분, 아랫줄에 "이후" 부분을 적은 도미노를 둔다.
  • 복사 도미노: 헤드에서 멀리 떨어진 위치는 그대로 유지된다. 각 테이프 글자 a에 대해 윗·아랫줄 모두 a인 도미노를 둔다.
  • 마무리 도미노: 수락 상태에 도달했을 때 윗줄을 따라잡게 만드는 청소(cleanup) 도미노들.

대응을 만들려고 시도하는 일은 곧 M의 계산을 한 단계씩 그려나가는 일이 된다 — 도미노들이 서로 맞물리도록 강제하는 유일한 방법은 합법적인 다음 구성을 적어 가는 것이다. 따라서 P가 대응을 가짐 ⇔ M의 수락 이력 존재 ⇔ M이 w를 수락이 된다. (이 환원의 정확한 디테일 — 시작과 끝의 처리, 정확한 도미노 수 — 는 한 페이지가 넘는 사례 분석이지만, 본질은 위와 같다.) ∎

PCP는 1946년에 정의되었지만 결정 불가능성 증명은 1950년대에 와서야 완성되었다. 도미노 퍼즐이라는 어린이 게임이 튜링 기계만큼이나 강력하다는 사실은 — 학문 전반에 걸쳐 — 환원의 위력을 증언하는 가장 인상 깊은 사례 중 하나이다.

6. 마무리

계산 이력은 시간이라는 추상을 문자열이라는 구체로 끌어내리는 망원경이다. 이 망원경 하나로 우리는 LBA의 빈 언어, CFG의 만물 언어, 그리고 도미노 퍼즐까지 결정 불가능 영역으로 끌어들였다. 다음 강의에서는 정반대 방향의 마법을 본다 — 자기 자신을 출력하는 프로그램, 그리고 그로부터 나오는 우아한 회귀 정리이다.

강의 11

회귀 정리와 논리 — 자기 자신을 부르는 프로그램

QUINE에서 괴델까지, 자기 참조의 한 줄 마법

1. 자기 자신을 출력하는 프로그램

다음과 같은 작은 도전이 있다. 입력 없이 실행했을 때 자기 자신의 소스 코드를 그대로 출력하는 프로그램을 작성하라. "그냥 파일을 읽으면 되지 않나?" 하는 학생도 있을 것이다. 그러나 그건 반칙이다 — 외부 자원에 접근하지 말고, 코드 자체의 글자만으로 그 코드 전체를 재구성해야 한다. 이런 프로그램을 콰인(quine)이라 부른다.

처음 시도하면 곧 무한 회귀에 빠진다. 코드를 출력하려면 그 코드를 어딘가에 적어둬야 하는데, 그 적어둔 부분도 출력해야 하므로 또 적어두고 — 마치 거울 두 개를 마주 보게 한 듯하다. 그러나 콰인은 가능하다. 그리고 콰인의 일반화가 바로 회귀 정리(recursion theorem)이다. 회귀 정리는 단지 호기심 차원의 트릭이 아니라, 임의의 튜링 기계가 "자기 자신의 기술(description)에 접근할 수 있다"는 강력한 결론을 보장한다.

"자기 자신의 코드에 접근한다" — 이 말은 신비롭게 들리지만, 회귀 정리가 보장하는 바는 매우 실용적이다. M이 자신의 ⟨M⟩을 마치 입력처럼 갖다 쓰는 것을 우리가 합법화한다는 뜻이다. 이 권한이 있으면 결정 불가능성, 의미적 성질의 한계, 심지어 괴델의 불완전성까지 한 줄 증명이 가능해진다.

2. 자신의 기술을 출력하는 TM의 보조정리

회귀 정리의 핵심은 두 단계 구성이다. 우리는 먼저 "어떤 고정된 문자열 t를 출력하는 기계"를 만드는 일반적인 절차가 존재함을 본다. 그런 다음 이 절차를 자기 자신에게 적용하여 콰인을 얻는다.

보조정리 11.1 (출력 기계 생성). 임의의 문자열 t에 대해, 입력에 무관하게 t를 출력하고 정지하는 TM ⟨Pt⟩의 기술을 만드는 계산 가능 함수 q : t ↦ ⟨Pt⟩가 존재한다.

이는 직관적으로 자명하다. q는 단순히 "t를 테이프에 쓰고 정지"라는 코드를 t의 글자 수에 맞게 펼쳐 적기만 하면 된다. q 자체도 짧은 알고리즘이다.

정리 11.2 (SELF, 자기 출력 TM의 존재). 입력에 무관하게 자기 자신의 기술 ⟨SELF⟩를 출력하고 정지하는 튜링 기계 SELF가 존재한다.

증명. SELF를 두 부분 A와 B의 직렬 결합으로 구성한다. SELF = AB.

B의 역할. B는 테이프에 이미 어떤 문자열 t가 적혀 있다고 가정한다. B는 다음을 수행한다.

  1. t를 q에 통과시켜 ⟨Pt⟩를 계산한다.
  2. 테이프 위에 ⟨Pt⟩를 먼저 적고, 그 뒤에 원래의 t를 이어 붙인다.
  3. 정지한다.

즉 B의 입력 t에 대한 출력은 ⟨Pt⟩t이다.

A의 역할. A는 입력을 무시하고 어떤 고정된 문자열을 테이프에 쓰고 B에게 넘겨주는 — q(⟨B⟩)에 해당하는 — 기계이다. 즉 A는 ⟨B⟩를 테이프에 출력하는 P⟨B⟩이다. 그러므로 A의 기술 ⟨A⟩는 정확히 q(⟨B⟩)이다.

전체 동작. SELF = AB가 실행되면 다음이 차례로 일어난다.

  1. A가 ⟨B⟩를 테이프에 출력한다.
  2. B가 그 ⟨B⟩를 자신의 입력 t로 받아, t = ⟨B⟩에 대해 ⟨P⟨B⟩⟩t = ⟨A⟩⟨B⟩를 출력한다.

따라서 SELF의 최종 출력은 ⟨A⟩⟨B⟩ = ⟨AB⟩ = ⟨SELF⟩이다. SELF는 자기 자신의 기술을 출력한다. ∎

이 두 단계 구성은 이론과 실제 양쪽에서 우아하다. A는 "B를 테이프에 적는다"는 단 한 가지 일을 하고, B는 "지금 적힌 것이 곧 무엇을 출력해야 할지를 말해주는 명세"라고 간주하여 그 명세에 따라 자기 자신을 출력한다. 콰인 작성 대회의 우승작들은 모두 이 패턴의 변주이다.

3. 회귀 정리

정리 11.3 (Kleene의 회귀 정리, 약식 진술). T를 입력 (x, w)를 받는 임의의 TM이라 하자. 그러면 다음을 만족하는 TM R이 존재한다.

R(w) = T(⟨R⟩, w) (모든 w에 대하여)

다시 말해, R은 자기 자신의 기술 ⟨R⟩에 자유롭게 접근하면서 — 마치 그것이 추가 입력으로 주어진 것처럼 — 임의의 계산 T를 수행할 수 있다.

증명 스케치. 보조정리 11.2의 SELF 구성을 일반화한다. R을 세 부분 A'B'T의 결합으로 만든다. A'B'는 SELF와 똑같은 두 단계 구성을 약간 확장하여 — 입력 w를 보존하면서 — 자기 자신의 기술 ⟨R⟩을 테이프에 추가로 마련한다. 그런 뒤 T를 (⟨R⟩, w) 위에서 호출한다. 결국 R(w) = T(⟨R⟩, w)이다. ∎

회귀 정리의 미덕은 "괜히 만들어진 자기 참조" 같은 인상에도 불구하고 어디에서나 등장한다는 점이다. 이제 그 위력을 두 가지 응용으로 본다.

4. 응용 1 — ATM의 회귀 정리 증명

대각선 논법으로 ATM의 결정 불가능성을 보였던 기억이 있을 것이다. 이제 회귀 정리를 활용하면 같은 결과를 한층 직접적이고 짧게 얻을 수 있다.

정리 11.4. ATM은 결정 불가능하다.

증명 (회귀 정리 사용). 모순을 위해 ATM의 결정자 H가 존재한다고 가정하자. 회귀 정리에 의해, 자기 자신의 기술 ⟨D⟩에 접근 가능한 TM D를 다음과 같이 정의할 수 있다.

D = "입력 w에 대해 — H(⟨D⟩, w)를 실행한다. H가 수락하면 D는 거부, H가 거부하면 D는 수락한다."

이제 D를 자기 자신의 기술 ⟨D⟩ 위에서 실행한 결과를 따져보자.

  • D가 ⟨D⟩를 수락 ⇔ H(⟨D⟩, ⟨D⟩)가 거부 ⇔ D가 ⟨D⟩를 수락하지 않음.

이는 명백한 모순이다. 따라서 H는 존재하지 않는다. ∎

대각선 논법과 회귀 정리는 사실상 같은 동전의 양면이다. 대각선 논법이 "한 줄에 하나씩 위배되는 입력을 만든다"는 표 만들기 작업이라면, 회귀 정리는 "그 위배를 한 점에 압축한 자기 참조"이다. 둘은 동치이다.

5. 응용 2 — MINTM은 인식 가능하지 않다

회귀 정리는 결정 불가능성보다 한 단계 더 강한 결론도 즉시 준다. "최소 길이 TM"의 집합을 보자.

정의 11.5. ⟨M⟩이 최소(minimal)이라는 것은, L(M) = L(M')이고 |⟨M'⟩| < |⟨M⟩|인 다른 TM M'이 존재하지 않음을 의미한다. MINTM = { ⟨M⟩ : ⟨M⟩은 최소 }.

정리 11.6. MINTM은 튜링 인식 불가능하다.

증명 스케치. 모순을 위해 MINTM를 인식하는 열거자(enumerator) E가 존재한다고 가정하자. E는 MINTM의 원소를 차례로 출력한다(인식 가능 = 열거 가능). 이제 회귀 정리로 다음 TM C를 만든다.

C = "입력 w에 대해 — 자기 자신의 기술 ⟨C⟩를 얻는다. E를 가동하여 |⟨C⟩|보다 긴 기술 ⟨D⟩가 처음 출력될 때까지 기다린다. 그러면 D를 w 위에서 시뮬레이션하고 그 결과를 따라간다."

그런데 이렇게 만든 C에 대해 다음이 성립한다.

  • L(C) = L(D) (C가 D의 시뮬레이션을 그대로 따르므로).
  • |⟨C⟩| < |⟨D⟩| (E의 출력이 |⟨C⟩|보다 긴 것을 골라뒀으므로).

그런데 D는 E가 출력한 — 즉 최소라고 인증된 — 기계이다. 그런 D보다 더 짧은 C가 같은 언어를 인식한다는 것은 D가 최소라는 사실과 모순이다. 따라서 E는 존재하지 않는다. ∎

이 증명에서 회귀 정리가 한 일은 단 하나 — C가 자기 자신의 길이를 알 수 있게 해준 것이다. "내가 얼마나 긴지 모르는 기계"는 "나보다 긴 것을 기다리겠다"고 말할 수 없다. 자기 참조가 길이 비교를 가능하게 했고, 길이 비교가 모순을 만들었다.

6. 1차 논리와 산술의 결정 가능성

강의의 마지막 한 발을 더 내디뎌, 회귀 정리가 빛을 발하는 또 다른 무대 — 수리논리학의 결정 문제 — 를 살핀다.

정의 11.7 (구조와 이론). 구조(structure)는 영역(universe)과 그 위의 함수·관계 기호의 해석으로 이루어진 수학 대상이다. 자연수 위의 덧셈만 가진 구조 (ℕ, +)와 덧셈·곱셈을 모두 가진 (ℕ, +, ×)을 떠올리자. 한 구조 𝔄의 이론(theory) Th(𝔄)는 𝔄에서 참인 1차 논리 문장(sentence) 전체의 집합이다.

"이 문장이 자연수에서 참인가?"라는 질문은 매우 자연스러운 결정 문제이다. 그 답은 — 놀랍게도 — 어떤 연산 기호를 허용하느냐에 따라 극과 극으로 갈린다.

정리 11.8 (Presburger, 1929). Th(ℕ, +)는 결정 가능하다.

덧셈만 있는 자연수의 1차 논리는 — ∀, ∃, ∧, ∨, ¬와 = 만 결합한 임의의 문장이라도 — 알고리즘으로 참·거짓을 판정할 수 있다. 증명은 양화사 제거(quantifier elimination)에 의존한다 — 모든 문장을 양화사 없는 문장으로 동치 변환할 수 있고, 양화사 없는 문장은 산술 식의 단순 검사로 끝난다.

정리 11.9 (Gödel·Tarski). Th(ℕ, +, ×)는 결정 불가능하다.

증명 직관. 곱셈이 더해지는 순간 우리는 1차 논리 안에서 튜링 기계의 계산 — 사실상 임의의 알고리즘 — 을 인코딩할 수 있게 된다. 핵심은 다음과 같다. 자연수의 쌍 ⟨a, b⟩, 시퀀스 (a1, ..., ak)를 단일 자연수로 번호 매기는 — 괴델 번호화(Gödel numbering) — 가 덧셈과 곱셈만으로 표현 가능하다. 이 번호화 위에서 "x는 M의 w에 대한 수락 계산 이력이다"라는 술어를 1차 논리식으로 적을 수 있다. 따라서 M이 w를 수락하는가 — 즉 ATM의 원소인가 — 는 "∃x: x는 수락 이력이다"라는 (ℕ, +, ×)의 문장의 진위와 동치이다.

이제 ATMm Th(ℕ, +, ×) 환원이 완성되며, ATM의 결정 불가능성이 Th(ℕ, +, ×)로 그대로 전파된다. 회귀 정리는 보다 미묘한 곳에서 등장한다 — 괴델의 불완전성 정리에서 "이 문장은 증명 불가능하다"라는 자기 참조 문장을 만드는 데 사용되는 것이 정확히 우리의 SELF 보조정리의 산술 버전이다. ∎

덧셈만으로는 부족하지만 곱셈을 한 방울 더하는 순간 — 산술은 알고리즘의 모든 능력을 빨아들인다. 이 비대칭은 수학사의 가장 깊은 신비 중 하나이고, 괴델의 1931년 논문이 던진 충격의 본질이기도 하다. 학부 강의에서는 이 결과를 그저 풍문으로 듣게 되지만, 그 핵심 기계 장치는 이미 우리 손 안에 있다 — 환원, 계산 이력, 회귀 정리. 이 셋이 모이면 괴델의 정리가 보인다.

7. 마무리

강의 9에서 11까지의 흐름을 한 문장으로 요약하면, "결정 불가능성은 한 점에서 시작해 환원으로 퍼지고, 자기 참조에서 절정에 닿는다"이다. 콰인이라는 작은 장난감이 어떻게 괴델의 결과까지 끌어내는지 보았다. 다음 강의부터는 시선을 결정 가능한 영역으로 다시 돌려 — 결정 가능하지만 얼마나 효율적으로 결정 가능한가 — 라는 새로운 질문, 즉 복잡도 이론(complexity theory)으로 들어간다.

강의 12

시간 복잡도 — 결정 가능과 실용성 사이

우주의 나이만큼 걸리는 알고리즘은, 사실상 알고리즘이 아니다.

1. 결정 가능만으로는 부족하다

지난 강의들에서 우리는 어떤 언어가 결정 가능한지(decidable)를 끈질기게 따졌다. 그러나 결정 가능하다는 사실은 언젠가는 끝난다는 약속일 뿐, 그 끝이 다음 화요일인지 우주의 열사망 이후인지에 대해서는 한 마디도 하지 않는다. 이론적으로 풀 수 있다는 것과 실제로 답을 받아볼 수 있다는 것 사이에는 천지 차이가 있다.

예컨대 입력 길이 n에 대해 2n단계가 걸리는 알고리즘이 있다고 하자. n = 100이면 2100 ≈ 1030이다. 1나노초에 한 단계씩 처리한대도 약 1013년이 걸린다. 우주의 추정 나이가 1.4 × 1010년이니, 우주가 천 번쯤 다시 태어나는 동안 답을 기다려야 한다. 이런 알고리즘을 가지고 “문제가 풀린다”고 말하는 건 윤리적으로 곤란하다.

그래서 이번 강의부터는 자원(resource), 그중에서도 시간이라는 자원을 정량적으로 다룬다. 핵심 질문은 단순하다. 입력이 커질 때 실행 시간이 얼마나 빨리 자라는가?

“실행 시간이 입력에 비례한다”는 말은 충분히 모호하다. 어떤 모델에서, 어떤 입력 크기 척도로, 어떤 점근적 의미로 비례한다는 것인가? 이 강의에서는 이 모호함을 하나씩 정확히 잠가 둔다.

2. 점근 표기법: 빅-O와 그 친척들

알고리즘의 실행 시간을 정확한 단계 수로 비교하는 일은 헛수고에 가깝다. 컴파일러, 기계, 테이프 알파벳에 따라 상수 배수는 얼마든지 달라지기 때문이다. 우리가 신경 쓰는 것은 큰 입력에서의 성장률이다. 그래서 점근 표기(asymptotic notation)가 등장한다.

정의 12.1 (빅-O). 함수 f, g: ℕ → ℝ≥0에 대해, f(n) = O(g(n))이라는 것은 어떤 양의 상수 c와 자연수 n0가 존재하여 모든 n ≥ n0에 대해 f(n) ≤ c · g(n)인 것이다. 즉 “f는 충분히 큰 n에서 g의 상수배 이하”이다.
정의 12.2 (작은-o). f(n) = o(g(n))이란 limn→∞ f(n)/g(n) = 0이라는 것이다. f가 g보다 엄격히 느리게 자란다.
정의 12.3 (빅-Ω). f(n) = Ω(g(n))은 g(n) = O(f(n))과 같은 말. 하한이다.
정의 12.4 (빅-Θ). f(n) = Θ(g(n))은 f = O(g)이면서 동시에 f = Ω(g)인 경우. 같은 차수다.

예를 들어 3n3 + 5n + 12 = O(n3) = Θ(n3)이다. n log n = o(n2)이지만 n log n ≠ O(n)이다. 점근 표기에서 로그의 밑은 보통 표시하지 않는다 — 밑이 바뀌면 상수 배수만 달라지므로 빅-O 안에서는 차이가 사라진다.

예 12.5. f(n) = ⌈n/2⌉, g(n) = n이라 하자. 모든 n ≥ 1에 대해 f(n) ≤ n이므로 f = O(n). 반대로 f(n) ≥ n/2 = (1/2)g(n)이므로 f = Ω(n). 따라서 f = Θ(n)이다. 절반을 자르거나 두 배로 늘리는 것은 점근적으로 “같은 일”이다.

3. TIME 클래스와 P

점근 표기를 무기로 들고 시간 복잡도 클래스를 정의한다. 모델은 일단 결정적 단일 테이프 튜링 기계(deterministic single-tape Turing machine)로 못 박는다.

정의 12.6 (실행 시간). 결정적 TM M이 모든 길이 n의 입력에 대해 정확히 t(n)단계 안에 멈춘다면, M의 실행 시간(running time)이 t(n)이라고 한다.
정의 12.7 (TIME 클래스). 자연수 위 함수 t(n)에 대해, TIME(t(n)) = { L | 어떤 결정적 TM이 L을 O(t(n)) 시간에 결정한다 }.
정의 12.8 (다항식 시간 클래스 P). P = ⋃k ≥ 1 TIME(nk). 즉 P는 어떤 상수 k에 대해 O(nk) 시간에 결정 가능한 언어들의 모임이다.

P가 대단해 보이는 이유는 단순하다. n2, n3, 심지어 n100도 모두 P 안에 있다. 학부생이 보기에 n100은 끔찍해 보이지만, 이 코스의 관점에서는 “문제는 풀렸다”의 카테고리에 들어간다. 다항식 시간이 곧 “합리적”이라는 약속은 다소 과감하지만, 후술하듯 모델 변경에 강건한(robust) 정의이기 때문에 경계선으로 채택된다.

4. 단일 테이프와 다중 테이프 — 시간의 환율

여기서 자연스러운 의심이 든다. 다중 테이프 TM은 단일 테이프보다 일을 훨씬 효율적으로 한다. 그러면 P의 정의가 모델 선택에 휘둘리는 것 아닌가?

정리 12.9 (시뮬레이션 비용). t(n) ≥ n인 다중 테이프 TM의 모든 t(n) 시간 계산은 동치인 단일 테이프 TM에서 O(t(n)2) 시간 안에 시뮬레이션할 수 있다.
증명 스케치. 다중 테이프의 k개 테이프 내용을 단일 테이프 위에 구분자로 나란히 적어 둔다. 각 테이프의 헤드 위치는 해당 칸 위에 점을 찍어 표시한다. 다중 테이프의 한 단계를 시뮬레이션하려면, 단일 테이프 위를 처음부터 끝까지 한 번 훑어 모든 헤드 위치의 기호를 읽고, 다시 한 번 훑어 갱신한다. 한 번의 훑기는 현재 사용 중인 테이프 길이 — 최대 O(t(n)) — 만큼 걸린다. 다중 테이프의 t(n)단계 시뮬레이션은 O(t(n)) × t(n) = O(t(n)2)단계가 든다. 갱신할 때 칸이 부족하면 뒤 칸들을 한 칸씩 밀어내는데, 이 비용 또한 O(t(n))으로 합산되어 차수를 바꾸지 않는다. ∎

핵심 결과: 다중 테이프에서 다항 시간이면, 단일 테이프에서도 다항 시간이다(차수만 두 배 정도 커진다). 그래서 P의 정의는 테이프 개수에 무관하다. P는 모델의 미세한 차이에 흔들리지 않는, 묵직한 클래스다.

5. 다항식 동치성 — 어떤 모델이든 P는 P

이 강건함은 단지 테이프 개수에 그치지 않는다. 합리적인 모든 결정적 계산 모델은 서로 다항식 시간 동치(polynomial-time equivalent)이다. 즉 한 모델에서 t(n) 시간에 풀리면, 다른 모델에서 t(n)c 시간 안에 풀린다(c는 상수).

합리적이지 않은 모델? 예컨대 비결정적 모델이나, 한 단계에 무한 비트를 비교하는 가상 모델은 이 동치성에서 빠진다. 비결정성은 다음 강의의 NP 정의에서 등장한다.

대표적인 합리적 모델들:

  • 다중 테이프 TM — 단일 테이프와 다항식 동치 (위 정리).
  • RAM(랜덤 접근 기계) — C 언어 비슷한 모델. TM과 다항식 동치이며, 이 덕분에 “알고리즘 책의 의사 코드”와 “TM 정의”가 같은 P를 묘사한다.
  • 람다 계산(λ-calculus) — 함수 언어의 수학적 토대. 여전히 다항식 동치(단, 평가 전략에 따라 자세한 차수는 달라진다).
  • 2차원 테이프 TM, 셔블 TM, 큐 기계 — 모두 다항식 동치.

이 동치성은 표면적으로는 코딩 연습처럼 보이지만, 그 결과는 묵직하다. 다항식 시간이라는 개념은 모델에 의존하지 않는 수학적 대상이다. 양자 모델까지 포함하면 이야기가 달라지지만, 고전 결정적 모델 안에서는 이 동치성이 P를 진정한 “자연 클래스”로 만든다.

6. P 안에 사는 친구들

구체적인 예를 셋 보자. 모두 P에 속함을 알고리즘으로 보인다.

예 12.10 (PATH). PATH = { ⟨G, s, t⟩ | G는 방향 그래프이고 s에서 t로 가는 경로가 존재한다 }. 결정 알고리즘은 너비 우선 탐색(BFS): s에서 시작해 도달 가능한 정점을 차례로 마킹한다. 정점이 새로 마킹될 때마다 그 이웃을 큐에 넣는다. t가 마킹되면 수락, 큐가 비면 거부. 각 간선은 상수 번 검사되므로 시간은 O(|V| + |E|) — 충분히 다항이다. 따라서 PATH ∈ P.
예 12.11 (RELPRIME). RELPRIME = { ⟨a, b⟩ | a와 b는 서로소 }. 유클리드 알고리즘은 gcd(a, b) = gcd(b, a mod b)를 반복한다. 한 단계마다 작은 수가 적어도 절반 이하로 줄어든다는 사실(피보나치 수열의 마술)을 보이면, 단계 수는 O(log min(a, b))이다. 입력 길이 n은 a와 b의 비트 수의 합이므로, 단계 수는 O(n)이고, 각 단계의 나머지 연산도 다항. 따라서 RELPRIME ∈ P.
예 12.12 (CFL 인식). 임의의 문맥 자유 언어 L에 대해 L ∈ P이다. 증명 스케치: L의 문법을 촘스키 표준형(CNF)으로 변환한 뒤, CYK 동적 계획법을 돌린다. 길이 n 입력 w의 모든 부분 문자열 w[i..j]에 대해 그것을 유도할 수 있는 변수 집합을 표 한 칸에 채운다. 부분 문자열은 O(n2)개이고, 각 칸을 채우려면 분할점 j − i + 1가지를 보아야 하므로 총 시간은 O(n3)이다. 그러므로 모든 CFL은 P에 속한다.

세 예의 공통점은 단순하다. 알고리즘이 입력 크기에 대해 다항 차수 안에 끝나면 P. 우리가 “알고리즘”이라고 부를 때 흔히 떠올리는 것이 사실 P를 슬쩍 가리키고 있던 셈이다.

7. P는 “합리적 시간 안에 풀리는” 문제

실용적 명제(thesis)로서, P는 다음과 같이 받아들여진다.

실용 명제 (코브햄–에드몬즈). 합리적 결정적 계산 모델에서 P는 “현실적으로 풀 수 있는” 문제 클래스와 거의 일치한다.

이 명제는 정리가 아니다. n100은 다항식이지만 현실적이지 않고, 1.0001n은 지수지만 작은 입력에서는 빠르다. 그럼에도 이 등식이 50년 넘게 살아남은 데는 두 가지 이유가 있다. 첫째, P 안의 자연 문제들은 거의 예외 없이 작은 차수의 다항식 알고리즘을 가진다 — n100는 인공적이다. 둘째, P 바깥인 문제들은 반대로 비현실적인 시간을 요구하는 경우가 압도적이다. 경계선의 좌우는 실제로 잘 갈라져 있다.

그래서 우리는 다음 강의로 자연스레 넘어간다. P 바깥에 무엇이 있는가? 결정 가능하지만 다항 시간이 아닌 듯한 문제 — 만족 가능성, 클리크, 해밀턴 경로 — 가 줄지어 등장한다. 이들을 묶는 클래스가 NP이며, NP의 본성을 묻는 P = NP? 질문이 다음 강의의 무대를 연다.

강의 14

P, NP, SAT, 그리고 다항식 시간 환원

답을 찾는 일과 답을 검증하는 일, 그 사이에 천만 달러가 걸려 있다.

1. 다시, 답을 ‘검증’한다는 것

주어진 부울 식 ϕ에 대해 “ϕ는 만족 가능한가?”를 물으면 직관적으로 어렵다. 변수 n개라면 2n가지 대입을 다 시험해 보는 게 가장 단순한 방법이고, 더 영리한 방법이 있는지는 — 솔직히 말해 — 아무도 모른다. 그러나 누군가가 “이 변수 대입이 ϕ를 만족시킨다”고 알려준다면 우리는 그 주장을 빠르게 확인할 수 있다. ϕ에 대입을 꽂고 평가하면 끝이다.

이 비대칭이 NP의 본질이다. NP는 답을 찾는 클래스가 아니라 답을 검증하는 클래스다.

비유하자면 P는 “스스로 수학 문제를 푸는 학생”, NP는 “해답지를 받았을 때 그것이 옳은지 빠르게 채점하는 조교”의 클래스다. 풀이가 어렵다고 채점까지 어려우란 법은 없다.

2. NP의 두 정의

NP는 두 가지 방식으로 정의된다. 다행히 둘은 동치다.

정의 14.1 (비결정적 시간). 비결정적 TM(NTM)이 모든 길이 n 입력에 대해 어떤 계산 분기에서든 t(n)단계 안에 멈춘다면, 그 NTM의 실행 시간은 t(n)이다. 클래스 NTIME(t(n))은 어떤 NTM이 O(t(n)) 시간에 결정하는 언어들의 모임이다. NP1 = ⋃k ≥ 1 NTIME(nk).
정의 14.2 (인증서·검증기). 언어 A가 NP2에 속한다는 것은, 다음을 만족하는 결정적 다항 시간 TM V(검증기, verifier)가 존재한다는 것이다: w ∈ A ⟺ 어떤 c, |c| ≤ p(|w|), V는 ⟨w, c⟩를 수락한다. 여기서 c는 인증서(certificate) 또는 증명서다.
정리 14.3. NP1 = NP2.
증명 스케치. (⊇) V가 다항 시간 검증기라면, NTM N은 입력 w에 대해 길이 ≤ p(|w|)의 인증서 c를 비결정적으로 추측한 뒤 V(w, c)를 시뮬레이션한다. V가 수락하면 N도 수락. 각 분기는 다항 시간이므로 N은 NP1 안에 있다.
(⊆) NTM N이 w를 수락한다면, 수락 분기를 따라 내려가는 비결정 선택의 수열이 존재한다. 그 수열을 인증서 c로 삼는다. 검증기 V는 ⟨w, c⟩를 받아 c가 지시하는 선택대로 N을 시뮬레이션하고 수락 여부를 따라간다. 분기가 다항 깊이이므로 인증서도 다항 길이, 검증도 다항 시간이다. ∎

이후로 그냥 NP라고 부른다. 핵심은 표어처럼 적힌다. NP = 다항 길이의 증명서가 존재하면 다항 시간에 검증할 수 있는 문제들.

3. NP 거주민들 — 인증서를 보면 안다

다음 문제들이 NP에 속함을 일일이 인증서로 확인하자. 각 인증서는 직관적이다.

SAT. 부울 식 ϕ가 어떤 변수 대입에 의해 참이 되는가? 인증서는 만족시키는 변수 대입 자체. 검증은 ϕ에 대입을 꽂고 평가 — 다항 시간.
3SAT. SAT의 특수 형태로, ϕ가 절(clause)당 정확히 3개의 리터럴을 가지는 CNF 형태. 인증서·검증은 SAT와 같다.
CLIQUE. ⟨G, k⟩에 대해 G에 크기 k의 완전 부분 그래프가 있는가? 인증서는 그 k개의 정점 집합. 검증은 모든 쌍이 간선인지 확인 — O(k2) 시간.
INDEPENDENT-SET. ⟨G, k⟩에 대해 서로 인접하지 않은 k개의 정점이 있는가? 인증서는 그 정점 집합. 검증은 어떤 쌍도 간선이 아닌지 확인.
VERTEX-COVER. ⟨G, k⟩에 대해 모든 간선의 양 끝 중 적어도 하나를 덮는 k개의 정점이 있는가? 인증서는 그 정점 집합.
HAMPATH. ⟨G, s, t⟩에서 s를 출발해 모든 정점을 정확히 한 번씩 방문하고 t에서 끝나는 경로가 있는가? 인증서는 그 정점 순서.
SUBSET-SUM. ⟨{x1, …, xn}, t⟩에 대해 부분 집합의 합이 정확히 t인가? 인증서는 그 부분 집합.

일곱 문제 모두 검증은 누가 봐도 다항 시간이다. 그러나 답을 찾는 다항 알고리즘은 — 50년 동안 — 아무도 발견하지 못했다.

4. P ⊆ NP, 그리고 천만 달러

P에 속하는 언어 A에 대해, 검증기 V는 인증서를 무시하고 그냥 결정 알고리즘을 돌리면 된다. 즉 P ⊆ NP는 자명하다.

정리 14.4. P ⊆ NP.

그렇다면 반대 방향, NP ⊆ P? 풀어 쓰면 “답을 빠르게 검증할 수 있다면 답도 빠르게 찾을 수 있는가?” 이것이 P 대 NP 문제이고, 클레이 수학 연구소의 밀레니엄 문제 일곱 중 하나로 백만 달러가 걸려 있다. 대다수 컴퓨터 과학자는 P ≠ NP를 믿는다. 그 이유는 이론적이라기보다 경험적이다 — 수십 년간 수만 명이 NP의 자연 문제 수천 개에 다항 알고리즘을 못 찾았으니까.

만약 P = NP가 증명된다면, 현대 암호 체계의 절반 이상이 일주일 안에 무너진다. 이론가들이 이 등식의 진실성을 의심하는 데에는 “세상이 저렇게 친절할 리 없다”는 생활 감각도 한몫한다.

5. 다항 시간 매핑 환원

NP 안에서 어떤 문제가 다른 문제보다 “적어도 같은 만큼 어렵다”는 것을 어떻게 표현하나? 답은 환원(reduction)이다. 결정 가능성의 환원은 사상 환원(mapping reduction)이었는데, 여기서는 그 환원이 다항 시간 안에 계산되어야 한다.

정의 14.5 (다항 시간 매핑 환원). 언어 A에서 B로의 다항 시간 매핑 환원(polynomial-time mapping reduction)이란 다항 시간에 계산되는 함수 f: Σ* → Σ*가 존재하여 모든 w에 대해 w ∈ A ⟺ f(w) ∈ B 이 성립하는 것을 말한다. 이때 A ≤p B라 쓴다.
정리 14.6. A ≤p B 이고 B ∈ P 이면 A ∈ P.
f가 A에서 B로의 다항 시간 환원이고 M이 B의 다항 시간 결정기라 하자. A의 결정기 M′은 입력 w에 대해 f(w)를 계산한 뒤 M(f(w))를 돌려 그 결과를 출력한다. f의 계산 시간이 다항이므로 |f(w)| 또한 입력 길이의 다항이다. M의 시간은 |f(w)|의 다항이므로 합성한 M′의 시간도 |w|의 다항이다. 즉 A ∈ P. ∎

대우를 취하면 더 유용한 형태가 된다. A ≤p B 이고 A ∉ P 이면 B ∉ P. 즉 환원은 어려움을 “옮긴다” — 쉬운 문제로 줄어드는 어려운 문제는 사실 어렵지 않았다는 모순이 생기므로, 어려움이 환원의 목표 쪽으로 흘러간다.

같은 논리는 NP에도 적용된다 — A ≤p B이고 B ∈ NP이면 A ∈ NP. 환원은 P, NP 모두를 보존한다.

6. 환원 실전: 3SAT ≤p CLIQUE

이론은 충분하니 사례 하나를 구체적으로. 3SAT 인스턴스를 CLIQUE 인스턴스로 다항 시간 안에 변환할 수 있고, 변환 결과의 답이 곧 원본의 답이 되는 사상을 만들겠다.

정리 14.7. 3SAT ≤p CLIQUE.
입력은 k개의 절을 가진 3CNF 식 ϕ = (a1 ∨ b1 ∨ c1) ∧ … ∧ (ak ∨ bk ∨ ck). 각 ai, bi, ci는 리터럴(변수 또는 그 부정)이다.

변환 함수 f가 출력하는 그래프 G와 정수 k는 다음과 같다. 그래프의 정점은 ϕ의 모든 리터럴 자리(literal occurrence) 하나당 한 개씩 — 따라서 정확히 3k개. 정점들은 각 절에 해당하는 그룹(triple)으로 묶인다. 같은 그룹 안의 정점끼리는 간선을 두지 않는다. 다른 그룹의 두 정점 사이에는, 두 리터럴이 서로의 부정이 아니라면 간선을 둔다(즉 모순되지 않는 한 연결).

이제 ϕ가 만족 가능 ⟺ G에 크기 k의 클리크가 있음을 보인다.

(⇒) ϕ가 만족 가능하면 만족시키는 대입이 있다. 각 절은 적어도 하나의 참 리터럴을 가지므로, 절마다 참 리터럴 하나씩을 골라 그 정점 k개를 모은다. 같은 변수의 모순된 리터럴(예: x와 ¬x)이 동시에 참일 수는 없으므로 이 k개 정점 사이에는 모두 간선이 있다. 따라서 k-클리크.

(⇐) G에 크기 k의 클리크가 있다고 하자. 같은 그룹 안에는 간선이 없으므로 클리크의 k개 정점은 서로 다른 절에서 하나씩 나와야 한다. 또 클리크 안의 두 리터럴은 모순되지 않으므로 일관된 변수 대입이 가능하다 — 클리크에 등장하는 리터럴을 모두 참으로 두고, 나머지 변수는 임의로 둔다. 각 절에서 클리크에 속한 리터럴이 참이 되었으므로 ϕ가 만족된다.

f의 계산 시간은 정점 3k개와 그래프 간선 O(k2)개를 적는 것뿐이라 다항이다. 결론. ∎

이 환원의 매력은 단순함이다 — 절 → 그룹, 모순 없음 → 간선, 만족 가능성 → 클리크. 어려움이 옷만 갈아입었을 뿐 사라지지 않았다는 사실을, 그래프라는 옷에 비추어 다시 본 셈이다.

그렇다면 자연스러운 질문. 어떤 NP 문제든 SAT로 환원할 수 있는가? 그리고 SAT에서 출발해 다른 모든 NP 문제로도 환원할 수 있는가? 이 질문의 답이 “그렇다”라면, 단 하나의 문제만 P에 들어가도 NP 전체가 P에 빨려 들어간다. 이 경계선상의 문제들이 NP-완전이고, 다음 강의의 주인공이다.

강의 15

NP-완전성 — 어려움의 가장 단단한 핵

문제 하나가 무너지면 모두가 무너진다. 그것이 완전(complete)이라는 단어의 무게다.

1. NP-난해와 NP-완전

지난 강의에서 우리는 다항 시간 환원 ≤p를 정의했다. 이 환원은 어려움을 화살표 방향으로 흘려보낸다 — A ≤p B는 “B가 적어도 A만큼 어렵다”는 뜻이다. 이 흐름의 종착점에 서 있는 문제들이 있다.

정의 15.1 (NP-난해). 언어 B가 NP-난해(NP-hard)라는 것은 모든 A ∈ NP에 대해 A ≤p B가 성립한다는 것이다. 즉 B는 NP의 어떤 문제보다도 적어도 같은 만큼 어렵다.
정의 15.2 (NP-완전). 언어 B가 NP-완전(NP-complete)이라는 것은 다음 두 조건을 모두 만족하는 것이다:
  1. B ∈ NP.
  2. B는 NP-난해.

NP-완전 문제는 NP의 “꼭대기”에 박힌 못이다. NP 안에 있으면서도 NP의 어떤 문제든 자기 위로 환원받는다. 비유하자면, 한 클래스의 학생들 중 모든 시험 범위를 자기 머릿속에 다 들고 있는 학생이다 — 다른 누구의 시험 답안도 자기를 통해 풀린다.

2. 한 문제가 무너지면 모두가 무너진다

정리 15.3. B가 NP-완전이고 B ∈ P이면, P = NP.
B가 NP-난해이므로 임의의 A ∈ NP에 대해 A ≤p B. 그리고 B ∈ P. 지난 강의의 정리에 의해 A ∈ P. A는 NP의 임의의 원소였으므로 NP ⊆ P. 반대 방향 P ⊆ NP는 자명하므로 P = NP. ∎

이 정리는 NP-완전 문제가 가지는 무게를 한마디로 요약한다. SAT, CLIQUE, HAMPATH 중 어느 하나라도 다항 알고리즘이 발견되면 우리가 아는 “어려운” 문제 수천 개가 한꺼번에 풀린다. 반대로 NP-완전 문제 하나에 대해 다항 시간 하한이 증명된다면 P ≠ NP가 풀린다. 천만 달러는 이 단 하나의 문턱에 걸려 있다.

그래서 알고리즘 설계자들은 어떤 새 문제를 만나면 가장 먼저 그것이 NP-완전인지 의심한다. 만약 NP-완전이면 다항 알고리즘 시도는 잠시 접고, 근사 알고리즘이나 휴리스틱으로 발걸음을 돌리는 게 합리적이다.

3. 환원의 동물원

NP-완전 문제 하나가 일단 박히면, 거기서 다른 문제로 환원시키는 것만으로 새로운 NP-완전 문제가 줄지어 등장한다. 다섯 가지 대표 환원을 둘러본다. 모든 환원은 다항 시간이다.

3.1 3SAT ≤p CLIQUE — 절을 그룹으로

지난 강의의 복습. 3CNF 식 ϕ에서 절 k개에 대해 그래프 G를 만든다. 각 절의 세 리터럴 자리 하나하나가 정점이 된다. 같은 절의 정점끼리는 간선을 두지 않고, 서로 다른 절의 정점 사이에는 두 리터럴이 모순(예: x와 ¬x)이 아닐 때만 간선을 둔다. ϕ가 만족 가능 ⟺ G에 k-클리크 존재. 만족시키는 대입이 절마다 한 리터럴을 참으로 만들고, 그 리터럴 정점들이 일관성 덕에 모두 연결되어 클리크가 된다.

3.2 CLIQUE ≤p VERTEX-COVER — 보색의 마술

입력 ⟨G, k⟩를 ⟨G̅, n − k⟩로 보낸다. 여기서 G̅는 G의 보색 그래프(같은 정점 집합, G에서 간선이 아니던 쌍이 G̅의 간선)이고 n = |V|.

정확성 스케치. G에 정점 부분 집합 S(|S| = k)가 있을 때, S가 G의 클리크 ⟺ S 안의 모든 쌍이 G의 간선 ⟺ S 안의 어떤 쌍도 G̅의 간선이 아님 ⟺ V ∖ S가 G̅의 모든 간선을 덮는다(왜냐하면 G̅의 간선은 양 끝 중 적어도 하나가 V ∖ S에 있어야만 가능하므로) ⟺ V ∖ S는 G̅의 정점 덮개. |V ∖ S| = n − k. 따라서 G의 k-클리크 ⟺ G̅의 (n − k)-덮개. ∎

한 줄짜리 마술처럼 보이지만, 그 안에는 “덮지 못함”과 “이웃 아님”이 보색에서 정확히 맞물린다는 조합론적 사실이 들어 있다.

3.3 3SAT ≤p HAMPATH — 다이아몬드와 절 노드

이 환원은 가장 정교하다. 3CNF 식 ϕ가 변수 x1, …, xn과 절 c1, …, cm를 가진다고 하자. 그래프 G는 변수마다 “다이아몬드(diamond)”라 부르는 사다리 모양 가젯을 두고, 절마다 절 노드(clause node) 하나를 둔다.

구성 스케치. 각 다이아몬드는 양쪽 끝에 한 정점씩, 가운데에 m × 2 + 3 정도의 칸이 늘어선 “두 줄 사다리”다. 다이아몬드 안을 통과하는 해밀턴 경로는 두 방향(왼쪽→오른쪽 또는 오른쪽→왼쪽) 중 하나로만 진행할 수 있는데, 이 두 방향이 변수의 두 진리값에 대응한다.

각 절 cj의 노드는, cj에 등장하는 리터럴마다 해당 변수 다이아몬드의 적절한 위치와 연결된다. xi가 cj에 양의 리터럴로 나타나면, xi의 다이아몬드가 “참” 방향으로 통과될 때만 cj 노드를 잠시 들렀다 돌아올 수 있도록 간선을 단다. 부정 리터럴이면 “거짓” 방향에서 들를 수 있게 한다.

해밀턴 경로는 모든 다이아몬드를 어떤 방향으로 통과해야 하고(변수 대입을 결정), 각 절 노드를 정확히 한 번씩 방문해야 한다(각 절이 만족됨). 따라서 ϕ가 만족 가능 ⟺ G에 s에서 t로의 해밀턴 경로 존재. ∎

3.4 HAMPATH ≤p UHAMPATH — 방향을 무방향으로

UHAMPATH는 무방향 그래프에서의 해밀턴 경로 문제다. 방향 그래프 G의 각 정점 v를 세 정점 vin, vmid, vout으로 분해해 무방향 그래프 G′를 만든다.

구성 스케치. 무방향 간선 (vin, vmid)와 (vmid, vout)를 둔다. G에서 (u, v)가 방향 간선이면, G′에서 무방향 간선 (uout, vin)을 둔다. 출발점 s는 sout로, 도착점 t는 tin으로 매핑한다(또는 in/out 구분 보조 정점 추가).

G′에서 해밀턴 경로는 어떤 정점 v에 들어가더라도 vin → vmid → vout 순서로만 통과할 수 있다 — vmid의 이웃이 vin과 vout 둘뿐이므로. 따라서 무방향 경로는 사실상 G의 방향 간선을 따라가는 경로와 일대일 대응한다. ∎

“in / mid / out” 분해는 무방향성에서 사라진 방향 정보를 토폴로지로 살려내는 영리한 트릭이다. vmid는 양옆을 한 번씩만 사용해야 하므로 사실상 화살표 역할을 한다.

3.5 3SAT ≤p SUBSET-SUM — 자릿수의 분리 마술

SUBSET-SUM의 NP-완전성은 부울 논리에서 산수로의 점프라 특히 인상적이다. 3CNF 식 ϕ에 변수 n개, 절 m개가 있다고 하자. (n + m)자리 십진수들의 집합을 만들어 합 목표 t를 정한다.

구성 스케치. 자릿수는 두 부분으로 나뉜다. 왼쪽 n자리는 변수 x1, …, xn에 하나씩, 오른쪽 m자리는 절 c1, …, cm에 하나씩. 변수 xi마다 두 수 yi(xi = 참)와 zi(xi = 거짓)를 만든다. yi는 변수 자릿수 xi 위치에 1, xi가 양의 리터럴로 들어 있는 절 자릿수에 1을 두고, 나머지는 0. zi는 대칭적으로 xi 자릿수에 1, ¬xi가 들어 있는 절 자릿수에 1.

추가로 각 절 cj에 “보충(slack)” 두 수 gj, hj를 두는데, 둘 다 cj 자릿수에만 1과 2를 둔다(또는 1을 두 개). 목표 합 t는 변수 자릿수에 모두 1, 절 자릿수에 모두 3.

자릿올림이 발생하지 않도록 자릿수 사이 간격을 충분히 두는 것이 핵심이다(변수당 최대 합이 한 자리 안에 머무르도록). 그러면 부분 집합 합이 t를 만들기 위해 각 변수에 대해 yi나 zi 중 정확히 하나를 골라야 하고(변수 자릿수에서 1을 채워야 하니까), 그 선택이 변수 대입에 대응한다. 절 자릿수의 3을 채우려면 그 절을 만족하는 리터럴이 적어도 하나 필요하다(보충 두 수가 최대 2까지 채워주므로 리터럴에서 적어도 1은 와야 한다). 따라서 ϕ가 만족 가능 ⟺ 합 t를 만드는 부분 집합 존재. ∎

자릿수가 곧 채널이다 — 변수와 절을 서로 다른 자릿수에 가두어 두면, 자릿올림 없는 산술이 곧 부울 논리의 진리값 책정과 절 만족 검사를 동시에 수행한다. 부울에서 산수로의 다리이자, NP-완전성이 얼마나 침투력 강한지를 보여주는 사례다.

4. 동물원이 폭발적으로 자라는 이유

NP-완전 문제는 카프(R. Karp)의 1972년 목록에서 출발해 21세기에는 수만 개에 이른다. 왜 이렇게 빠르게 늘어나는가? 이유는 환원의 추이성(transitivity)이다.

정리 15.4 (≤p의 추이성). A ≤p B 이고 B ≤p C 이면 A ≤p C.

증명은 두 다항 환원 함수의 합성이 다시 다항이라는 사실에서 곧장 따라온다. 결과적으로 어떤 새 문제 X가 NP에 속하고 NP-완전이라 알려진 문제 B에 대해 B ≤p X라는 환원만 보이면, X 또한 NP-완전이다 — 임의의 A ∈ NP에 대해 A ≤p B ≤p X이기 때문이다.

그래서 SAT 하나가 NP-완전이라고 증명된 다음(쿡-레빈 정리, 다음 강의), 그로부터 3SAT, CLIQUE, VERTEX-COVER, INDEPENDENT-SET, HAMPATH, UHAMPATH, SUBSET-SUM, KNAPSACK, GRAPH-COLORING, SET-COVER, BIN-PACKING, … 줄줄이 사탕이 풀린다. 첫 번째 도미노만 쓰러뜨리면 나머지는 거저였다.

이것이 NP-완전성이 알고리즘 설계자에게 주는 “나쁜 소식의 좋은 면”이다. 어떤 새 문제가 어려워 보이면, 그것을 직접 다항 시간으로 풀려 애쓰지 말고 알려진 NP-완전 문제로부터 환원이 가능한지 살핀다. 환원이 성공하면 그 문제는 NP-완전이고, 적어도 “괜히 시간 낭비한 게 아니었다”는 면죄부를 얻는다.

5. 다음으로 — 첫 번째 도미노

지금까지 우리는 NP-완전 문제 하나만 손에 들어오면 환원으로 무한정 늘릴 수 있다는 사실을 보였다. 그러나 “첫 번째” NP-완전 문제는 어떻게 만들어졌는가? 그것은 환원의 사슬을 출발시킬 단단한 첫 발걸음이어야 한다.

1971년 스티븐 쿡(Stephen Cook), 그리고 거의 동시에 레오니드 레빈(Leonid Levin)이 같은 결과를 독립적으로 증명했다. SAT은 NP-완전이다. 즉, NP에 속한 임의의 언어가 SAT으로 다항 시간에 환원된다. 이 정리는 NP에 속한 언어의 정의 — 다항 시간 비결정 TM이 수락한다는 것 — 자체를 부울 식으로 “인코딩”함으로써 증명된다.

다음 강의는 이 인코딩의 디테일을 다룬다. 비결정 TM의 계산을 일종의 표(tableau)로 그리고, 그 표가 “수락하는 합법적 계산”이라는 사실을 한 줄짜리 거대한 부울 식으로 옮겨 적는 작업. 그것이 바로 NP-완전성 이론 전체의 첫 도미노다.

강의 16

쿡-레빈 정리 — SAT가 NP-완전이 되는 이유

계산 이력을 부울 수식으로 옮겨 적으면, 모든 NP 문제는 결국 한 장의 진리표 위에 놓인다.

1. 출발점: 왜 하필 SAT인가

NP-완전성이라는 개념을 처음 정의했을 때 한 가지 의문이 따라붙는다. NP-완전 문제가 정말 존재하긴 하는가? 정의상 그것은 NP에 속하면서, NP의 모든 문제가 자기 자신으로 다항 시간 환원되는 거대한 자석 같은 문제다. 누군가가 그 자석을 한 번이라도 만들어 보여 주지 않는다면, 클래스의 정의는 공허할 수도 있다.

1971년 스티븐 쿡과 1973년 레오니드 레빈이 독립적으로 이 자석을 직접 손에 쥐여 주었다. 그 자석의 이름이 바로 SAT(boolean satisfiability problem, 부울식 충족성 문제)이다. SAT는 변수들의 논리식이 주어졌을 때 그 식을 참으로 만드는 할당이 존재하는지를 묻는 결정 문제다. 결과는 충격적으로 단순하면서도 깊다.

정리 (쿡-레빈, Cook 1971; Levin 1973). SAT는 NP-완전이다. 즉
  1. SAT ∈ NP, 그리고
  2. 모든 A ∈ NP에 대해 A ≤p SAT.

(1)은 거의 자명하다. 식 φ가 주어지고 누군가 만족 할당 τ를 인증서로 건네주면, τ를 φ에 대입해 결과가 참인지 다항 시간에 확인하면 된다. 검증자는 한 줄 평가기 그 이상도 이하도 아니다. 흥미로운 부분은 (2)다. 임의의 NP 언어 A를 SAT로 환원해야 한다 — 그것도 A의 정의에 대해 거의 아무것도 모르는 채로 말이다.

2. 환원의 골격: 계산 이력을 식으로

A가 NP 언어라 하자. 정의에 의해 A를 결정하는 비결정적 튜링 기계(NTM) N과 다항식 t(n)이 존재해서, 입력 w(길이 n)에 대해 N은 t(n) 단계 안에 어떤 비결정 분기를 따라 수락 여부를 끝낸다. 우리가 만들 환원은 다음 한 줄로 요약된다.

핵심 발상. 입력 w를 받아 부울식 φw를 출력한다. φw가 충족 가능 ⟺ N이 w를 수락하는 어떤 계산 이력이 존재 ⟺ w ∈ A.

다시 말해 φw의 만족 할당이란 곧 "N이 w를 어떻게 받아들이는가"의 청사진이다. 변수는 청사진의 각 칸이고, 절(clause)은 그 청사진이 진짜 N의 동작 규칙을 따르는 합법적 이력임을 강제한다.

3. 표(tableau) 그리기

이제 실제로 청사진의 종이를 펼쳐 보자. 입력 길이가 n일 때 t(n)을 그저 t로 줄여 적는다. 우리는 가로 t칸, 세로 t칸짜리 격자(tableau)를 그린다. 행 인덱스 i는 시간(0행이 초기, t-1행이 종료), 열 인덱스 j는 테이프 위치다. 각 칸 ⟨i, j⟩에 들어갈 내용은 다음 두 가지 중 하나다.

  • 테이프 기호 s ∈ Γ — 그 시각 그 위치의 글자
  • (상태, 기호) 쌍 — 헤드가 그 위치에 있고 상태가 q일 때, 칸에는 ⟨q, s⟩처럼 합쳐 쓴다

한 행을 좌에서 우로 읽으면 한 시각의 전체 구성(configuration)이 된다. 행이 하나씩 아래로 내려간다는 것은 N이 한 단계 움직였다는 뜻이다.

              j=0   j=1   j=2   j=3   ...   j=t-1
       i=0 |  q0,w1 | w2  | w3  | ⊔   | ... | ⊔   |   초기 구성
       i=1 |  w1   | q', w2 | w3 | ⊔   | ... | ⊔   |   한 칸 우측 이동, 상태 q'
       i=2 |  w1   | w2'  | q'',w3 | ⊔ | ... | ⊔   |
        .
        .
       i=t-1| ... 어딘가에 q_accept 등장 ...        |
    

이 격자가 합법적인 수락 이력이라는 사실을 부울식으로 옮기는 데 필요한 변수와 절은 다음과 같다.

표 변수. 각 칸 ⟨i, j⟩와 각 가능한 칸 내용 s ∈ C(여기서 C = Γ ∪ (Q × Γ))에 대해 부울 변수
   xi, j, s = "칸 ⟨i, j⟩의 내용이 s이다"
을 도입한다. 변수의 총 개수는 t2 · |C|로 다항이다.

4. 네 종류의 절

이제 우리는 변수들의 진리값이 진짜 격자를 묘사하도록 강제하는 절들을 적는다. 이를 네 그룹으로 나누어 부른다 — cell, start, accept, move.

4.1 cell — 각 칸은 정확히 한 글자

먼저 각 칸이 적어도 하나의 내용은 가지고, 그러나 두 가지를 동시에 가지지 않게 만들어야 한다. 칸 ⟨i, j⟩에 대해

  ( ⋁s ∈ C xi,j,s )   ∧   ( ⋀s ≠ t ¬xi,j,s ∨ ¬xi,j,t )
    

전자는 "무엇이든 적혀 있다", 후자는 "두 글자가 동시에 적혀 있을 수는 없다"는 뜻이다. 칸이 t2개이고 각 칸의 절 길이는 |C|에 의해 정해지므로, 이 그룹의 총 절 개수는 O(t2)이다.

4.2 start — 0행은 초기 구성

입력 w = w1 w2 … wn이 주어졌을 때, 0행은 정확히 다음 모양이어야 한다.

  x0, 0, ⟨q0, w1  ∧  x0, 1, w2  ∧  …  ∧  x0, n-1, wn  ∧  x0, n, ⊔  ∧  …  ∧  x0, t-1, ⊔
    

(한 줄짜리 합접이라 절 하나로 표현하기 어색해 보이면, 각 합접 항을 단일 리터럴 절로 따로따로 두면 된다.) 이 그룹의 절 개수는 O(t)이다.

4.3 accept — 어딘가에 수락 상태가 등장

N이 w를 수락한다는 사실은 이력 어딘가에 수락 상태 qaccept가 등장했다는 뜻이다. 격자의 어느 칸이든 좋다.

i, j, s ∈ Γ  xi, j, ⟨qaccept, s⟩
    

거대한 OR 절 하나로 충분하며 길이는 O(t2)이다. (전이 후 정지하는 NTM이라 가정하면 헤드가 일단 qaccept에 도달하면 그 자리에 머무는 식으로 다듬을 수 있다.)

4.4 move — 인접 행 사이는 N의 전이 함수와 일치

가장 중요한 그룹이다. 1행, 2행, …, (t-1)행이 정말 0행에서 N의 규칙에 따라 한 단계씩 진행된 결과여야 한다. 한 번의 NTM 단계는 헤드와 그 좌우 한 칸씩, 총 세 칸의 내용에만 의존하므로 우리는 격자 전체를 한꺼번에 보지 않아도 된다.

대신 격자 위의 모든 2행 × 3열 윈도우를 살펴 그 윈도우가 N에서 합법적인지를 묻는다. 2 × 3 윈도우란 행 ⟨i, i+1⟩과 열 ⟨j-1, j, j+1⟩이 만나 만드는 작은 사각형이다.

            j-1   j     j+1
       i  | a  |  b  |  c  |
      i+1 | a' |  b' |  c' |
    

"합법적 윈도우"란, 만약 i행의 (a, b, c)가 N의 어떤 한 단계로 (a′, b′, c′)이 될 수 있다면 통과, 아니면 부적합이다. 합법적 윈도우의 집합은 N의 전이 함수 δ로부터 미리 유한하게 계산해 둘 수 있다 — N에 의존할 뿐 입력 w와는 무관하다.

이제 각 윈도우 위치 ⟨i, j⟩에 대해 다음 절을 둔다.

(a,b,c,a',b',c') ∈ 합법윈도우  ( xi,j-1,a ∧ xi,j,b ∧ xi,j+1,c ∧ xi+1,j-1,a' ∧ xi+1,j,b' ∧ xi+1,j+1,c' )
    

(이 거대한 OR-of-AND를 CNF로 옮길 때는 분배 법칙을 쓰거나, 보조 변수를 도입해 부피를 다항으로 유지한다. 길이가 N에만 의존하는 상수 크기의 OR이므로 어느 쪽이든 다항 시간에 끝낸다.) 윈도우 개수는 O(t2)이다.

왜 2×3인가. 한 단계에서 변할 수 있는 칸은 (헤드 위치) 그리고 (헤드가 이동하는 방향의 이웃)뿐이다. 따라서 윈도우의 양 끝 두 열만으로는 헤드의 도착 지점이 안 보이는 문제가 생긴다. 폭 3, 높이 2가 한 단계의 모든 인접 변화를 정확히 포착한다.

네 그룹을 모두 합접으로 묶으면 우리의 부울식 φw가 완성된다.

  φw  =  φcell  ∧  φstart  ∧  φaccept  ∧  φmove
    

5. 환원의 정확성과 다항성

증명 스케치. 두 방향을 모두 본다.

(⇒) w ∈ A이면 N의 어떤 분기가 t 단계 안에 w를 수락한다. 그 분기의 단계별 구성을 격자에 그대로 적어 넣고, 칸 ⟨i, j⟩의 내용에 해당하는 변수만 참으로, 나머지를 거짓으로 놓으면 cell, start, accept, move 네 그룹이 동시에 만족된다.

(⇐) 반대로 φw가 만족 할당 τ를 가진다 하자. cell 그룹이 만족되므로 τ는 칸별로 정확히 한 내용을 지정한다. start로부터 0행은 초기 구성이고, move로부터 인접 행 사이는 모두 N의 합법 전이를 따르며, accept로부터 어딘가에 수락 상태가 적혀 있다. 따라서 그 격자는 N이 w를 수락하는 합법 이력이고, 곧 w ∈ A.

다항성도 따져 보자. 변수 개수는 O(t2), 절 개수는 cell·start·accept·move 모두 합쳐 O(t2)에 N에 의존하는 상수가 곱해진 정도다. φw를 종이에 적는 일은 입력 w를 훑으며 격자 좌표를 따라 출력하는 것이라 다항 시간에 끝난다. 따라서 환원 자체가 다항 시간에 가능하다 — A ≤p SAT.

6. 3SAT까지 — 절을 셋으로 자르기

SAT의 절은 임의 길이를 허용하지만, 실전에서는 한 절의 리터럴 수가 정확히 셋인 3SAT이 환원의 표준 출발점이 되는 일이 많다. 다행히 SAT가 NP-완전이라는 사실로부터 3SAT가 NP-완전임을 잇는 다리는 짧다.

따름정리. 3SAT는 NP-완전이다.
증명 스케치. 3SAT ∈ NP는 SAT와 같은 이유로 자명하다. 환원은 SAT ≤p 3SAT를 보이면 된다. 임의의 절 (l1 ∨ l2 ∨ … ∨ lk)를 다음과 같이 길이 3짜리 절들의 합접으로 바꾼다. 새로운 보조 변수 z1, …, zk-3를 도입해
   (l1 ∨ l2 ∨ z1)  ∧  (¬z1 ∨ l3 ∨ z2)  ∧  …  ∧  (¬zk-3 ∨ lk-1 ∨ lk)
      
로 쓴다. 길이가 1 또는 2인 절은 변수 하나를 복제해 길이 3에 맞춘다. 보조 변수의 진리값은 "지금까지의 어느 li도 참이 아니라면, 다음 절을 만족시키기 위한 책임을 떠넘긴다"는 신호로 작동한다. 원래 절이 만족되면 적절한 z 할당이 존재하고, 반대로 변환된 합접이 만족되면 어떤 li가 참이어야 한다(그렇지 않으면 z들의 충돌로 자명히 모순).

변환 후 절 개수는 원본의 합 길이에 비례해 다항이다. 따라서 SAT ≤p 3SAT, 그리고 임의 NP 언어 A는 A ≤p SAT ≤p 3SAT.

7. 이 정리가 우리에게 주는 것

쿡-레빈 정리의 진짜 가치는 그 자체보다 그것이 열어 주는 통로에 있다. 새로운 결정 문제 B의 NP-완전성을 보이고 싶다고 하자. 정의에 따르면 모든 NP 언어가 B로 환원됨을 보여야 하는데, 이는 매번 NTM의 격자를 들고 와 사투를 벌이라는 뜻이다. 그러나 SAT 또는 3SAT가 NP-완전이라는 사실을 손에 쥐고 있으면, 우리는 한 가지만 보이면 된다.

실전 처방. B의 NP-완전성을 증명하려면
  1. B ∈ NP를 보인다 (인증서와 다항 검증자 제시).
  2. 이미 알려진 NP-완전 문제 C(흔히 3SAT, VERTEX-COVER, CLIQUE 등)에 대해 C ≤p B를 보인다.
그러면 환원의 추이성에 의해 모든 NP 언어가 B로 환원된다.

이로써 이후의 모든 NP-완전성 증명은 "어디서 출발할까" 하는 카탈로그 게임이 된다. 첫 번째 NP-완전 문제를 정직하게 만들어 둔 쿡과 레빈의 수고가 그 카탈로그의 맨 윗 줄을 지탱하고 있는 셈이다.

다음 강의에서는 시간에서 공간으로 무대를 옮긴다. 메모리만 다항이면 시간이 지수여도 괜찮다는 클래스 PSPACE를 정의하고, 비결정적 공간이 결정적 공간과 본질적으로 다르지 않다는 사비치(Savitch) 정리를 만난다 — 시간 영역의 P 대 NP 문제가 공간에서는 한 변의 제곱 차이로 깔끔하게 해결되는, 약간 짓궂은 광경이 펼쳐진다.

강의 17

공간 복잡도, PSPACE, 그리고 사비치 정리

시간이 아니라 메모리를 자원으로 셀 때, 결정성과 비결정성의 격차는 한 변의 제곱이라는 작은 값으로 좁혀진다.

1. 자원의 축을 바꾸기

시간 복잡도에서 우리는 "단계 수"를 자원으로 셌다. 그러나 컴퓨터의 한계가 시간만은 아니다. 어떤 알고리즘은 빠르게 끝나지만 메모리를 게걸스럽게 먹어 치우고, 또 어떤 알고리즘은 느리지만 작은 노트만으로도 충분하다. 이번 강의에서는 자원의 축을 메모리로 바꾸어 본다.

여기서 한 가지 약속이 필요하다. 메모리를 측정한다고 해서 입력 w 자체를 다시 셀 수는 없다 — 입력만으로 이미 n 비트가 든다. 우리가 진짜 관심 있는 것은 기계가 추가로 끼적이는 노트의 양이다. 그래서 공간 복잡도용 튜링 기계는 보통 입력 테이프(읽기 전용)와 작업 테이프(읽기/쓰기)를 분리한 모델을 사용한다.

정의 (공간 복잡도 클래스). 함수 s : ℕ → ℕ에 대해
  • SPACE(s(n)) — 모든 입력 길이 n에 대해 작업 테이프 칸을 최대 s(n)개만 사용하고 항상 정지하는 결정적 튜링 기계로 결정 가능한 언어들의 집합.
  • NSPACE(s(n)) — 같은 정의에서 비결정적 기계를 허용한 것. 어떤 분기든 작업 테이프 사용량이 s(n) 이하라야 한다.
다항 공간.
   PSPACE = ⋃k ≥ 1 SPACE(nk),   NPSPACE = ⋃k ≥ 1 NSPACE(nk).

입력 자체는 셈에서 빠지므로 SPACE(log n)처럼 입력보다 작은 공간 클래스를 정의하는 일도 가능하다. 본 강의에서는 다항 공간만 다루지만, 그런 정의의 미세함이 가능한 까닭은 이 분리된 모델 덕분이라는 점을 머리 한구석에 둬두자.

2. 시간과 공간 사이의 격자

두 자원은 서로를 묶는 두 가지 자명한 부등식을 가진다. 첫 번째는 거의 정의에 가깝다.

관찰 1. 임의의 함수 t(n)에 대해 TIME(t(n)) ⊆ SPACE(t(n)).
증명. t(n) 단계 안에 정지하는 기계는 그 동안 헤드가 t(n)칸 이상 움직일 수 없다. 따라서 작업 테이프에서 실제로 방문되는 칸도 t(n)개를 넘지 못한다.

두 번째는 약간의 사색을 요구한다. 공간을 적게 쓰는 기계가 시간을 얼마까지 쓸 수 있는가? 답은 "의외로 많지만 그 한계가 깔끔하다"이다.

관찰 2. s(n) ≥ log n에 대해 SPACE(s(n)) ⊆ TIME(2O(s(n))).
증명 스케치. 작업 공간이 s 칸이면 가능한 구성(상태, 작업 테이프 내용, 작업 헤드 위치, 입력 헤드 위치)의 총 수는 |Q| · |Γ|s · s · n으로, 2O(s)(s ≥ log n이라 n도 흡수된다). 정지하는 기계는 같은 구성을 두 번 방문하지 않으므로 — 만약 그랬다면 무한 루프 — 총 단계 수는 구성 개수를 넘지 못한다.

두 관찰을 묶으면 다음 다이어그램이 자연스럽다.

   P  ⊆  NP  ⊆  PSPACE  ⊆  EXPTIME
    

맨 왼쪽은 자명, 두 번째는 NP의 다항 검증자가 인증서와 함께 다항 시간에 굴러가니 다항 공간만 쓴다는 데서 나온다 — 또는 모든 가능 인증서를 한 통의 다항 길이 변수에 저장하면서 차례로 시도해도 다항 공간이 충분하다. 마지막 PSPACE ⊆ EXPTIME은 관찰 2의 직접 따름이다.

흥미로운 점은 이 사슬 어디에서도 진짜 분리가 알려져 있지 않다는 것이다. P ≠ PSPACE인지, NP ≠ PSPACE인지, 어느 쪽도 풀리지 않은 채 책상 위에 놓여 있다.

3. PSPACE의 대표 시민: TQBF

NP에 SAT가 있다면 PSPACE에는 그 양화 버전이 있다. SAT는 "어떤 할당이 식을 만족시키는가"를 묻지만, 진짜 게임은 변수마다 ∀와 ∃가 번갈아 붙을 때 시작된다.

정의 (TQBF). 전 양화 부울 식(totally quantified boolean formula)은 다음 모양이다.
  φ = Q1 x1  Q2 x2  …  Qk xk  ψ(x1, …, xk)
      
여기서 각 Qi는 ∀ 또는 ∃이고 ψ는 양화자 없는 부울 식이다. 자유 변수가 없으므로 φ는 그 자체로 참 또는 거짓이다. TQBF는 참인 전 양화 부울 식들의 집합이다.

TQBF가 PSPACE에 속한다는 사실을 보이는 자연스러운 방법은 양화자 한 개씩을 손으로 까보는 재귀이다.

정리. TQBF ∈ PSPACE.
증명 스케치. 다음 재귀 알고리즘 EVAL(φ)을 정의한다.
  • φ에 양화자가 없으면 ψ를 직접 계산해 결과를 돌려준다 — 다항 공간.
  • φ = ∃x1 φ'(x1)이면 EVAL(φ'[x1 := 0])과 EVAL(φ'[x1 := 1])을 차례로 호출, 둘 중 하나라도 참이면 참을 돌려준다.
  • φ = ∀x1 φ'(x1)이면 같은 두 호출의 결과가 모두 참인 경우에만 참을 돌려준다.
각 호출은 다음 호출에 들어가기 전에 필요한 작업 공간을 회수한다. 즉 우리는 같은 다항 공간을 재사용한다. 호출 깊이는 변수 개수 k이고 k는 입력 크기에 의해 다항으로 한정된다. 따라서 총 작업 공간은 (한 레벨의 공간) × (깊이) = 다항.

실은 TQBF는 PSPACE-완전이다 — 그 사실의 증명은 쿡-레빈의 변형이지만 이 강의의 메인 메뉴는 따로 있다.

두 명이 두는 게임. ∃ 측은 자기 차례마다 변수에 0 또는 1을 골라 두고, ∀ 측은 자기 차례마다 변수를 골라 둔다. 마지막에 ψ가 참이면 ∃ 승, 거짓이면 ∀ 승. φ가 TQBF에 속한다는 것은 정확히 "∃ 측에 필승 전략이 있다"는 진술이다. 체스나 바둑처럼 양 진영이 번갈아 두는 게임이 PSPACE에 등장하는 데에는 그럴 만한 이유가 있다.

4. 사비치 정리 — 비결정성을 공간에서 메우다

시간 영역에서 P와 NP의 차이가 얼마나 큰지는 아무도 모른다. 그런데 공간 영역에서는 사정이 다르다. 1970년 월터 사비치가 "비결정 공간을 결정 공간으로 옮길 때 잃는 것은 한 변을 제곱할 만큼뿐"임을 보였다.

사비치 정리 (Savitch 1970). s(n) ≥ log n에 대해 NSPACE(s(n)) ⊆ SPACE(s(n)2).

증명의 무대는 임의의 NTM N과 그 안에서 일어나는 구성 그래프(configuration graph)다. 입력 w가 주어졌을 때 N의 구성은 (상태, 작업 테이프 내용, 두 헤드 위치)로, 작업 공간이 s 칸이면 가능한 구성은 2O(s)개. N이 w를 수락한다는 것은 시작 구성 cstart에서 어떤 수락 구성 caccept로 이르는 경로가 N의 한 단계 관계 안에서 존재한다는 뜻이다.

핵심은 "도달 가능성"을 분할 정복으로 풀어내는 다음 술어다.

술어 CANYIELD(c1, c2, t). N의 구성 c1에서 c2로 t 단계 안에 (혹은 c1 = c2이고 t = 0으로) 도달 가능한가?

CANYIELD는 다음 재귀로 계산된다.

  CANYIELD(c1, c2, t):
    if t = 1 :  return ( c1 = c2  또는  c1 ⊢ c2 in N )
    for each 가능한 중간 구성 m :
      if CANYIELD(c1, m, ⌈t/2⌉)  AND  CANYIELD(m, c2, ⌊t/2⌋) :
        return YES
    return NO
    

핵심 트릭은 두 재귀 호출을 차례로 하고 그 사이에 작업 공간을 재활용하는 것이다 — 깊이는 단지 log2 t에 비례하고, 한 레벨이 차지하는 변수는 c1, c2, m의 세 구성이다. 각 구성은 s 칸을 차지하므로 한 레벨당 O(s) 공간.

정리의 증명 스케치. N의 NSPACE(s) 기계가 입력 w를 수락하면 그 수락 경로의 길이는 구성의 총 수에 의해 한정되어 2O(s) 이내. 따라서 cstart에서 caccept로 가는 경로가 있으려면 t = 2O(s)로 두고 CANYIELD(cstart, caccept, t)를 묻는 것으로 충분하다.

이를 결정적 기계로 구현한다. 모든 가능한 수락 구성 caccept에 대해 CANYIELD(cstart, caccept, 2O(s))가 참인지 차례로 시도한다. 재귀 깊이는 log(2O(s)) = O(s), 한 레벨당 공간은 O(s). 따라서 총 작업 공간은
  O(s) × O(s) = O(s2).
      
바깥쪽 caccept 순환은 카운터 하나로 돌리고 매번 같은 작업 공간을 재활용하므로 추가 비용이 없다.

주목할 만한 점 두 가지. 첫째, 시간으로 같은 일을 시도했다면 결과는 끔찍했을 것이다 — 우리는 t를 t/2씩 쪼개도 두 호출 모두를 수행하므로 시간상 곱이 절약되지 않는다. 그러나 공간은 재사용 가능한 자원이라 이 분할 정복이 의미를 갖는다. 둘째, 우리가 다룬 t가 2O(s)이라 깊이가 O(s)였다는 점이다. 시간으로 설정한 t였다면 깊이가 너무 작아 별 도움이 안 됐을 것이다.

따름정리. PSPACE = NPSPACE.
증명. NSPACE(nk) ⊆ SPACE((nk)2) = SPACE(n2k) ⊆ PSPACE. 따라서 NPSPACE = ⋃k NSPACE(nk) ⊆ PSPACE. 반대 포함은 자명.

이 결과를 시간 영역의 미해결 문제 P =? NP와 비교해 보면 약간의 위안과 동시에 약간의 좌절감을 느끼게 된다. 메모리 자원에서는 결정성과 비결정성이 한 변을 제곱하는 일로 거리가 메워진다 — 그런데 시간에서는 그조차도 우리가 모른다.

5. 정리하며, 그리고 다음 강의

오늘의 수확을 헤아려 두자. 공간 클래스 SPACE(s)와 NSPACE(s)를 입력 테이프와 작업 테이프를 분리한 모델 위에서 정의하고, 그 정의로부터 PSPACE와 NPSPACE를 얻었다. 시간/공간의 두 자명한 부등식은 P ⊆ NP ⊆ PSPACE ⊆ EXPTIME이라는 사슬을 빚어냈고, 이 사슬 어느 곳에서도 진짜 진부분 관계가 알려져 있지 않다는 사실을 확인했다.

그 다음 PSPACE의 대표적 시민 TQBF를 만났다. 이 문제는 양화자 게임에서 ∃ 측의 필승 여부를 묻는 것과 다름없고, 양화자 한 겹씩 까는 재귀로 다항 공간에 결정 가능했다. 마지막으로 사비치 정리는 도달 가능성을 분할 정복으로 다루어, 비결정 공간 s를 결정 공간 s2로 시뮬레이션할 수 있음을 보였다 — 결과적으로 PSPACE = NPSPACE.

다음 강의에서는 이 PSPACE 안에서 가장 어려운 자리에 앉은 문제들 — PSPACE-완전 문제들 — 의 모습을 본격적으로 들여다본다. TQBF가 그 자리의 첫 거주민이고, 그로부터 환원되는 게임 이론적 결정 문제들이 줄을 잇는다. 시간이 흘러도 메모리는 잊지 않는다는 사실을 가장 적나라하게 보여 주는 클래스가 PSPACE다.

강의 18

PSPACE-완전성

다항 공간의 가장 어려운 문제들, 그리고 TQBF가 그 자리에 앉는 이유

1. 한 클래스의 "최악"을 잡는 법

NP에서 SAT가 차지했던 위치를 떠올려 보자. SAT 하나만 잘 풀면 NP 전체가 무너지는, 그런 압도적 위치 말이다. PSPACE에서도 똑같은 그림을 그릴 수 있다. 다만 자원이 시간이 아니라 공간이라는 점만 다를 뿐이다. 이번 강의의 주연은 TQBF(True Quantified Boolean Formula, 참인 양화 부울식)이고, 조연은 Savitch 정리에서 이미 한 번 만난 재귀적 분할이다.

정의 18.1 (PSPACE-hard, PSPACE-complete). 언어 BPSPACE-hard라 함은, 임의의 A ∈ PSPACE에 대해 Ap B가 성립한다는 뜻이다. 여기서 ≤p는 다항 시간 매핑 환원이다. 만약 추가로 B ∈ PSPACE이면 BPSPACE-complete(PSPACE-완전)이라 한다.

왜 환원의 척도로 "다항 시간"을 쓰는가? PSPACE라는 더 큰 그릇 안에서 의미 있는 비교를 하려면, 환원 자체는 비교 대상보다 훨씬 약한 자원으로 묶어 두어야 한다. 시간 다항이면 공간도 다항이므로, 다항 시간 환원은 PSPACE 내부의 구조를 충분히 보존한다.

정리 18.2. B가 PSPACE-완전이고 B ∈ P이면, P = PSPACE이다.
증명. 임의의 A ∈ PSPACE를 잡자. 정의에 의해 Ap B인 다항 시간 환원 f가 존재한다. B가 P에 속한다는 가정에서 결정자 MB가 다항 시간에 동작한다. 그러면 입력 w에 대해 f(w)를 계산한 뒤 MB(f(w))를 돌리면 된다. 이 합성도 다항 시간이므로 A ∈ P이다. A가 임의였으니 PSPACE ⊆ P이고, 반대 포함은 자명하므로 P = PSPACE. □

다시 말해, PSPACE-완전 문제 한 마리만 효율적으로 잡아도 다항 시간으로 다항 공간 전체를 정복하는 셈이다. 그래서 PSPACE-완전성은 단순히 어렵다는 라벨이 아니라, "이 한 점이 무너지면 클래스 전체가 무너진다"는 절단점의 의미를 갖는다.

2. TQBF: 양화의 풀스택

정의 18.3 (TQBF). 양화 부울식(quantified Boolean formula, QBF)이란 모든 변수가 ∃ 또는 ∀로 양화된, 자유변수 없는 부울식 φ를 말한다. 표준형(prenex form)은

φ = Q1x1 Q2x2 … Qnxn ψ(x1, …, xn), Qi ∈ {∃, ∀}

이며 ψ는 양화 없는 명제 논리식이다. 언어 TQBF는 이런 형태의 식 중 참인 것들의 집합이다.

SAT가 ∃만 쓰는 양화식의 진리 판정이라면, TQBF는 ∃와 ∀가 자유롭게 교차한다. 양화자가 한 번 더 끼어들 때마다 "결정 한 단계"가 더해지고, 게임으로 치면 수가 한 번 더 두어지는 셈이다.

정리 18.4 (Stockmeyer–Meyer). TQBF는 PSPACE-완전이다.

증명은 두 부분으로 나뉜다. 한 쪽은 쉬운 멤버십, 다른 한 쪽은 핵심 어려움이다.

3. TQBF ∈ PSPACE

먼저 멤버십. 입력 φ = Q1x1 … Qnxn ψ를 받았다고 하자. 재귀적으로 평가한다. φ의 가장 바깥 양화자가 ∃x1이면 x1 = 0과 x1 = 1을 차례로 시도해 둘 중 하나라도 참이면 참을 반환한다. ∀x1이면 둘 다 참이어야 참을 반환한다. 양화자가 모두 사라지면 ψ를 직접 계산한다.

재귀 깊이는 양화자의 개수 n이고, 각 단계에서 부분 식의 사본 대신 변수 할당만 기억하면 된다. 따라서 공간 사용량은 O(n + |φ|), 즉 n의 다항이다. 이 단순한 깊이 우선 평가만으로 TQBF ∈ PSPACE.

4. PSPACE-경도: 식이 너무 커지면 안 된다

이제 어려운 방향이다. 임의의 A ∈ PSPACE를 받아, Ap TQBF임을 보여야 한다. PSPACE TM M이 입력 w에서 공간 s = nk를 쓴다고 하자(여기서 n = |w|). 우리의 임무는 다항 시간에 양화 부울식 φM,w를 구성해 다음을 만족시키는 것이다.

φM,w가 참 ⇔ Mw를 받아들임.

자연스러운 시도, 그리고 그 좌절

M의 형태(configuration)는 길이 O(s) = O(nk) 비트로 인코딩된다. Cook–Levin 식 발상으로, 시작 형태 cstart에서 받아들임 형태 caccept까지의 형태 수열을 통째로 변수화하면? M의 실행 시간은 최대 2O(s)이다(공간 한계 TM의 정지성을 위해). 형태 수열은 그러므로 길이 2O(s), 변수 개수도 2O(s). 식 크기가 지수가 되어 다항 시간 환원이 깨진다. 단순 인코딩은 실패한다.

Savitch 스타일 재귀적 분할

해법은 시간이 아니라 중간점을 양화로 잡아내는 것이다. 두 형태 c1, c2와 단계 수 t에 대해, "c1에서 c2로 ≤ t 단계에 갈 수 있다"를 표현하는 식 φc1,c2,t를 재귀적으로 만든다.

기저 t = 1: φc1,c2,1c1 = c2이거나 c1이 한 단계로 c2에 가는지 확인하는, Cook–Levin식 국소 검증 식. 크기는 O(s).

재귀 단계: 직관적으로는

m [ φc1,m,t/2 ∧ φm,c2,t/2 ]

이라고 쓰고 싶지만, 이 형태는 재귀가 한 단계 내려갈 때마다 식이 두 배가 된다. 깊이 log T = O(s)이므로 결국 다시 지수 폭발이다.

핵심 트릭은 ∀를 이용해 두 부분 식을 같은 식 하나로 합치는 것이다.

φc1,c2,t ≡ ∃m ∀(a,b) ∈ {(c1,m), (m,c2)} φa,b,t/2.

여기서 ∀(a,b) ∈ {…}는 두 가지 형태 쌍에 대한 양화이며, 새 변수 (a,b)를 도입한 뒤 "(a,b)가 (c1,m) 또는 (m,c2)이면 φa,b,t/2가 성립" 같은 함의로 풀어 쓴다. 이렇게 하면 재귀 호출이 식 안에 두 번 등장하는 대신 한 번만 등장한다.

크기 분석

각 재귀 단계에서 식 크기는 다음 점화식을 만족한다.

L(t) = L(t/2) + O(s), L(1) = O(s).

풀면 L(T) = O(s · log T) = O(s2). 다항이다. 양화자의 깊이도 log T = O(s) = O(nk)로 다항이다. 마지막으로

φM,w ≡ φcstart, caccept, T

로 두면 φM,w가 참 ⇔ Mw를 받아들임. 환원 자체는 형태 인코딩과 재귀적 식 생성이 전부이므로 다항 시간에 끝난다. 따라서 TQBF는 PSPACE-완전이다. □

여담. Savitch 정리에서는 ∃m으로 중간점을 추측하고, 두 부분 호출을 시간 순서로 직렬화해 공간을 재사용했다. 여기서는 같은 중간점을 ∃로 추측한 뒤 ∀로 두 부분을 "한 번에" 표현한다. 시간 자원이 식 크기로, 공간 재사용이 양화 재사용으로 번역된다. 같은 트릭이 자원만 갈아끼우며 다시 쓰이는 모습을 보면, 계산이론이 사실은 한두 가지 아이디어를 끝없이 변주하고 있다는 인상을 받게 된다.

5. 클래스 사이의 풍경

이쯤에서 그림을 정리하자. 다음 포함 관계는 모두 알려진 사실이다.

P ⊆ NP ⊆ PSPACE = NPSPACE ⊆ EXPTIME ⊆ EXPSPACE.

등호는 Savitch 정리, NPSPACE ⊆ EXPTIME은 형태 그래프 크기가 2poly임에서 곧바로 따른다. 이 사슬에서 어느 두 인접 클래스가 진짜로 같은지 다른지는 대부분 미해결이지만, 다음 강의에서 공부할 위계 정리는 P ⊊ EXPTIME과 PSPACE ⊊ EXPSPACE를 확정해 준다. 따라서 위 사슬에서 적어도 한 곳은 진짜 ⊊이다. 단지 어디인지를 모를 뿐.

예 18.5. TQBF는 PSPACE-완전이므로 NP에도 coNP에도 들어 있을 가능성이 매우 낮다. 만약 TQBF ∈ NP라면 PSPACE ⊆ NP가 따를 것이고, 결국 NP = PSPACE라는 강한 등식을 얻는다. 가능한 일이지만 누구도 그렇게 믿지 않는다.

6. 양화 게임으로서의 TQBF

마지막으로, TQBF를 게임이라는 다른 렌즈로 보자. φ = ∃x1 ∀x2 ∃x3 … ψ를 두 플레이어의 대국으로 읽자. ∃ 차례에는 플레이어 E가 변수를 0/1로 둔다. ∀ 차례에는 플레이어 A가 둔다. 모든 변수가 결정되면 ψ를 평가한다. ψ가 참이면 E의 승리, 거짓이면 A의 승리.

그러면 φ가 참이라는 것은 정확히 E가 승리 전략을 갖는다는 뜻이다. 게임 트리의 minimax 평가가 곧 양화식의 재귀적 평가다. ∃는 max, ∀는 min, 잎은 ψ의 진리값. 다항 깊이의 minimax 트리 위에서 누가 이기는가 — 이 질문이 PSPACE의 가장 어려운 문제와 같은 난도라는 사실은, 다음 강의에서 일반화 지오그래피와 보드게임으로 곧장 이어진다.

다음 강의 다리. "양화 → 게임"이라는 번역을 한 단계 더 밀어 보자. 식 변수 대신 그래프의 정점을 따라 두 플레이어가 번갈아 이동한다면? 그렇게 만들어진 일반화 지오그래피가 또 한 번 PSPACE-완전이 된다. 보드게임의 결정 문제 일반론이 그 그림자 안에 있다.
강의 19

게임과 일반화 지오그래피

두 사람이 번갈아 두는 모든 것은 결국 양화식이다

1. 양화에서 게임으로

지난 강의에서 TQBF를 게임으로 읽는 법을 잠깐 보았다. ∃ 차례의 플레이어와 ∀ 차례의 플레이어가 번갈아 변수를 채우고, 마지막에 식이 참이면 ∃이 이긴다. 이 시점에서 합리적인 의문 하나. 그렇다면 우리가 일상에서 즐기는 보드게임 — 체스, 바둑, 오목 — 의 결정 문제들도 같은 틀에 들어가지 않을까?

답은 "들어간다"이지만, 어디에 들어가는지가 미묘하다. 보드 크기를 매개변수로 일반화하면 어떤 게임은 PSPACE-완전, 어떤 게임은 EXPTIME-완전이 된다. 이번 강의에서는 그 가운데 가장 깔끔한 견본인 일반화 지오그래피를 통해, "2인 완전정보 게임의 승자 판정 = 양화식의 진리 판정"이라는 등식을 또렷이 보일 것이다.

정의 19.1 (2인 완전정보 게임의 결정 문제). 두 플레이어 E와 A가 번갈아 수를 두며, 모든 정보가 공개되어 있고 무작위 요소가 없는 유한 게임을 생각하자. 게임 위치 p가 주어졌을 때 "E가 p에서 승리 전략을 가지는가?"를 묻는 결정 문제는 보통

m1m2m3 … (마지막 위치가 E의 승리)

형태의 양화식과 동치이다.

양화자의 깊이는 게임의 길이와 같다. 게임이 다항 길이로 끝나면 PSPACE 안에 머문다(TQBF의 PSPACE 멤버십과 같은 깊이 우선 평가). 게임이 지수적으로 길어질 수 있으면 EXPTIME 영역으로 올라간다.

2. 일반화 지오그래피

어릴 적 끝말잇기를 떠올려 보자. 한 사람이 단어를 말하면 다음 사람은 그 단어의 마지막 글자로 시작하는 단어를 댄다. 더 못 대는 쪽이 진다. 이 게임을 그래프로 추상화한 것이 지오그래피다. 정점은 단어, 간선은 "끝 글자가 시작 글자와 일치"라는 관계.

정의 19.2 (일반화 지오그래피, GG). 입력은 방향 그래프 G = (V, E)와 시작 정점 v0. 두 플레이어가 번갈아 토큰을 움직인다. 차례인 플레이어는 현재 정점에서 나가는 간선을 골라 인접 정점으로 이동한다. 단, 한 번 방문한 정점은 다시 방문할 수 없다. 자신의 차례에 갈 곳이 없는 플레이어가 진다. 언어 GG는 "선공 플레이어 1이 v0에서 승리 전략을 갖는 (G, v0) 쌍"의 집합.

왜 토큰 한 개로, 왜 정점 재방문 금지인가? 단어 끝말잇기에서 같은 단어를 두 번 쓰지 않는 규칙을 그대로 옮긴 것이다. 이 단순한 규칙 두 줄이 게임을 충분히 풍부하게 만들어 준다.

정리 19.3. GG는 PSPACE-완전이다.

멤버십 GG ∈ PSPACE는 어렵지 않다. 위치 = (현재 정점, 방문한 정점 집합)인데, 후자를 비트 벡터로 들고 있어도 |V| 비트면 충분하다. minimax를 깊이 우선으로 재귀 평가하면 재귀 깊이도 |V|. 따라서 다항 공간이면 충분하다.

핵심은 PSPACE-경도 — 즉 TQBF ≤p GG. 임의의 양화 부울식 φ를 받아, 그래프 Gφ와 시작 정점을 만들어 "φ가 참 ⇔ 선공 승리"가 되도록 한다.

3. 환원 가젯

일반성 잃지 않고 φ를 다음과 같이 정규화하자. 양화자가 ∃와 ∀가 교대로 나오고, 행렬은 3-CNF.

φ = ∃x1 ∀x2 ∃x3 … Qnxn C1 ∧ C2 ∧ … ∧ Ck.

그래프 Gφ는 두 부분으로 나뉜다. 변수 가젯의 사슬과, 그 끝에 매달린 절 가젯들.

변수 가젯: 다이아몬드

각 변수 xi마다 다이아몬드 모양의 가젯을 둔다. 위쪽 정점 ai에서 두 갈래(왼쪽: xi = T, 오른쪽: xi = F)로 갈라졌다가 아래쪽 정점 bi에서 다시 합쳐진다. 그리고 bi는 다음 변수의 ai+1로 이어진다.

다이아몬드의 갈래는 두 개의 정점(ti와 fi)으로 표현된다. 시작 정점이 ai이고 차례인 플레이어가 ti 또는 fi를 고르면, 상대편이 자동으로 다음 정점 bi로 가야 한다. 이 한 라운드 안에서 차례인 플레이어가 사실상 변수의 진리값을 결정한다.

핵심은 차례를 어떻게 짜 두느냐. 양화자 ∃xi이면 i번째 다이아몬드의 ai가 플레이어 1(∃)의 차례에 오도록, ∀xi이면 플레이어 2(∀)의 차례에 오도록 정렬한다. 다이아몬드 한 개는 두 수(ai → ti/fi → bi)를 잡아먹으므로, 시작 위치를 적절히 잡으면 차례가 정확히 맞아떨어진다.

마무리: 절 가젯과 함정

n번째 다이아몬드의 bn은 절 선택 정점 c로 이어진다. c에서는 플레이어 2(∀)의 차례. ∀는 절 C1, …, Ck 중 하나를 고른다. 즉 c에서 절 정점 vj로 간선이 나와 있고, ∀는 그중 하나를 선택한다.

절 정점 vj에서는 다시 플레이어 1(∃)의 차례. vj는 자신의 절 Cj의 세 리터럴 각각으로 간선이 나 있다. ∃는 그중 하나를 골라 이동한다. 그리고 결정적인 부분: 각 리터럴 정점은, 변수 가젯에서 해당 리터럴을 "참"으로 만든 갈래의 정점(ti 또는 fi)으로 간선이 이어져 있다. 즉 리터럴 xi는 ti로, ¬xi는 fi로.

그런데 ti 혹은 fi는 이미 게임 초반에 한 번 방문되었을 수도, 그렇지 않을 수도 있다. 이게 트릭이다. 변수 단계에서 차례인 플레이어가 ti를 고르면 ti가 방문 표시된다. 즉 xi를 T로 정한 셈. 그러면 절 단계에서 어떤 리터럴이 ti로 가려 해도 정점이 이미 사용되었으므로 갈 수 없다.

잠깐, 방향이 거꾸로 아닌가? 다시 정리. 절 가젯에서 ∃이 리터럴 ℓ을 골라 ti(또는 fi)로 들어가면, 그 정점에서 다시 한 수가 나가야 한다. 그래프를 설계할 때, ti와 fi 각각에서 더 이상 갈 곳이 없도록(혹은 한 단계만 더 가는 막다른 길이도록) 만든다. 그러면 절 단계에서 ∃이 ℓ을 골라 들어가면 그 다음은 ∀의 차례인데 ∀는 갈 곳이 없어 진다 — 단, 그 정점 ti/fi가 아직 방문되지 않았을 때만. 만약 변수 단계에서 이미 방문되었다면 ∃이 그 리터럴 정점으로 들어가는 수 자체가 막혀, 결국 ∃의 막다른 길이 되어 ∃이 진다.

요약하자면, 절 단계에서 ∃이 살아남으려면 절 Cj를 만족시키는 리터럴이 적어도 하나는 있어야 하고, 그 리터럴에 해당하는 변수 정점이 방문되지 않은 상태여야 한다. 그런데 변수 가젯에서 ti를 골랐다는 것은 xi = T로 두었다는 뜻이고, 이때 방문되지 않은 채 남은 정점은 fi다. fi는 xi = F를 의미하는 리터럴 ¬xi의 표적이고, 따라서 ¬xi가 절을 만족시키려면 절 안에 ¬xi가 있어야 한다. 결국 "리터럴 ℓ이 절을 참으로 만든다"와 "ℓ에 대응하는 정점이 절 단계에서 비방문 상태이다"가 정확히 일치하도록 설계된다.

증명 스케치. 위 그래프 Gφ에서 플레이어 1이 시작 정점 a1에서 승리 전략을 가짐 ⇔ φ가 참. 한 방향: φ가 참이면 ∃이 변수 단계에서 자기 변수 xi를 만족 부여에 맞추고, ∀가 어떤 절 Cj를 골라도 그 절을 만족시키는 리터럴이 있으므로 ∃이 그 리터럴 정점으로 가서 ∀를 막다른 길에 몰아넣는다. 반대 방향: φ가 거짓이면 어떤 ∃의 전략에 대해서도 ∀가 어긋난 변수를 강제하고 적절한 절을 골라 ∃을 막다른 길에 빠뜨린다. 환원 자체는 변수와 절 개수의 다항이므로 다항 시간. □
가젯이라는 말. "gadget"은 환원 이론의 필수 어휘다. 작은 부품을 끼워 맞춰 큰 구조를 흉내 내는 기법인데, NP-완전 환원에서도 익숙했던 발상이다. 차이가 있다면 PSPACE-완전 환원의 가젯은 정적인 만족 가능성이 아니라 차례와 정보의 흐름까지 부호화한다는 점. 그래서 누가 어느 정점에서 두는지를 한 칸이라도 잘못 맞추면 환원이 무너진다. 다이아몬드를 그릴 때 항상 "차례 패리티"를 종이 한 귀퉁이에 적어 가며 검증하는 습관이 생기게 된다.

4. 보드게임의 자리는 어디인가

일반화 지오그래피의 환원 기술은, 더 본격적인 보드게임으로 확장된다. 다만 클래스 위치는 게임의 "자연스러운 길이"에 따라 달라진다.

다항 길이 게임은 PSPACE 안에 머문다. 위치 인코딩과 전략 평가가 다항 공간 안에 들어가기 때문이다. 지수 길이 게임은 EXPTIME으로 올라간다. 시간 자체가 지수가 되면 PSPACE 평가가 통하지 않는다.

  • n×n 체스(50수 무승부 규칙 없이): 대국이 지수 길이일 수 있어 EXPTIME-완전.
  • n×n 바둑(일본 룰 변종): 대국 길이가 지수, EXPTIME-완전. 단, 어떤 룰을 채택하느냐로 결과가 흔들린다.
  • n×n 오목(Gomoku) 류의 라인업 게임: 보통 PSPACE-완전.
  • Generalized Geography: 길이 ≤ |V|이므로 PSPACE-완전.

"무승부 규칙이 있으면 게임 길이가 다항으로 강제되어 PSPACE에 떨어진다"는 한 줄짜리 직관이 꽤 자주 들어맞는다.

예 19.4 (Hex). Hex는 두 플레이어가 마름모 격자 위에 자기 색의 돌을 놓아 자신 쪽 두 변을 잇는 게임이다. n×n 일반화 Hex의 승자 결정 문제는 PSPACE-완전으로 알려져 있다(Reisch, 1981). 한 번 놓은 돌이 사라지지 않고 보드 칸 수가 다항이라 게임 길이가 다항으로 강제되는 점이 PSPACE에 머무는 핵심이다. 환원은 GG보다 더 정교한 가젯을 사용하지만, 골격은 동일하다.

5. 마무리

2인 완전정보 게임의 결정 문제를 양화 부울식의 진리 판정과 한 줄로 잇는 데 성공했다. 그 결과 TQBF가 누리던 PSPACE-완전성은 깔끔한 가젯 환원을 통해 일반화 지오그래피로 전염되었고, 그 너머로 Hex와 같은 보드게임에까지 번져 있다.

다음 강의 다리. 지금까지는 시간/공간이 다항인 큰 클래스를 다루었다. 이제 시야를 한참 줄여 보자. 작업 테이프가 단지 O(log n)인 경우는 어떤가? 메모리가 한 줌밖에 없는 기계가 풀 수 있는 일은 무엇이며, 그 비결정적 친척과는 어떤 관계인가? L과 NL의 세계로 들어간다.
강의 20

L, NL, 그리고 NL = coNL

로그 공간의 좁은 방, 그리고 그 안에서 의외로 풀려 버린 한 등식

1. 메모리 한 줌으로 무엇을 할 수 있는가

이쯤 되면 자원의 단위가 점점 작아진다. 다항 시간, 다항 공간을 거쳐 이제 우리가 다룰 자원은 로그 공간이다. 입력 길이가 n이라면 작업 테이프는 O(log n) 칸. 직관적으로는 입력에 대한 인덱스를 몇 개 들고 있을 정도의 메모리. 이 좁은 방 안에서도 의외로 많은 일이 일어난다.

정의 20.1 (로그 공간 TM). 입력 테이프(읽기 전용)와 작업 테이프를 분리한 2-테이프 튜링 기계 M을 생각하자. M공간 사용량은 작업 테이프에서 사용한 칸 수만 센다. 입력 테이프 자체는 공간으로 치지 않는다. M이 모든 입력 길이 n에서 O(log n) 작업 공간만 사용하면, 그것을 로그 공간 TM이라 한다.

왜 입력 테이프를 빼는가? log n은 입력을 한 번 통째로 적어 두기에도 부족한 양이다. 입력 자체를 공간에 포함시키면 log 공간이라는 정의가 거의 무의미해진다. 따라서 입력은 "외부 세계"로 두고 작업 메모리만 측정하는 모형이 표준이다.

정의 20.2.
  • L = SPACE(log n): 결정적 로그 공간 TM이 결정하는 언어들의 클래스.
  • NL = NSPACE(log n): 비결정적 로그 공간 TM이 인식하는 언어들의 클래스.

당연히 L ⊆ NL. 그리고 한 단계 더.

정리 20.3. NL ⊆ P.
증명. 비결정적 로그 공간 TM M의 형태(configuration)는 (상태, 작업 테이프 내용, 입력 헤드 위치, 작업 헤드 위치)로 인코딩된다. 작업 테이프 길이는 O(log n), 헤드 위치는 각각 log n 비트. 따라서 형태 하나의 크기가 O(log n)이고, 가능한 형태 수는 2O(log n) = nO(1)로 다항이다. 형태 그래프(정점 = 형태, 간선 = 1단계 전이)를 명시적으로 만든 뒤, 시작 형태에서 받아들임 형태로의 도달 가능성을 BFS로 확인하면 다항 시간에 끝난다. 따라서 L(M) ∈ P. □

이 한 줄짜리 보조 정리, "형태 그래프의 크기가 다항"이 NL을 다룰 때마다 반복적으로 등장한다. 잘 외워 두면 뒤이은 모든 증명의 토대가 된다.

2. PATH: 로그 공간 비결정성의 표본

정의 20.4 (PATH). 입력은 방향 그래프 G와 정점 쌍 (s, t). 질문은 "Gs에서 t로 가는 방향 경로가 존재하는가?". 이 언어를 PATH라 한다.

고전적 BFS로는 다항 시간에 풀린다. 하지만 공간 측면에서는? 방문한 정점을 표시할 비트맵을 만드는 순간 |V| 비트가 필요하니 로그 공간을 넘어선다. 그래서 PATH가 L에 들어가는지는 미해결이다. 반면 비결정적이라면 사정이 다르다.

정리 20.5. PATH ∈ NL.
증명. 다음 비결정적 알고리즘을 고려하자. 현재 정점 vs로 초기화. 카운터 i를 0으로 초기화. i ≤ |V|인 동안 다음을 반복: 만약 v = t이면 받아들임. 그렇지 않으면 v의 이웃 중 하나 v′을 비결정적으로 추측하고 vv′, ii + 1. i가 |V|를 초과하면 거부.

각 정점은 log |V| = O(log n) 비트, 카운터도 마찬가지. 작업 메모리 총량은 O(log n)이다. s에서 t로 경로가 존재하면 그것을 추측하는 수용 분기가 있고, 없으면 어느 분기도 받아들이지 않는다. □

"정점 두 개를 메모리에 들고 있다 + 카운터" — 이 셋이 NL의 가장 정직한 그림이다.

3. 로그 공간 환원과 NL-완전성

NL 안에서 "가장 어려운" 문제를 잡으려면 환원의 척도도 NL과 어울리는 자원이어야 한다. 다항 시간 환원은 NL을 비교하기엔 너무 강력하다(다항 시간이면 NL 전체를 안에 품으니, 환원이 너무 많은 일을 해 버린다).

정의 20.6 (로그 공간 환원). 함수 f: Σ* → Σ*가 로그 공간으로 계산 가능하다는 것은, 입력 테이프에 w를 받고 출력 테이프에 f(w)를 적는 결정적 TM이 작업 테이프 O(log |w|)만 사용함을 말한다. 출력 테이프는 한 방향 쓰기 전용이라 출력 자체는 공간에 포함하지 않는다. AL B는 어떤 로그 공간 환원 f가 존재해 wAf(w) ∈ B가 되는 것을 의미한다.

로그 공간 환원의 결정적 합성이 다시 로그 공간이라는 사실(주의를 요하는 보조 정리지만 표준)이, 이 환원이 NL의 자연스러운 척도임을 보장한다.

정리 20.7. PATH는 NL-완전이다(≤L 기준).
증명 스케치. 멤버십은 위에서 보았다. 경도: 임의의 A ∈ NL과 비결정적 로그 공간 TM M을 받자. M의 형태 그래프 GM,w를 만들면(정점 = 형태, 간선 = 가능한 비결정적 전이) A의 멤버십은 GM,w에서 시작 형태로부터 받아들임 형태로의 도달 가능성과 동치. 형태 하나는 O(log n) 비트이므로, 형태 한 개의 인코딩을 작업 메모리에 두고 한 비트씩 출력 테이프에 흘리면서 정점/간선을 차례로 적어 내려갈 수 있다. 각 시점에 들고 있는 메모리는 형태 두 개 정도 — O(log n)에 머문다. 따라서 환원은 로그 공간이며, 결과 그래프 위의 PATH 질문이 wA와 동치. □
잠깐, 익숙한 패턴이다. NP-완전 SAT를 보일 때도 우리는 "TM의 계산표를 그래프 비슷한 식으로 인코딩한 뒤 도달 가능성을 묻는다"는 발상을 썼다. 이번엔 시간 표가 아니라 형태 그래프, 식이 아니라 그래프 도달성. 자원의 종류만 갈아 끼웠을 뿐 골격은 같다.

4. 의외의 등식: NL = coNL

NP의 여집합 클래스 coNP가 NP와 같은지는 50년이 지나도 미해결이다. 같은 질문을 NL에 던지면 어떨까? 1987년, Immerman과 Szelepcsényi가 독립적으로 NL = coNL을 증명했다. NP에서는 안 풀린 일이 NL에서는 풀린 셈이다.

정리 20.8 (Immerman–Szelepcsényi). NL = coNL. 즉 모든 NL 언어의 여집합도 NL에 속한다.

이 정리를 보이는 데에는 NL-완전 PATH의 여집합, 즉

NPATH = { (G, s, t) : Gs에서 t로 가는 방향 경로가 없다 }

이 NL에 들어감을 보이면 충분하다. PATH가 NL-완전이므로 PATH의 여집합이 NL에 들어가면 모든 coNL 언어가 NL에 들어간다.

5. 핵심 발상: 정확한 카운트가 있으면 부정도 추측 가능

비결정주의가 풀어야 하는 어려움은 "어떤 게 없다"를 어떻게 증인 없이 받아들이느냐이다. 그러나 한 가지 우회로가 있다. s에서 도달 가능한 정점의 수 R을 정확히 알면, 그 R개를 모두 비결정적으로 열거하면서 그 안에 t가 없음을 확인하는 것으로 "t는 도달 불가"를 검증할 수 있다.

구체적으로 다음을 보자.

보조 정리 20.9. 어떤 절차가 입력 (G, s) 위에서 도달 가능 정점 수 R을 작업 메모리 안에 적어 줄 수 있다고 하자. 그러면 NPATH ∈ NL.
증명. R이 손에 있다고 가정. 다음을 한다. 카운터 k를 0으로. G의 모든 정점 v를 차례로 훑으며, 각 v에 대해 비결정적으로 "이 정점이 s에서 도달 가능하다"라고 주장하거나 건너뛴다. 주장한다면 s에서 v로 가는 경로를 길이 ≤ |V|로 비결정적으로 추측해 검증하고, 만약 v = t이면 즉시 거부(도달 가능한 정점 중에 t가 있다는 뜻이므로). 검증 성공하면 kk + 1. 모든 정점을 돌고 나서 k = R이면 받아들임, 아니면 거부.

만약 t가 진짜 도달 불가이면, 도달 가능한 R개 정점을 정확히 골라 검증하는 분기가 존재하고 그동안 한 번도 t를 만나지 않으므로 k = R로 받아들인다. 만약 t가 도달 가능이면, R개를 모은다는 것은 어디선가 반드시 t를 거쳐야 한다는 뜻이라 항상 거부된다. 메모리는 정점 두어 개 + 카운터 + R 자체이므로 O(log n). □

6. R을 비결정적으로 세는 법: 인덕티브 카운팅

남은 일은 R을 NL 안에서 손에 넣는 것. 핵심은 정점이 아닌 거리 단계별로 세는 것이다.

Ri = "s에서 i 단계 이내에 도달 가능한 정점의 수".

R0 = 1이고(자기 자신만 도달), R = R|V|이다. R0에서 R|V|까지 하나씩 갱신해 가는데, 갱신 단계에서도 비결정성을 활용한다.

Ri−1이 손에 있다고 하자. Ri를 구하려면 각 정점 v마다 "vi 단계 안에 도달 가능한가?"를 결정해야 하는데, 비결정주의로는 양성 사실(도달 가능)만 직접 증명할 수 있다. 그래서 다음 관찰을 쓴다.

vi단계 안에 도달 가능 ⇔ v가 (i−1)단계 안에 도달 가능, 또는 v의 어떤 입접 정점 u가 (i−1)단계 안에 도달 가능.

알고리즘은 정점 v를 한 명씩 처리하며 다음을 한다. (i−1)단계 도달 가능 정점들을 Ri−1개 비결정적으로 열거하고 각각의 경로를 검증한다 — 보조 정리에서 한 트릭과 같은 골격. 그 과정에서 어떤 도달 가능 uv의 입접 이웃이거나 u = v이면 "vi단계 도달 가능"이라 표시. 모든 정점에 대해 표시 여부를 합산해 Ri를 얻는다.

각 정점에 대한 처리 메모리도 O(log n), 모든 정점을 한 명씩 처리하므로 동시에 들고 있어야 할 데이터는 (현재 v, 카운터, 검증용 임시 정점) 정도 — 여전히 O(log n). 거리 i도 |V|까지만 가니 카운터 한 개. 결국 전체가 NL 안에 들어간다.

증명 결론. R = R|V|을 NL에서 계산할 수 있고, R을 손에 두면 NPATH ∈ NL. PATH가 NL-완전이므로 임의의 coNL 언어를 NL의 PATH-여집합 인스턴스로 환원해 NL 안에서 풀 수 있다. 따라서 coNL ⊆ NL. NL ⊆ coNL은 같은 논증을 여집합 양쪽으로 돌려 얻으며, 결국 NL = coNL. □
왜 NP에서는 같은 트릭이 안 통하는가. NP의 카운트 버전 #SAT(만족하는 부여의 수)를 정확히 안다면 coNP를 NP 안에서 다룰 수 있다. 그러나 #SAT를 NP 안에서 정확히 세는 방법이 없다. 형태 공간이 지수라 "거리 i까지 도달 가능 정점 수"의 NL 트릭이 NP에서는 너무 비싸다. 좁은 메모리가 오히려 무기가 되어 준다는 점이 이 정리의 묘미다.

7. 함의의 의외성

P vs NP, NP vs coNP는 풀리지 않은 채 수십 년이 흘렀다. 그런데 한 단계 아래로 내려와 NL을 보니, 1987년의 두 사람이 같은 질문을 깔끔히 정리해 버렸다. 비결정성과 부정 사이의 비대칭성이 자원이 작아질수록 약해진다는 사실은, 복잡도 이론의 직관 하나를 흔드는 일이었다. "비결정성의 본질적 비대칭"이 보편 진리가 아니라, 시간 다항이라는 특정 자원에서만 나타나는 특수한 현상일 가능성을 열어 둔 셈.

다음 강의 다리. 그렇다면 자원을 더 주면 정말로 더 많이 할 수 있는가 — 시간을 두 배로, 공간을 한 줌 더 — 라는 가장 원초적인 질문으로 돌아가자. 위계 정리(hierarchy theorem)가 이 직관에 어떤 보장을 주고, 어떤 한계에서 멈추는지가 다음 강의의 주제다.
강의 21

위계 정리

자원을 더 주면 정말 더 많은 일을 할 수 있는가에 대한 명백한 답, 그리고 그 한계

1. 자명해 보이지만 자명하지 않은 질문

"자원을 두 배로 늘려 주면 풀 수 있는 문제가 정말로 늘어날까?" 이 질문에 1초도 망설이지 않고 "그럼"이라 답하고 싶지만, 형식적으로 따지자면 그리 단순하지 않다. 시간 n2로는 풀 수 없는데 n3로는 풀리는 문제가 진짜 있어야 자원의 의미가 살아난다. 그런 문제가 존재한다는 것을 어떻게 보일까?

이 강의에서 만날 위계 정리(hierarchy theorem)들은 그 답이다. 시간을 늘리면 정말로 새로운 언어가 결정 가능해지고, 공간을 늘리면 정말로 새로운 언어가 인식 가능해진다. 다만 "얼마나 늘려야 하는가"의 양적 조건이 달려 있고, 함수가 적당히 잘 행동해야 한다.

정의 21.1 (시간/공간 구성 가능 함수). 함수 f: ℕ → ℕ가 시간 구성 가능(time-constructible)하다는 것은, 입력 1n에서 f(n)을 이진수로 출력하는 결정적 TM이 시간 O(f(n))에 존재함을 뜻한다(보통 f(n) ≥ n도 가정). 비슷하게 f공간 구성 가능(space-constructible)하다는 것은 f(n) ≥ log n이고 입력 1n에 대해 f(n)을 공간 O(f(n))으로 계산할 수 있는 TM이 있다는 것이다.

일상에서 만나는 거의 모든 "정상적인" 함수 — n2, n log n, 2n 등 — 는 두 종류 모두에 들어간다. 구성 가능성은 시뮬레이터가 시계나 자처럼 자원 한도를 셀 수 있어야 한다는 기술적 요청이다.

2. 시간 위계 정리

정리 21.2 (시간 위계 정리). f, g: ℕ → ℕ가 시간 구성 가능하고 f(n) log f(n) = o(g(n))이라 하자. 그러면

TIME(f(n)) ⊊ TIME(g(n)).

"f를 한 단계 키워 g로 가면, 진짜로 더 많은 언어를 결정할 수 있다"는 정확한 형태다. 왜 단순히 f(n) = o(g(n))이 아니라 f(n) log f(n)이 끼어드는지가 증명에서 자연스럽게 드러난다. 보편 시뮬레이터가 어떤 TM을 흉내 낼 때 log 인자만큼의 오버헤드가 든다는 사실이 그 출처다.

3. 증명의 핵심: 대각선화

증명의 도구는 칸토어가 실수의 비가산성을 보일 때 쓴 것과 본질이 같은 대각선화다. 우리는 g(n) 시간에는 결정 가능하지만 어떤 f(n)-시간 TM도 결정할 수 없는 언어를 손수 만든다.

다음 TM D를 정의하자. 입력 ⟨M⟩ — TM M의 인코딩 — 에 대해

  1. 입력 길이 n을 보고 g(n)을 시간 구성 가능성을 이용해 카운터에 적어 둔다.
  2. M을 입력 ⟨M⟩ 위에 시뮬레이션하되, g(n) 시간이 지나기 전까지만 돌린다. 시계가 만료되면 시뮬레이션을 중단.
  3. 시간 안에 M이 멈췄고 받아들였다면 D는 거부; 멈췄고 거부했다면 D는 받아들임; 시간이 만료되었다면 거부.

핵심 두 사실.

사실 1. D는 시간 O(g(n))에 동작한다. 보편 시뮬레이션의 log 오버헤드 때문에 M의 한 단계가 시뮬레이션 시 O(log f(n)) 시간이 들어, 전체 비용이 O(f(n) log f(n)) ≤ O(g(n))으로 묶인다 — 정확히 정리의 가정 f log f = o(g)가 여기서 쓰인다.

사실 2. D를 결정하는 어떤 f(n)-시간 TM M0도 존재하지 않는다. 만약 존재한다면, 충분히 큰 n에서 M0의 동작이 g(n) 시간 안에 끝나도록 할 수 있다(f log f = o(g)). 입력 ⟨M0⟩(또는 같은 언어를 결정하는 충분히 긴 인코딩)을 D에 넣으면, D의 정의에 의해 D(⟨M0⟩) = ¬M0(⟨M0⟩). 그러나 M0D를 결정한다면 D(⟨M0⟩) = M0(⟨M0⟩). 모순. □

이름의 유래. D는 자기 자신과 동치인 인코딩에서 다른 답을 내도록 강제된다. "대각선 위에서 부정"이라는 칸토어의 트릭과 동일하다. 다만 칸토어는 가능한 함수의 집합 위에서, 우리는 가능한 TM의 집합 위에서. 같은 논증이 자원 한계라는 새로운 제약 아래에서 다시 빛난다는 점이 이 분야의 즐거움이다. 그리고 정직히 말해, 대각선화는 한 번 익히면 평생 써먹는다.

4. 공간 위계 정리

정리 21.3 (공간 위계 정리). f, g가 공간 구성 가능하고 f(n) = o(g(n))이라 하자(둘 다 ≥ log n). 그러면

SPACE(f(n)) ⊊ SPACE(g(n)).

시간 위계와 비교하면 조건이 깔끔하다. 그저 f(n) = o(g(n))이면 충분하고, log 오버헤드가 없다. 이유는 단순. 공간은 재사용이 자유로운 자원이라 공간 시뮬레이션의 오버헤드는 상수배에 그친다. 한 셀을 천 번 다시 쓰든 자원이 늘지 않는다. 시간은 그렇지 않다. 한 단계는 한 번이고, 시뮬레이터의 내부 데이터구조 검색에 log가 자연스레 따라붙는다.

공간 위계의 증명도 같은 골격이다. g(n) 공간 시계를 들고 ⟨M⟩ 위에서 M을 시뮬레이션하다가 공간을 초과하면 멈춘다. 결과를 뒤집어 출력. 마찬가지로 어떤 f(n)-공간 기계도 이 언어를 결정할 수 없다. 한 가지 추가 주의는 공간 한계 시뮬레이션에서 무한 루프를 피하기 위해 형태 수가 2O(g(n))로 한정됨을 이용해 시계도 함께 도는 것 — 같은 형태가 두 번 나오면 정지로 간주.

5. 따름정리: 강력한 분리

위계 정리들은 추상적으로 보일 수 있으나, 곧장 구체적인 클래스 분리로 이어진다.

따름정리 21.4. P ⊊ EXPTIME.
증명. P = ⋃k TIME(nk) ⊆ TIME(2n) ⊆ EXPTIME = ⋃k TIME(2nk). 시간 위계 정리로 TIME(2n) ⊊ TIME(22n) ⊆ EXPTIME. 따라서 P ⊊ EXPTIME. □
따름정리 21.5. PSPACE ⊊ EXPSPACE.

이 두 분리는 직관적으로는 "그야 당연히 그렇겠지" 싶지만, 형식적인 증명을 위해서는 위계 정리의 대각선화가 반드시 필요하다는 사실을 짚어 두고 싶다. 추가로, P와 EXPTIME 사이를 채우는 클래스들 — NP, PSPACE — 가운데 어딘가에 진짜 ⊊가 일어난다는 것은 알지만, 어디인지는 모른다.

예 21.6. EXPTIME-완전 문제는 P에 들어가지 않는다. 만약 들어간다면 P = EXPTIME이 되어 위 따름정리에 모순. 그래서 EXPTIME-완전이라는 라벨은 "다항 시간으로는 절대 풀 수 없다"는 강력한 증명을 동반한다 — NP-완전이 누리지 못하는 형식적 자격이다.

6. 한계: 위계 정리로 풀리지 않는 것

위계 정리는 같은 자원 종류 안에서 양적 차이가 클 때만 분리를 보장한다. 여기서 자연스럽게 떠오르는 한계들.

자원 종류가 다르면 직접 적용 불가. P와 NP는 모두 다항 시간이지만, 비결정성이라는 정성적 차이를 가진다. 위계 정리는 결정적 시간 안에서의 양적 분리, 비결정적 시간 안에서의 양적 분리만 직접 말해 준다. 두 종류의 시간을 가로지르는 분리는 다른 도구가 필요하다 — 그리고 그 도구가 아직 없다.

같은 종류 안에서도 격차가 작으면 무력. P vs PSPACE는 양쪽이 모두 결정적이지만, P는 다항 시간을, PSPACE는 다항 공간을 다룬다. 다항 시간 ⇒ 다항 공간이지만 그 역은 미해결. 시간과 공간을 잇는 위계는 별도의 미해결 영역이다.

릴라티비제이션 장벽. 60년대 후반 Baker–Gill–Solovay는 oracle A를 잘 골라 PA = NPA를 만들 수도, PB ≠ NPB를 만들 수도 있음을 보였다. 위계 정리의 대각선화는 oracle 아래에서도 그대로 작동한다(시뮬레이션이 oracle을 그대로 통과). 따라서 P vs NP는 단순한 대각선화 논증으로는 풀 수 없다는 강력한 신호. 이것이 relativization barrier다. P와 NP 사이의 진짜 분리(혹은 등식)는 더 정교한 도구가 필요하다는 메시지로 받아들여진다.

위계 정리의 위치. 위계 정리는 복잡도 이론의 가장 단단한 기초석 중 하나다. 시간/공간이라는 자원이 진짜 의미를 가지며, 자원이 늘면 능력이 정말 늘어난다는 사실의 보증서. 그 위에 P, NP, PSPACE, EXPTIME 같은 큰 클래스가 쌓이고, 클래스 사이의 미해결 관계가 우리의 지적 지평을 정의한다. 위계 정리만으로는 P ≠ NP를 풀 수 없다는 그 한계가, 사실 우리가 어디서 더 깊이 파야 하는지를 말해 주는 안내판인 셈이다.

7. 마무리

이 강의에서는 자원의 의미를 정량적으로 굳혔다. 시간을 한 단계 늘리면 (log 인자를 감안하고) 진짜로 새 언어가 풀리고, 공간도 마찬가지다. 그 결과 P ⊊ EXPTIME, PSPACE ⊊ EXPSPACE 같은 가장 자연스러운 분리가 안전하게 손에 들어왔다. 동시에, P vs NP, P vs PSPACE 같은 작은 격차의 클래스 분리는 위계 정리의 손이 닿지 않는 영역임을 확인했다.

다음 강의 다리. 같은 자원 종류 안의 양적 분리에서 한 발 떼어, 환원의 구조와 전체 풍경을 한 번 더 정리하자. 다항 위계, 교대 튜링 기계, 회로 복잡도 — 다음 단계의 도구들이 그 풍경을 더 선명히 그려 줄 것이다.
강의 22

증명 가능 난해 문제와 신탁(Oracle) 기계

위계 정리가 보장하는 어려움, 그리고 상대화의 함정

1. 위계 정리가 약속한 것

지난 강의들에서 우리는 P, NP, PSPACE, EXPTIME 같은 클래스들을 차곡차곡 쌓아 올렸지만, 이 클래스들이 정말로 서로 다른지에 대해서는 대부분 침묵해 왔다. P ≠ NP는 여전히 수수께끼이고, NP ≠ PSPACE조차 미해결이다. 그러나 시간 위계 정리(time hierarchy theorem)와 공간 위계 정리(space hierarchy theorem)는 단 하나의 확실한 분리를 우리에게 선물한다. 충분히 큰 격차가 있으면 자원을 더 주는 쪽이 진짜로 더 많은 것을 한다는 사실이다.

특히 공간 위계 정리는 PSPACE ⊊ EXPSPACE를 직접 보여 준다. 다시 말해, 다항 공간으로는 절대로 풀 수 없지만 지수 공간으로는 풀리는 언어가 자연 속에 존재한다. 위계 정리는 보통 대각선화로 만든 인공적 언어를 분리 증인으로 사용하는데, 이 강의의 첫 번째 목표는 그 추상적 분리를 구체적 자연 문제에 끼워 넣는 것이다.

정리 22.1 (공간 위계). f, g가 공간 구성 가능(space-constructible)이고 f(n) = o(g(n))이면 SPACE(f(n)) ⊊ SPACE(g(n)). 따라서 PSPACE = ∪k SPACE(nk)는 SPACE(2n)의 진부분 집합이고, 결과적으로 EXPSPACE를 진부분 집합으로 가진다.

2. EQREX↑: 다항 공간으로는 도달할 수 없는 자연 문제

정규 표현식의 표준 연산자 집합 ∪, ·, ∗에 더해서 제곱 연산자 ↑를 추가하자. 식 R↑은 R · R, 즉 R을 두 번 이어 붙인 것을 줄여 쓴 것이다. 이런 확장 정규 표현식 두 개가 같은 언어를 나타내는지 묻는 문제를 다음과 같이 정의한다.

정의 22.2. EQREX↑ = { ⟨R, S⟩ : R, S는 ↑를 허용한 정규 표현식이고 L(R) = L(S) }.

제곱 연산자는 사소해 보이지만, 식 ((R↑)↑)↑ … ↑는 R을 2k번 이어 붙인 식과 동치다. 즉 ↑는 길이 n짜리 입력으로 길이 2n까지의 문자열을 다루는 표현력을 끌어올린다. 이 폭발적 표현력 덕분에 EQREX↑은 EXPSPACE 안에서 해결되지만 — 표준 동치성 검사를 지수 크기 NFA에 대해 시뮬레이션 — PSPACE로는 절대 잡히지 않는다.

정리 22.3 (Meyer–Stockmeyer 풍). EQREX↑은 EXPSPACE-완전이다. 따라서 EQREX↑ ∉ PSPACE.

증명의 골자는 임의의 EXPSPACE 기계 M의 계산 이력을 길이 2p(n)짜리 정규 표현식 두 개로 인코딩한 뒤, "M이 수락한다"는 사실이 "이 두 식이 다른 언어를 나타낸다"와 동치임을 보이는 다항 시간 환원이다. 위계 정리가 EXPSPACE에 의해 PSPACE 바깥에 있는 무언가를 보장하므로, EXPSPACE-완전 문제는 자동으로 PSPACE-바깥이 된다. 우리는 비로소 "구체적이고 자연스러운, 그러나 다항 공간으로는 절대 못 푸는" 문제를 손에 쥔 것이다.

↑는 작은 사치처럼 보이지만, 표현식 길이 절약이 곧 검증의 어려움이다. 압축은 항상 대가를 치른다. 이것이 복잡도 이론이 우리에게 가르치는 가장 정직한 교훈이다.

3. 신탁 튜링 기계의 정의

이제 시점을 바꿔, 우리가 어려운 문제를 해결한 마법 동전을 가지고 있다고 가정하자. 그 동전의 이름이 신탁(oracle)이다.

정의 22.4. 언어 A ⊆ Σ에 대한 신탁 튜링 기계 MA는 일반 작업 테이프와 별도의 질의 테이프, 그리고 세 개의 특수 상태 q?, qYES, qNO를 가진 TM이다. 기계가 q?로 진입하면 단위 시간에 질의 테이프 위 문자열 w가 A에 속하면 qYES로, 아니면 qNO로 옮겨 간다.

신탁은 결과만을 알려 주지 그 결과를 어떻게 얻었는지는 절대 말하지 않는다. 신탁의 능력은 자원 측정에서 무료다. 따라서 PA는 "A를 단위 시간에 묻는 다항 시간 결정 TM이 결정하는 언어들의 집합"이고, NPA는 같은 비결정 변종이다.

A = SAT라면 PSAT는 사실상 NP-어려움까지 단번에 해결할 능력을 얻는다. 그래서 PSAT ⊇ NP ∪ coNP가 즉시 따라온다. 사실 PSAT = Δ2p로, 다항 위계의 둘째 층이다.

4. Baker–Gill–Solovay 정리

신탁의 진짜 매력은 P 대 NP 문제를 우회적으로 살펴보게 해 준다는 데 있다. 1975년 Baker, Gill, Solovay는 다음의 충격적 사실을 증명했다.

정리 22.5 (Baker–Gill–Solovay). 다음을 만족하는 신탁 A, B가 존재한다.
  1. PA = NPA.
  2. PB ≠ NPB.
증명 스케치. 두 부분을 나누어 짓는다.

A의 구성. A를 임의의 PSPACE-완전 언어, 예를 들어 TQBF로 잡자. 그러면 PA의 모든 기계는 다항 시간에 PSPACE 신탁을 호출할 수 있으니 PA ⊆ PSPACE이다. 또한 PSPACE는 자기 자신을 단위 시간에 풀 수 있으므로 PSPACE ⊆ PA. 같은 논리가 비결정 모델에도 적용되어 NPA = PSPACE. 따라서 PA = NPA = PSPACE.

B의 구성. 언어 LB = { 1n : 길이 n인 어떤 문자열이 B에 속한다 }을 보자. LB는 명백히 NPB이다 — 비결정 기계가 길이 n 문자열을 추측해 신탁에 질의하면 끝. 우리가 해야 할 일은 어느 P-기계 MiB도 LB를 결정하지 못하도록 B를 짓는 것이다. 다항 시간 결정 기계의 표준 열거 M1, M2, …를 잡고, 각 단계에서 Mi의 시간 한계 ni < 2n이 보장되도록 충분히 큰 n을 고른다. MiB(1n)을 시뮬레이션하며 그 기계가 묻는 모든 질의를 기록한 뒤, 답을 우리 마음대로 정한다. 기계가 1n을 수락하면 B에 길이 n인 문자열을 하나도 넣지 않고, 거절하면 묻지 않은 길이 n 문자열 하나를 B에 추가한다. 시간 한계 ni가 2n보다 작으니 항상 묻지 않은 문자열이 남는다. 이렇게 대각선화된 B는 어느 Mi도 LB를 결정하지 못함을 강제한다. 따라서 LB ∈ NPB ∖ PB.

5. 함의: 상대화 장벽

왜 이 정리가 그토록 큰 무게를 가지는가? 우리가 P 대 NP를 푸는 데 사용해 온 거의 모든 도구 — 시뮬레이션, 대각선화, 환원 — 는 "신탁을 그냥 통과해 적용된다"는 의미에서 상대화(relativizing)된다. 만약 어떤 증명이 P = NP를 보였다면, 그 증명을 신탁 B에 넣어도 같은 결론이 나와야 한다. 그런데 PB ≠ NPB! 따라서 P = NP는 상대화 가능한 기법으론 절대 증명될 수 없다. 마찬가지로 P ≠ NP의 증명은 신탁 A에 적용했을 때 PA ≠ NPA를 강제할 텐데, 우리는 PA = NPA를 보았다. 즉 양쪽 결론 모두 상대화 기법의 사거리 밖에 있다.

이 정리는 1975년에 등장해 복잡도 이론자들의 야심을 25년 동안 짓눌렀다. 1990년대에 Razborov와 Rudich가 또 다른 장벽인 natural proofs를 발견했고, 이어 Aaronson–Wigderson이 algebrization 장벽을 추가했다. P 대 NP는 단순히 어렵다기보다, 우리가 생각해 낼 수 있는 거의 모든 종류의 증명에 대해 면역이다.

6. 다음 강의 예고

상대화의 그늘에서 벗어나는 한 가지 길은 우연을 도구로 끌어들이는 것이다. 결정적 시뮬레이션이 아닌 동전 던지기로 푸는 문제 — 이 무작위 계산이 다음 강의 BPP의 무대다. 신탁이 가능성에 대한 사고 실험이라면, 무작위성은 그 실험을 실제로 수행하는 알고리즘이다.

강의 23

확률적 계산과 BPP

동전을 굴려 답하기, 그리고 그 답을 신뢰하기

1. 결정성을 포기한 대가

지금까지 우리가 다룬 모든 모델은, 비결정성을 포함하더라도, "옳은 답"이라는 단일 진리치에 매달려 있었다. 이번 강의에서는 그 진리치를 살짝 흔든다. 알고리즘에게 동전을 쥐여 주고, 답이 틀릴 가능성을 작게나마 허용하자. 놀랍게도 이 사소해 보이는 양보가 그래프, 정수론, 행렬, 부울 함수 등 많은 영역에서 결정적 알고리즘으로는 흉내 내기 어려운 효율을 가져온다.

정의 23.1 (확률적 TM). 확률적 튜링 기계(probabilistic TM, PTM)는 두 개의 전이 함수 δ0, δ1을 가지며 각 단계에서 공정한 동전을 던져 어느 함수를 적용할지 정한다. 입력 x에 대한 수락 확률은 동전 시퀀스에 대한 균등 분포 아래에서 기계가 수락 상태로 끝날 확률 Pr[M(x) accepts]이다.

같은 입력에 대해 같은 기계가 시도 때마다 다른 답을 줄 수 있다는 것이 핵심이다. 그러므로 우리가 해야 할 일은 이 변덕을 제어하는 정의를 세우는 것이다. 가장 자연스러운 후보는 다음의 양면 오류(two-sided error) 모델이다.

2. BPP의 정의

정의 23.2. 언어 L이 BPP (Bounded-error Probabilistic Polynomial time)에 속한다는 것은, 다항 시간에 동작하는 PTM M이 존재해 다음을 만족함을 뜻한다.
  • x ∈ L ⇒ Pr[M(x) accepts] ≥ 2/3.
  • x ∉ L ⇒ Pr[M(x) accepts] ≤ 1/3.

2/3과 1/3 사이의 간격은 신중하게 설정된 신호대잡음비(signal-to-noise ratio)다. 만약 두 임계값이 1/2의 양옆이 아니라 1/2 위아래로 임의로 가까우면, 다수결 증폭을 통한 신뢰도 향상이 망가진다. 그러나 일단 1/3 만큼이라도 떨어져 있으면, 우리는 이 간격을 천문학적으로 벌릴 수 있다.

3. 오차 증폭과 체르노프 한계

같은 PTM M을 독립적으로 k번 실행해 다수결을 취하자. 각 실행은 정답에 한 표를 던지는 베르누이 변수와 같다. 정답률이 2/3이면 평균은 2k/3, 거짓 답을 다수결이 채택하려면 평균에서 k/6만큼 어긋나야 한다. 체르노프 한계(Chernoff bound)는 이런 큰 일탈의 확률이 지수적으로 작음을 보장한다.

정리 23.3 (BPP 증폭). L ∈ BPP이고 다항식 p(n)이 주어지면, 어느 다항식 q(n)에 대해서도 오류 확률을 2−q(n) 이하로 만드는 다항 시간 PTM M'가 존재한다. 구체적으로 M을 k = Θ(q(n)) 번 독립 시행 후 다수결.
증명 스케치. 각 실행이 옳을 확률을 p ≥ 2/3로 두고 Xi를 i번째 시행의 지표 변수, X = ∑Xi라 하자. E[X] ≥ 2k/3. 다수결이 틀리려면 X ≤ k/2, 즉 평균에서 적어도 k/6만큼 어긋나야 한다. 체르노프 한계는 Pr[X − E[X] ≤ −εk] ≤ exp(−2ε²k)를 주므로 ε = 1/6, k = 18 q(n)이면 오류 확률이 e−q(n)/2 ≤ 2−q(n)이 된다.

다시 말해 BPP의 정의에서 "2/3"이 별것 아니다. 1/2 + 1/poly(n)부터 1 − 2−n까지 상수나 다항 만큼 오차 한계를 다양하게 잡아도 같은 클래스다. 무작위 알고리즘의 신뢰도는 무한히 살 수 있는 상품이다.

4. 일면 오류와 영면 오류: RP, coRP, ZPP

오차의 종류에 따라 BPP를 더 엄격하게 좁힐 수 있다.

정의 23.4.
  • RP: 다항 시간 PTM M이 존재해 x ∈ L ⇒ Pr[수락] ≥ 1/2, x ∉ L ⇒ Pr[수락] = 0. (거짓 양성 없음.)
  • coRP: RP의 보집합 — 거짓 음성 없음.
  • ZPP (Zero-error Probabilistic Polynomial time): 기댓값 다항 시간에 항상 정답을 내는 PTM이 존재. 시간이 변할 뿐 답은 결정적.
정리 23.5. ZPP = RP ∩ coRP.

관용적 직관: RP의 기계와 coRP의 기계를 동시에 돌리고, 둘의 답이 일치할 때까지 다시 시도한다. 두 답이 결정적 진실을 끼고 있을 때 일치할 확률은 적어도 1/2이므로 평균 두 번 시행이면 충분하다. 어떤 답이 나오든 그 답은 무조건 옳다.

5. BPP는 어디에 있는가?

BPP를 결정적 클래스로 시뮬레이션하려면 모든 동전 시퀀스를 차례로 시도해 보면 된다. 다항 시간 PTM은 다항 길이의 동전 시퀀스를 사용하므로, 그 모두에 대해 수락/거절을 카운트하면 된다.

정리 23.6. BPP ⊆ PSPACE.
증명 스케치. L ∈ BPP의 PTM M이 입력 x에 대해 t(n) ≤ p(n)개의 동전을 사용한다고 하자. 결정적 기계 M'는 0t(n)부터 1t(n)까지 모든 길이 t(n) 비트열 r을 차례로 만들고, M(x; r)을 시뮬레이션한 결과를 카운터에 누적한다. 카운트가 2t(n)의 1/2을 넘으면 수락. 동전 시퀀스 하나를 시뮬레이션하는 데 다항 공간이면 충분하고, 카운터도 t(n) ≤ p(n) 비트면 된다.

역방향 포함 PSPACE ⊆ BPP에 대해서는 아무도 모른다. P ⊆ BPP ⊆ PSPACE라는 거대한 띠 안에서 BPP의 정확한 위치는 미해결 문제다.

6. Schwartz–Zippel과 다항식 동등성 검사

BPP의 위력을 가장 우아하게 보여 주는 예가 다항식 동등성(polynomial identity testing, PIT)이다. 두 다항식이 같은지 묻는 문제는 — 식이 산술 회로로 압축되어 주어지면 — 결정적으로 폭발할 수 있다. 그러나 Schwartz–Zippel 보조정리는 단숨에 우리를 구한다.

보조정리 23.7 (Schwartz–Zippel). p(x1, …, xn)이 영이 아닌 전차수 d 다항식이고 S ⊆ 𝔽가 유한 부분집합이면, Sn에서 균등하게 뽑은 점 (a1, …, an)에 대해 Pr[p(a1, …, an) = 0] ≤ d / |S|.
예제. 두 회로 C1, C2가 같은 다항식을 계산하는지 묻기. p = C1 − C2를 |S| ≥ 2d인 S에서 무작위로 평가한다. p ≡ 0이면 항상 0, 아니면 적어도 1/2 확률로 0이 아니다. 이 알고리즘은 거짓 양성(같지 않은데 같다고 보고)이 있을 수 있고 거짓 음성은 없으므로 PIT ∈ coRP. 결정적 다항 시간 알고리즘은 — 회로 모델에서는 — 알려져 있지 않다.

7. Miller–Rabin과 PRIMES

현실 세계에서 BPP의 가장 빛나는 사례는 소수 판별이었다. Miller–Rabin 검사는 페르마 소정리와 비자명 제곱근의 부재를 무작위로 검증해, 합성수를 확률 1/4 이상으로 잡아낸다. k번 반복하면 거짓 양성 확률이 4−k로 떨어진다. 이는 PRIMES ∈ coRP를 보장한다.

그런데 2002년 Agrawal–Kayal–Saxena가 결정적 다항 시간 알고리즘 AKS로 PRIMES ∈ P를 증명했다. 이 사건은 BPP에 대한 우리의 시야를 넓혔다 — 어쩌면 모든 BPP 문제가 결국 P 안에 있을지도 모른다는 추측, 즉 P = BPP가 더 그럴듯해 보이게 만든 사건이었다. 다음 강의에서 이 추측의 토대를 살펴본다.

8. 정리

이번 강의에서 우리는 동전을 손에 쥔 알고리즘을 형식화하고, 그 신뢰도를 무한히 끌어올릴 수 있음을 체르노프 한계로 확인했다. RP, coRP, ZPP가 BPP 안에 박혀 있고, 모두 PSPACE 아래에 있다. PIT와 PRIMES는 무작위성이 결정성보다 본질적으로 더 강한지, 아니면 단지 우리의 분석이 미흡한지에 대한 질문을 우리에게 던진다. 이 질문이 다음 강의의 출발점이다.

강의 24

확률적 계산 (계속)

BPP는 정말로 P보다 강한가, 아니면 우리가 게으른 것인가

1. BPP를 가두는 다항 위계

지난 강의에서 BPP ⊆ PSPACE를 보았지만, 이 한계는 너무 헐렁하다. PSPACE는 우주의 컴퓨팅 자원을 모두 모아도 풀 수 없는 거인들을 잔뜩 품고 있는 클래스이고, BPP는 우리가 매일 굴리는 무작위 알고리즘들의 집이다. 더 정밀한 한계가 필요하다. 그것이 1983년 Sipser와 Gács, 그리고 Lautemann이 독립적으로 증명한 다음 정리다.

정리 24.1 (Sipser–Gács–Lautemann). BPP ⊆ Σ2p ∩ Π2p.

이 결과의 묘미는 무작위성이라는 양적인 자원을 ∃와 ∀라는 논리적인 자원으로 환산해 낸다는 데 있다. 직관은 다음과 같다. L ∈ BPP에 대한 PTM M의 동전 시퀀스 r은 길이 m = poly(n)의 비트열이다. 입력 x ∈ L에 대한 "수락 동전 집합" Ax = { r : M(x; r) accepts }는 {0, 1}m의 적어도 99%를 차지하도록 증폭할 수 있고, x ∉ L이면 1% 이하다.

이제 비결정적 ∃∀ 한 쌍을 다음처럼 설계한다. 충분히 큰 t = m + 1에 대해, 비트열 t-튜플 (s1, …, st)이 주어지면 "이 t개의 시프트로 Ax의 평행이동 합집합이 {0, 1}m 전체를 덮는다"는 술어를 본다. Ax가 거대하면 적당한 (s1, …, st)이 존재해 모든 r ∈ {0, 1}m에 대해 어떤 i가 있어 M(x; r ⊕ si)이 수락한다. 반대로 Ax가 작으면, 어떤 t-튜플로도 덮을 수 없는 r이 항상 존재한다.

증명 스케치. 증폭으로 오류 확률을 2−m까지 떨어뜨려 두자. x ∈ L 사례에서는 ∃ s1, …, st ∈ {0, 1}m 가 존재해 ∀ r ∈ {0, 1}m 어떤 i에 대해 M(x; r ⊕ si)이 수락하도록 만들 수 있다 — 이 t-튜플의 존재는 확률적 논증으로 증명된다. x ∉ L 사례에서는 |Ax|가 너무 작아 어떤 t-튜플도 {0, 1}m을 덮을 수 없다. 이 술어는 정확히 Σ2p 형식이고, BPP가 보집합에 대해 닫혀 있으므로 Π2p도 자동.

이 결과의 한 가지 그림 같은 함의: P = NP라면 다항 위계 전체가 P로 무너지고, 따라서 BPP ⊆ P. 즉 P 대 NP 추측은 무작위성의 가치 추측까지 동시에 결정한다.

2. BPP = P 추측과 의사난수성

현재의 압도적 추측은 BPP = P이다. 즉 모든 무작위 알고리즘은 (다항 시간 추가 비용으로) 결정성으로 환원될 수 있다는 것이다. 이 추측의 진지한 근거는 의사난수 생성기(pseudo-random generator, PRG)의 존재다.

정의 24.2. 함수 G: {0, 1}s(n) → {0, 1}n이 (시간 t(n), 오차 ε(n))-PRG라는 것은, 시간 t(n) 안에 동작하는 모든 회로 C에 대해 |Pr[C(G(Us(n))) = 1] − Pr[C(Un) = 1]| < ε(n) 임을 뜻한다.

좋은 PRG가 있다면 BPP 알고리즘의 동전 m비트를 G의 시드 s(n) ≪ m비트로 대체한 뒤, 모든 시드를 결정적으로 시도하면 된다. 시뮬레이션 비용은 2s(n)·poly(n)인데, 충분히 강한 회로 가정 — 예컨대 SAT가 지수적 회로를 요구한다 — 아래에서 s(n) = O(log n)인 PRG가 존재하므로 결정적 다항 시간 시뮬레이션이 가능해진다. Impagliazzo–Wigderson(1997)은 이러한 가정 아래 BPP = P를 증명했다. 무작위성은, 따라서, 단순히 "쉬운 문제 X 어려운 회로 가정"으로 환산되는 자원이다.

3. Adleman 정리와 비균일 조언

다른 방향에서 BPP의 결정화를 시도하자. 시간 자원만으로는 어렵다면, 비균일 조언을 허락하면 어떨까?

정리 24.3 (Adleman). BPP ⊆ P/poly.
증명 스케치. L ∈ BPP의 PTM M을 증폭해 길이 n 입력에 대한 오류 확률이 2−n−1이 되도록 하자. 길이 n 입력은 정확히 2n개. 무작위 동전 r ∈ {0, 1}m에 대해 M(x; r)이 x ∈ L의 멤버십과 어긋날 확률은 ≤ 2−n−1. 길이 n 입력 모두에 대한 합집합 한계로 Prr[∃x : M(x; r)이 틀림] ≤ 2n · 2−n−1 = 1/2 < 1.

따라서 길이 n의 모든 입력에 동시에 옳은 답을 주는 동전 시퀀스 rn이 적어도 하나 존재한다. 이 rn을 길이 n 입력에 대한 다항 길이 조언 문자열로 사용하면, 결정적 다항 시간 회로(혹은 조언 받는 TM)가 L을 결정한다. 즉 BPP는 비균일 모델에서는 다항 회로의 위력을 넘지 못한다.

Adleman 증명은 카운팅 논증(probabilistic method)의 정수다. 좋은 조언이 어떻게 생겼는지는 모른다. 다만 그것이 존재함을 동전 평균을 헤아려 안다. 알고리즘 설계와 존재 증명 사이의 간극이 가장 좁아지는 순간.

4. 무작위 환원과 RP-완전성

결정성 환원 ≤p를 무작위로 일반화한 것이 무작위 다항 시간 환원 ≤r이다. A ≤r B란, A의 멤버십을 답하는 다항 시간 PTM이 존재해 B에 대한 단일 질의로 답하되 양측 오류가 1/3 이하라는 뜻이다. RP-완전, BPP-완전 같은 개념이 정의될 수 있지만, BPP가 자기-환원과 잘 어울리는 promise 클래스인 탓에 BPP-완전 언어는 표준적인 의미에서 존재하지 않는다 — 이는 BPP가 syntactic 클래스가 아니라 semantic 클래스임을 보여 주는 미묘한 사실이다.

5. 그래프 비동형성: BPP의 자연스러운 거주민

BPP의 자연 예제 중 가장 사랑받는 것은 그래프 비동형성(GRAPH NON-ISOMORPHISM, GNI)이다.

예제. 두 그래프 G1, G2가 동형이 아닌지 묻기. 직관적으로 BPP/IP 알고리즘을 짤 수 있다 — 다음 강의에서 IP 버전을 자세히 살피겠지만, BPP 자체로는 GNI를 풀 결정적 다항 시간 알고리즘은 알려져 있지 않다. 두 그래프가 동형이라면, "G1의 무작위 순열"과 "G2의 무작위 순열"이 같은 분포를 만들고, 동형이 아니면 두 분포가 0-교집합이다 — 이런 통계적 차이를 무작위성으로 검출할 수 있다.
그러나 그래프 동형성(GI) 자체는 한 번 더 놀라운 운명을 맞이했다. 1979년부터 GI는 NP에 속하지만 NP-완전이라는 증거도 없고 P에도 속한다는 증거도 없는 미궁의 문제였다. 2015년 László Babai가 GI에 대한 quasi-다항 시간(2polylog n) 알고리즘을 발표하면서 이 미궁의 벽이 결정적으로 무너졌다. 동형성은 거의 다항이고, 비동형성도 본질적으로 같이 거의 다항이다. BPP의 자연 예제로 GNI를 들고 다니던 우리에게는 아쉬운 사건이지만, 이 분야의 활기를 보여 주는 가장 신선한 결과이기도 하다.

6. 다음 강의 예고

지금까지 우리는 검증자가 무작위성을 사용하되 외부와 상호작용하지 않는 모델을 다뤘다. 검증자가 동전을 가지고 무한 능력의 증명자와 대화를 나누면 어떤 일이 벌어지는가? 이 단순한 한 가지 변화가 PSPACE 전체를 검증 가능 클래스로 끌어올린다. 다음 강의에서 등장하는 IP, 상호작용 증명 시스템이 그 무대다. 우리는 NP의 정적 인증서가 무작위성을 만났을 때 어떻게 살아 움직이는지를 본다.

강의 25

상호작용 증명 시스템(Interactive Proof Systems, IP)

검증자에게 동전과 대화를 동시에 쥐여 주면

1. NP의 한계, 그리고 그 너머

NP를 다시 떠올려 보자. 검증자 V는 다항 시간 결정 TM이고, 증명자가 보낸 단 하나의 인증서 w를 읽고 수락 또는 거절한다. V는 동전도 없고 P와 두 번째 메시지를 주고받지도 않는다. 이 정적 모델은 우아하지만, 매우 경직되어 있다. SAT 같은 문제는 잘 다루지만, "어떤 조건이 성립하지 않는다"는 종류의 진술 — coNP — 에 대해서는 짧은 인증서를 일반적으로 알지 못한다.

이 강의에서 우리는 검증자에게 두 가지 새로운 자원을 동시에 준다. 첫째, 무작위 동전. 둘째, 증명자와의 다항 라운드 대화. 그 결과 클래스가 IP다. 놀랍게도 IP는 NP보다 단순히 큰 정도가 아니라, PSPACE 전체와 같다(다음 강의에서 증명). 우선 정의부터.

2. IP의 형식적 정의

정의 25.1 (상호작용 증명 시스템). 언어 L이 IP에 속한다는 것은, 다항 시간에 동작하는 확률적 검증자 V와 무한 계산 능력을 가진 증명자 P가 존재해 둘이 다항 라운드의 메시지를 주고받으며, 다음 두 조건을 만족함을 뜻한다.
  • 완전성(completeness): x ∈ L이면 어떤 P가 존재해 Pr[V가 수락] ≥ 2/3.
  • 건전성(soundness): x ∉ L이면 모든 (악의적) P̃에 대해 Pr[V가 수락] ≤ 1/3.
라운드 수와 메시지 길이는 |x|에 대해 다항.

NP의 두 변경점이 모두 결정적이다. V의 동전은 P가 모르는 무작위성을 V에게 주고, 다항 라운드의 대화는 V가 P의 답에 따라 다음 도전을 적응적으로 만들 수 있게 한다. P가 무한 능력이라는 가정 — 결국 어떤 PSPACE 문제도 풀어 줄 수 있다 — 도 핵심이다. P는 진실을 알고 있고, V는 그 진실을 검증하기만 하면 된다.

완전성/건전성의 1/3과 2/3은 BPP에서처럼 증폭으로 1 − 2−n 수준까지 끌어올릴 수 있다. 같은 프로토콜을 독립적으로 여러 번 평행 또는 직렬로 돌려 다수결을 취하면 된다. 단 평행 반복이 건전성을 항상 보존하지는 않는다는 미묘함은 다항 라운드 IP의 분석에서 중요한 주제다.

3. NP ⊆ IP는 자명하다

정리 25.2. NP ⊆ IP.
증명. L ∈ NP의 검증자 VNP를 생각하자. IP 프로토콜에서 P는 첫 라운드에 인증서 w를 보내고, V는 VNP(x, w)를 결정적으로 시뮬레이션한다. 동전을 단 한 번도 던지지 않아도 완전성 1, 건전성 0이 성립한다. 따라서 L ∈ IP.

그렇다면 IP의 진짜 위력은 어디서 오는가? coNP 같은 클래스에서 온다. 다음 절의 예제는 IP가 단순히 NP를 흉내 내는 것이 아니라, 짧은 인증서가 알려져 있지 않은 문제까지 검증할 수 있음을 보여 주는 고전이다.

4. 그래프 비동형성 ∈ IP

두 그래프 G1 = (V, E1), G2 = (V, E2)가 주어졌을 때 동형이 아니라는 것을 어떻게 짧게 증명할 것인가? 동형이라는 사실에는 짧은 인증서(순열)가 있지만, 동형이 아니라는 사실에는 자연스러운 짧은 인증서가 없다. 그러나 다음 IP 프로토콜은 단 두 라운드로 GNI를 검증한다.

정리 25.3. GRAPH NON-ISOMORPHISM ∈ IP.
프로토콜.
  1. V의 도전. V는 b ∈ {1, 2}를 균등하게 무작위로 뽑고, 정점 순열 π를 균등하게 무작위로 뽑은 뒤 H = π(Gb)를 P에게 보낸다.
  2. P의 답. P는 H가 G1과 G2 중 어느 쪽에서 만들어졌는지 추측해 b' ∈ {1, 2}를 보낸다.
  3. V의 결정. b = b'이면 V가 수락, 아니면 거절.

완전성. G1 ≇ G2이면 H의 동형류는 Gb의 동형류와 같다. 무한 능력의 P는 H의 동형류를 결정해 b를 정확히 맞힌다. 따라서 Pr[수락] = 1.

건전성. G1 ≅ G2이면 H의 분포는 b의 값과 무관하게 같다 — π가 균등 순열이고 G1 ≅ G2면 π(G1)의 분포 = π(G2)의 분포. P̃는 H만 보고 b를 정보 이론적으로 알 수 없으므로 어떤 전략으로도 Pr[b = b'] ≤ 1/2.

건전성 1/2은 우리 정의의 1/3을 살짝 넘지만, 두 번 독립 시행 후 둘 다 맞을 때만 수락하면 1/4로 떨어진다. 적당한 반복으로 1/3 이하 보장.

5. 왜 무작위성이 핵심인가

위 프로토콜에서 V의 동전 b와 π를 P가 미리 알고 있다고 상상해 보자. 그러면 P는 H를 받기도 전에 b'를 정확히 답할 수 있다. 건전성은 즉시 무너진다. 즉 V의 동전이 P에게 비밀로 남아 있어야만 P가 속이지 못한다. 이런 의미에서 IP에서 무작위성은 단순한 효율 도구가 아니라 안전 메커니즘이다.

또 다른 시각으로 말하자면, V의 동전은 P를 시험하기 위한 동적 도전을 무한히 생성하는 엔진이다. 정적 NP 인증서가 한 번의 시험이라면, IP는 P를 매번 새로운 무작위 도전 앞에 세우는 면접관의 역할을 V에게 부여한다.

6. Arthur–Merlin과 공개 동전 모델

IP의 동전은 V에게 비밀이다. 동전을 모두 공개하는 변종 — 공개 동전 모델 — 도 자연스러운 정의를 낳는다. 이를 Arthur–Merlin 게임이라 한다. Arthur(V)가 매 라운드 동전을 던져 그 결과를 그대로 메시지로 보내고, Merlin(P)이 응답한다.

정의 25.4. AM[k]는 Arthur–Merlin 프로토콜에서 k 라운드를 사용하는 클래스다. 가장 중요한 두 사례:
  • MA = Merlin이 먼저, Arthur가 나중. 사실상 NP에 무작위 V를 결합한 형태.
  • AM = Arthur가 먼저(동전을 보냄), Merlin이 나중. AM[2].
정리 25.5 (Goldwasser–Sipser, 1986). IP[k] ⊆ AM[k+2]. 따라서 다항 라운드에 대한 IP와 AM은 동치이며, 비밀 동전 모델은 공개 동전 모델로 효율 손실 없이 환원될 수 있다.

이 정리의 직관: V가 비밀 동전을 사용한다면, V는 동전 시퀀스의 분포가 자기 메시지에 대해 충분히 균등함을 P에게 통계적으로 증명할 수 있다. 비밀스러움은 전체 클래스의 표현력에 영향을 주지 않는, 다소 외형적인 차이임이 드러난다. 단, 라운드 수가 상수일 때는 AM[k]의 위계가 특정 깊이에서 무너진다 — AM[2] = AM[k] for any constant k ≥ 2 — 라는 부수적 사실도 유명하다.

Goldwasser와 Sipser의 결과는 직관에 반한다. "V가 동전을 숨기는 것이 P를 속이지 못하게 하는 핵심"이라고 우리가 5절에서 강조했는데, 정리 25.5는 그 비밀스러움을 그냥 포기해도 클래스 자체는 안 변한다고 말한다. 차이는 프로토콜 설계의 우아함에 있을 뿐, 표현력에 있지 않다는 것이다.

7. 다음 강의 예고

지금까지 우리는 IP의 정의와 첫 비자명한 거주민 GNI를 보았다. 다음 강의에서 우리는 더 야심찬 목표 — coNP ⊆ IP — 을 LFKN의 산술화 기법과 SUM-CHECK 프로토콜로 직접 증명한다. 그리고 이 기법이 전부 PSPACE까지 확장될 때 IP = PSPACE라는 1992년의 대정리에 도달한다. NP의 좁은 정적 모델을 떠난 우리는, 검증의 한계가 사실은 PSPACE만큼 멀다는 것을 보게 된다.

강의 26

coNP ⊆ IP, 그리고 IP = PSPACE

산술화와 SUM-CHECK, 그리고 한 학기의 결산

1. 마지막 산

지난 강의에서 우리는 GNI ∈ IP를 통해 IP가 NP를 진정으로 넘어선다는 첫 증거를 보았다. 이번 강의의 목표는 훨씬 더 멀다.

대정리 26.1 (Shamir, 1992; LFKN, 1990). IP = PSPACE.

한 방향 IP ⊆ PSPACE는 비교적 쉽다 — V의 결정과 P의 최적 메시지를 다항 공간 안에서 게임 트리 탐색으로 시뮬레이션할 수 있다. 어려운 방향은 PSPACE ⊆ IP. 이 강의에서는 그 출발점이자 핵심 기법을 다 보여 주는 부분 — coNP ⊆ IP — 를 자세히 살펴본 뒤, 그 기법이 PSPACE 전체로 확장되는 모습을 스케치한다. 출발 도구는 1990년 Lund–Fortnow–Karloff–Nisan(LFKN)이 도입한 산술화(arithmetization)다.

2. #SAT와 산술화

UNSAT — 부울 식 φ가 충족 불가능한가? — 는 coNP-완전이다. 우리는 이를 더 일반적인 카운팅 문제 #SAT로 환원해 다룬다.

정의 26.2. #SAT은 입력 ⟨φ, k⟩에 대해 부울 식 φ의 충족 할당 수가 정확히 k인지 묻는 문제다. UNSAT은 ⟨φ, 0⟩-사례에 해당.

산술화의 핵심. 부울 식 φ(x1, …, xn)을 변수가 정수 또는 유한체 𝔽p 위의 값을 가질 수 있는 다변수 다항식 fφ로 바꾼다. 변환 규칙은 다음처럼 기계적이다.

  • 변수 x → x.
  • ¬x → 1 − x.
  • x ∧ y → x · y.
  • x ∨ y → x + y − xy. (즉 1 − (1−x)(1−y).)

이 변환은 부울 입력 (b1, …, bn) ∈ {0, 1}n에 대해 fφ(b1, …, bn) = [φ(b1, …, bn) = 참] 를 보장한다. 따라서 충족 할당 수는

#φ = ∑x1 ∈ {0,1}x2 ∈ {0,1} ⋯ ∑xn ∈ {0,1} fφ(x1, …, xn).

UNSAT은 #φ = 0이라는 주장과 동치다. 이로써 부울 만족 문제는 다변수 다항식 위 합의 값에 대한 주장으로 환산된다. 다항식의 차수는 φ 길이에 대해 다항이다 — 정확히 절(節) 수에 비례. 이 다항식 표현은 작은 일탈에도 민감해서, 무작위 한 점에서의 평가가 전체를 식별하는 강력한 지표가 된다(Schwartz–Zippel).

3. SUM-CHECK 프로토콜

이제 IP 프로토콜을 설계해, 다항 시간 V가 P의 도움으로 ∑x ∈ {0,1}n f(x) = K 라는 주장을 검증하게 만들자. 작업장은 충분히 큰 유한체 𝔽 = 𝔽p이고, p는 충족 할당 수의 상한 2n보다 훨씬 큰 소수로 잡는다(예 p = 23n).

핵심 발상: P가 한 번에 모든 변수의 합을 V에게 증명할 수 없으니, 변수 하나를 다항식으로 풀어 V에게 보내고 V가 무작위 점 r을 골라 한 변수씩 제거해 가는 라운드 기반 검증.

SUM-CHECK 프로토콜.
  1. 주장. P는 K = ∑x ∈ {0,1}n f(x) 임을 V에게 주장한다. V는 K를 메모.
  2. 라운드 i = 1, …, n.
    • P는 일변수 다항식 gi(z) := ∑xi+1, …, xn ∈ {0,1} f(r1, …, ri−1, z, xi+1, …, xn) 를 V에게 보낸다.
    • V는 두 가지를 검사: (a) deg(gi) ≤ degi(f); (b) gi(0) + gi(1) = Ki−1 (이전 라운드의 약속, K0 := K). 둘 중 하나라도 어긋나면 즉시 거절.
    • V는 ri ∈ 𝔽를 균등하게 무작위로 뽑아 P에게 보낸다. 새 약속 Ki := gi(ri).
  3. 마지막 검증. n 라운드 후 V는 f(r1, …, rn)을 직접 평가하고 Kn과 비교한다. 일치하면 수락, 아니면 거절.

완전성. #φ가 진짜로 K이면 정직한 P는 매 라운드의 정확한 gi를 보낼 수 있고, 모든 등식이 성립해 V는 항상 수락. 마지막 평가도 일치한다.

건전성. 진짜 합이 K가 아닌데 어떤 P̃가 V를 속이려 한다고 하자. 첫 라운드에서 P̃는 진짜 g1와 다른 다항식 g̃1를 보내야 한다 — 안 그러면 g1(0) + g1(1) = K가 거짓을 폭로한다. 그러나 g̃1 ≠ g1은 차수 d1의 두 다항식이 서로 다름을 의미하므로, 무작위 r1에서 두 식이 같을 확률은 d1/|𝔽| 이하(Schwartz–Zippel).

그래서 r1이 "운 좋게" 두 다항식의 일치점을 짚지 않는 이상, 두 번째 라운드의 새 약속 K1 = g̃1(r1)도 진짜와 어긋나 같은 일이 반복된다. 모든 n 라운드를 통과하려면 매 라운드 di/|𝔽| 정도의 운이 필요하다. 합집합 한계로 V가 속을 확률 ≤ ∑i di/|𝔽| ≤ n · d / |𝔽|. |𝔽|를 23n으로 잡으면 이 값은 1/3보다 훨씬 작다.

다시 말해, P̃의 거짓말은 매 라운드 다항식 사이의 격차를 만들고, 그 격차는 무작위 점에서 거의 확실히 검출된다. 한 번 검출된 거짓말은 V의 마지막 직접 평가에서 결정적으로 폭로된다.

4. coNP ⊆ IP

정리 26.3. coNP ⊆ IP.
증명. UNSAT을 #SAT의 K = 0 사례로 환원한 뒤, SUM-CHECK 프로토콜로 V가 ∑ f(x) = 0 주장을 검증한다. 완전성과 건전성은 위에서 확인.

이 결과는 NP가 coNP를 단순히 흉내낼 수 없는 정적 모델임에 비추어 충격적이다. 비대화 NP에서는 UNSAT의 짧은 인증서가 알려져 있지 않은데, 동전 + 다항 라운드의 대화가 있으면 검증이 가능해진다. 이는 다음 강의의 자연스러운 확장으로 이어진다.

5. PSPACE까지의 확장

위 기법을 PSPACE-완전 문제 TQBF로 확장하면 IP = PSPACE의 어려운 방향이 따라온다. TQBF는 ∀x1 ∃x2 … φ(x1, …, xn) 형태의 양화된 부울 식의 진리값을 묻는다. ∃-양화자는 합 ∑로, ∀-양화자는 곱 ∏로 산술화하면 다음 표현을 얻는다.

⟦ψ⟧ = ∑x1 ∈ {0,1}x2 ∈ {0,1} ⋯ fψ(x1, …, xn).

그러나 곱 연산은 다항식의 차수를 입력 길이에 대해 지수적으로 키워 SUM-CHECK의 차수 분석을 망가뜨린다. Shamir의 1992년 핵심 아이디어는 라운드 사이에 축약 연산자(linearization operator) Li를 끼워 넣는 것이다. Li는 변수 xi에 대해 다항식을 강제로 1차로 줄여 두며 — xi ∈ {0, 1}에서의 값에 의해 1차 다항식이 결정되므로 — 차수 폭발을 막아 준다. 이 트릭으로 다항 라운드, 다항 차수의 SUM-CHECK 같은 프로토콜이 TQBF에 적용 가능하고, 결과적으로 PSPACE ⊆ IP. 다른 방향 IP ⊆ PSPACE은 V와 최적 P를 PSPACE 시뮬레이션으로 평가할 수 있다는 사실에서 따라온다. 따라서 두 클래스가 정확히 일치한다.

IP = PSPACE는 발표된 1992년 한 해 안에 완성된 결과는 아니었다. LFKN(1990)이 #P ⊆ IP까지 도달한 뒤 Shamir가 마지막 한 걸음을 내딛었다. 그 사이 코딩이론과 다항식의 무작위 평가, 알고리즘적 합의의 모든 도구가 함께 무르익었다. 무작위성과 대화, 두 가지 단순한 자원이 결정적 검증의 한계를 PSPACE 끝까지 끌어올린 것이다.

6. 한 학기의 결산

한 학기를 한 바퀴 돌아 우리는 다음 풍경을 그렸다. 가장 작은 모델 — 정규 언어, 결정적 유한 오토마타 — 에서 출발해 비결정성과 폐쇄 연산을 거쳐 문맥 자유 문법에 도착했다. 펌핑 보조정리들은 이 작은 모델들의 한계를 드러냈고, 우리는 무한 메모리 — 튜링 기계 — 로 사다리를 한 칸 올랐다. 거기서 결정 가능과 인식 가능이 갈렸고, 정지 문제와 환원의 기술은 결정 불가능성의 지도를 그려 주었다.

그다음 자원의 양을 측정하는 시점으로 돌아와 시간 위계와 공간 위계를 세웠다. P, NP, PSPACE, EXPTIME, EXPSPACE — 그 사이의 거리는 일부 확실하고 일부 미궁이다. 환원과 완전성은 이 미궁 안의 길잡이로, SAT, TQBF, EQREX↑ 같은 자연 문제들에 정확한 어려움의 좌표를 부여했다.

마지막 몇 강의에서 우리는 결정성을 흔들었다. 동전을 던지는 BPP, 다항 위계로 한정되는 BPP의 거주지, 비균일 조언이 흡수하는 무작위성. 그리고 검증자가 동전과 대화를 동시에 가지면 IP = PSPACE라는 거대한 동치까지. 무작위성은 단순한 효율 도구가 아니라 검증의 본질을 바꾸는 자원이었다.

이 한 바퀴의 핵심 메시지는 단 하나다. 계산은 자원으로 잴 수 있고, 그 자원의 종류를 바꿀 때마다 새로운 풍경이 열린다. 시간, 공간, 무작위성, 상호작용, 비균일성 — 우리는 이 다섯을 손에 쥐고 풀 수 있는 것과 풀 수 없는 것의 경계를 매번 조금씩 다시 그렸다. P 대 NP, BPP 대 P, NP 대 PH 같은 미해결 추측들은 이 풍경 안에 빈자리로 남아 있다. 그 빈자리를 메우는 일이, 계산이론을 떠나며 여러분에게 남기는 우리 분야의 손짓이다. 강의는 끝이지만, 질문은 막 시작이다.

또는 j k 로 이동