логика Хоара
Логика Хоара (также известная как логика Флойда-Хора или правила Хоара ) — это формальная система с набором логических правил для строгого рассуждения о правильности компьютерных программ . Она была предложена в 1969 году британским ученым-компьютерщиком и логиком Тони Хоаром и впоследствии усовершенствована Хоаром и другими исследователями. [1] Оригинальные идеи были заложены в работе Роберта Флойда , опубликовавшего аналогичную систему. [2] для блок-схем .
Тройка Хоара [ править ]
Центральной особенностью логики Хоара является тройка Хоара . Тройка описывает, как выполнение фрагмента кода меняет состояние вычислений. Тройка Хоара имеет вид
где и являются утверждениями и это команда . [примечание 1] называется предварительным условием и постусловие . : когда предусловие выполнено, выполнение команды устанавливает постусловие Утверждения — это формулы в логике предикатов .
Логика Хоара предоставляет аксиомы и правила вывода для всех конструкций простого императивного языка программирования . В дополнение к правилам для простого языка, описанным в оригинальной статье Хоара, с тех пор Хоар и многие другие исследователи разработали правила для других языковых конструкций. Существуют правила для параллелизма , процедур , переходов и указателей .
Частичная и полная правильность [ править ]
Используя стандартную логику Хоара, только частичную правильность можно доказать . Полная корректность дополнительно требует завершения , что можно доказать отдельно или с помощью расширенной версии правила While. [3] Таким образом, интуитивное прочтение тройки Хоара таково: всякий раз, когда удерживает государство до исполнения , затем сохранится впоследствии, или не прекращается. В последнем случае нет «после», поэтому может быть вообще любое утверждение. Действительно, можно выбрать быть ложным, чтобы выразить это не прекращается.
«Завершение» здесь и далее в этой статье подразумевается в более широком смысле, что вычисление в конечном итоге будет завершено, то есть подразумевает отсутствие бесконечных циклов; это не означает отсутствия нарушений предела реализации (например, деления на ноль), что приводит к преждевременной остановке программы. В своей статье 1969 года Хоар использовал более узкое понятие завершения, которое также влекло за собой отсутствие нарушений предела реализации, и выразил свое предпочтение более широкому понятию завершения, поскольку оно сохраняет утверждения независимыми от реализации: [4]
Еще один недостаток аксиом и правил, приведенных выше, заключается в том, что они не дают оснований для доказательства успешного завершения программы. Невозможность завершения может быть связана с бесконечным циклом; или это может быть связано с нарушением ограничения, определенного реализацией, например, диапазона числовых операндов, размера хранилища или ограничения времени операционной системы. Таким образом, обозначение « следует интерпретировать «при условии, что программа успешно завершается, свойства ее результатов описываются выражением ». Довольно легко адаптировать аксиомы так, чтобы их нельзя было использовать для предсказания «результатов» незавершающихся программ; но фактическое использование аксиом теперь будет зависеть от знания многих функций, зависящих от реализации, например, размера и скорости компьютера, диапазона чисел и выбора метода переполнения. Помимо доказательств отсутствия бесконечных циклов, вероятно, лучше доказать «условную» корректность программы и полагаться на то, что реализация выдаст предупреждение, если ей пришлось отказаться от выполнения программы в результате нарушения какого-либо условия. предел реализации.
Правила [ править ]
Схема аксиом пустого утверждения [ править ]
Правило пустого оператора утверждает, что Оператор пропуска не меняет состояние программы, поэтому все, что было верно до этого, Skip также остается верным и после этого. [примечание 2]
Схема аксиом присваивания [ править ]
Аксиома присваивания гласит, что после присваивания любой предикат, который ранее был истинным для правой части присваивания, теперь справедлив для переменной. Формально, пусть P в котором переменная x свободна — утверждение , . Затем:
где утверждение P, котором каждое свободное x E. заменено в выражением обозначает вхождение
Схема аксиом присваивания означает, что истинность эквивалентно истине после присвоения P . Так было истинно до присваивания, согласно аксиоме присваивания, тогда P будет истинным после этого. И наоборот, были ложь (т.е. true) до оператора присваивания, P затем должно быть ложным.
Примеры допустимых троек включают в себя:
Все предусловия, которые не изменяются выражением, могут быть перенесены в постусловие. В первом примере присвоение не меняет того факта, что , поэтому оба утверждения могут появиться в постусловии. Формально этот результат получается применением схемы аксиом, где P равно ( и ), что дает существование ( и ), которое, в свою очередь, можно упростить до заданного предусловия .
Схема аксиом присваивания эквивалентна утверждению: чтобы найти предусловие, сначала возьмите постусловие и замените все вхождения левой части присваивания правой частью присваивания. Будьте осторожны и не пытайтесь сделать это наоборот, следуя этому неправильному образу мышления: ;это правило приводит к бессмысленным примерам, таким как:
Еще одно неверное правило, кажущееся заманчивым на первый взгляд: ; это приводит к бессмысленным примерам вроде:
Хотя данное постусловие P однозначно определяет предусловие , обратное неверно. Например:
- ,
- ,
- , и
являются действительными экземплярами схемы аксиом присваивания.
Аксиома присвоения, предложенная Хоаром, не применяется , когда к одному и тому же хранимому значению может относиться более одного имени. Например,
неверно, если x и y относятся к одной и той же переменной ( псевдоним ), хотя это правильный пример схемы аксиом присваивания (с обоими и существование ).
Правило композиции [ править ]
Проверка swap-кода без вспомогательных переменных |
---|
Правило композиции Хоара применяется к последовательно выполняемым программам S и T , где S выполняется до T и записывается ( Q называется средним условием ): [5]
Например, рассмотрим следующие два примера аксиомы присваивания:
и
По правилу последовательности можно сделать вывод:
Другой пример показан в правом поле.
Условное правило [ править ]
Условное правило гласит, что постусловие Q, общее для тогда и иначе часть также является постусловием целого оператор if...endif . [6] В тогда и В противном неотрицательное и отрицаемое условие B можно добавить случае к предварительному условию P соответственно.Состояние B не должно иметь побочных эффектов.Пример приведен в следующем разделе .
Это правило не содержалось в оригинальной публикации Хоара. [1] Однако, поскольку заявление
имеет тот же эффект, что и конструкция одноразового цикла
условное правило может быть получено из других правил Хоара.Аналогичным образом действуют правила для других производных программных конструкций, например для цикла, делать... до цикла, выключатель , перерыв , continue можно свести путем преобразования программы к правилам из оригинальной статьи Хоара.
Правило последствий [ править ]
Это правило позволяет усилить предусловие и/или ослабить постусловие .Он используется, например, для достижения буквально идентичных постусловий для тогда и еще часть.
Например, доказательство
необходимо применить условное правило, которое, в свою очередь, требует доказать
- или упрощенно
для затем расстаться и
- или упрощенно
для еще часть.
Однако правило присваивания для тогда часть требует выбрать P как ; применение правил, следовательно, дает
- , что логически эквивалентно
- .
Правило последствий необходимо для усиления предусловия полученное из правила присваивания требуется для условного правила.
Аналогично, для else часть, правило присваивания дает
- или эквивалентно
- ,
следовательно, правило последствий должно применяться с и существование и , соответственно, чтобы еще раз усилить предусловие. Неформально, эффект правила последствий состоит в том, чтобы «забыть», что известно при входе в else часть, поскольку правило присваивания, используемое для else часть не нуждается в этой информации.
Пока правило [ править ]
Здесь P — инвариант цикла который должен сохраняться телом цикла S. , После завершения цикла этот инвариант P все еще сохраняется, и, более того, должно быть, привело к завершению цикла.Как и в условном правиле, B не должен иметь побочных эффектов.
Например, доказательство
к тому времени правило требует доказать
- или упрощенно
- ,
которое легко получить по правилу присваивания.Наконец, постусловие можно упростить до .
Другой пример: правило while можно использовать для формальной проверки следующей странной программы для вычисления точного квадратного корня x из произвольного числа a , даже если x — целочисленная переменная, а a — не квадратное число:
После применения правила while, когда P равно правда , осталось доказать
- ,
что следует из правила пропуска и правила последствий.
На самом деле странная программа отчасти верна: если бы она завершилась, то наверняка x (случайно) содержал бы значение квадратного корня.Во всех остальных случаях оно не будет прекращено; поэтому это не совсем правильно.
Хотя правило абсолютной правильности [ править ]
Если вышеупомянутое обычное правило while заменить следующим, исчисление Хоара также можно будет использовать для доказательства полной корректности , т. е. завершения, а также частичной корректности. Обычно здесь вместо фигурных скобок используются квадратные скобки, чтобы указать на другое представление о корректности программы.
В этом правиле, помимо сохранения инварианта цикла, также доказывается завершение с помощью выражения t , называемого вариантом цикла , значение которого строго уменьшается по отношению к обоснованному отношению < на некотором множестве доменов D во время каждой итерации. Поскольку < обосновано, строго убывающая цепочка членов D может иметь только конечную длину, поэтому t не может уменьшаться вечно. (Например, обычный порядок < хорошо обоснован для натуральных чисел , но ни в целых числах ни о положительных действительных числах ; все эти множества подразумеваются в математическом, а не в вычислительном смысле; в частности, все они бесконечны.)
Учитывая инвариант цикла P , условие B должно подразумевать, что t не является минимальным элементом , D поскольку в противном случае тело S не могло бы уменьшать t дальше, т. е. посылка правила была бы ложной. (Это одно из различных обозначений полной правильности.) [примечание 3]
Возвращаясь к первому примеру предыдущего раздела , для доказательства полной корректности
правило while для полной корректности может быть применено, например, D — это неотрицательные целые числа обычного порядка, а выражение t — , что затем, в свою очередь, требует доказать
Неформально говоря, нам нужно доказать, что расстояние уменьшается в каждом цикле цикла, при этом всегда остается неотрицательным; этот процесс может продолжаться лишь конечное число циклов.
Предыдущую цель доказательства можно упростить до
- ,
что можно доказать следующим образом:
- получается по правилу присваивания, а
- может быть усилен до по правилу последствий.
Во втором примере предыдущего раздела , конечно, не может быть найдено выражение t , которое уменьшается на пустое тело цикла, поэтому завершение не может быть доказано.
См. также [ править ]
Примечания [ править ]
- ^ Хоар первоначально написал " " скорее, чем " ".
- ^ В этой статье для правил используются обозначения в стиле естественной дедукции . Например, неформально означает: «Если выполняются и α , и β , то выполняется и φ »; α и β называются предшественниками правила, φ называется его последователем. Правило без антецедентов называется аксиомой и записывается как .
- ^ Статья Хоара 1969 года не содержала правила полной корректности; ср. его обсуждение на стр.579 (вверху слева). Например учебник Рейнольдса [3] дает следующую версию правила полной корректности: когда z — целочисленная переменная, которая не встречается в свободном виде в P , B , S или t , а t — целочисленное выражение (переменные Рейнольдса переименованы, чтобы соответствовать настройкам этой статьи).
Ссылки [ править ]
- ^ Jump up to: а б Хоар, ЦАР (октябрь 1969 г.). «Аксиоматические основы компьютерного программирования» . Коммуникации АКМ . 12 (10): 576–580. дои : 10.1145/363235.363259 . S2CID 207726175 .
- ^ Р.В. Флойд . « Придание значения программам ». Труды симпозиума Американского математического общества по прикладной математике. Том. 19, стр. 19–31. 1967.
- ^ Jump up to: а б Джон К. Рейнольдс (2009). Теории языков программирования . Издательство Кембриджского университета. ) Здесь: Разд. 3.4, с. 64.
- ^ Хоар (1969), стр.578-579.
- ^ Хут, Майкл; Райан, Марк (26 августа 2004 г.). Логика в информатике (второе изд.). ЧАШКА. п. 276. ИСБН 978-0521543101 .
- ^ Апт, Кшиштоф Р.; Ольдерог, Эрнст-Рюдигер (декабрь 2019 г.). «Пятьдесят лет логики Хоара» . Формальные аспекты вычислений . 31 (6): 759. doi : 10.1007/s00165-019-00501-3 . S2CID 102351597 .
Дальнейшее чтение [ править ]
- Роберт Д. Теннент. Specifying Software (учебник, включающий введение в логику Хоара, написанный в 2002 году) ISBN 0-521-00401-2
Внешние ссылки [ править ]
- KeY-Hoare — это полуавтоматическая система проверки, построенная на базе средства доказательства теорем KeY . Он использует исчисление Хоара для простого языка while.
- Модуль j-Algo Hoare Calculus ( j-Algo на GitHub , j-Algo на SourceForge ) — визуализация расчета Хоара в программе визуализации алгоритма j-Algo.