중지 문제를 피하는 프로그램의 하위 집합이 있습니까?


21

나는 멈추는 문제에 대한 또 다른 설명을 읽고 있었고, 예를 들어 무한 시퀀스와 관련하여 주어진 모든 문제를 생각하게했습니다. 그러나 나는 내 프로그램에서 무한 시퀀스를 사용하지 않습니다-너무 오래 걸립니다. 모든 실제 응용 프로그램에는 하한과 상한이 있습니다. 실수조차도 진짜가 아닙니다-32/64 비트 등으로 저장된 근사치입니다.

문제는 그들이 멈췄을 때 결정될 수있는 프로그램의 서브 세트가 있는가하는 것입니다. 대부분의 프로그램에 충분합니까? 프로그램의 '중단 가능성'을 결정할 수있는 일련의 언어 구성을 만들 수 있습니까? 나는 이것이 전에 어딘가에서 연구되었으므로 어떤 점이라도 높이 평가 될 것입니다. 언어는 튜링 완료되지 않았지만 거의 튜링 완료와 같은 것이 있습니까?

당연히 그러한 구조는 재귀와 무한한 while 루프를 배제해야하지만, 충분히 쉽게 프로그램을 작성할 수는 없습니다.

예를 들어 표준 입력에서 읽는 것은 제한적이지만 충분히 쉽습니다. 문제 도메인에 따라 입력을 10,000,000 자로 제한합니다.

티아

[최신 정보]

의견과 답변을 읽은 후 아마도 내 질문을 다시 말해야합니다.

모든 입력이 바인드 된 특정 프로그램에 대해 프로그램이 정지하는지 판별 할 수 있습니다. 그렇다면 언어의 제약 조건과 입력 세트의 한계는 무엇입니까? 이들 구성의 최대 세트는 중단 될 것으로 추론 될 수있는 언어를 결정할 것이다. 이것에 대한 연구가 있습니까?

[업데이트 2]

다음은 정답입니다. 1967 년에 http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf 에서 돌아 왔습니다 .

최소 상태 시스템에 대해 정지 문제가 이론적으로 해결 될 수 있다는 사실은 1967 년 Minsky에 의해 이미 주장되었다 [4] : 반복적 인 패턴. 이 반복 패턴의 지속 시간은 기계의 내부 상태 수를 초과 할 수 없습니다 ...”

(따라서 유한 한 튜링 머신을 고수하면 오라클을 구축 할 수 있습니다)


13
"무한 시퀀스 ... 너무 오래 걸린다". 나를 크게 웃게했다.
Bryan Oakley

3
SQL92와 정규 표현식은 중단이 보장되는 언어의 예라고 생각합니다.
Elian Ebbing

2
답변으로 "Update2 ..."를 게시하십시오.
S.Lott

2
재귀를 제외 할 필요는 없습니다. 재귀를 수신자 수신자의 엄격한 하위 용어로 제한하면 항상 종료를 증명할 수 있습니다. 교회 숫자를 사용하는 한 "바운드 루프"등은 필요하지 않습니다.
SK-logic

1
언어 Idris는 의존적 타이핑 및 증명 검사기를 사용하여 프로그램을 실행하기 전에 프로그램이 종료되었음을 증명합니다. Haskell과 유사하며 재귀를 허용하지만 일반적인 재귀 는 허용하지 않습니다. (종속적 유형을 통해) 증명할 수있는 재귀는 일부 터미널 상태를 초래합니다.
Jack

답변:


8

문제는 입력에 있지 않습니다 (분명히 무제한 입력의 경우 입력을 읽기 위해 무제한 실행 시간을 가질 수 있음). 내부 상태의 수에 있습니다.

내부 상태의 수가 제한되면 이론적으로 모든 경우에서 정지 문제를 해결할 수 있습니다 (정지 또는 상태 반복에 도달 할 때까지 에뮬레이션). 그렇지 않으면 해결할 수없는 경우가 있습니다. . 그러나 내부 국가의 수가 실제로 제한되어 있더라도 내부 국가 수의 경계에 의존하는 방법이 가장 사소한 프로그램 이외의 종료를 증명하는 데 쓸모가 없을 정도로 너무 큽니다.

