모든 목록의 밖에 있는 똑같은 열을 만든다는 뜻일까요?
5. 모든 목록의 밖에 있는 똑같은 열을 만든다는 뜻일까요?
주의해야 할 대목이 있습니다. d는 목록 L에 따라 만들어집니다. L을 바꾸면 대각선 자리의 값도 바뀌며 새 열 d도 달라집니다. 따라서 모든 목록에 대해 단 하나의 고정된 이진열이 항상 빠져 있다는 주장과는 다릅니다.
또한 새 열을 만드는 규칙이 간단해 보인다고 해서 언제나 컴퓨터가 계산할 수 있다는 뜻도 아닙니다. L(n)(n) 값을 얻으려면 해당 목록의 n번째 행과 n번째 자리 값을 계산할 방법이 필요합니다. L이 전혀 계산 가능한 방식으로 제공되지 않았다면 d를 계산할 수 있다는 보장은 없습니다. 이 구별은 뒤에서 컴퓨터 프로그램의 한계를 다룰 때 결정적입니다.
대각선 논법은 주어진 목록의 모든 행과 적어도 한 자리에서 다른 열을 만든다는 집합론적 증명입니다. 이 결과를 바로 '어떤 특정 프로그램으로도 모든 계산을 할 수 없다'는 주장으로 바꾸려면, 프로그램을 어떤 방식으로 나열하고 어떤 값을 실제 계산할 수 있는지를 새롭게 정의해야 합니다.
6. 컴퓨터 프로그램에도 자연수 번호를 붙일 수 있나요?
프로그램은 유한한 길이의 기호열로 기록됩니다. 0과 1로 된 코드로 모든 프로그램을 표현할 수도 있습니다. 유한한 이진 문자열은 길이가 0인 것부터 1인 것, 2인 것 순으로 나열할 수 있습니다. 각 길이의 문자열은 유한 개이므로 모든 유한 문자열에 자연수 번호를 붙일 수 있습니다.
정확한 코딩 방법과 문법의 차이는 있지만, 이 사실로부터 프로그램 전체가 많아야 가산 무한임을 알 수 있습니다. 모든 프로그램이 서로 다른 계산을 하지는 않습니다. 한 프로그램이 여러 입력에서 같은 결과를 내거나 어떤 입력에서는 끝나지 않을 수도 있습니다. 그럼에도 서로 다른 프로그램의 총수는 가산이라는 사실은 유지됩니다.
여기서 앞의 B와 프로그램의 집합을 비교할 수 있습니다. B에는 모든 무한 이진열이 있고 그 수는 비가산입니다. 반면 프로그램 코드는 유한 문자열이므로 가산입니다. 따라서 계산 가능한 이진열은 전체 B보다 훨씬 적습니다. 계산할 수 없는 무한 이진열이 존재한다는 결론을 얻습니다. 이것은 집합 크기의 비교로 얻은 존재 정리입니다.
7. '가산'인데도 모든 것을 계산하지 못한다는 사실
이 결론이 의아할 수 있습니다. 프로그램에도 0번부터 번호를 붙이고, 자연수에도 0번부터 번호를 붙이는데 왜 프로그램으로 모든 이진열을 만들 수 없을까요? 핵심은 프로그램 한 개가 나타내는 것이 무한 이진열 하나라는 점입니다. 자연수로 셀 수 있는 개수만큼의 프로그램으로 표현할 수 있는 이진열은 가산 개뿐입니다. 그런데 모든 이진열의 집합은 비가산입니다.
이 논증에는 중요한 한계도 있습니다. 비가산성을 이용하면 계산할 수 없는 이진열의 존재를 보일 수 있지만, 그 자체로 특정한 유명한 문제 하나가 계산 불가능하다고 증명하지는 않습니다. '어떤 수는 계산 불가능하다'와 '정지 문제는 결정할 수 없다'는 다른 강도의 질문입니다. 실제 문제의 판정 불가능성을 얻으려면 문제의 구조를 구체적으로 사용해야 합니다.
이제 표의 값 0과 1을 프로그램이 멈추는지 여부로 바꿔 봅시다.

