**재귀 이론**은 여기로 연결됩니다. 다른 뜻에 대해서는 재귀 이론 (동음이의) 문서를 참고하십시오.
**계산 가능성 이론**(計算可能性理論, 영어: computability theory) 또는 **재귀 이론**(再歸理論, 영어: recursion theory)은 수학기초론의 중요한 분야이자 컴퓨터 과학에서는 계산 이론의 한 갈래이다.

계산 가능성 이론의 기초는 가산 집합 상에서 함수의 해를 찾는 문제와 관련이 있다. 1930년대 불완전성 정리와 함께 람다 대수와 튜링 기계라는 계산 모형이 만들어지면서, 어떤 집합이 효율적으로 계산 가능한지의 문제는 실질적으로 그 집합을 효율적으로 계산해 내는 함수를 만들어 내는 것과 같은 일이 되었다. 계산 가능성 이론의 초기 성과는 이들 집합을 계산적으로 동치인 것들로 묶어 위계로 분류한 것이다. 수학적으로 유한히 정의된 함수를 계산 가능성에 따라 분류했을 때 어떤 함수의 계산 가능성 문제를 다른 함수(다른 함수들)의 문제로 환원할 수 있다는 것을 보임으로써, 굳이 알고리즘 자체를 증명에 끌어들이지 않고도 계산 가능성을 증명할 수 있는 것이다. 이에 따라 대안적인 공리계를 모색하기 위한 이론적 토대가 마련되었고, 수리논리학과 증명론에서 직관주의가 입지를 공고히 했으며, 유형 이론과 고차 논리, 자연 연역, 헤이팅 대수의 비약적 발전에 영향을 주었다.

계산 복잡도 이론에서는 계산 가능한 집합을 그 함수의 해를 찾는 효율적인 알고리즘에 의해 소모되는 시공간적 자원의 추세를 토대로 분류한다. 이에 따라 계산 복잡도 이론과 계산 가능성 이론 중 어느 쪽이 상위의 개념인지에 관해 다소 논쟁이 있다.

소개
--

컴퓨터 과학의 핵심과제는 컴퓨터로 푸는 문제들을 이해하여 연산장치의 한계를 밝히는 것이다. 현대의 연산장치는 거의 무한대의 계산능력을 지닌 것처럼 보인다. 그래서 충분한 시간이 있으면 우리는 어떤 문제든 컴퓨터로 풀 수 있을 거라고 생각하기 쉽다. 그러나 문제가 쉬워 보이고 또 엄청난 자원이 주어졌다고 해도 컴퓨터의 계산능력에는 한계가 있으며 한계성을 증명할 수 있다.

컴퓨터 과학자들은 이 분야를 연구하기 위해 주로 컴퓨터가 다음 문제를 대답할 수 있는지에 역점을 둔다.

형식 언어가 주어지고, 문자열 하나가 있다, 이 문자열이 그 언어의 원소인가?

주어진 언어를 소수(2,3,5,7,11...) 길이의 문자열 집합이라고 정의하자. 그러면 어떤 문자열이 주어진 언어의 원소인지는 주어진 문자열의 길이가 소수인지와 같은 문제가 된다. 다른 예로 회문의 집합이나 'a'로만 이루어진 모든 문자열의 집합 등을 생각할 수 있다. 컴퓨터가 이러한 문제를 다루는 경우는 매우 흔하다.

그렇다면 어떤 관점에서 문제가 어려운지를 판단해야 하는가? 특정한 문제가 컴퓨터로 풀기에 얼마나 난해한지를 어떻게 정의할 것인가? 이러한 물음에 답하는 것이 계산가능성 이론의 목적이다.

계산 모형
-----

계산 가능성 이론의 핵심과제를 풀기 위해서는 먼저 컴퓨터를 정의해야 한다. 계산에 쓰이는 많은 모형중에서도 가장 널리 알려진 모형은 튜링 기계이며 현존하는 가장 강력한 모형이다. 여기에 다음과 같은 다른 형태의 모형도 존재한다.