프로그램 종료를 확인하는 더 실용적인 방법이 있습니다. 예를 들어, 재귀 나 이동이 없으며 루프 구조가 루프 시작시 지정 해야하는 반복 횟수에 모두 묶여있는 프로그래밍 언어로 표현하십시오. (한계가 실제로 유효한 반복 횟수와 관련이있는 것은 아니며 루프의 종료를 증명하는 표준 방법은 반복에서 한 번에 한 번 반복하여 입력 조건이 줄어드는 기능을 갖는 것입니다. 긍정적인지 확인하십시오. 첫 번째 평가를 귀하의 한계로 둘 수 있습니다.


10

먼저, 정지 감지기가 있으면 어떻게 될지 고려하십시오. 우리는 멈춤 검출기가 멈추지 않거나 틀린 대답을하게하는 적어도 하나의 프로그램이 존재한다는 대각선 주장에서 알 수 있습니다. 그러나 그것은 기괴하고 가능성이 적은 프로그램입니다.

정지 검출기가 불가능하다는 또 다른 주장이 있으며, 이는 정지 검출기가 마 법적이라는 더 직관적 인 주장입니다. Fermat의 마지막 정리가 참인지 거짓인지 알고 싶다고 가정하십시오. 당신은 그것이 참이면 멈추고 거짓이라면 영원히 실행되는 프로그램을 작성하고 정지 검출기를 실행합니다. 프로그램을 실행 하지 말고 프로그램 에서 정지 탐지기 실행 하면됩니다 . 정지 검출기는 프로그램 작성만으로 수 이론에서 수많은 개방 된 문제를 즉시 해결할 수있게합니다.

따라서 정지를 항상 결정할 수있는 프로그램을 생성 할 수있는 프로그래밍 언어를 작성할 수 있습니까? 확실한. 루프, 조건을 가질 수 없으며 임의로 많은 스토리지를 사용합니다. 루프가 없거나 "if"문이 없거나 엄격하게 제한된 저장 용량으로 기꺼이 살기를 원한다면 정지를 항상 결정할 수있는 언어를 작성할 수 있습니다.


2
점프가 항상 앞뒤로 오지 않으면 if 문을 가질 수 있습니다. "GOTO X"는 줄 번호 currentLine + X로 이동하고 X는 0보다 커야 함을 의미하는 BASIC 언어의 제한된 하위 집합을 생각하고 있습니다. 줄이 유효하지 않으면 중단됩니다. 이는 스토리지 요구를 증가 시키지만 사소한 논리를 허용합니다. 이것은 정점이 그래프를 형성하고 그래프에주기가 없거나 FSM이 유효하지 않은 유한 상태 머신과 동일합니다. 또한 막 다른 (dead end) 상태 인 모든 상태는 수락 가능한 상태 여야합니다.
Job

3
예를 들어 i = 1에서 10의 경우 루프와 같은 루프를 사용할 수 있습니다. 따라서 해결 될 수있는 유한 문제의 클래스가 있습니다. 페르마 정리는 다시 일련의 실수에 관여합니다. 그러나 도메인을 1,000,000 미만의 숫자로 제한하면 중지됩니다.
daven11

2
왜 조건이 아닌가? 점프가없는 조건은 항상 멈춘 것으로 보인다 ...
Billy ONeal

2
@ nikie : 물론 그것은 약한 논쟁입니다. 요점은 그러한 정지 검출기가 반드시 증거를 찾지 않고도 그러한 진술을 증명하거나 반증 할 수 있다는 것 입니다. 독자가 여기서 개발하려고하는 직관은 사소한 정지 검출기가 작성 될 수있는 언어는 Fermat의 마지막 정리 또는 Goldbach의 추측과 같은 수 이론에서 간단한 문제조차도 표현할 수없는 언어이므로 아마도 그렇지 않을 것입니다. 매우 유용한 언어입니다.
Eric Lippert

3
@EricLippert : 잘못되었습니다. 이러한 언어에는 루프, 적절한 저장 및 기타 유용한 것들이 있습니다. 거의 모든 것을 코딩 할 수 있습니다. 보라, 여기있다 : coq.inria.fr
SK-logic

6

Gödel, Escher, Bach 을 읽을 것을 권장합니다 . 고델의 불완전 성 정리와 정지 문제에 대해 다루는 매우 재미 있고 빛나는 책입니다.

간단히 말해서 : 프로그램에 while루프 (또는 가능한 많은 표현)가 포함되어 있지 않으면 중지 문제를 결정할 수 있습니다 .


죄송합니다 댓글을 삭제했지만 GEB의 추천을 다시 말씀 드리겠습니다.
AProgrammer

@zvrba 그것은 나의 독서 목록에 잠시 동안 있었다 – 아마 잠수 할 시간.
daven11

5

제한된 양의 메모리 (모든 종류의 저장 장치 포함)에서 작동하는 모든 프로그램에 대해 정지 문제를 해결할 수 있습니다. 즉, 결정 불가능한 프로그램은 실행에 점점 더 많은 메모리를 사용하도록 바인딩됩니다.

그럼에도 불구하고이 통찰력은 실제 문제에 사용될 수 있음을 의미하지는 않습니다. 단 몇 킬로바이트의 메모리로 작업하는 정지 프로그램이 우주의 나머지 수명보다 쉽게 ​​오래 걸릴 수 있기 때문입니다.


3

"일부 중단 문제를 피하는 프로그램의 하위 집합이 있습니까?"라는 질문에 (부분적으로) 대답하십시오. 그러나이 하위 집합은 놀랍게도 쓸모가 없습니다 (내가 이야기하는 하위 집합은 중지되는 프로그램의 엄격한 하위 집합입니다).

'대부분의 입력'에 대한 문제의 복잡성에 대한 연구를 일반적인 경우 복잡성 이라고 합니다. 가능한 입력의 일부 서브 세트를 정의하고이 서브 세트가 '대부분의 입력'을 다루고이 서브 세트의 문제점을 해결하는 알고리즘을 제공함을 증명하십시오.

예를 들어, 정지 문제는 대부분의 입력에 대해 다항식 시간으로 해결할 수 있습니다 (실제로 용지를 올바르게 이해하면 선형 시간으로 ).

그러나이 결과는 세 가지 참고 사항으로 인해 다소 쓸모가 없습니다. 첫째, 실제 컴퓨터의 실제 컴퓨터 프로그램이 아닌 단일 테이프로 Turing 머신에 대해 이야기합니다. 내가 아는 한 실제 컴퓨터가 튜링 머신과 동일한 기능, 허용되는 프로그램 수, 길이 및 중단 여부와 동일한 기능을 계산할 수는 있지만 실제 컴퓨터와 동일한 기능을 수행하는지 여부는 아무도 모릅니다. 완전히 다른).

