Логика Хоара - Hoare logic

Логика Хоара (также известная как логика Флойда – Хора или правила Хора ) - это формальная система с набором логических правил для строгого рассуждения о правильности компьютерных программ . Он был предложен в 1969 году британским ученым-компьютерщиком и логиком Тони Хоаром и впоследствии усовершенствован Хором и другими исследователями. Оригинальные идеи были посеяны в работе Роберта У. Флойда , который опубликовал аналогичную систему для блок-схем .

Хоар тройной

Главная особенность Хоара логики является Хоара тройной . Тройка описывает, как выполнение фрагмента кода меняет состояние вычисления. Тройка Хоара имеет вид

где и - утверждения, а - команда . названо в предпосылке и в постусловии : когда предварительное условие выполнено, выполнение команды устанавливает постусловие. Утверждения - это формулы в логике предикатов .

Логика Хоара предоставляет аксиомы и правила вывода для всех конструкций простого императивного языка программирования . В дополнение к правилам для простого языка в оригинальной статье Хоара, с тех пор Хоаром и многими другими исследователями были разработаны правила для других языковых конструкций. Есть правила для параллелизма , процедур , переходов и указателей .

Частичная и полная правильность

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

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

В своей статье 1969 года Хоар использовал более узкое понятие завершения, которое также влекло за собой отсутствие каких-либо ошибок времени выполнения: «Отказ завершить может быть из-за бесконечного цикла; или это может быть из-за нарушения определенного реализацией лимита для например, диапазон числовых операндов, размер хранилища или ограничение времени операционной системы ».


Правила

Схема аксиомы пустого оператора

Пустое утверждение правило утверждает , что пропуск оператор не изменяет состояние программы, таким образом , все , что справедливо , прежде чем пропустить справедливо и впоследствии.

Схема аксиомы присваивания

Аксиома присваивания утверждает, что после присваивания любой предикат, который ранее был истинным для правой части присваивания, теперь выполняется для переменной. Формально, пусть Р будет утверждение , в котором переменная х является свободным . Затем:

где обозначает утверждение P , в которой каждый свободное вхождение из й было заменено выражением Е .

Схема аксиомы присваивания означает, что истинность эквивалентна истинности P после присваивания . Таким образом , согласно аксиоме присваивания, были истинными до присвоения, тогда P будет истинным после которого. И наоборот, если перед оператором присваивания было ложно (т. Е. Истинно), то после этого P должно быть ложным.

Примеры действительных троек включают:

Все предусловия, которые не изменяются выражением, могут быть перенесены в постусловие. В первом примере присвоение не меняет того факта, что оба оператора могут появиться в постусловии. Формально этот результат получается путем применения схемы аксиом, где P является ( и ), что дает значение ( и ), что, в свою очередь, может быть упрощено до данного предусловия .

Схема аксиомы присваивания эквивалентна утверждению, что для нахождения предусловия сначала возьмите постусловие и замените все вхождения левой части присваивания правой частью присваивания. Будьте осторожны, чтобы не пытаться сделать это в обратном порядке, следуя неправильному образу мышления :; это правило приводит к бессмысленным примерам вроде:

Еще одно неправильное правило, которое на первый взгляд выглядит заманчиво : это приводит к бессмысленным примерам вроде:

Хотя данное постусловие P однозначно определяет предусловие , обратное неверно. Например:

  • ,
  • ,
  • , и

являются допустимыми примерами схемы аксиомы присваивания.

Аксиома присваивания, предложенная Хоаром , неприменима, когда более одного имени могут относиться к одному и тому же сохраненному значению. Например,

неверно, если x и y относятся к одной и той же переменной ( псевдоним ), хотя это правильный пример схемы аксиомы присваивания (с обоими и существующими ).

Правило композиции

Правило композиции Хоара применяется к последовательно выполняемым программам S и T , где S выполняется до T и записывается ( Q называется промежуточным условием ):

Например, рассмотрим следующие два случая аксиомы присваивания:

и

По правилу последовательности можно сделать вывод:

Другой пример показан в правом поле.

Условное правило

Условное правило гласит, что постусловие Q, общее для then и else части, также является постусловием всего оператора if ... endif . В частях then и else необязательное и отрицательное условие B может быть добавлено к предусловию P соответственно. Состояние B не должно иметь побочных эффектов. Пример приведен в следующем разделе .

