Turing의 "Halting problem‍"을 해결하는 알고리즘


23

"Alan Turing은 1936 년에 가능한 모든 프로그램 입력 쌍에 대한 정지 문제를 해결하기위한 일반적인 알고리즘이 존재할 수 없음을 증명했습니다. "

나는에 대한 중단 문제를 해결하기 위해 일반적인 알고리즘을 찾을 수 몇 가지 가능한 프로그램 입력 쌍을?

이 언어로 된 모든 종류의 프로그램에 대해 프로그래밍 언어 (또는 언어)를 찾을 수 있습니까? 프로그램 종료 여부 또는 영구 실행 여부를 결정할 수 있습니까?



3
CACM는 5 월에서 매우 흥미로운 기사 한 프로그램 종료를 입증
크리스토프 Walesch

3
"일부 가능한 프로그램 입력 쌍을위한 일반적인 알고리즘 [...]"-그것은 자기 모순에 가깝습니다. 모든 프로그램의 무한 서브 클래스로 제한하고 싶습니까?
Raphael

답변:


25

가능한 프로그램 입력 쌍의 정지 문제를 해결하기위한 일반적인 알고리즘을 찾을 수 있습니까?

물론이지. 예를 들어, 루프 나 재귀를 포함하지 않는 프로그램에 대해 "예, 종료합니다"를 반환하는 알고리즘을 작성할 수 있으며, while(true)확실히 도달하고 포함하지 않는 루프를 포함하는 프로그램에 대해서는 "아니요, 종료하지 않습니다" 브레이크 선언 및 기타 모든 것에 대한 "Dunno".

이 언어로 된 모든 종류의 프로그램에 대해 프로그래밍 언어 (또는 언어)를 찾을 수 있습니까? 프로그램 종료 여부 또는 영구 실행 여부를 결정할 수 있습니까?

그 언어가 Turing-complete라면 아닙니다.

그러나 중단 문제를 결정할 수있는 Coq , Agda 또는 Microsoft Dafny 와 같은 비 Turing 완전한 언어 가 있습니다 (실제로 해당 유형 시스템에 의해 결정되어 전체 언어 (예 : 종료되지 않을 수있는 프로그램은 작동하지 않음) 엮다)).


1
원시 재귀 함수의 클래스는 정지 문제가 사소하게 결정될 수있는 잘 알려진 "프로그래밍 언어"입니다.
Raphael

모든 프로그램이 종료 될 수있는 몇 가지 " 총 기능 프로그래밍 "언어가 있습니다.
Anderson Green

3

나는 여기에있는 모든 대답이 완전히 요점을 그리워한다고 생각합니다. 질문에 대한 답은 : 프로그램이 중단되었다고 가정하면 프로그램이 중지되었음을 더 잘 보여줄 수 있다는 것입니다. 쉽게 중지 할 수없는 경우 품질 관리에서 프로그램을 매우 잘못 작성하여 거부 한 것으로 간주해야합니다.

실제로 적합한 기계 알고리즘을 작성할 수 있는지 여부는 입력 프로그래밍 언어와 사용자의 야심에 달려 있습니다. 종료를 쉽게 증명할 수 있도록하는 프로그래밍 언어의 합리적인 설계 목표입니다.

언어가 C ++ 인 경우 아마도 도구를 작성할 수 없을 것입니다. 실제로 파서가 끝나지 않을 것 같지는 않습니다. 보다 체계적인 언어를 사용하려면 증거를 생성하거나 최소한 특정 가정을 사용하여 증명할 수 있어야합니다. 후자의 경우 도구가 이러한 가정을 출력해야합니다. 유사한 접근 방식은 언어에 종료 어설 션을 포함하고 도구가 어설 션을 신뢰하는 복잡한 상황에서이를 사용하는 것입니다.

결론적으로, 그러한 정지 프로그램을 작성하려는 (좋은) 프로그래머는 항상 의도적으로 그렇게하고 왜 종료하고 올바르게 행동하는지에 대한 정신적 인 그림을 가지고 있기 때문에 프로그램이 멈춘 증거가 실제로 가능하다는 것을 아무도 이해하지 못하는 것입니다. 그러한 코드는 의도적으로 그것들이 멈추고 정확하다는 것이 분명 해졌고, 합리적인 알고리즘이 이것을 암시 할 수 없다면, 힌트가있을 경우 프로그램을 거부해야합니다.

요점 : 프로그래머는 임의의 프로그램을 작성하지 않으므로 정지 정리의 이론이 충족되지 않으며 결론이 적용되지 않습니다.