둘째, '대부분의 입력'이 무엇을 의미하는지주의해야합니다. 이 알고리즘으로 '길이'n의 랜덤 프로그램을 검사 할 수있는 확률은 n이 무한대 일수록 1이되는 경향이 있음을 의미합니다. 즉, n이 충분히 크면이 알고리즘으로 길이 n의 임의의 프로그램을 거의 확실하게 확인할 수 있습니다.

논문에 설명 된 접근 방식으로 어떤 프로그램을 확인할 수 있습니까? 기본적으로 상태를 반복하기 전에 정지되는 모든 프로그램 ( 'state'는 프로그램의 코드 줄에 대략 해당)

거의 모든 프로그램을 이런 방식으로 검사 할 수 있지만, 이런 방식으로 검사 할 수있는 프로그램은 그다지 흥미롭지 않으며 대개 사람이 설계하지 않으므로 실제적인 가치는 없습니다.

또한 거의 모든 흥미로운 프로그램을 확인하기가 어렵 기 때문에 일반적인 경우의 복잡성으로 인해 정지 문제를 해결하지 못할 수도 있습니다. 또는 대안 적으로 말하면 거의 모든 프로그램이 흥미롭지 않지만 확인하기 쉽습니다.


2
-1, 이것은 많은 수준에서 잘못되었습니다 ...
user281377