Этого правила не было в оригинальной публикации Хора. Однако, поскольку заявление

имеет тот же эффект, что и конструкция одноразового цикла

условное правило может быть получено из других правил Хоара. Аналогичным образом правила для других производных программных конструкций, таких как цикл for , do ... until loop, switch , break , continue, могут быть сокращены путем преобразования программы в правила из исходной статьи Хоара.

Правило следствия

Это правило позволяет усилить предусловие и / или ослабить постусловие . Он используется, например, для достижения буквально идентичных постусловий для частей then и else .

Например, доказательство

необходимо применить условное правило, которое, в свою очередь, требует доказательства

, или упрощенный

для тогдашней части, и

, или упрощенный

для другой части.

Однако правило присваивания для части then требует выбора P как ; применение правила, следовательно, дает

, что логически эквивалентно
.

Правило следствия необходимо для усиления предусловия, полученного из правила присваивания, до необходимого для условного правила.

Точно так же для части else правило присваивания дает

, или эквивалентно
,

отсюда правило следствие должно применяться с и время и , соответственно, вновь усилить предпосылку. Неформально, эффект правила следствия состоит в том, чтобы «забыть», что известно при вводе части else , поскольку правило присваивания, используемое для части else , не требует этой информации.

Пока правило

Здесь Р есть инвариант цикла , которая должна быть сохранена в теле цикла S . После завершения цикла этот инвариант P все еще сохраняется, и, более того, он должен был вызвать завершение цикла. Как и в условном правиле, у B не должно быть побочных эффектов.

Например, доказательство

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

, или упрощенный
,

которое легко получается с помощью правила присваивания. Наконец, постусловие можно упростить до .

В качестве другого примера, правило while можно использовать для формальной проверки следующей странной программы для вычисления точного квадратного корня x из произвольного числа a - даже если x - целочисленная переменная, а a - не квадратное число:

После применения правила пока с P является истинным , то остается доказать

,

что следует из правила пропуска и правила следствия.

Фактически, странная программа частично верна: если она завершилась, несомненно, что x должно было содержать (случайно) значение квадратного корня из a . Во всех остальных случаях он не прекращается; поэтому это не совсем правильно.

Хотя правило полной правильности

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

В этом правиле, в дополнение к поддержанию инварианта цикла, также доказывается завершение с помощью выражения t , называемого вариантом цикла , значение которого строго уменьшается относительно хорошо обоснованного отношения < на некотором множестве областей D во время каждой итерации. Поскольку < является хорошо обоснованным, строго убывающая цепочка элементов D может иметь только конечную длину, поэтому t не может продолжать уменьшаться бесконечно. (Например, обычный порядок < основан на положительных целых числах , но не на целых числах или положительных действительных числах ; все эти множества подразумеваются в математическом, а не в вычислительном смысле, в частности, все они бесконечны.)

Учитывая инвариант цикла P , условие B должно означать , что т не является минимальный элемент из D , иначе тело S не может уменьшить T дальше, то есть помещение правила было бы неверно. (Это одно из различных обозначений для полной правильности.)

Возвращаясь к первому примеру предыдущего раздела , для доказательства полной корректности

может быть применено правило while для полной правильности, например, D является неотрицательными целыми числами в обычном порядке, а выражение t является , что, в свою очередь, требует доказательства

Неформально говоря, мы должны доказать, что расстояние уменьшается в каждом цикле цикла, но всегда остается неотрицательным; этот процесс может продолжаться только конечное число циклов.

Предыдущая цель доказательства может быть упрощена до

,

что можно доказать следующим образом:

получается по правилу присваивания, а
может быть усилено правилом последствий.

Для второго примера предыдущего раздела , конечно, не может быть найдено ни одного выражения t , которое уменьшалось бы пустым телом цикла, следовательно, завершение не может быть доказано.

Смотрите также

Примечания

использованная литература

дальнейшее чтение

внешние ссылки

  • KeY-Hoare - это полуавтоматическая система проверки, построенная на основе средства доказательства теорем KeY . Он включает в себя исчисление Хоара для простого языка.
  • j-Алгомодульное исчисление Хоара - Визуализация исчисления Хоара в программе визуализации алгоритма j-Algo