4
나는 요점을 완전히 그리고 완전히 놓친 것이 당신이라고 생각합니다. 답의 첫 번째 단락은 알고리즘에 대해 질문하기 때문에 질문에 적용되지 않습니다. 인간이 할 수있는 것이거나 증명할 수없는 것이 아닙니다. 나머지 답변은 질문의 첫 번째 단락, 즉 알고리즘이 일부 프로그램의 종료를 증명할 수 있는지 여부에 대한 답변 입니다. 이전 답변의 모든 사람들은 이미 그 답변에 "예"라고 대답했습니다.
sepp2k

3
충분히 잘 작성된 Turing-complete 언어로 잘 작성된 모든 프로그램의 종료를 증명할 수있는 알고리즘을 작성할 수있는 주장은 완전히 잘못된 것입니다. 종료를 증명하는 모든 가능한 알고리즘에는 해당 문제를 해결하는 모든 프로그램이 해당 알고리즘에 의해 중지되는 것으로 입증 될 수없는 문제가 있습니다. 따라서 그 문제를 해결하는 모든 프로그램이 정의에 의해 잘못 쓰여졌다 고 말하지 않는 한 (당신의 주장을 반증합니다).
sepp2k

1
@ Sam 누군가가 코드가 멈추는 지 묻는다면 코드를 살펴보고 알아낼 것입니다. 그러나 나는 알고리즘이 아닙니다. 그리고 네, 프로그램이 많은 프로그램을 멈추는 지 검사 할 수있는 알고리즘을 작성할 수 있습니다. 그러나이 트릴이 말한 것은 아닙니다. 이 트릴은 모든 잘 작성된 프로그램이 가능하다고 말했다. 그리고 이전의 의견에서 말했듯이, 특정 문제가 잘못 작성된 프로그램으로 만 해결할 수 있다고 주장하지 않는 한 단순히 거짓입니다.
sepp2k

1
@Sam은 "정 지적으로 중지하도록 작성된 프로그램을 정지 조건에 대해 쉽게 분석 할 수 있다는 것이 간단 해 보입니다."그렇다면 그러한 도구가없는 이유는 무엇입니까? 사람들이 시도하지 않은 것처럼 아닙니다. (한 가지 범인은 메서드 재정의입니다. 컴파일 타임에 실행할 모든 코드를 모릅니다.)
Raphael

1
@Sam "무한 루프가 있습니까?"는 실제 루프에서도 접근하기 어려운 것입니다. 물론 루프 불변량을 찾는 방법을 배웠지 만 많은 경우에 쉽게 찾을 수 있다는 의미는 아닙니다. 내가 아는 한 요즘 추측하고 증명하는 것이 표준입니다. 다시 말하지만,이 경우 했다 합리적으로 일반적인 알고리즘, 나는 그들이 (주요 컴파일 또는 십오에 포함되는 예상 몇 가지 사소한, 구문 검사를 수행). 합리적으로 강력한 알고리즘에 대한 참조를 제공 할 수 있습니까?
Raphael

3

우수하고 (의도적으로 심의적인) 질문. 제한된 입력 세트에서 성공할 수있는 정지 감지 프로그램이 있습니다. 활발한 연구 분야. 그것은 이론을 증명하는 영역과 (자동화 된) 관계를 맺고있다.

그러나 컴퓨터 과학은 "때때로"성공하는 "프로그램"에 대한 정확한 용어를 가지고 있지 않습니다. "알고리즘"이라는 단어는 일반적으로 항상 중단되는 프로그램을 위해 예약되어 있습니다.

이 개념은 CS 이론가들이 그들의 성공에 대해 알려진 또는 계산 가능한 확률이 있다고 주장하는 확률 적 알고리즘 과는 분명히 다른 것으로 보인다 .

때때로 사용되는 반 알고리즘 이라는 용어 가 있지만 재귀 적으로 열거 가능하거나 계산 불가능한 것과 동의어로 보입니다.

여기에서 목적을 위해 그들을 quasialgorithms 라고 부릅니다 . 개념은 결정 가능한 것과 결정 불가능한 것과 다릅니다.

AXBYXYXYBA

CS에서이 "quasi algorithm hierarchy"는 대부분 비공식적으로 만 연구 된 것으로 보인다.

그것은 바쁜 비버 연구 [1]와 PCP 문제 [2]에서 나타난다. 사실 PCP에 대한 DNA 기반 컴퓨팅 공격은 quasialgorithm으로 볼 수 있습니다. [3] 그리고 이론 증명과 같이 이미 언급 된 다른 영역에서도 볼 수있다 [4].

[1] 바쁜 비버 문제에 대한 새로운 밀레니엄 공격

[2] Zhao (v2?)의 Tackling Posts 통신 문제