결정적 유한 상태 기계비교적 간단한 이 계산모형은 결정적 유한 오토마타(deterministic finite automaton, DFA), 간단히 유한 상태 기계로 불린다. 현존하는 모든 연산 장치들은 유한 상태 기계모형으로 설명 가능하다. 유한 상태 기계는 상태, 입출력, 입력에 따른 상태 천이식으로 구성된다. 입력 장치에서 한번에 문자 한개를 전달하면, 현재 상태에 있어서의 상태 천이는 입력에 따라 이루어진다. 만약 입력에 맞는 상태 천이가 존재한다면, 기계는 새로운 상태로 변하게 된다. 일부 상태는 수락(accepting) 상태로 정의되는데, 일련의 입력 끝에서 기계가 수락 상태에 있다면 해당 입력 전체를 수락한다.
내리누름 오토마타정해지지 않은 크기를 가진 실행 스택을 가졌다는 것을 제외하고는 위의 유한 상태 기계와 거의 같다. 상태 천이는 기존의 기능 외에, 부가적으로 스택에 기호(symbol)를 추가하거나 뺄 수 있으며 스택 위의 기호에 따라 다른 상태로 이동할 수도 있다.
튜링 기계입력 방식이 실행 테이프(tape)라는 점을 빼고는 내리누름 오토마타와 유사하다. 실행 테이프는 헤드(head)를 이동시키는 방식으로 읽고 쓰기를 수행하며 무한히 길다. 튜링 기계는 실제 기계와는 달리 유한성을 고려하지 않지만 컴퓨터 과학에서 가장 중요한 계산 모형이다.

계산모형의 계산능력
----------

앞서 말한 계산 모형들이 어떤 종류의 형식 언어를 표현할 수 있는지에 따라 각 모형의 한계를 알 수 있다.

### 유한상태기계의 계산능력

컴퓨터 과학자들은 유한 상태 기계 모형을 만족하는 기계가 받아들일 수 있는 언어를 정규 언어라 한다. 유한 상태 기계에서 가능한 상태는 유한개이다. 따라서 어떤 언어가 정규 언어가 아니라는 것을 보이기 위해서는 그 언어를 표현하기 위해 무한개의 상태가 필요하다는 것을 보여야 한다.

예를 들어 a 와 b를 같은 개수만큼 포함하는 문자열들의 집합을 생각해 보자. 이 언어가 유한 상태 기계 모형으로 다룰 수 없다는 것을 보이기 위해 그런 기계 M 이 있다고 하자. M 은 유한하므로 상태의 수를 n 개라 할 수 있다. 한편 앞에 a가 (n+1) 개, 뒤에 b가 (n+1) 개 있는 문자열 x를 생각하자.

기계 M 이 문자열 x를 읽어 들이면 문자열 'a'를 읽을 때 적어도 한 상태를 두 번 거치게 된다. 'a'가 (n+1) 개 있고 상태가 n 개 있으므로 비둘기집 원리를 적용할 수 있기 때문이다. 이 상태를 S 라 하자. 그리고 상태 S 가 처음 나온 때로부터 두 번째 등장할 때까지 읽은 'a'의 개수를 d 라 하자. 즉, S에서 d 만큼의 'a'를 받아들였을 때 다시 S 상태가 된다는 것이고 따라서 기계가 (n+d+1) 개의 'a'문자를 읽든 (n+1) 개의 'a'를 읽든 최종에는 같은 상태가 된다. 이는 곧 기계가 문자열 x를 받아들인다면, (n+d+1) 개의 'a'와 (n+1) 개의 'b'로 구성된 문자열도 받아들인다는 것이다. 이것은 M 이 'a'와 'b'가 같은 개수가 있는 문자열만 받아들인다는 데서 모순이 된다.

따라서 이 언어는 어떤 유한 상태 기계로도 표현할 수 없으며 따라서 정규 언어가 아니다. 더 일반적인 형태로 보이기 위해서 정규 언어에 대한 펌핑 렘마를 쓰는데, 많은 언어들이 유한 상태 기계로 나타낼 수 없다는 것을 보이는 데 쓰인다.

