Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Hoare Triple [ править ]

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

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

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

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

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

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

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

Правила [ править ]

Схема аксиомы пустого оператора [ править ]

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

Схема аксиомы присваивания [ править ]

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

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

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

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

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

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

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

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

  • ,
  • ,
  • , а также

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

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

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

Правило композиции [ править ]

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

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

а также

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

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

Условное правило [ править ]

Условное правило гласит , что Постусловие общего для и части также Постусловие всего заявления. В и в стороны, unnegated и инвертированный условие может быть добавлен к предпосылке , соответственно. Состояние не должно иметь побочных эффектов. Пример приведен в следующем разделе .

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

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

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

Правило последствий [ править ]

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

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

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

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

со стороны, и

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

со стороны.

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

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

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

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

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

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

Пока правило [ править ]

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

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

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

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

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

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

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

,

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

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

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

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

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

Учитывая инвариант цикла , то условие должно подразумевать , что это не минимальный элемент из , ибо в противном случае организм не может уменьшаться дальше, то есть помещение правила было бы неверно. (Это одно из различных обозначений для полной правильности.) [Примечание 4]

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

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

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

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

,

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

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

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

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

  • Утверждение (вычисление)
  • Связь последовательных процессов
  • Дизайн по контракту
  • Денотационная семантика
  • Динамическая логика
  • Эдсгер В. Дейкстра
  • Инвариант цикла
  • Семантика предикатного преобразователя
  • Проверка программы
  • Исчисление уточнения
  • Логика разделения
  • Последовательное исчисление
  • Статический анализ кода

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

  1. ^ Хоар первоначально написал "", а не "".
  2. ^ В этой статьедля правилиспользуетсянотация естественного дедуктивного стиля. Например,неформально означает «Если и то,идругоедержится, то тожедержится»; иназываются антецедентами правила,называются его преемниками. Правило без антецедентов называется аксиомой и записывается как.
  3. ^ «Прекращение» здесь означает в более широком смысле, что вычисление в конечном итоге будет завершено; это не означает, что никакое нарушение предела (например, нулевое деление) не может преждевременно остановить программу.
  4. ^ Статья Хоара 1969 года не содержала правила полной правильности; ср. его обсуждение на стр.579 (вверху слева). Например, учебник Рейнольдса ( John C. Reynolds (2009). Theory of Programming Languages . Cambridge University Press.), Sect.3.4, с.64 дает следующую версию общего правила корректности: если это целая переменная , которая не свободной в , , , или , и это целое выражение (переменные Рейнольдса переименованы в соответствии с этим настройки статьи).

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

  1. ^ a b Хоар, ЦАР (октябрь 1969 г.). «Аксиоматическая основа компьютерного программирования» (PDF) . Коммуникации ACM . 12 (10): 576–580. DOI : 10.1145 / 363235.363259 . CS1 maint: discouraged parameter (link)
  2. ^ RW Флойд . « Придание значения программам». Труды симпозиумов Американского математического общества по прикладной математике. Vol. 19. С. 19–31. 1967 г.
  3. ^ стр.579 вверху слева
  4. ^ Хут, Майкл; Райан, Марк (2004-08-26). Логика в информатике (второе изд.). ЧАШКА. п. 276. ISBN. 978-0521543101.

Дальнейшее чтение [ править ]

  • Роберт Д. Теннент. Спецификация программного обеспечения (учебник, включающий введение в логику Хоара, написанный в 2002 г.) ISBN 0-521-00401-2 

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

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