[3] Kari et al 의 경계 포스트 대응 문제를 해결하기 위해 DNA 사용

[4] 증명 프로그램 종료 등 쿡 통신에 의해. ACM의

(이것은 실제로 defn이 TCS.SE imho에있을 가치가있는 매우 깊은 질문입니다 ... 어쩌면 누군가가 그것이 맞는 & 머무르는 방식으로 다시 요청할 수 있습니다)


ps는 quasialgorithms가 얼마나 강력한 지에 대한 인상적인 예로써 ackermanns 함수는 quasialgorithm에 의해 정지되는 것으로 입증 될 수 있지만 모든 원시 재귀 함수보다 (계산할 수는 없음) 더 크다고 지적합니다.
vzn

1
"알고리즘"이라는 단어는 일반적으로 항상 중단되는 프로그램을 위해 예약되어 있습니다. " -나는 그것이 확실하지 않다. 주변에 부분적으로 종결되는 알고리즘이 많이 있으며 (특히 검증 중) "알고리즘"이라고 말하는 사람은 없습니다.
Raphael

"알고리즘"은 비공식적으로 사용됩니다. "부분적으로 종료"는 괜찮지 만 문제가되지 않습니다. 명시된 바와 같이, 아직 규정 된 용어가없는 것 같습니다. wikipedia는 알고리즘효과적인 방법 으로 정의합니다. 즉 , 다음과 같은 특성으로 결정할 수 있습니다. (1) 항상 응답하지 않고 항상 응답합니다. (2) 항상 옳은 대답을하고 틀린 대답을하지 마십시오. (3) 항상 무한 수가 아닌 유한 한 단계로 완료되어야한다. (4) 학급의 모든 문제에 대해 일한다.
vzn

그런 다음 같은 기사에서 "유효한 방법"이라는 용어에 대한 추가 설명에는 방법이 효과적인 클래스 외부에서 문제가 발생했을 때 방법이 멈추지 않고 영원히 중단되거나 반복 될 수 있어야한다는 요구 사항이 포함될 수 있습니다. "하지만 문제에 대한 답인 것처럼 결과를 반환해서는 안됩니다." 즉 그것은 거의 모순된다!?! 따라서 핵심 이슈에 대한 실제 혼동이 있으며 기존 용어가 엄격하지 않습니다. "알고리즘"이상에 가까운 단어를주의 천년 된 정도 및 ... 실질적으로 이동했다
vzn

그것은 사실입니다 : 전통적인 의미는 아마도 위키피디아가 말한 방식에서 "유효한 방법"일 것입니다. 일부 입력). 나는 이것이 1950 년대 이후로 바뀌 었다고 생각합니다. 내가 말했듯이 오늘날 사람들은 부분적으로 종료하는 방법을 "알고리즘"이라고 부릅니다.
Raphael

2

문제가되는 프로그래밍 언어가 충분히 복잡하다면 (즉, 튜링이 완료된 경우), 어떤 프로그램도 종료 할 수없는 언어의 프로그램이 항상 있습니다.

가장 원시적 인 언어를 제외한 모든 언어는 Turing complete (변수 및 조건과 같은 것만 필요함)이므로 정지 문제를 해결할 수있는 매우 작은 장난감 언어 만 만들 수 있습니다.

편집 : 의견에 비추어보다 명확하게 설명하겠습니다. 중지 문제를 해결할 수있는 디자인 언어는 반드시 튜링 불완전해야합니다. 이것은 적절한 기본 구성 요소 세트 (예 : "변수, 조건부 및 점프") 또는 @ sepp2k에서 말한 것처럼 일반적인 "while"-루프를 포함하는 모든 언어를 배제합니다.

분명히 몇 가지 실용적인 "간단한"언어가 있습니다 (예 : Coq 및 Agda와 같은 정리 솔버). 이것들이 "프로그래밍 언어"라는 개념을 만족 시키면 어떤 종류의 완성도를 만족시키는 지 또는 정지 문제를 해결할 수 있는지 여부를 조사 할 수 있습니다.


3
"가장 원시적 인 언어를 제외한 모든 언어가 Turing complete이기 때문에 (변수 나 조건과 같은 것을 취한다)"사실이 아니다. 우선 최소한 재귀 또는 어떤 형태의 루핑 구조가 필요합니다 (while 루프만큼 강력해야합니다-간단한 카운팅 루프로는 충분하지 않습니다). 두 번째로 나는 Coq 또는 Agda와 같은 언어를 사용하는 사람들이 많지 않다고 생각합니다.
sepp2k

@ sepp2k : 그래. Peano 산술도 매우 유용하며 튜링 완료가 아닙니다. 단순화 된 진술이라고 생각합니다. OP가 문제에 충분히 익숙한 경우 기술 세부 정보를 채울 수 있기를 바랍니다.

