Есть ли «достаточно хорошее» решение проблемы остановки? - PullRequest
6 голосов
/ 18 марта 2010

Известно, что проблема остановки не может иметь определенного решения, а именно: а) возвращает true <==> программа действительно останавливает и б) обрабатывает любой ввод, но мне было интересно, есть ли достаточно хорошие решения для проблема, которая может прекрасно обрабатывать определенные типы программных потоков, или может определить, когда она не может правильно решить проблему, или ту, которая подходит много раз, и так далее ... ..

Если да, то насколько они хороши и на какие идеи / ограничения они опираются?

Ответы [ 6 ]

4 голосов
/ 18 марта 2010

Обычный подход заключается в ограничении поведения программы алгоритмом , эффективно вычисляемым . Например, лямбда-исчисление простого типа может использоваться для определения того, что алгоритм всегда останавливается. Это означает, что простое типичное лямбда-исчисление не является полным по Тьюрингу, но все еще достаточно мощно, чтобы представлять множество интересных алгоритмов.

1 голос
/ 18 марта 2010

Один из способов доказать останов цикла - это определить некоторую целочисленную переменную (не обязательно явную в программе), которая всегда уменьшается при каждом выполнении цикла, и, когда эта переменная меньше нуля, цикл завершается. Мы можем назвать эту переменную вариантом цикла.

Рассмотрим следующий небольшой фрагмент:

var x := 20;
while (x >= 0) {
    x := x - 1
}

Здесь мы можем видеть, что x уменьшается при каждом выполнении цикла и что цикл завершится, как только x <0 (очевидно, это не очень строго, но вы поняли идею). Следовательно, мы можем использовать x как вариант. </p>

А как насчет более сложного примера? Рассмотрим конечный список целых чисел, L = [L [0], L [1], ..., L [n]]. in(L, x) верно, если x является членом L. Теперь рассмотрим следующую программу:

var x := 0;
while (in(L, x)) {
    x := x + 1
}

Это выполнит поиск по натуральным числам (0, 1, 2, ...) и остановится, когда найдет значение для x, которого нет в L. Итак, как мы докажем, что это заканчивается? В L есть максимальное значение - назовите его max (L). Затем мы можем определить наш вариант как max(L) - x. Чтобы доказать завершение, мы должны сначала доказать, что max(L) - x всегда уменьшается - не слишком сложно, поскольку мы можем доказать, что x всегда увеличивается. Затем мы должны доказать, что цикл прекратится, когда max(L) - x < 0. Если max(L) - x < 0, то max(L) < x, что означает, что x не может быть в L, и поэтому цикл завершится.

1 голос
/ 18 марта 2010

те, которые могут прекрасно обрабатывать определенные типы программных потоков

Это легко, и чем проще, тем более узки ваши "определенные типы". Примитивный пример: решить, заканчивается ли следующий фрагмент кода, для произвольных начальных значений x:

void run(int x)
{
    while(x != 0)
    {
        x = x > 0 ? x-2 : x+2;
    }
}

Решение короче самого кода.

или могут определить, когда не могут правильно решить проблему

Опять просто: возьмите программу выше, заставьте ее ответить «нет», когда программа не соответствует фиксированной узкой схеме.

или тот, который правильный высокий процент раз

Как вы определяете «высокий» процент по бесконечному набору возможных входных данных?

0 голосов
/ 18 марта 2010

Да, просто сделайте пространство состояний конечным, и это (теоретически) возможно для всех входов. (Просто переберите все возможности.)

Так что теоретически это возможно для любой программы, работающей на реальном компьютере. (Вам может понадобиться использовать компьютер с большим объемом оперативной памяти, чем тот, который должен выполнять программу, для анализа. И, конечно, анализ займет невероятно много времени.)

Вероятно, вы хотите что-то более практичное, хотя. В этом случае подумайте о языках. Проблема синтаксической правильности / неправильности может быть определена довольно быстро (в зависимости от типа языка и длины ввода), хотя существует бесконечно много программ, которые вы можете предоставить в качестве ввода. ( Примечание: Мы не говорим о выполнении входной программы, просто определяем, является ли она синтаксически правильной или нет.)

0 голосов
/ 18 марта 2010

Иногда очевидно, остановится машина или нет, даже если она очень большая. После того, как вы определили шаблон, например, наличие переменной «обратный отсчет», вы можете написать небольшой компьютер, который будет работать для любого компьютера, на котором он есть. Это бесконечное семейство, но ничтожное количество всевозможных машин. Большинство машин, написанных человеком, имеют очень простое поведение для своего размера, поэтому меня не удивит слишком много, если многие из них могут быть решены в практическом времени / пространстве, но я не знаю, как это измерить.

Чтобы дать вам представление о том, насколько сложна проблема «насколько они хороши», вот вопрос большого теоретического интереса: для какого размера N останавливается количество машин размера N? Это невычислимо (потому что машина, которая может его вычислить, может быть использовано для решения проблемы остановки) и не известно для N> 4.

0 голосов
/ 18 марта 2010

См. Документы, связанные с проектом Терминатор:

http://research.microsoft.com/en-us/um/cambridge/projects/terminator/

...