- 다양한 주제에 대해 자유롭게 글을 작성하는 게시판입니다.
Date 17/02/10 22:45:46
Name   April_fool
Link #1   http://scienceon.hani.co.kr/34696
Link #2   https://namu.wiki/w/%EC%A0%95%EC%A7%80%20%EB%AC%B8%EC%A0%9C
Subject   로또 번호 생성 프로그램과 정지 문제

어제 올린 로또 번호 생성 프로그램을 보다, 문득 소개하고 싶은 것이 생겨 글을 씁니다.

예를 들어 말입니다, 제가 올린 로또 번호 생성 프로그램이 실제로 몇 번만에 로또 번호를 맞출 수 있는지 한번 검증해보고 싶어졌다고 해 봅시다. 그래서 저는 다음과 같은 프로그램을 작성하였습니다.

  1. import random
  2.  
  3. def plusAll(a):
  4.     result = 0
  5.     for i in a:
  6.         result += i
  7.     return result
  8.  
  9. def lottoNumGen():
  10.     while True:
  11.         a = random.sample(range(1, 45+1), 6)
  12.         if 135 <= plusAll(a) <= 141:
  13.             result = sorted(a)
  14.             return result
  15.  
  16. count = 0
  17. = random.sample(range(1, 45+1), 6)
  18. = sorted(a)
  19.  
  20. while True:
  21.     b = lottoNumGen()
  22.     b = sorted(b)
  23.     count += 1
  24.     if a == b:
  25.         print(a, count)
  26.         break

파이썬 언어를 모르시는 분들을 위해 위의 프로그램을 간략하게 설명하면 다음과 같습니다.

  1. 1에서 45 사이의 랜덤한 번호 6개로 이루어진 수열 [a]를 만듭니다. 수열을 오름차순으로 정렬하여 순서를 맞춥니다. 수열의 각 숫자는 서로 겹치지 않습니다.
  2. 수열 a와 모든 조건이 똑같지만, 각 숫자를 모두 합치면 135에서 141 사이에 있다는 조건을 추가한 수열 [b]를 만듭니다.
  3. 수열 a와 b가 서로 일치하는지 비교합니다.
  4. 수열 a와 b가 일치하지 않으면, 일치할 때까지 수열 b를 새로 만들어서 다시 비교합니다.
  5. 수열 a와 b가 일치하면, 일치한 수열과 지금까지 수열 b를 몇 번 만들었는지 횟수를 출력하고 프로그램을 종료합니다.

여기서 문제입니다. 과연 이 프로그램은 정상적으로 종료될까요?

이런 식으로, 컴퓨터 프로그램이 언젠가 정상적으로 종료되는가 아니면 종료되지 않고 무한루프에 빠져 영원히 실행되는가를 판정하는 것을 정지 문제(halting problem)이라고 부릅니다. 조금 더 엄밀하게 말하자면, 정지 문제의 내용은 다음과 같습니다.

“임의의 프로그램 A가 주어졌을 때, A가 정상적으로 종료하는지 무한히 계속하는지를 결정하라.”