3
"충분히 복잡하다"는 것과 Turing-complete라는 것 사이에는 큰 차이가 있습니다. Coq는 실제로 복잡하며 광범위한 실제 작업에 적합합니다.

1
@Kerrek SB Turing-complete language는 종료 될 가능성이있는 방식으로 사용될 수 있습니다. 재귀 수식이 항상 계승 함수와 같은 종료 조건에 접근한다는 것을 증명할 수 있다면 모든 유형의 재귀를 처리 할 수는 없지만 종료되는 것을 증명할 수 있습니다.

@ArtB : 물론, 종료 된 것으로 입증 될 수있는 일부 프로그램 이 항상 있습니다. OP의 첫 번째 질문은 그것을 암시 할 수는 있지만 완전히 따르지는 않을 것입니다. 프로그램 종료의 특정 가족, 반대로 동안 예를 들어, 만약 당신이 결정하는 "일반적인 알고리즘을"이 없습니다 아마도 함수를 가정하는 것은 그 가족에 속한다는 것을, 당신이 알고리즘 그것을 여부를 말할 수있는 같은 기능의 제한된 가족 구성 종료합니다. (하지만 가족이 사소한 것이 아닌지 잘 모르겠습니다. 가능하다고 생각하지만 예를 만들 수는 없습니다.)

2

TT

이것은 아주 사소한 일입니다. 정지 TM의 ce 하위 집합과 정지하지 않는 TM의 ce 하위 집합을 합치면 결과는 정지 문제를 결정할 수있는 TM 세트가됩니다 (첫 번째 기계가 TM을 수락하면 두 기계를 동시에 실행) 두 번째 것이 허용되면 기계가 정지하지 않습니다). 그러나 이것은 많은 흥미로운 언어로 이어지지 않을 것입니다.

ALogTimecM


1

예, 가능하지만 유용 할 것 같습니다. 아마도 사건 분석을해야했을 것이고, 가장 명백한 사건 만 찾을 수있을 것입니다. 예를 들어, 코드 파일을 grep 할 수 있습니다 while(true){}. 파일에 해당 코드가 있으면 종료되지 않습니다 ^. 더 일반적으로 루프 나 재귀가없는 프로그램은 항상 종료되고 프로그램이 종료되거나 종료되지 않을 것이라고 보장 할 수있는 몇 가지 경우가 있지만 중간 규모의 프로그램조차도 매우 어려울 수 있습니다. 대부분의 경우 답변을 드릴 수 없습니다.

tl; dr : 예. 그러나 가장 유용한 프로그램에는 유용하지 않습니다.


^ 예, 기술적으로 해당 코드가 코드 경로에 없거나 여전히 종료 할 수있는 다른 스레드가있는 경우 여기에서 일반적인 요점을 만들고 있습니다.


4
왜 Coq와 Agda가 유용하지 않다고 생각합니까? Turing-completeness의 가치를 과대 평가하고 있습니다.

Coq을 사용했지만 대부분의 상용 소프트웨어는 Java / C ++ / Ruby / C #으로 작성되었으므로 소유권 주장이 유효합니다. 사람들의 90 %가 작문에 관심이있는 프로그램은 도움이되지 않습니다. 기본적으로 Coq / Agda 등을 모른다면 목표 시장이 아닙니다.

5
실제 프로그램의 99 %가 튜링-완료가 아닌 언어의 일부로 구현되는 것이 좋습니다. Ackermann 기능은 매일 구현하지 않습니다. CRUD의 100 %는 "실제"언어가 필요하지 않습니다. 데이터 처리는 거의 항상 사소합니다. Terminator 프로젝트를 참조하십시오-심지어 실제 C ++ 프로그램의 적절한 하위 세트를 제공합니다 (드라이버 및 기타 저수준 코드 포함).

대부분의 실제 프로젝트는 Turing-complete 언어로 작성된 라이브러리를 재사용하고 IDE 및 디버거 및 자습서를 사용하려고합니다. 그렇습니다. 튜링 이외의 언어로도 할 수 있지만 실제로 "X를 원합니다"라고 대답하고 "Coq 사용"이라는 대답을 상상할 수 없습니다. The Terminator Project 를 소개해 주셔서 감사합니다 .

4
상상할 수 없을 정도로 많은 비즈니스 로직이 이미 튜링이 완료되지 않은 SQL로 구현되었습니다. 그리고 DSL과 eDSL도 증가하고 있습니다. 따라서 곧 대부분의 비즈니스 앱 프로그래머는 모든 "일반 목적"언어를 잊게됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.