"이 기계가 이 문자열을 받아들이나요?" — 답할 수 있는 질문들의 카탈로그.
결정 문제(decision problem)란 예/아니오로 답이 떨어지는 질문이다. 우리는 이 질문들을 언어로 인코딩한다. 예컨대 "DFA B가 문자열 w를 수락하는가?"는 다음 언어의 멤버십 문제와 같다.
ADFA = { ⟨B, w⟩ : B는 DFA이고 B가 w를 수락한다 }
여기서 ⟨B, w⟩는 DFA B의 형식적 표현과 입력 w를 한 문자열로 인코딩한 것이다. 어떤 인코딩 규약이든 — 예컨대 상태와 전이 함수를 ASCII 표로 적고 # 같은 구분자로 잇든 — 합리적이기만 하면 결정 가능 여부는 바뀌지 않는다(처치-튜링 명제의 일상적 활용 사례다).
이번 강의의 모든 정리는 같은 골격을 따른다: "어떤 TM이 입력을 받아 알고리즘적 절차를 수행하고 항상 멈추며, 답이 예일 때 정확히 수락한다." 이러한 TM이 존재함을 보이면 해당 언어는 결정 가능(decidable)이다.
이 증명은 거의 무의미해 보일 정도로 평이하다. 그러나 메시지는 분명하다: 유한한 자원만으로 정의되는 모델을 흉내 내는 일은 항상 결정 가능하다. 이 패턴이 이번 강의 절반의 동력이 된다.
EDFA = { ⟨B⟩ : B는 DFA이고 L(B) = ∅ }
DFA가 어떤 문자열도 수락하지 않는다는 것은, 시작 상태에서 어떤 수락 상태에도 도달할 수 없다는 것과 동치이다. 그리고 도달 가능성은 그래프에서 너비 우선 탐색(BFS)이면 된다.
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)로 적는다. 두 언어가 다르면, 한 쪽에는 있고 다른 쪽에는 없는 어떤 문자열이 반드시 존재한다 — 그 문자열이 대칭차에 들어 있다.
ANFA = { ⟨N, w⟩ : N이 w를 수락 }, ENFA = { ⟨N⟩ : L(N) = ∅ }
변환의 비용(상태 수가 지수적으로 폭발할 수 있음)은 결정 가능성에는 영향을 주지 않는다. 결정 가능성은 "유한 시간 안에 답이 나오느냐"의 문제이지 "얼마나 빠르냐"의 문제가 아니다. 후자는 복잡도 이론의 영역이다.
ACFG = { ⟨G, w⟩ : CFG G가 w를 생성 }
여기서 첫 번째 함정이 등장한다. 순진하게 "G가 가능한 모든 유도(derivation)를 시도해보자"고 하면 끝없이 늘어나는 유도가 무한히 많을 수 있어 절차가 멈추지 않는다. 그러나 한 가지 관찰로 문제가 풀린다.
모든 CFG는 같은 언어(필요시 ε 처리만 분리)를 생성하는 어떤 CNF로 알고리즘적으로 변환할 수 있다(보조 변수 도입, 단위 규칙 제거, ε 규칙 제거 단계의 조합). 이제 결정적 사실 하나가 마법을 부린다.
이유는 직관적이다. CNF에서 단말은 "A → a" 규칙으로만 나타나므로 길이 n인 문자열에는 단말 규칙이 정확히 n번 적용된다. 비단말 규칙 "A → BC"는 변수 한 개를 두 개로 늘리므로 변수 수를 1 증가시킨다. 시작 변수 1개에서 출발해 변수 n개까지 늘리려면 정확히 n − 1번 적용되어야 한다. 합치면 (n − 1) + n = 2n − 1.
실용적인 사람들은 단계 3을 그렇게 야만적으로 짜지 않는다. 동적 계획법으로 만든 CYK(Cocke-Younger-Kasami) 알고리즘은 O(n3)시간에 같은 문제를 푼다 — 길이 k의 모든 부분 문자열이 어떤 변수에서 유도되는지를 작은 k부터 채워 올라간다. 결정 가능성을 보이는 데에는 야만적인 나열로 충분하지만, 컴파일러를 짤 때는 CYK 또는 LR(1) 같은 더 빠른 파싱이 등장한다.
ECFG = { ⟨G⟩ : CFG G이고 L(G) = ∅ }
이 문제도 도달 가능성의 변장이다. 다만 이번 그래프는 변수와 규칙의 그래프다.
여기까지 보면 도구를 충분히 갖춘 듯 느껴진다. 그러면 EQCFG = { ⟨G1, G2⟩ : L(G1) = L(G2) }도 같은 트릭으로 풀릴까? 두 문맥 자유 언어의 대칭차도 결정 가능한 비어 있음 검사로 환원할 수 있을까?
아쉽게도 안 된다. 문맥 자유 언어는 합집합과 연쇄에는 닫혀 있지만 교집합과 여집합에는 닫혀 있지 않다. 따라서 대칭차 트릭이 무너진다. 이것은 단순히 우리의 구성이 통하지 않는다는 뜻이지만, 더 깊은 진실은 다음과 같다.
이 정리의 증명은 환원(reduction) 기법을 본격적으로 다룬 뒤에야 가능하다. 한편 모든 문맥 자유 언어가 (CYK가 보여주듯) 결정 가능한 멤버십을 가지므로 EQCFG는 결정 가능 언어 사이의 동치 문제다. 결정 가능 언어 두 개의 동치성마저 일반적으로는 결정 불가능할 수 있다는 사실을 살짝 미리 들고 가자.
지금까지 우리는 결정 가능의 풍요로운 정원을 거닐었다. 거기에는 시뮬레이션, 그래프 탐색, 곱 구성, 정규형 변환 같은 점잖은 도구들이 있었다. 다음 강의 8에서는 정원의 담장을 처음으로 넘는다 — 결정 불가능한 언어가 존재함을, 심지어 우리에게 가장 친숙한 질문 "M이 w를 수락하는가?"가 일반적으로는 알고리즘으로 풀리지 않음을 보일 것이다. 도구는 단 하나, 칸토어의 대각선 논법이다.