아마 많은 사람들이 이 결과를 의아하게 생각할 것이다. 이러한 언어를 인식하는 프로그램을 컴퓨터로 작성하는 것이 매우 쉽기 때문이다. 하지만 위에서 데스크톱 PC 등 현존하는 모든 컴퓨터들이 유한 상태 기계라고 말하였다. 이것은 컴퓨터에도 엄연히 컴퓨터의 메모리 용량 같은 제한이 존재하기 때문이다. 문자열의 길이가 길어지면 문자의 개수를 세는 데 컴퓨터의 메모리 용량을 다 쓸 것이고, 결국 바닥나 오버플로우할 것이다. 아무리 많은 문자열을 인식할 수 있다고 해도 결국 인식할 수 없는 문자열이 있다. 이러한 사실들은 정규 언어가 어떻게 데스크톱 PC 등에 적용되는지를 이해할 수 있게 해 준다.

### 내리누름 오토마타의 계산능력

컴퓨터 과학자들은 내리누름 오토마타로 받아들일 수 있는 언어를 문맥 자유 언어라 정의한다. 이 언어는 문맥 자유 문법으로도 표현할 수 있다. 앞에서 'a'와 'b'가 같은 개수만큼 있는 언어는 정규 언어가 아니라고 하였는데, 내리누름 오토마타로는 표현할 수 있다. 일반적으로 내리누름 오토마타가 유한 상태 기계처럼 동작할 수 있고 따라서 정규 언어를 받아들인다. 그러므로 이 계산 모형은 유한 상태 기계보다 더 강력하다.

하지만 내리누름 오토마타로도 표현할 수 없는 언어가 있다. 정규 언어에서와 비슷하게 찾을 수 있는데, 예로는 소수의 집합이 있다(상세히 설명하지는 않겠다.) 정규 언어와 비슷하게, 문맥 자유 언어에 대한 펌핑 렘마도 있다.

### 튜링 기계의 계산능력

튜링 기계는 모든 문맥 자유 언어를 표현할 수 있으며 내리누름 오토마타로 표현할 수 없는 언어도 표현할 수 있다. 예를 들어 소수로 이루어진 언어를 표현할 수 있다. 따라서 이 모형은 앞의 두 모형보다 더욱 강력하다.

튜링 기계는 자신의 입력 테이프에 내용을 저장하는 기능이 있기 때문에 긴 시간이 주어진다면 다른 계산 모형으로는 할 수 없었던 일들을 할 수 있다. 튜링 기계는 어떤 입력에 대해 영원히 멈추지 않을 수 있다. 만약 튜링 기계가 모든 입력에 대해서 멈추고 결과를 출력한다면 언어를 **결정한다**라고 하고 그 언어를 순환 언어라 한다. 만약 튜링 기계가 언어의 원소에 대해서는 항상 멈추고 결과를 출력하지만 언어 밖의 문자열에 대해서는 멈추지 않을 수도 있다면 그 언어를 순환 열거 언어라 한다.

튜링 기계로는 많은 일을 할 수 있다. 많은 이들이 튜링 기계 이상의 기계를 만들어내려 노력했지만 모두 실패하였다. 예를 들어 튜링 기계의 테이프 수를 늘려 2-3차원 무한 영역으로 확장한다 하더라고 이것은 1차원 테이프로도 구현할 수 있다. 이런 모형들은 튜링 기계보다 더 편리할 수는 있지만 더 강력하지는 않다. 사실상 튜링 기계 이상의 합리적인 계산 모형이 없다는 것을 처치-튜링 명제를 통해 추측할 수 있다. 튜링 기계 이상의 기능을 갖는 계산 모형들이 많이 제안되었지만, 대체로 비현실적이거나 비합리적인 것 같다 (아래를 참고).

튜링 기계는 계산 가능성의 한계에 대한 질문에 답할 수 있는 매우 강력한 도구이다. 그렇다면 이제 어떤 질문을 해야할 것인가? 두 가지 질문을 제시한다.

* 순환 열거 언어나 순환 언어가 아닌 언어가 존재하는가?
* 순환 열거 언어조차 아닌 언어가 존재하는가?

#### 정지 문제

 이 부분의 본문은 정지 문제입니다.
