CS/Data Structure (2021-1)

[자료구조] The Halting Problem (정지 문제)

샤아이인 2023. 3. 5.

해당 본문은 학교수업시간에 배운 강의내용을 기반으로 정리하는 요약글 입니다. 정확하지 않은 점이 있으면 지적해주시면 감사하겠습니다.

 

1. Halting Problem이란?

어떤 프로그램이 어떠한 입력값을 받았을 때 종료되는지 아닌지를 돌려보기 "전에" 알 수 있는가?

 

당연히 프로그램을 돌려봐서 끝난다면 끝난다는 것 을 알수 있지만, 우리는 프로그램을 돌리기 전에 먼저 알고싶다!

코드를 작성하다보면 컴파일에러도 잡아주고, 문법에러도 잡아준다, 어찌 저찌 잘 해보면 실행전에 종료되는지의 유무를 알수 있지 않을까?

 

1 - 1) 문제의 목적

세상엔 컴퓨터로 풀기 쉬운 문제가 있고, 풀기 어려운 문제가 있다.

그런데 세상엔 컴퓨터로 풀 수 없는 문제도 있다.

정지 문제는 컴퓨터로 풀 수 없는 문제들 중 하나이다.

 

"해결 불가능한(unsolvable)" 문제

 

해결 불가능한 문제가 존재한다는 역사상 첫 번째 증명은, 앨런 튜링의 "정지 문제" 이다.

 

2. The Proof (by Alan Turing!)

2 - 1) 가정

우리는 귀류법을 통해 가정이 틀렸음을 증명할 것 이다.

  1. D를 만드는 것이 가능하다 가정했고
  2. D를 통해 잘못된 결과를 반환하는 S를 만들었다.
  3. 전제에 모순되므로, D를 만드는것은 불가능하다.

 

2 - 1 - 1) 프로그램 D

프로그램 D가 존재해서, 모든 프로그램 M M에 대한 모든 입력 X 대해서 M(X)를 실행하면 종료할지 영원히 계속 수행될지 판단할 수 있다고 하자

  • 프로그램 D는 Yes/No만을 대답하는 프로그램
  • 프로그램 D는 항상 종료함
  • M은 검사할 프로그램의 소스 코드
  • X는 M에 입력할 input이다

 

, 프로그램 D의 입력은 (어떤 프로그램과 M, 그 프로그램에 주어질 입력 X)이고, 출력은 종료 여부이다
  • D(M, X)를 실행하면 Yes/No 중 하나를 출력하고 종료한다.

▶ M(X) 코드

def M(X):
    while X > 0:
        print("running...")
    return 1

위 코드를 통해 M(7)은 계속 "running..."을 출력할 것 이고 => D(M, 7)은 NO를 출력하고 종료한다.

위 코드를 통해 M(-1)은 1을 반환하고 종료되며 => D(M, 1)은 YES를 출력하고 종료한다.

 

누가 저런 프로그램 D를 만들었다고 가정을 해보자!

 

이렇게 D가 있다 가정하면 다음 D'은 만들기 매우 쉽다.

 

2 - 1 - 2) 프로그램 D'

프로그램 존재하는 D가 있다면, 다음 새로운 D'는 쉽게 정의할수가 있다.

  • D′: M(X)가 멈추는 경우 D′(M, X)는 멈추지 않고, M(X)가 멈추지 않는 경우 D′(M, X)는 멈춘다
    • 즉, D(M, X)의 출력이 No이면 M은 멈추고, 출력이 Yes이면 M은 멈추지 않고 무한루프를 돌게된다.

 

▶ D'(M, X) 코드

def D'(M, X):
    if D(M, X) == "YES":
    	while true:
            continue
    elif D(M, X) == "NO":
        return

위 코드를 통해 M(7)은 계속 "running..."을 출력할 것 이고 => D'(M, 7)은 멈춘다.

위 코드를 통해 M(-1)은 1을 반환하고 종료되며 => D'(M, 1)은 멈추지 않는다.

 

D'은 그냥 D를 이용하는 몇줄 안되는 코드 이다.

 

2 - 1 - 3) 프로그램 S

  • S: M(M)이 멈추는 경우 S(M)은 멈추지 않고,
        M(M)이 멈추지 않는 경우 S(M)은 멈춘다
    • S가 M을 입력으로 받으면, D′(M, M)을 돌리기만 하면 됨!
    • M은 프로그램이지만 문자열일 뿐이므로 D′의 입력으로 줄 수 있고 M 의 입력으로도 줄 수 있음 (그냥 입력으로 바이트를 전달한다고 생각하자)

즉, S는 돌려볼 프로그램 M을 입력으로 받지만, M이 돌릴 입력 X는 받지 않는다.

M만 입력으로 받는다. 즉 프로그램 M은 입력으로 자신의 소스코드 M을 받는 것 이다!

 

▶ S(M) 코드

def S(M):
    D'(M, M)

 

2 - 1 - 4) S(S)를 돌리면???

S: S(S)가 멈추는 경우 S(S)는 멈추지 않고, S(S)가 멈추지 않는 경우 S(S)는 멈춘다

 

??????????????? 앵? S(S)가 멈추는 경우 S(S)가 멈추지 않는다고 ?????????????????

 

말이 안되는 상황이 발생한 것 이다.

 

이는 가정이 틀렸기 때문에 발생한 것 이다, 

1) D를 만드는 것이 가능하다 가정했고

2) D를 통해 잘못된 결과를 반환하는 S를 만들었다.

3) 전제에 모순되므로, D를 만드는것은 불가능하다.

 

3) 참고

https://johngrib.github.io/wiki/halting-problem/

 

정지 문제

The Halting Problem

johngrib.github.io

 

댓글