제한적이거나 예측 가능한 입력이있는 경우 정지 문제를 해결할 수 있습니까?


18

일반적인 경우에는 정지 문제를 해결할 수 없습니다. 허용 된 입력을 제한하는 정의 된 규칙을 생각해 내고 해당 특수한 경우 정지 문제를 해결할 수 있습니까?

예를 들어, 예를 들어 루프를 허용하지 않는 언어는 프로그램이 중지되는지 여부를 쉽게 알 수 있습니다.

지금 해결하려는 문제는 프로그램의 유효성을 검사하는 스크립트 검사기를 만들려고한다는 것입니다. 스크립트 작성자가 무엇을 기대해야하는지 정확히 알고 있으면 매우 예측 가능한 입력을 의미하는 경우 정지 문제를 해결할 수 있습니다. 이것이 정확하게 해결 될 수 없다면, 이것을 해결하기위한 좋은 근사 기법은 무엇입니까?

답변:


10

직관적 인 대답은 무한 루프가없고 재귀가없고 이동하지 않으면 프로그램이 종료된다는 것입니다. 이것은 사실이 아니며, 종료하지 않는 다른 방법이 있지만 대부분의 실제 사례에는 충분합니다. 물론 그 반대는 잘못입니다. 이러한 구조를 가진 언어는 종료되지 않는 프로그램을 허용하지 않지만 정교한 유형 시스템과 같은 다른 종류의 제한을 사용합니다.

재귀

스크립팅 언어의 일반적인 제한 사항은 재귀를 동적으로 방지하는 것입니다. A가 B를 호출하면 C가 호출을하는 경우… 두 가지 구체적인 예 :

  • C 전처리 기는 매크로를 확장하는 동안 매크로를 그대로 유지합니다. 가장 일반적인 용도는 함수 주위에 래퍼를 정의하는 것입니다.

    #define f(x) (printf("calling f(%d)\n", (x)), f(x))
    f(3);
    

    이 확장

    (printf("calling f(%d)\n", (3)), f(3))
    

    상호 재귀도 처리됩니다. 결과적으로 C 전처리 기는 항상 종료되지만 런타임 복잡성이 높은 매크로를 작성할 수 있습니다.

    #define f0(x) x(x)x(x)
    #define f1(x) f0(f0(x))
    #define f2(x) f1(f1(x))
    #define f3(x) f2(f2(x))
    f3(x)
    
  • 유닉스 쉘은 별칭을 재귀 적으로 확장하지만 이미 확장되고있는 별칭을 만날 때까지만 확장합니다. 다시, 주요 목적은 유사한 이름의 명령에 대한 별명을 정의하는 것입니다.

    alias ls='ls --color'
    alias ll='ls -l'
    

nn

한 재귀 호출에서 다음 재귀 호출로 항상 감소하는 양의 정수를 찾는 것과 같이 재귀 호출이 종료됨을 증명하는 더 일반적인 기술이 있지만 탐지하기가 상당히 어렵습니다. 그들은 종종 유추하기는하지만 검증하기가 어렵다.

루프

formn

특히 for 루프 (조건부와 같은 합리적인 언어 구성)를 사용하면 모든 기본 재귀 함수를 작성할 수 있으며 그 반대도 가능합니다. 원시 재귀 함수는 구문없이 (난독 한 방식으로 작성된 경우) 구문을 인식 할 수 있습니다. 왜냐하면 while 루프 나 이동 또는 재귀 또는 기타 트릭을 사용하지 않기 때문입니다. 원시 재귀 함수는 종료되도록 보장되며 대부분의 실제 작업은 원시 재귀를 넘어서는 것이 아닙니다.


4

터미네이터AProVe를 참조하십시오 . 그들은 휴리스틱에 의존하는 경향이 있으며, 그들이 일하는 프로그램의 클래스를 명확하게 설명하는지 확실하지 않습니다. 그럼에도 불구하고 그들은 최첨단 기술로 간주되므로 좋은 출발점이되어야합니다.


4

네 가능합니다. 이러한 문제를 해결하는 일반적인 방법 중 하나 는 입력의 일부로 코드에 따라 추가 (모노톤) 계산할 수없는 매개 변수를 고려하는 것 입니다. 해당 매개 변수를 갖는 문제의 복잡성을 심각하게 줄일 수 있습니다.

매개 변수를 계산할 수는 없지만 처리중인 입력 인스턴스에 작은 매개 변수 값이 있음을 알고 있으면이를 작은 수로 수정하고 알고리즘을 사용할 수 있습니다.

이 트릭과 유사한 트릭은 정식 방법에서 중지 및 유사한 문제의 결정 불가능 성을 처리하는 데 사용됩니다. 그러나 결정하려는 것이 복잡하면 알고리즘의 복잡성이 해당 인스턴스에서 알고리즘을 실행하는 것보다 낫지는 않습니다.

다른 질문과 관련하여 입력을 충분히 제한하면 정지 문제가 쉽게 발생할 수 있습니다. 예를 들어, 입력이 다항식 시간 알고리즘이라는 것을 알고 있다면, 모든 다항식 시간 알고리즘이 정지되기 때문에 정지 문제를 결정하는 것은 쉽지 않습니다.

공식적인 방법에서 발생하는 문제는 일반적으로 결정할 수 없으므로 실제로 이러한 문제를 어떻게 처리하는지에 대한 문헌을 확인하는 것이 좋습니다.


4

공식적으로 엄격한 대답은 아니지만 여기에 있습니다.

그것이 영원히 멈추거나 반복되는지를 결정하는 문제. 유한 컬렉션에서 한 번에 한 요소 씩 또는 숫자 간격 사이에서 반복해도 괜찮습니다. 편집 : 분명히 이것은 반복되는 컬렉션이나 간격이 반복 될 때 (예 : 불변성으로) 변경되지 않는 경우 (또는 적어도 성장이 금지 된 경우)에만 작동합니다.

최대 스택 깊이를 허용하거나 음수가 아닌 매개 변수가 각 반복에서 감소하도록 강제하는 등 인공 규칙을 유한하게 설정하지 않는 한 재귀는 적합하지 않습니다.

임의 고토는 일반적으로 나쁘다. 거꾸로 된 고토는 무한 루프 일 수 있습니다.

while 및 do-whiles 문은 실행 중에 변경되지 않았는지 또는 보장되지 않는 조건에 의존하기 때문에 문제가됩니다. 이것을 제한하는 가능한 (그러나 아마도 매우 불만족스러운) 방법은 가능한 최대 반복 횟수를 제공하는 것입니다.


2

스크립트 언어의 정의를 제공해야하며 스크립트 작성자의 "예상"이 무엇을 의미합니까?

O(nω)

Aaron R. Bradley, Zohar Manna 및 Henny B. Sipma의 다항식 프로그램에 대해서도 유사한 결과가 있습니다. 그러나 AFAIK (여기서는 틀릴 수 있음) 런타임은 이중 지수입니다 (본질적으로 Groebner 기준을 계산하는 데 필요한 시간).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.