컴퓨터 과학에서 가장 중요한 문제들 중 하나인 정지 문제는 '튜링 기계와 입력이 주어져 있을 때 튜링 기계가 이 입력에 대해 유한시간 내에 계산을 끝내고 멈출 것인가 아니면 영원히 멈추지 않을 것인가'를 판별하는 문제이다. 평소에 컴퓨터가 어떻게 다루어지는가와, 계산 가능성 이론에 대한 핵심적인 부분을 다루고 있다.

이것은 소수의 개수나 회문과 같은 단순한 문제와는 달리 튜링 기계가 다른 튜링 기계에 대한 물음에 답할 수 있도록 해야한다. 이런 동작을 하는 튜링 기계를 설계하는 것이 불가능하다는 것을 보일 수 있다. (정지 문제 참고)

사실 주어진 프로그램이 어떤 입력에 대해 정지하는지를 아는 일반적인 방법은 단순히 작동시켜보고 멈추는지를 보는 수밖에 없다. 만일 멈춘다면 그 기계가 멈춘다는 것을 알 수 있다. 하지만 멈추지 않는다면 이 기계가 언젠가 멈출지 아닐지 알 수 없다. 정지 언어(튜링 기계와 그 기계를 멈추는 입력의 모든 순서쌍 집합)는 순환 언어가 아니다. 따라서 정지 문제는 **계산 불가능** 혹은 **결정 불가능**하다.

정지 문제의 확장으로 라이스의 정리가 있는데, 이 정리에 따르면 어떤 튜링 기계가 수락하는 언어가 자명하지 않은 성질을 가지는지 아닌지는 결정 불가능하다.

#### 순환 언어를 넘어서

정지 문제에 대응되는 언어는 순환 열거 언어이다. 작동시켰을 때 튜링 기계가 그 입력에 대해 멈춘다면 기계가 멈춘다는 사실을 그 시점에서 알게 되기 때문이다. 그러나 순환 열거 언어조차 아닌 언어도 존재하며, 그 예를 들 수 있다.

순환 열거 언어가 아닌 언어로는 정지 언어의 여집합(튜링 기계와 그 기계를 멈추지 않는 입력의 모든 순서쌍 집합)이 있다. 이 언어가 순환 열거 언어가 아니라는 것을 보일 것이다. 멈추는 튜링 기계를 입력으로 받으면 영원히 멈추지 않고 나머지 경우에는 항상 멈추는 튜링 기계 M 이 있다고 가정하자. 그러면 시분할 기법을 이용하여 튜링 기계를 입력으로 하여 M 을 동작시키면서 동시에 입력으로 받은 기계를 동작시키는 기계 M' 을 만들 수 있다. 만약 입력된 튜링 기계가 멈추지 않는다면 M 이 멈추고 만일 입력된 튜링 기계가 멈춘다면 M'에서 입력으로 받은 기계를 동작시키는 부분이 멈출 것이다. 즉, M'의 두 스레드 중 적어도 하나는 멈춘다. 따라서 M' 은 정지 문제를 판정할 수 있는 기계이며 이것은 정지 문제가 결정 불가능하다는 데서 모순이다. 따라서 정지 언어의 여집합은 순환 열거 언어가 아니다.

가상의 계산모형
--------

처치-튜링 명제를 통해, 튜링 기계보다 더 강력하면서 논리적인 모형은 없다고 추측할 수 있다. 그러나 비논리적인 모형은 생각할 수 있는데, 여기서 몇몇 모형을 살펴볼 것이다. 컴퓨터 과학자들은 많은 종류의 초계산기(hypercomputer)를 생각해냈다. 재귀 이론은 수리논리학의 한 갈래로 이런 계산 모형들을 엄밀하게 다룬다.

### 무한실행

어떤 기계가 단계를 수행하는 데 전 단계의 반만큼의 실행 시간이 걸린다고 하자. 만일 처음 단계의 실행 시간을 1이라고 둔다면 총 실행시간은

