Вариант петли - Loop variant
В Информатика, а вариант петли это математическая функция определены на пространство состояний компьютерной программы, значение которой монотонно уменьшается относительно (строгой) обоснованные отношения путем повторения пока цикл под некоторыми инвариантные условия, тем самым обеспечение его прекращения. Вариант цикла, диапазон которого ограничен неотрицательными целыми числами, также известен как связанная функция, потому что в этом случае он обеспечивает тривиальную верхнюю границу количества итераций цикла до его завершения. Однако вариант петли может быть трансфинитный, и поэтому не обязательно ограничивается целыми значениями.
Хорошо обоснованное отношение характеризуется существованием минимального элемента в каждом непустом подмножестве его области. Наличие варианта доказывает прекращение действия пока цикл в компьютерной программе обоснованный спуск.[1] Основное свойство хорошо обоснованных отношений состоит в том, что они не имеют бесконечные нисходящие цепочки. Следовательно, цикл, имеющий вариант, завершится после конечного числа итераций, пока его тело завершается каждый раз.
А пока цикл, или, в более общем смысле, компьютерная программа, которая может содержать циклы while, называется совершенно правильно если это частично правильно и это прекращается.
Правило вывода для полной правильности
Чтобы формально сформулировать правило вывода для завершения цикла while, которое мы продемонстрировали выше, напомним, что в Логика Флойда – Хора, правило для выражения частичной корректности цикла while:
куда я это инвариантный, C это условие, и S это тело петли. Чтобы выразить полную правильность, мы пишем вместо этого:
где, кроме того, V это вариант, и условно несвязанный символ z считается универсально определяемый.
Каждый завершающийся цикл имеет вариант
Существование варианта означает, что цикл while завершается. Это может показаться удивительным, но верно и обратное, если мы предполагаем, что аксиома выбора: у каждого завершающегося цикла while (с учетом его инварианта) есть вариант. Чтобы доказать это, предположим, что цикл
завершается с учетом инварианта я где мы имеем утверждение о полной корректности
Рассмотрим отношение «преемника» в пространстве состояний индуцированный выполнением оператора S из состояния, удовлетворяющего как инварианту я и условие C. То есть мы говорим, что состояние является "преемником" если и только если
- я и C оба верны в государстве и
- это состояние, которое возникает в результате выполнения оператора S в состоянии
Отметим, что иначе цикл не завершился бы.
Затем рассмотрим рефлексивное, транзитивное замыкание отношения «преемника». Назовите это итерация: мы говорим, что состояние является повторять из если либо или есть конечная цепь такой, что и является "преемником" для всех я,
Отметим, что если и два различных состояния, и это итерация , тогда не может быть повторением for снова, иначе цикл не завершится. Другими словами, итерация антисимметрична, и поэтому частичный заказ.
Теперь, поскольку цикл while завершается после конечного числа шагов с учетом инварианта я, и ни одно государство не имеет преемника, если я верно в этом состоянии, мы заключаем, что каждое состояние имеет только конечное количество итераций, каждая нисходящая цепочка относительно итерации имеет только конечное количество различных значений, и, следовательно, нет бесконечная нисходящая цепочка, т.е. итерация цикла удовлетворяет состояние нисходящей цепочки.
Следовательно, если предположить аксиома выбора - отношение "преемника", которое мы первоначально определили для цикла, обоснованный на пространстве состояний поскольку он строг (иррефлексивен) и содержится в отношении "повторения". Таким образом, функция идентичности в этом пространстве состояний является вариантом для цикла while, поскольку мы показали, что состояние должно строго уменьшаться - как «преемник» и «итерация» - каждый раз, когда тело S выполняется с учетом инварианта я и условие C.
Более того, мы можем показать с помощью счетного аргумента, что существование любого варианта подразумевает существование варианта в ω1, то первый несчетный порядковый номер, т.е.
Это потому, что набор всех состояний, достижимых конечной компьютерной программой за конечное число шагов от конечного входа, является счетно бесконечным, и ω1 перечисление всех в порядке типы на счетных множествах.
Практические соображения
На практике варианты петли часто считаются неотрицательными. целые числа, или даже требуется, чтобы это было так,[2] но требование, чтобы каждый цикл имел целочисленный вариант, лишает выразительную силу неограниченная итерация с языка программирования. Если такой (формально проверенный) язык не допускает трансфинитного доказательства завершения для какой-либо другой столь же мощной конструкции, как рекурсивный вызов функции, он больше не может μ-рекурсия, но только примитивная рекурсия. Функция Аккермана является каноническим примером рекурсивной функции, которая не может быть вычислена в цикл с целочисленным вариантом.
С точки зрения их вычислительная сложность однако функции, которые не являются примитивно рекурсивными, лежат далеко за пределами того, что обычно считается послушный. Рассматривая даже простой случай возведения в степень как примитивно рекурсивную функцию и что композиция примитивных рекурсивных функций является примитивно рекурсивной, можно начать видеть, насколько быстро может расти примитивная рекурсивная функция. И любая функция, которую можно вычислить Машина Тьюринга во время выполнения, ограниченное примитивной рекурсивной функцией, сама является примитивно рекурсивной. Таким образом, трудно представить себе практическое использование полной μ-рекурсии, где примитивная рекурсия не годится, тем более что первая может моделироваться последней до чрезвычайно длительного времени выполнения.
И в любом случае, Курт Гёдель первый теорема о неполноте и проблема остановки подразумевают, что существуют циклы while, которые всегда завершаются, но невозможно доказать, что это произошло; таким образом, неизбежно, что любое требование формального доказательства завершения должно уменьшать выразительную силу языка программирования. Хотя мы показали, что у каждого завершающегося цикла есть вариант, это не означает, что обоснованность итерации цикла может быть доказана.
Пример
Вот пример в C -подобно псевдокод, целочисленного варианта, вычисляемого на основе некоторой верхней границы числа итераций, оставшихся в цикле while. Тем не мение, C допускает побочные эффекты при оценке выражений, что недопустимо с точки зрения формальной проверки компьютерной программы.
/ ** переменная-условие, изменяемая в процедуре S () ** /bool C;/ ** функция, которая вычисляет итерацию цикла без побочных эффектов ** /в соответствии беззнаковый int getBound();/ ** тело цикла не должно изменять V ** / в соответствии пустота S(); int главный() { беззнаковый int V = getBound(); / * устанавливаем вариант равным ограниченному * / утверждать(я); / * инвариант цикла * / пока (C) { утверждать(V > 0); / * это утверждение является смыслом существования варианта (причиной существования) * / S(); / * вызываем тело * / V = мин(getBound(), V - 1); / * вариант должен уменьшиться хотя бы на один * / }; утверждать(я && !C); / * инвариант остается верным, а условие - ложным * / возвращаться 0;};
Зачем вообще рассматривать нецелочисленный вариант?
Зачем вообще рассматривать нецелочисленный или трансфинитный вариант? Этот вопрос был поднят, потому что во всех практических случаях, когда мы хотим доказать, что программа завершается, мы также хотим доказать, что она завершается в разумные сроки. Есть как минимум две возможности:
- Верхняя граница количества итераций цикла может зависеть от доказательства завершения в первую очередь. Может быть желательно отдельно (или постепенно) доказать три свойства
- частичная правильность,
- прекращение и
- Продолжительность.
- Общность: рассмотрение трансфинитных вариантов позволяет рассматривать все возможные доказательства завершения цикла while с точки зрения существования варианта.
Смотрите также
- Пока цикл
- Инвариант цикла
- Трансфинитная индукция
- Состояние нисходящей цепи
- Большой счетный порядковый номер
- Корректность (информатика)
- Самые слабые предварительные условия цикла While
Рекомендации
- ^ Винскель, Глинн (1993). Формальная семантика языков программирования: введение. Массачусетский Институт Технологий. С. 32–33, 174–176.
- ^ Бертран Мейер, Михаэль Швейцер (27 июля 1995 г.). "Почему варианты цикла - целые числа". Страницы поддержки Eiffel. Eiffel Software. Получено 2012-02-23.