"Alan Turing은 1936 년에 가능한 모든 프로그램 입력 쌍에 대한 정지 문제를 해결하기위한 일반적인 알고리즘이 존재할 수 없음을 증명했습니다. "
나는에 대한 중단 문제를 해결하기 위해 일반적인 알고리즘을 찾을 수 몇 가지 가능한 프로그램 입력 쌍을?
이 언어로 된 모든 종류의 프로그램에 대해 프로그래밍 언어 (또는 언어)를 찾을 수 있습니까? 프로그램 종료 여부 또는 영구 실행 여부를 결정할 수 있습니까?
"Alan Turing은 1936 년에 가능한 모든 프로그램 입력 쌍에 대한 정지 문제를 해결하기위한 일반적인 알고리즘이 존재할 수 없음을 증명했습니다. "
나는에 대한 중단 문제를 해결하기 위해 일반적인 알고리즘을 찾을 수 몇 가지 가능한 프로그램 입력 쌍을?
이 언어로 된 모든 종류의 프로그램에 대해 프로그래밍 언어 (또는 언어)를 찾을 수 있습니까? 프로그램 종료 여부 또는 영구 실행 여부를 결정할 수 있습니까?
답변:
가능한 프로그램 입력 쌍의 정지 문제를 해결하기위한 일반적인 알고리즘을 찾을 수 있습니까?
물론이지. 예를 들어, 루프 나 재귀를 포함하지 않는 프로그램에 대해 "예, 종료합니다"를 반환하는 알고리즘을 작성할 수 있으며, while(true)
확실히 도달하고 포함하지 않는 루프를 포함하는 프로그램에 대해서는 "아니요, 종료하지 않습니다" 브레이크 선언 및 기타 모든 것에 대한 "Dunno".
이 언어로 된 모든 종류의 프로그램에 대해 프로그래밍 언어 (또는 언어)를 찾을 수 있습니까? 프로그램 종료 여부 또는 영구 실행 여부를 결정할 수 있습니까?
그 언어가 Turing-complete라면 아닙니다.
그러나 중단 문제를 결정할 수있는 Coq , Agda 또는 Microsoft Dafny 와 같은 비 Turing 완전한 언어 가 있습니다 (실제로 해당 유형 시스템에 의해 결정되어 전체 언어 (예 : 종료되지 않을 수있는 프로그램은 작동하지 않음) 엮다)).
나는 여기에있는 모든 대답이 완전히 요점을 그리워한다고 생각합니다. 질문에 대한 답은 : 프로그램이 중단되었다고 가정하면 프로그램이 중지되었음을 더 잘 보여줄 수 있다는 것입니다. 쉽게 중지 할 수없는 경우 품질 관리에서 프로그램을 매우 잘못 작성하여 거부 한 것으로 간주해야합니다.
실제로 적합한 기계 알고리즘을 작성할 수 있는지 여부는 입력 프로그래밍 언어와 사용자의 야심에 달려 있습니다. 종료를 쉽게 증명할 수 있도록하는 프로그래밍 언어의 합리적인 설계 목표입니다.
언어가 C ++ 인 경우 아마도 도구를 작성할 수 없을 것입니다. 실제로 파서가 끝나지 않을 것 같지는 않습니다. 보다 체계적인 언어를 사용하려면 증거를 생성하거나 최소한 특정 가정을 사용하여 증명할 수 있어야합니다. 후자의 경우 도구가 이러한 가정을 출력해야합니다. 유사한 접근 방식은 언어에 종료 어설 션을 포함하고 도구가 어설 션을 신뢰하는 복잡한 상황에서이를 사용하는 것입니다.
결론적으로, 그러한 정지 프로그램을 작성하려는 (좋은) 프로그래머는 항상 의도적으로 그렇게하고 왜 종료하고 올바르게 행동하는지에 대한 정신적 인 그림을 가지고 있기 때문에 프로그램이 멈춘 증거가 실제로 가능하다는 것을 아무도 이해하지 못하는 것입니다. 그러한 코드는 의도적으로 그것들이 멈추고 정확하다는 것이 분명 해졌고, 합리적인 알고리즘이 이것을 암시 할 수 없다면, 힌트가있을 경우 프로그램을 거부해야합니다.
요점 : 프로그래머는 임의의 프로그램을 작성하지 않으므로 정지 정리의 이론이 충족되지 않으며 결론이 적용되지 않습니다.
우수하고 (의도적으로 심의적인) 질문. 제한된 입력 세트에서 성공할 수있는 정지 감지 프로그램이 있습니다. 활발한 연구 분야. 그것은 이론을 증명하는 영역과 (자동화 된) 관계를 맺고있다.
그러나 컴퓨터 과학은 "때때로"성공하는 "프로그램"에 대한 정확한 용어를 가지고 있지 않습니다. "알고리즘"이라는 단어는 일반적으로 항상 중단되는 프로그램을 위해 예약되어 있습니다.
이 개념은 CS 이론가들이 그들의 성공에 대해 알려진 또는 계산 가능한 확률이 있다고 주장하는 확률 적 알고리즘 과는 분명히 다른 것으로 보인다 .
때때로 사용되는 반 알고리즘 이라는 용어 가 있지만 재귀 적으로 열거 가능하거나 계산 불가능한 것과 동의어로 보입니다.
여기에서 목적을 위해 그들을 quasialgorithms 라고 부릅니다 . 개념은 결정 가능한 것과 결정 불가능한 것과 다릅니다.
CS에서이 "quasi algorithm hierarchy"는 대부분 비공식적으로 만 연구 된 것으로 보인다.
그것은 바쁜 비버 연구 [1]와 PCP 문제 [2]에서 나타난다. 사실 PCP에 대한 DNA 기반 컴퓨팅 공격은 quasialgorithm으로 볼 수 있습니다. [3] 그리고 이론 증명과 같이 이미 언급 된 다른 영역에서도 볼 수있다 [4].
[2] Zhao (v2?)의 Tackling Posts 통신 문제
[3] Kari et al 의 경계 포스트 대응 문제를 해결하기 위해 DNA 사용
[4] 증명 프로그램 종료 등 쿡 통신에 의해. ACM의
(이것은 실제로 defn이 TCS.SE imho에있을 가치가있는 매우 깊은 질문입니다 ... 어쩌면 누군가가 그것이 맞는 & 머무르는 방식으로 다시 요청할 수 있습니다)
문제가되는 프로그래밍 언어가 충분히 복잡하다면 (즉, 튜링이 완료된 경우), 어떤 프로그램도 종료 할 수없는 언어의 프로그램이 항상 있습니다.
가장 원시적 인 언어를 제외한 모든 언어는 Turing complete (변수 및 조건과 같은 것만 필요함)이므로 정지 문제를 해결할 수있는 매우 작은 장난감 언어 만 만들 수 있습니다.
편집 : 의견에 비추어보다 명확하게 설명하겠습니다. 중지 문제를 해결할 수있는 디자인 언어는 반드시 튜링 불완전해야합니다. 이것은 적절한 기본 구성 요소 세트 (예 : "변수, 조건부 및 점프") 또는 @ sepp2k에서 말한 것처럼 일반적인 "while"-루프를 포함하는 모든 언어를 배제합니다.
분명히 몇 가지 실용적인 "간단한"언어가 있습니다 (예 : Coq 및 Agda와 같은 정리 솔버). 이것들이 "프로그래밍 언어"라는 개념을 만족 시키면 어떤 종류의 완성도를 만족시키는 지 또는 정지 문제를 해결할 수 있는지 여부를 조사 할 수 있습니다.
예, 가능하지만 유용 할 것 같습니다. 아마도 사건 분석을해야했을 것이고, 가장 명백한 사건 만 찾을 수있을 것입니다. 예를 들어, 코드 파일을 grep 할 수 있습니다 while(true){}
. 파일에 해당 코드가 있으면 종료되지 않습니다 ^. 더 일반적으로 루프 나 재귀가없는 프로그램은 항상 종료되고 프로그램이 종료되거나 종료되지 않을 것이라고 보장 할 수있는 몇 가지 경우가 있지만 중간 규모의 프로그램조차도 매우 어려울 수 있습니다. 대부분의 경우 답변을 드릴 수 없습니다.
tl; dr : 예. 그러나 가장 유용한 프로그램에는 유용하지 않습니다.
^ 예, 기술적으로 해당 코드가 코드 경로에 없거나 여전히 종료 할 수있는 다른 스레드가있는 경우 여기에서 일반적인 요점을 만들고 있습니다.