1+{1 \over 2}+{1 \over 4}+\cdots 
이 된다. 이 무한급수는 2로 수렴하고, 따라서 이 튜링 기계는 2의 실행 시간 내에 무한 실행이 가능하다. 이 기계는 '무한히' 실행해보는 것을 통해 정지 문제를 판정할 수 있다.

### 신탁 기계

 이 부분의 본문은 신탁 기계입니다.
신탁 기계는 결정 불가능한 문제를 풀어내는 특정한 '신탁'에 접속할 수 있다. 예를 들어 '정지 신탁'을 가진 튜링 기계는 임의의 튜링 기계와 입력에 대해 정지 문제를 바로 판정할 수 있다.

### 초월계산의 한계

이런 기계들이 기존의 한계를 벗어난 것처럼 보여도 다시 각각의 한계를 찾을 수 있다. 이런 기계들이 튜링 기계에 대한 정지 문제를 판정할 수는 있지만 그 기계들 사이의 정지 문제는 결정 불가능하다. 예를 들어 신탁 기계는 임의의 신탁 기계가 멈추는지 아닌지를 판정할 수 없다.

계산가능성 이론의 역사
------------

계산가능성 이론은 일차 논리에 그 뿌리를 두고 있으며, 정지 문제 및 재귀와 관련된 많은 문제들은 불완전성 정리와 밀접하게 연관되어 있다. 다비트 힐베르트와 쿠르트 괴델은 일차논리의 기초를 쌓았다. 계산가능성 이론에 앞서 알론조 처치와 스티븐 클레이니는 람다 셈법을 연구했다. 앨런 튜링은 현대 전산학의 아버지라 불릴 수 있을 정도로 계산 가능성 이론과 복잡도 이론의 중대한 기틀을 다졌다. 튜링의 가장 유명한 업적은 튜링 기계를 제안하여 판정 문제를 해결한 것이다.

참고 문헌
-----

* Michael Sipser, *Introduction to the Theory of Computation*, PWS Publishing ISBN 0-534-94728-XPart Two: Computability Theory, chapters 3–6, pp.123–222.
* Christos Papadimitriou, *Computational Complexity*, Addison Wesley ISBN 0-201-53082-1, Chapter 3: Computability, pp.57–70.

| * v
* t
* e
집합론 |
| --- |
| 집합 | 
* 원소
* 공집합
* 한원소 집합
* 부분집합
* 교집합
* 합집합
* 여집합
* 대칭차
* 멱집합
	+ 멱집합 공리
* 곱집합
	+ 순서쌍
* 유한 집합
* 무한 집합
	+ 무한 공리
* 가산 집합
* 드 모르간의 법칙

 |
| 함수 | 
* 정의역
* 공역
* 치역
* 상
* 전사 함수
* 단사 함수
* 전단사 함수
* 다가 함수
* 역함수
* 항등 함수
* 상수 함수
* 지시 함수
* 함수의 합성

 |
| 기수 | 
* 집합의 크기
* 칸토어의 정리
	+ 대각선 논법
* 알레프 수
* 베트 수
* 극한 기수
* 기멜 함수
* 가능 공종도

 |
| 순서수 | 
* 정렬 순서
* 초한귀납법
* 공종도
	+ 쾨니그의 정리
* 하르톡스 수
* 정규 함수

 |
| 역설의 해소 | 
* 소박한 집합론
* 러셀의 역설
* 칸토어 역설
* 부랄리포르티 역설
* 모임
* 유형 이론
	+ 《수학 원리》
* 체르멜로-프렝켈 집합론
* 새 기초
* 폰 노이만-베르나이스-괴델 집합론
* 모스-켈리 집합론

 |
| 선택 공리 | 
* 가산 선택 공리
* 의존적 선택 공리
* 초른 보조정리
* 슈필라인 확장정리
* 바나흐-타르스키 역설
* 티호노프 정리

 |
| 집합론의 모형 | 
* 구성 가능 전체
* 추이적 집합
* 추이적 모형
* 순서수 정의 가능 집합
* 강제법

 |
| 큰 기수 | 
* 도달 불가능한 기수
* 가측 기수
* 약콤팩트 기수
* 강콤팩트 기수
* 초콤팩트 기수

 |