(출처 : http://scienceon.hani.co.kr/34696)

그럼, 과연 위에서 제가 작성한 프로그램을 실행시키면 언젠가는(비록 오랜 시간이 걸릴지라도) 결과값이 나올까요? 답은 [알 수 없다]입니다. 왜일까요? 제가 위에서 작성한 프로그램에는 이것과 관련된 아주 심각한 문제점이 하나 숨어 있습니다. 그것이 무엇인지는 한번 직접 생각해보시기 바랍니다. 아마도 프로그래밍을 배우신 분이시라면 보자마자 바로 알아챌 수 있으실 겁니다.

1936년에 ‘컴퓨터의 아버지’ 앨런 튜링은 위에서 언급한 정지 문제를 풀 수 있는 일반적인 방법(알고리즘)은 존재하지 않는다는 것을 증명하였습니다. 이게 무슨 소리냐 하면, 아무 프로그램이나 집어넣어서 이 프로그램이 정상적으로 종료된다고 보장할 수 있는 방법은 없다는 것입니다. 앨런 튜링의 증명 방법을 단순하게 설명하면 다음과 같습니다.

  1. 정지 문제를 풀 수 있다고 가정한다. (귀류법)
  2. 정지 문제를 풀 수 있는 절차(알고리즘)를 이용하여 프로그램 A를 만든다. 프로그램 A는 다음과 같은 프로그램이다.
    1. 프로그램 A는 다른 프로그램 B를 입력받는다.
    2. 만약 프로그램 B가 정상적으로 종료되는 프로그램이 맞으면, 프로그램 A는 무한루프에 빠져 응답을 멈춘다.
    3. 만약 프로그램 B가 무한루프에 빠져 응답을 멈추면, 프로그램 A는 정상적으로 종료된다.
  3. 프로그램 A에 자기 자신(프로그램 A)을 입력한다.
  4. 프로그램 A는 자기 자신이 정상적으로 종료된다고 해도, 무한루프에 빠진다고 해도 모순에 빠진다. 따라서 정지 문제는 판정할 수 없다(undecidable).

이 증명의 의미를 확장하면, [어떤 임의의 프로그램이 완전무결한지를 보증할 수 있는 방법은 없다]는 것이 됩니다. 다시 말해서, 어떤 프로그램에 버그가 전혀 없음을 증명할 수는 없다는 것이지요. 버그가 있다는 것은 보여주면 그만이지만, 버그가 전혀 없다는 것은 증명할 수가 없는 것입니다.

그럼, 컴퓨터가 자동으로 프로그램의 버그를 찾아내거나 하는 것은 완전히 불가능한 것일까요? 그렇지는 않습니다. 위에서 인용한 곳에는 이런 문장이 있군요. 제가 설명하는 것보다 이 문장을 인용하는 것이 더 적당할 것 같군요.

“종료 문제를 연구하는 소프트웨어공학자들은 가능한 모든 프로그램이 아닌 우리에게 가치가 있는 프로그램으로 문제의 범위를 제한한 뒤에 종료 문제에 대한 부분적인 해답을 얻는 것을 목표로 합니다. 임의의 모든 프로그램에 대해 종료 문제를 해결하는 것은 불가능하지만, 그럼에도 불구하고 상당수의 프로그램에 대해서는 해결이 가능하다는 뜻입니다 (마찬가지로, 완벽한 백신은 이론적으로 불가능하지만 매우 믿을 만한 백신은 충분히 가능하다는 희소식이기도 합니다). 이들이 연구하는 기술을 자동종료 증명(Automated Termination Proof)이라고 합니다. 주어진 소프트웨어가 언제나 정상적으로 종료하는지를 자동으로 증명하는 도구를 만드는 것입니다.”

그럼 여기서, 제가 위에서 작성한 프로그램이 어째서 결과값이 나올지 안 나올지를 알 수 없는지 혹시 눈치채지 못하신 분들을 위해 이유를 공개하겠습니다.

만약 수열 a의 값이 수열 b처럼 총합의 범위가 135에서 141 사이에 있으면 확률에 의해 언젠가는 결과값이 나올 수 있을 것입니다. 그런데 수열 a의 총합의 범위가 135에서 141 사이를 벗어나 있으면, 아무리 수열 b를 생성해도 수열 a와 b가 일치하는 일은 일어날 수가 없습니다. 수열 b는 총합의 범위가 135에서 141 사이라는 제약조건이 있으니까요. 문제는 수열 a가 어떤 값으로 생성될지는 완전히 랜덤이라는 점입니다. 따라서 위 프로그램을 실행시켜보기 전에는 위 프로그램이 정상적으로 종료될지 아니면 무한루프에 빠질지 알 수가 없지요.

이상, 오늘의 뻘글이었습니다.

p.s.
이 글의 내용이 재미있으셨다면, 다음 글도 한번 읽어보세요.
http://www.joysf.com/4602163




1


    목록
    번호 제목 이름 날짜 조회 추천
    5231 IT/컴퓨터유튜브 레드 3개월 사용기 5 Leeka 17/03/19 6799 1
    5169 IT/컴퓨터우주환경이 선거에 미치는 영향 25 은머리 17/03/13 5022 0
    5167 IT/컴퓨터최근 구입한 컴퓨터 관련 부품 평가기 8 이슬먹고살죠 17/03/13 4703 4
    5098 IT/컴퓨터해외 게임개발 프로젝트 참여하며 써본 이야기 12 유리소년 17/03/07 4290 4
    4994 IT/컴퓨터LG, G4/V10 업데이트 벌써 중단... 11 Leeka 17/02/24 3859 0
    4989 IT/컴퓨터컴알못의 조립컴퓨터 견적 연대기 (5) SSD, HDD, 파워, 케이스, 쿨러 등 4 이슬먹고살죠 17/02/24 4466 4
    4988 IT/컴퓨터컴알못의 조립컴퓨터 견적 연대기 (4) 모니터 2 이슬먹고살죠 17/02/24 5459 2
    4978 IT/컴퓨터AMD 대란?.. 짤 하나로 설명해보기 16 Leeka 17/02/23 5520 2
    4976 IT/컴퓨터컴알못의 조립컴퓨터 견적 연대기 (3) 그래픽카드 편 4 이슬먹고살죠 17/02/23 5555 5
    4972 IT/컴퓨터컴알못의 조립컴퓨터 견적 연대기 (2) CPU 메인보드, RAM 편 6 이슬먹고살죠 17/02/23 6055 8
    4971 IT/컴퓨터컴알못의 조립컴퓨터 견적 연대기 (1) 배경지식, 용도결정 편 4 이슬먹고살죠 17/02/23 4301 10
    4966 IT/컴퓨터타임라인을 어이할꼬 52 Toby 17/02/22 5082 3
    4949 IT/컴퓨터영화를 추천해드립니다! Movie2Vec 12 Top 17/02/21 6868 6
    4918 IT/컴퓨터팟플레이어(카카오TV) 개편을 보고... 13 저퀴 17/02/18 4573 0
    4856 IT/컴퓨터[사용기] 리얼포스 104U 키보드 21 수성펜 17/02/12 8539 0
    4831 IT/컴퓨터로또 번호 생성 프로그램과 정지 문제 11 April_fool 17/02/10 5421 1
    4822 IT/컴퓨터간단한 로또 번호 생성 프로그램 13 April_fool 17/02/09 7841 3
    4739 IT/컴퓨터딥러닝으로 채색하기 15 Toby 17/02/01 6621 1
    4738 IT/컴퓨터유료 DNS 서비스 사용시 장점은 어떤 게 있을까요? 8 녹풍 17/02/01 6409 0
    4653 IT/컴퓨터비와이패드 10 헬리제의우울 17/01/18 6026 0
    4572 IT/컴퓨터[소개] Swift Calcs - 최고의 온라인 계산기 8 April_fool 17/01/08 8145 10
    4564 IT/컴퓨터두 대의 구글 챗봇이 대화하는 채널 12 Azurespace 17/01/07 5592 2
    4484 IT/컴퓨터K Global 300으로 선정되었습니다. 22 집에가고파요 16/12/30 3677 8
    4388 IT/컴퓨터프라이버시는 없다... 12 눈부심 16/12/15 4271 0
    4327 IT/컴퓨터저도 드디어 앱 런칭을 했습니다! (내가 이 앱의 애비요) 34 쉬군 16/12/08 4265 8
    목록

    + : 최근 2시간내에 달린 댓글
    + : 최근 4시간내에 달린 댓글

    댓글