1
첫째, 실제 컴퓨터는 튜링 머신이 할 수없는 것을 계산할 수 없습니다. 지금까지 아무도 튜링 머신보다 더 유능한 실제 컴퓨터를 보여주지 못했습니다. 둘째, 프로그램이 상태를 반복하면 중단되지 않으므로 해당 프로그램 및 입력에 대한 정지 문제가 해결됩니다. 기억하세요 : 정지 문제는 프로그램이 주어진 입력에서 멈출 지 여부를 결정하는 것입니다. 당신이 그것을 긍정적으로 감지하면 무한 루프는 괜찮습니다. 마지막으로, 중지 문제를 해결할 수있는 유용한 프로그램이 많이 있습니다. 제한된 저장 공간에서 작동하는 프로그램입니다.
user281377

첫 번째 문제에 관해서 : 논문에서 언급했듯이 일부 계산 모델이 Turing complete임을 보여 주면 얼마나 많은 프로그램이 정확하게 정지되지 않습니까? 그 결과 입증 된 결과가 다른 모델의 계산에 즉각적인 의미는 없습니다. 나는 Turing 완전성을 잘 알고 있으며 왜 그것이 왜 대답을 '잘못'하게 만드는지 확실하지 않습니다.
Alex ten Brink

두 번째 문제에 관해서 : 내가 말하고있는 상태는 일반적으로 이야기하는 '기계 상태'와 같지 않지만 (상태를 가질 수있는 모든 상태를 포함) 오히려 오히려 유한 상태 자동 상태 튜링 머신을 제어하는 ​​데 사용됩니다. 이는 실행 중 어느 시점에서든 프로그램이 작업하는 코드 라인과 거의 일치합니다. 한 줄의 코드를 반복하면 메모리의 내용이 다를 수 있으므로 이것이 즉시 정지되는 것은 아닙니다. 더 명확하게 답변을 업데이트하겠습니다.
Alex ten Brink

@ammoQ : 아니요, 스토리지가 제한된 실제 시스템에 대해 이야기하는 경우 정지 문제를 해결할 수 없습니다. 즉, 상태 조합을 처리 할 수있는 실제 시스템을 구축해야합니다. 대부분의 CPU에서 가능한 레지스터 상태의 수가 유니버스의 원자 수를 초과하므로 그렇게 할 수 없습니다.
David Thornley

3

실제로 다른 문제에 대한 정지 문제를 항상 해결하는 프로그램이 실제로 존재합니다. 이들은 컴퓨터를 실행하는 운영 체제의 일부입니다. 결정 불가능 성은 다른 모든 프로그램에서 작동하는 프로그램이 없다고 말하는 이상한 주장입니다.

한 사람은 정지 증거가 거울처럼 자신을 무한히 추적하기 때문에 해결할 수없는 유일한 프로그램으로 보인다고 올바르게 언급했습니다. 이 사람은 또한 정지 기계가 있다면, 만약 그것이 해석 알고리즘이 멈 추면 미리 알려줌으로써 어려운 수학 문제를 알려줄 것이기 때문에 마술 일 것이라고 말했다.

이 두 경우 모두 정지 기계가 추적한다는 증거가 없기 때문에 정지 기계가 추적되지 않는다고 가정합니다. 그러나 실제로는 실제로 주어진 입력으로 실행되는 프로그램을 추적 / 실행합니다.

논리적 증거는 최소한 간단합니다. 적어도 첫 번째 단계를 추적 할 필요가 없으면 실행중인 프로그램과 함께 입력이 필요하지 않습니다. 정보를 사용하려면 최소한 경로가 어디로 가고 있는지 분석하기 전에 첫 번째 단계를 추적해야합니다.

상단 답변에 언급 된 어려운 수학 문제는 답을 찾기 위해 빨리 감을 수없는 문제이며, 이는 정지 패턴이 일부 패턴을 인식 할 수있을 때까지 계속 추적해야 함을 의미합니다.

따라서 정지 문제에서 얻을 수있는 실질적인 논거는 정지 기계가 문제 해결사가 완료 할 수있는 것보다 최적화 된 문제 해결사의 결과를 더 빨리 결정할 수 없다는 것입니다.

이 추론에 대한 공식적인 증거를 제시하는 것이 더 어렵고, 비록 내가 할 수 있다고 생각하지만, 누군가에게 학계를 설명하려고 시도하면 성미와 같은 유인원을 던지고 샹들리에에서 스윙을 할 수 있습니다. 그 사람들과 논쟁하지 않는 것이 가장 좋습니다.


1

다음은 정답입니다. 1967 년에 http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf 에서 돌아 왔습니다 .