| ZF와 독립된 명제 | 
* 연속체 가설
* 특이 기수 가설
* 수슬린 가설
* 화이트헤드 문제
* 결정 공리
* 마틴 공리
* 다이아몬드 원리

 |

| * v
* t
* e
컴퓨터 과학의 주요 분야 |
| --- |
| 수학적 기초 | 
* 수리논리학
* 집합론
* 정수론
* 그래프 이론
* 유형 이론
* 범주론
* 수치해석학
* 이산수학

 |
| 계산 이론 | 
* 오토마타 이론
* 계산 가능성 이론
* 계산 복잡도 이론
* 양자 계산 이론

 |
| 알고리즘 & 자료 구조 | 
* 알고리즘
* 알고리즘 설계
* 알고리즘 해석
* 자료 구조
* 계산기하학

 |
| 프로그래밍 언어 & 컴파일러 | 
* 구문 분석
* 컴파일러
* 인터프리터
* 프로그래밍 언어
* 구조적 프로그래밍
* 객체 지향 프로그래밍

 |
| 병렬 & 분산 시스템 | 
* 병렬 컴퓨팅
* 컴퓨터 클러스터
* 분산 컴퓨팅
* 그리드 컴퓨팅
* 클라우드 컴퓨팅
* IaaS
* PaaS
* SaaS

 |
| 소프트웨어 공학 | 
* 요구 분석
* 소프트웨어 설계
* 컴퓨터 프로그래밍
* 정형 기법
* 소프트웨어 테스트
* 소프트웨어 개발

 |
| 시스템 아키텍처 | 
* 컴퓨터 아키텍처
* 마이크로아키텍처
* 운영 체제

 |
| 통신 & 네트워크 | 
* 컴퓨터 오디오
* 라우팅
* 네트워크 토폴로지
* 암호학
* 차세대 통신망

 |
| 데이터베이스 | 
* 데이터 마이닝
* RDBMS
* SQL
* NoSQL
* 오라클 데이터베이스

 |
| 인공지능 | 
* 자동추론
* 전산언어학
* 컴퓨터 비전
* 진화 연산
* 기계 학습
* 자연 언어 처리
* 로봇학

 |
| 컴퓨터 그래픽 | 
* 시각화
* 영상 처리

 |
| 인간과 컴퓨터 상호 작용 | 
* 컴퓨터 접근성
* 사용자 인터페이스
* 착용 컴퓨터
* 유비쿼터스 컴퓨팅
* 가상현실

 |
| 계산과학 | 
* 인공생명
* 생물정보학
* 인지과학
* 계산화학
* 계산론적 신경과학
* 계산물리학
* 수치해석학
* 기호계산

 |
| 정보보호 | 
* 암호학
* 물리 보안
* 애플리케이션 보안
* 인터넷 보안
* 네트워크 보안
* 해킹
* 크래킹

 |

| * v
* t
* e
수학의 주요 분야 |
| --- |
| 수론 | 
* 대수적 수론
* 해석적 수론

 |
| 대수학 | 
* 선형대수학
* 추상대수학
* 군론
* 환론
* 가환대수학
* 호몰로지 대수학

 |
| 해석학 | 
* 미적분학
* 실해석학
* 복소해석학
* 수치해석학
* 측도론
* 함수해석학
* 조화해석학
* 비표준 해석학

 |
| 기하학 | 
* 대수기하학
* 계산기하학
* 해석기하학
* 미분기하학
* 리만 기하학

 |
| 위상수학 | 
* 일반위상수학
* 대수적 위상수학
* 미분위상수학
* 매듭 이론

 |
| 수학기초론 | 
* 수리논리학
* 모형 이론
* 증명 이론
* 계산 가능성 이론
* 집합론
* 범주론

 |
| 이산수학 | 
* 계산 이론
* 계산 복잡도 이론
* 암호학
* 조합론
* 그래프 이론

 |
| 확률과 통계 | 
* 확률론
* 통계학
* 확률미적분학
* 게임 이론
* 결정이론

 |

|  |  |
| --- | --- |
| 전거 통제: 국가 위키데이터에서 편집하기 | 
* 체코

 |