Логика Хоара — Дейкстры
Логика Хоара — Дейкстры — это формальная система для верификации императивных компьютерных программ, основанная на строгом математическом доказательстве корректности. Она объединяет аксиоматическую семантику, предложенную Чарльзом Энтони Ричардом Хоаром, и методологию структурного программирования, развитую Эдсгером Вибе Дейкстрой. Система позволяет устанавливать соответствие между программой и её спецификацией, выраженной в виде предусловий и постусловий, с помощью правил вывода для каждого конструкта языка программирования.
История
Истоки логики Хоара — Дейкстры восходят к середине 1960-х годов, когда развитие компьютерных наук столкнулось с проблемой надёжности программного обеспечения. Крупные проекты, такие как операционная система OS/360 (IBM), страдали от многочисленных ошибок, что привело к «кризису программного обеспечения». В 1968 году Эдсгер Дейкстра опубликовал письмо «Go To Statement Considered Harmful», в котором обосновал вред оператора безусловного перехода для доказательства корректности программ. Он предложил заменить его структурами управления: последовательностью, ветвлением и циклом.
В 1969 году Чарльз Хоар, работая в Королевском университете Белфаста, опубликовал статью «An Axiomatic Basis for Computer Programming». В ней он впервые сформулировал аксиоматическую семантику, основанную на тройках Хоара: {P} S {Q}, где P — предусловие, S — оператор, Q — постусловие. Хоар показал, что корректность программы можно доказывать дедуктивно, используя правила для присваивания, композиции, условного оператора и цикла while.
В 1970-е годы Дейкстра развил этот подход, введя понятие «слабейшего предусловия» (weakest precondition, wp) и формализовав методологию доказательства корректности. Его книга «A Discipline of Programming» (1976) стала основой для практического применения логики. В 1980-х годах логика Хоара — Дейкстры была расширена для параллельных программ (Хоар, «Communicating Sequential Processes», 1978) и объектно-ориентированного программирования.
Основные понятия
Тройка Хоара
Центральным элементом логики является тройка Хоара:
{P} S {Q}
P— предусловие: логическое утверждение о состоянии памяти до выполнения оператораS.S— оператор (команда) программы.Q— постусловие: логическое утверждение о состоянии памяти после выполненияS.
Тройка считается корректной, если из истинности P до выполнения S следует истинность Q после выполнения S при условии, что S завершается (тотальная корректность) или если S завершается (частичная корректность).
Слабейшее предусловие
Дейкстра ввёл оператор wp(S, Q), который возвращает слабейшее (наиболее общее) предусловие, гарантирующее истинность Q после выполнения S. Например, для оператора присваивания x := E:
wp(x := E, Q) = Q[x/E]
где Q[x/E] — подстановка выражения E вместо всех свободных вхождений x в Q.
Правила вывода
Логика Хоара — Дейкстры включает набор аксиом и правил вывода для доказательства корректности программ. Основные правила:
1. Аксиома присваивания
{Q[x/E]} x := E {Q}
Пример: {x + 1 > 0} x := x + 1 {x > 0}
2. Правило композиции (последовательность)
{P} S1 {R}, {R} S2 {Q} ⊢ {P} S1; S2 {Q}
Если S1 переводит состояние из P в R, а S2 — из R в Q, то последовательность S1; S2 переводит из P в Q.
3. Правило условного оператора (if-then-else)
{P ∧ B} S1 {Q}, {P ∧ ¬B} S2 {Q} ⊢ {P} if B then S1 else S2 {Q}
4. Правило цикла (while)
{I ∧ B} S {I} ⊢ {I} while B do S {I ∧ ¬B}
Здесь I — инвариант цикла, логическое утверждение, которое остаётся истинным до и после каждого выполнения тела цикла S. Для доказательства завершения цикла используется вариант цикла — целочисленная функция, строго убывающая на каждой итерации.
5. Правило ослабления (consequence)
P → P', {P'} S {Q'}, Q' → Q ⊢ {P} S {Q}
Позволяет усиливать предусловие и ослаблять постусловие.
Применение
Верификация программ
Логика Хоара — Дейкстры используется для формального доказательства корректности программ. Например, для программы вычисления факториала:
`` { n ≥ 0 } i := 0; f := 1; while i ≠ n do i := i + 1; f := f * i od { f = n! } ``
Инвариант цикла: I = (f = i! ∧ i ≤ n). Вариант цикла: n - i. Доказательство проводится по правилам вывода, показывая, что инвариант сохраняется и постусловие выполняется при выходе из цикла.
Разработка программ (программирование по контракту)
Методология, развитая Дейкстрой, предполагает написание спецификации (предусловия и постусловия) до написания кода. Программа разрабатывается так, чтобы доказать её корректность относительно спецификации. Этот подход лёг в основу контрактного программирования (Бертран Мейер, язык Eiffel, 1986).
Автоматическая верификация
Современные инструменты, такие как Why3, Frama-C, SPARK Ada, используют логику Хоара — Дейкстры для автоматического доказательства корректности программ. Они генерируют условия верификации (verification conditions), которые затем передаются решателям (SMT-решателям, например, Z3, CVC4).
Критика и ограничения
Несмотря на теоретическую значимость, логика Хоара — Дейкстры имеет ряд ограничений:
- Сложность для больших программ: доказательство вручную для реальных проектов (сотни тысяч строк кода) практически невозможно. Автоматизация частично решает проблему, но требует значительных вычислительных ресурсов.
- Неполнота для недетерминированных и параллельных программ: классическая логика не учитывает эффекты параллелизма (гонки данных, взаимные блокировки). Расширения (CSP, Owicki-Gries) решают эту проблему частично.
- Требование формальной спецификации: необходимо точно задать предусловия и постусловия, что само по себе сложно для больших систем.
- Проблема завершения: доказательство тотальной корректности (завершение + частичная корректность) требует нахождения варианта цикла, что не всегда тривиально.
Влияние на информатику
Логика Хоара — Дейкстры стала фундаментом для:
- Формальной верификации — области, занимающейся математическим доказательством корректности программного и аппаратного обеспечения.
- Языков программирования — концепции контрактов (Eiffel, D, Rust), типов-зависимых (Agda, Coq), языков со статической верификацией (SPARK, Whiley).
- Методологий разработки — структурное программирование, программирование по контракту, чисто функциональное программирование.
- Образования — курсы по формальным методам, верификации программ, теории программирования.
Интересные факты
- Чарльз Хоар получил премию Тьюринга в 1980 году за вклад в определение языков программирования и формальную верификацию.
- Эдсгер Дейкстра получил премию Тьюринга в 1972 году за фундаментальный вклад в структурное программирование и теорию вычислений.
- Логика Хоара — Дейкстры лежит в основе верификации операционной системы seL4 (2009), которая стала первой formally verified microkernel.
- В 2010-х годах логика была расширена для верификации квантовых алгоритмов (квантовая логика Хоара).
Источники
- Hoare, C. A. R. (1969). An Axiomatic Basis for Computer Programming. Communications of the ACM, 12(10), 576–580.
- Dijkstra, E. W. (1976). A Discipline of Programming. Prentice-Hall.
- Dijkstra, E. W. (1968). Go To Statement Considered Harmful. Communications of the ACM, 11(3), 147–148.
- Meyer, B. (1992). Applying "Design by Contract". IEEE Computer, 25(10), 40–51.
- Owicki, S., & Gries, D. (1976). An Axiomatic Proof Technique for Parallel Programs. Acta Informatica, 6(4), 319–340.
- Klein, G., et al. (2009). seL4: Formal Verification of an OS Kernel. Proceedings of the ACM SIGOPS 22nd Symposium on Operating Systems Principles.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →