DannyuNDos

일련번호: SCP-715-KO

등급: 타우미엘(Thaumiel)

특수 격리 절차: 대상은 제 ■기지의 정전차폐 격리실에 보관한다. 대상을 분해하거나, 대상의 내용을 변조하는 등의 대상에 대한 일체의 위해를 금지한다. 그러한 시도는 ZK급 현실 오류 시나리오를 일으킬 것으로 여겨진다.

설명: SCP-715-KO는 일종의 컴퓨터로 보인다. SCP-715-KO는 경도 및 강도가 매우 큰 물질로 구성돼 있으며, 비파괴 검사 결과 별다른 내부 구조를 확인할 수 없었으므로 매우 정밀한 나노 (실험 참조. 대상의 정밀함은 무한한 것으로 여겨진다.) 구조로 이루어져 있음을 짐작할 수 있었다.

SCP-715-KO의 형태는 30cm × 20cm 크기의 얇은 푸른색 육각형으로, 종횡으로 선대칭이며 볼록 집합에 속한다. 앞면에는 그 면을 거의 꽉 채우는 디스플레이가 있다. 앞면에는 전원 버튼도 달려 있는데, 전원 버튼을 누름으로써 별도의 부팅이나 시스템 종료 과정 없이 순식간에 대상을 켜거나 끌 수 있다. 뒷면에는 별다른 장치가 없다.

SCP-715-KO의 얇은 윗면에는 USB-3.1 사양의 A형 포트 5개와 C형 포트 3개가 있다. 이를 통해 USB 메모리나 스마트폰의 데이터를 읽어들일 수 있다.

SCP-715-KO를 켰을 때 바탕화면에 나오는 내용은 파일 관리자와, Halting.io라 이름 붙여진 응용 프로그램이 끝이다. 파일 관리자에서 USB 메모리 등의 내용을 확인할 수 있으나, 그 내용을 SCP-715-KO로 옮기는 방법은 제공되지 않는다. 또한 Halting.io를 비롯한 응용 프로그램이나 시스템 파일 등은 보여주지 않는다.

Halting.io를 실행하면 GHCi1 프롬프트가 뜬다. 대상의 변칙성은 무한 루프를 일으키는 코드를 입력했을 때, 혹은 Prelude 모듈에 있는 halt라는 함수를 호출했을 때 나타난다. 대상의 사용 기록을 보려면 실험 기록을 참조 바람.

실험 기록 715:

날짜: 2018.07.14.
사용자: Multu-Hwatu 박사
목표: 프로그램 이름이 Halting.io인 것에서 착안하여 대상의 정지 문제2에의 관련성을 확인한다.
이하, Halting.io의 사용 기록(굵게 표기)을 사용자의 소견과 함께 기재한다.

GHCi, version 8.4.3: http://www.haskell.org/ghc :? for help
Prelude> action = action
Prelude> action
«loop»
원래는 아무 것도 출력하지 못하고 무한 루프에 빠져야 한다. - Multu-Hwatu 박사

Prelude> :m + Data.Function
Prelude Data.Function> fix (1+)
«loop»
Prelude Data.Function> fix id
«loop»
이들 역시 원래는 아무 것도 출력하지 못하고 무한 루프에 빠져야 한다. - Multu-Hwatu 박사

Prelude Data.Function> :
Prelude> halt 0
True
Prelude> halt action
False
역시, 정지 문제를 푸는 함수가 따로 있다. - Multu-Hwatu 박사

Prelude> halt (putStrLn "Hello, world!")

<interactive>:8:7: error:
Variable not in scope: putStrLn :: String -> t
잠깐, putStrLn이 없다니? 순수하지 않은(impure) 함수3라 그런가? - Multu-Hwatu 박사

Prelude> :t putChar

<interactive>:9:4: error:
Variable not in scope: putChar
Prelude> :t putStr

<interactive>:10:4: error:
Variable not in scope: putStr
아무래도 순수하지 않은 함수는 모두 사용할 수 없는 것 같다. - Multu-Hwatu 박사

Prelude> :m + System.Random
<no location info>: error:
Could not find module 'System.Random'
It is not a module in the current program, or in any known package.
난수 생성기 역시 순수하지 않은 함수이므로 당연한 일이다. - Multu-Hwatu 박사

Prelude> :m + Control.Monad.Fix
Prelude Control.Monad.Fix> mfix (Just . (1+))
Nothing
원래는 "Just"만 출력하고 무한루프에 빠져야 한다. 여기서는 mfix 함수가 내부적으로 halt 함수를 호출하는 것 같다. - Multu-Hwatu 박사

Prelude> :q
프로그램 종료.

부록 A: Multu-Hwatu 박사의 소견

정지 문제는 분명히 해결불능(unsolvable) 문제임에도 불구하고, SCP-715-KO는 정지 문제를 잘만 해결한다. 이 실험 결과에서 우리는 다음 결론을 도출할 수 있다. 첫째로, Halting.io의 소스 코드는 무한한 길이를 가지고 있다. 정지 문제가 해결불능이라는 것의 증명은 모든 프로그램은 유한한 길이를 가지고 있다는 전제에서부터 시작한다. 따라서 정지 문제를 풀 수 있다는 것은 이 전제가 무너졌다는 것을 의미한다. 둘째로, SCP-715-KO의 구조 또한 무한히 정밀하다. 무한한 크기의 소프트웨어를 담은 하드웨어 또한 무한한 크기를 가지고 있을 수밖에 없고, 따라서 SCP-715-KO의 물리적인 자료 밀도 또한 무한하다. 원자는 물론이고 소립자보다도 더 빽빽하단 말이다. 몇몇 사람은 SCP-715-KO가 단순히 양자 컴퓨터이기 때문에 한 큐비트(qubit) 안에도 무수히 많은 정보가 담겨져 있는 것 아니냐고 반문할 수 있겠지만, 큐비트 역시 최종적인 결과 도출 시에는 0 또는 1로 붕괴하므로 이는 틀린 생각이다. 이로 미루어 보아, SCP-715-KO는 어쩌면 물리 법칙은 물론이고 수학과 논리의 법칙까지 직접적으로 관여하고 있는 건 아닌지 짐작할 수 있다. 따라서 SCP-715-KO의 등급을 타우미엘(Thaumiel)로 지정하고, 대상에 대한 일체의 위해를 금지한다.

부록 B: 정지 문제의 해결불능성의 증명

정지 문제를 해결할 수 있는 함수 H가 존재한다고 가정하자. H는 이인자 함수로, H(A,x)는 함수 A에 인자 x를 집어넣어 호출했을 때 무한 루프에 빠지면 거짓, 그렇지 않으면 참을 결과값으로 내놓는다. 이때, 일인자 함수 S를 다음과 같이 정의하자:

S(A)는 H(A,A)가 거짓이면 무사히 마치고, 참이면 무한 루프에 빠진다.

이 때, H(S,S)는 참일까, 거짓일까? H(S,S)는 S(S)가 무한 루프에 빠질 지, 아닐 지를 알아야 한다. H(S,S)가 참이라고 가정하자. 즉 S(S)는 무사히 마치리라고 가정했다. 그런데 S(S)는 H(S,S)가 참이므로 무한 루프에 빠진다. 따라서 모순이다. 그렇다면 H(S,S)가 거짓이라고 가정하자. 즉 S(S)는 무한 루프에 빠지리라고 가정했다. 그런데 S(S)는 H(S,S)가 거짓이므로 무사히 마친다. 따라서 또한 모순이다. 즉 H(S,S)는 참도 거짓도 될 수 없다. 따라서 H가 존재한다는 대전제가 붕괴한다. Q.E.D.

그렇다면 H의 역할을 훌륭히 수행하는 SCP-715-KO는 대체 뭘까? 부록 A에서 보듯 SCP-715-KO는 무한한 길이의 소스 코드를 가지고 있다. 보통의 컴파일러나 인터프리터, 혹은 위 증명의 S라면 무한한 길이의 소스 코드를 다 처리하는 데에는 무한한 길이의 시간이 걸릴 것이다. 그런데도 이를 기어이 컴파일(혹은 인터프렛) 했다는 것이 SCP-715-KO의 변칙성의 기원인 듯 하다. - Multu-Hwatu 박사