최소 상태 시스템에 대해 정지 문제가 이론적으로 해결 될 수 있다는 사실은 1967 년 Minsky에 의해 이미 주장되었다 [4] : 반복적 인 패턴. 이 반복 패턴의 지속 시간은 기계의 내부 상태 수를 초과 할 수 없습니다 ...”

(따라서 유한 한 튜링 머신을 고수하면 오라클을 구축 할 수 있습니다)

물론 이것이 걸리는 시간은 또 다른 질문입니다


0

중지되면 확인할 수있는 프로그램의 하위 집합이 있습니까?

예.

대부분의 프로그램에 충분합니까?

"most"를 정의하십시오.

프로그램의 '중단 가능성'을 결정할 수있는 일련의 언어 구성을 만들 수 있습니까?

예.

충분히 튜링 완료와 같은 것이 있습니까?

"거의"를 정의하십시오.

많은 사람들은 while진술이나 재귀 를 사용하지 않고 파이썬을 작성 합니다.

많은 사람들 for간단한 반복자 또는 카운터가 있는 명령문 만 사용하여 Java를 작성 합니다. 그들은 재귀없이 씁니다.

피하고 while재귀 를 피하는 것은 매우 쉽습니다 .


모든 입력이 묶여있는 특정 프로그램에 대해 프로그램이 중지되는지 확인할 수 있습니까?

아니.

그렇다면 언어의 제약 조건과 입력 세트의 한계는 무엇입니까?

음 중단 문제는 프로그램이 프로그램 자체를 복잡하게 결정할 수 없다는 것을 의미합니다. 정지 문제를 극복하기 위해 많은 제약 조건 중 하나를 추가 할 수 있습니다.

정지 문제에 대한 표준 접근 방식은 프로그래밍 언어에서 사용할 수있는 것보다 약간 더 풍부한 수학 형식을 사용하여 증거를 허용하는 것입니다.

언어를 제한하는 것보다 증명 시스템을 확장하는 것이 더 쉽습니다. 모든 제한은 제한 때문에 표현하기 어려운 하나의 알고리즘에 대한 인수로 이어집니다.

이들 구성의 최대 세트는 중단 될 것으로 추론 될 수있는 언어를 결정할 것이다. 이것에 대한 연구가 있습니까?

예. 이것을 "그룹 이론"이라고합니다. 일련의 작업에서 닫힌 값 집합입니다. 꽤 잘 이해 된 것들.


"거의"는 내가 요구하는 비트입니다. 프로그램이 정지한다고 할 수있는 유한 한 종류의 문제가 있습니까? 그리고 문제는 얼마나 제한되어 있습니까? 예를 들어 if (i <10) then print (i) 문은 모든 i에 대해 중지됩니다. i의 도메인을 32 비트 정수로 제한하면 너무 멈 춥니 다.
daven11

for루프 while 루프라는 것을 명심하십시오. 사람들은 종종 조건 용어에 더 복잡한 것을 넣습니다 x < 42.
Billy ONeal

@BillyONeal : 좋은 지적입니다. 파이썬에서 for루프는 반복자를 통해 작동하도록 매우 엄격하게 제한됩니다. for그러나 Java 의보다 일반적인 루프에는 반복자의 간단한 사용을 무효화하는 추가 조건이 포함될 수 있습니다.
S.Lott

"프로그램이 정지한다고 할 수있는 유한 한 종류의 문제가 있습니까?" 대답은 그렇습니다. "문제는 얼마나 제한되어 있습니까?" 음 유한은 유한하다. 실수를 근사하고 자연수를 고수하려고 노력하고 모든 수학 연산에서 닫히면 일반적인 그룹 이론을 수행하는 것입니다. 모듈 식 산술. 특별한 것은 없습니다. 무엇을 요구하는지 명확하지 않습니다. 모듈 식 산술이 무엇인지 묻고 있습니까?
S.Lott

@ S.Lott 나는 추상적 인 의미가 아니라 기계로 표현 된 숫자를 의미합니다. 따라서 숫자를 고정 된 비트 수로 생각하십시오. 이 숫자는 정수 및 실수와 약간 다른 규칙이 있습니다. 이해가 되길 바랍니다.
daven11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.