- 다양한 주제에 대해 자유롭게 글을 작성하는 게시판입니다.
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


    목록
    번호 제목 이름 날짜 조회 추천
    7812 게임[불판] 리프트 라이벌즈 결승전 - 한중전 180 OshiN 18/07/08 6740 1
    3697 기타핸디캡 이론 (흡연과 음주의 이유) 9 모모스 16/09/13 6740 6
    12085 꿀팁/강좌여행유튜버 4천왕 8 copin 21/09/17 6739 1
    11287 꿀팁/강좌[새해맞이] 습관을 게임처럼! Habitica 11 사이시옷 20/12/28 6739 3
    11067 스포츠로마첸코-로페즈 : 초속과 변칙 3 Fate 20/10/18 6739 6
    7798 일상/생각왜 펀치라인? 코메디의 구조적 논의 6 다시갑시다 18/07/06 6739 24
    6969 오프모임20일(토) 국박가실 분! 118 나단 18/01/18 6738 3
    5193 게임젤다의 전설 -야생의 숨결- 은 대단합니다. 12 커피최고 17/03/15 6738 3
    6285 요리/음식2박3일 속초 휴가 (먹기만 함..) 10 꿈꾸는늑대 17/09/15 6737 6
    12600 정치누가 이기든 반성하는 쪽을 주의깊게 바라보려 합니다. 27 파로돈탁스 22/03/09 6736 9
    10449 오프모임[넷플벙/종료] 목요일엔 펭귄이 좋다고 생각해 22 카야 20/04/02 6736 6
    10406 오프모임[급구] 아무말 오프모임 2명 선착순! 마감 33 류아 20/03/20 6736 4
    8022 일상/생각슬픈 뉴스에 애도하지 않으면 개념이 없는 건가요? 15 라밤바바밤바 18/08/09 6736 8
    7808 오프모임<가락동 벙> 펑합니다. 25 소주왕승키 18/07/07 6736 9
    7515 음악[팝송] 앤 마리 새 앨범 "Speak Your Mind" 김치찌개 18/05/13 6736 0
    845 도서/문학"걸리버 여행기"를 부탁해... 9 Neandertal 15/08/26 6736 0
    4585 스포츠[해축] 16/17 전반기 키커 랑리스테 9 익금산입 17/01/09 6735 0
    12007 역사서양 사학자 평가한 촉한 12 히하홓 21/08/24 6734 1
    8281 게임롤드컵 한국 로스터가 공개되었습니다. 2 Leeka 18/09/26 6734 0
    1703 꿀팁/강좌이것이 진화생물학적으로 접근하는 사회브란감? 4 눈부심 15/12/04 6734 1
    782 일상/생각한 폭의 그림같은 직장 이야기 #6 5 No.42 15/08/12 6734 0
    10437 도서/문학타이의 대모험을 추억하며... 19 사십대독신귀족 20/03/28 6733 3
    4831 IT/컴퓨터로또 번호 생성 프로그램과 정지 문제 11 April_fool 17/02/10 6733 1
    538 기타좋은 프로가 있네요 - 오 마이 갓 글로벌 특집 5 pinkwhale 15/07/08 6733 0
    11339 사회건설사는 무슨 일을 하는가? 12 leiru 21/01/13 6732 14
    목록

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