Как проверить, возвращают ли два алгоритма (скажем, сортировка слиянием и наивная сортировка) один и тот же результат для любого входа, когда набор всех входов бесконечен?
Обновление: Спасибо, Бен, за описание того, как это невозможно сделать алгоритмически в общем случае. Ответ Дейва - это краткое изложение как алгоритмических, так и ручных (с учетом человеческого ума и метафоры) методов, которые не всегда работают, но довольно эффективны.
computability
formal-methods
software-engineering
software-verification
Андрес Риофрио
источник
источник
Ответы:
В отличие от того, что говорят «отговорки», для этого существует множество эффективных методов.
Бизимуляция является одним из подходов. См., Например, статью Гордона о коиндукции и функциональном программировании .
Другой подход заключается в использовании операционных теорий эквивалентности программ, таких как работа Питта .
Третий подход заключается в проверке того, что обе программы удовлетворяют одной и той же функциональной спецификации. Есть тысячи работ по этому подходу.
Четвертый подход заключается в том, чтобы показать, что одну программу можно переписать в другую, используя звуковые преобразования программ .
Конечно, ни один из этих методов не является полным из-за неразрешимости, но объемы и объемы работы были созданы для решения этой проблемы.
источник
Чтобы немного уточнить утверждения «невозможно», вот простой набросок доказательства.
Мы можем смоделировать алгоритмы с выводом на машины Тьюринга, которые останавливаются с выводом на ленту. Если вы хотите иметь машины, которые могут останавливаться, принимая либо вывод на их ленту, либо отклоняя (в этом случае нет вывода), вы можете легко придумать кодировку, которая позволяет вам моделировать эти машины с «остановкой или остановкой, нет брака "машины".
Теперь предположим, что у меня есть алгоритм P для определения, имеют ли два таких ТМ одинаковый выход для каждого входа. Затем, учитывая TM A и вход X , я могу построить новую TM B, которая работает следующим образом:
Теперь я могу запустить P на A и B . B не останавливается на X , но имеет тот же вывод, что и A для всех других входных данных, поэтому, если и только если A не останавливается на X, тогда эти два алгоритма имеют одинаковый выход для каждого входа. Но предполагалось, что P сможет определить, имеют ли два алгоритма одинаковые выходные данные для каждого входа, поэтому, если бы у нас был P, мы могли бы сказать, останавливается ли произвольная машина на произвольном входе, что является проблемой остановки. Поскольку известно, что проблема остановки является неразрешимой, P не может существовать.
Это означает, что не существует общего (вычислимого) подхода к определению того, имеют ли два алгоритма один и тот же вывод, который всегда работает, поэтому вы должны применить рассуждения, специфичные для пары алгоритмов, которые вы анализируете. Однако на практике могут быть вычислимые подходы, которые работают для больших классов алгоритмов, и, безусловно, есть методы, которые вы можете использовать, чтобы попытаться выработать доказательство для любого конкретного случая. Ответ Дейва Кларка дает вам некоторые важные вещи, которые стоит посмотреть здесь. Результат «невозможности» относится только к разработке общего метода, который решит проблему раз и навсегда для всех пар алгоритмов.
источник
Это вообще невозможно, но многие ограничения могут сделать это возможным. Например, вы можете проверить эквивалентность двух программ с прямым кодом, используя BDD. Символическое исполнение может справиться со многими другими случаями.
источник
Невозможно разработать алгоритм, который доказывает это равенство вообще. Подсказка: сокращение от проблемы остановки.
источник