Jump to content

Анализ завершения

(Перенаправлено с проверки завершения )
void f(int n) {
   while (n > 1)
      if (n % 2 == 0)
          n = n / 2;
      else
          n = 3 * n + 1;
}
По состоянию на 2024 год , это пока неизвестно
является ли эта C -программа
завершается для каждого ввода;
см. гипотезу Коллатца .

В информатике , который пытается определить , анализ завершения — это анализ программы останавливается ли выполнение данной программы для каждого ввода. Это значит определить, вычисляет ли входная программа итоговую функцию.

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

Теперь, поскольку вопрос о том, является ли вычислимая функция тотальной, полуразрешим , [1] Каждый анализатор звукового завершения (т. е. утвердительный ответ никогда не дается для незавершаемой программы) является неполным , т. е. не может определить завершение для бесконечного числа завершающихся программ либо из-за бесконечной работы, либо из-за остановки с неопределенным ответом.

Доказательство прекращения действия [ править ]

Доказательство завершения — это тип математического доказательства , которое играет решающую роль в формальной проверке, зависит от завершения поскольку полная правильность алгоритма .

Простой общий метод построения доказательств завершения предполагает связывание меры с каждым шагом алгоритма. Мера берется из области хорошо обоснованного отношения , например, из порядковых чисел . Если мера «убывает» по отношению на каждом возможном шаге алгоритма, то он должен завершиться, поскольку не существует бесконечных нисходящих цепочек по обоснованному отношению .

Некоторые типы анализа прекращения могут автоматически генерировать или предполагать наличие доказательства прекращения.

Пример [ править ]

Примером конструкции языка программирования , которая может завершаться или не завершаться, является цикл , поскольку он может выполняться неоднократно. Циклы, реализованные с использованием переменной-счетчика , которая обычно встречается в обработки данных алгоритмах , обычно завершаются, как показано в примере псевдокода ниже:

i := 0
loop until i = SIZE_OF_DATA
    process_data(data[i])) // process the data chunk at position i
    i := i + 1 // move to the next chunk of data to be processed

Если значение SIZE_OF_DATA неотрицательное, фиксированное и конечное, цикл в конечном итоге завершится, предполагая, что процесс_data также завершится.

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

i := 1
loop until i = 0
    i := i + 1

При анализе завершения можно также попытаться определить поведение завершения некоторой программы в зависимости от неизвестного ввода. Следующий пример иллюстрирует эту проблему.

i := 1
loop until i = UNKNOWN
    i := i + 1

Здесь условие цикла определяется с использованием некоторого значения НЕИЗВЕСТНО, где значение НЕИЗВЕСТНО неизвестно (например, определяется вводом пользователя при выполнении программы). Здесь анализ завершения должен принять во внимание все возможные значения UNKNOWN и выяснить, что в возможном случае UNKNOWN = 0 (как в исходном примере) завершение не может быть показано.

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

На практике невозможно показать завершение (или отсутствие завершения), поскольку каждый алгоритм работает с конечным набором методов, способных извлечь соответствующую информацию из данной программы. Метод может смотреть на то, как изменяются переменные относительно некоторого условия цикла (возможно, показывая завершение этого цикла), другие методы могут попытаться преобразовать вычисления программы в некоторую математическую конструкцию и работать над этим, возможно, получая информацию о поведении завершения из некоторые свойства этой математической модели. Но поскольку каждый метод способен «видеть» только некоторые конкретные причины (не)завершения, даже с помощью комбинации таких методов невозможно охватить все возможные причины (не)завершения. [ нужна ссылка ]

Рекурсивные функции и циклы эквивалентны по выражению; любое выражение, включающее циклы, можно записать с использованием рекурсии, и наоборот. Таким образом, завершение рекурсивных выражений также вообще неразрешимо. Можно показать , что большинство рекурсивных выражений, встречающихся в обычном использовании (т.е. не патологических ), завершаются различными способами, обычно в зависимости от определения самого выражения. Например, аргумент функции в рекурсивном выражении для функции факториала ниже всегда будет уменьшаться на 1; благодаря свойству упорядоченности натуральных чисел аргумент в конечном итоге достигнет 1, и рекурсия завершится.

function factorial (argument as natural number)
    if argument = 0 or argument = 1
        return 1
    otherwise
        return argument * factorial(argument - 1)

Зависимые типы [ править ]

Проверка завершения очень важна в языках программирования с зависимой типизацией и системах доказательства теорем, таких как Coq и Agda . Эти системы используют изоморфизм Карри-Говарда между программами и доказательствами. Доказательства над индуктивно определенными типами данных традиционно описывались с использованием принципов индукции. Однако позже выяснилось, что описание программы с помощью рекурсивно определенной функции с сопоставлением с образцом является более естественным способом доказательства, чем непосредственное использование принципов индукции. К сожалению, разрешение бесконечных определений приводит к логической несогласованности в теориях типов. [ нужна ссылка ] , поэтому Agda и Coq имеют встроенные средства проверки завершения.

Типы размеров [ править ]

Одним из подходов к проверке завершения в зависимо типизированных языках программирования являются размерные типы. Основная идея состоит в том, чтобы аннотировать типы, над которыми мы можем рекурсивно работать, аннотациями размера и разрешить рекурсивные вызовы только для меньших аргументов. Размерные типы реализованы в Agda как синтаксическое расширение.

Текущее исследование [ править ]

Есть несколько исследовательских групп, которые работают над новыми методами, которые могут показать (не)терминацию. Многие исследователи включают эти методы в программы. [2] которые пытаются автоматически проанализировать поведение завершения (то есть без участия человека). Продолжающийся аспект исследования заключается в том, чтобы позволить использовать существующие методы для анализа поведения завершения программ, написанных на языках программирования «реального мира». Для декларативных языков, таких как Haskell , Mercury и Prolog , существует множество результатов. [3] [4] [5] (в основном из-за сильной математической базы этих языков). Исследовательское сообщество также работает над новыми методами анализа поведения завершения программ, написанных на императивных языках, таких как C и Java.

См. также [ править ]

Ссылки [ править ]

  1. ^ Роджерс-младший, Хартли (1988). Теория рекурсивных функций и эффективная вычислимость . Кембридж (Массачусетс), Лондон (Англия): MIT Press. п. 476. ИСБН  0-262-68052-1 .
  2. ^ Инструменты на сайте termination-portal.org.
  3. ^ Гизл, Дж.; Свидерски, С.; Шнайдер-Камп, П.; Тиманн, Р. Пфеннинг, Ф. (ред.). Автоматизированный анализ завершения для Haskell: от переписывания терминов к языкам программирования (приглашенная лекция) (постскриптум) . Переписывание терминов и приложения, 17-й Int. конф., РТА-06. ЛНКС. Том. 4098. стр. 297–312. (ссылка: Springerlink.com ).
  4. ^ Параметры компилятора для анализа завершения в Mercury
  5. ^ http://verify.rwth-aachen.de/giesl/papers/lopstr07-distribute.pdf [ только URL-адрес PDF ]

Исследовательские работы по анализу автоматического завершения программы включают:

Системные описания инструментов автоматического анализа завершения включают в себя:

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7e30011a54c0d61b377de688694d9995__1710441900
URL1:https://arc.ask3.ru/arc/aa/7e/95/7e30011a54c0d61b377de688694d9995.html
Заголовок, (Title) документа по адресу, URL1:
Termination analysis - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)