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


    목록
    번호 제목 이름 날짜 조회 추천
    공지 티타임 게시판 이용 규정 2 Toby 15/06/19 35024 1
    15878 창작또 다른 2025년 (3) 3 트린 25/12/04 287 2
    15877 스포츠[MLB] 코디 폰세 토론토와 3년 30M 계약 김치찌개 25/12/04 215 0
    15876 창작또 다른 2025년 (1), (2) 8 트린 25/12/03 457 7
    15875 기타유럽 영화/시리즈를 시청하는 한국 관객에 관한 연구(CRESCINE 프로젝트) 19 기아트윈스 25/12/03 567 2
    15874 일상/생각큰일이네요 와이프랑 자꾸 정들어서 ㅋㅋㅋ 14 큐리스 25/12/02 955 5
    15873 오프모임12월 3일 수요일, 빛고을 광주에서 대충 <점봐드립니다> 15 T.Robin 25/12/01 548 4
    15872 경제뚜벅이투자 이야기 19 기아트윈스 25/11/30 1509 14
    15871 스포츠런린이 첫 하프 대회 후기 8 kaestro 25/11/30 440 12
    15870 도서/문학듣지 못 하는 아이들의 야구, 만화 '머나먼 갑자원'. 15 joel 25/11/27 1044 27
    15869 일상/생각상남자의 러닝 3 반대칭고양이 25/11/27 699 5
    15868 정치 트럼프를 조종하기 위한 계획은 믿을 수 없이 멍청하지만 성공했다 - 트럼프 행정부 위트코프 스캔들 6 코리몬테아스 25/11/26 903 8
    15867 일상/생각사장이 보직해임(과 삐뚫어진 마음) 2 Picard 25/11/26 690 5
    15866 일상/생각기계가 모르는 순간 - 하루키 느낌으로 써봤어요 ㅋㅋㅋ(와이프 전전전전전 여친을 기억하며) 5 큐리스 25/11/25 627 0
    15865 경제주거 입지 선택의 함수 4 오르카 25/11/25 650 3
    15864 철학/종교진화와 창조, 근데 이게 왜 떡밥임? 97 매뉴물있뉴 25/11/25 1871 4
    15863 일상/생각창조론 교과서는 허용될 수 있을까 12 구밀복검 25/11/25 1057 17
    15862 기타★결과★ 메가커피 카페라떼 당첨자 ★발표★ 11 Groot 25/11/23 616 4
    15861 기타[나눔] 메가커피 아이스 카페라떼 깊콘 1 EA (모집마감) 31 Groot 25/11/21 675 3
    15860 일상/생각식생활의 스트레스 3 이이일공이구 25/11/20 714 1
    15859 일상/생각누구나 원하는 것을 얻는다. moqq 25/11/20 646 7
    15858 오프모임[취소] 11월 29일 토요일 수도권 거주 회원 등산 모임 13 트린 25/11/19 770 3
    15857 경제투자 포트폴리오와 축구 포메이션2 2 육회한분석가 25/11/19 476 3
    15855 의료/건강성분명 처방에 대해 반대하는 의료인들이 들어줬으면 하는 넋두리 46 Merrlen 25/11/17 2012 2
    15854 경제투자 포트폴리오와 축구 포메이션 육회한분석가 25/11/17 563 6
    목록

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

    댓글