Как продемонстрировать правильность программы с циклом while, используя логику Хоара c? - PullRequest
1 голос
/ 13 февраля 2020

Как я могу продемонстрировать через Hoare logi c правильность программы, имеющей цикл while. Было бы увлекательно, если бы кто-то разработал его на любом примере, потому что моя задача решить:

Предварительное условие = {n> 0}

cont := n;
sum := 0;
while cont <> 0 do:
    sum := sum + cont;
    cont := cont-1;
endwhile

Постусловие = {sum = 1 + 2 + ... + n}

Нет необходимости разрабатывать этот пример. Мне просто нужно понять процедуру, потому что у меня нет практического примера. Спасибо за ваше время.

1 Ответ

3 голосов
/ 14 февраля 2020

Hoare logi c * Здесь должно применяться правило"while":

Если команда S удовлетворяет тройке Хоара вида {P ∧ B} S {P} , тогда команда while B do S удовлетворяет {P} while B do S {P ∧ ¬B}.

Это единственная техника для доказательства постусловия while l oop в Hoare logi c, поэтому вы должны применить Это. Условие B и тело l oop S приведены в коде, но P может быть любым выбранным условием, если выполняется {P ∧ B} S {P}.

Эта тройка Хоара утверждает, что если P истинно до итерации l oop, то оно все равно будет истинно после, поэтому такое условие P известно как l oop инвариант . Чтобы доказать постусловие l oop, вам необходимо установить sh (1), что P истинно перед первой итерацией l oop, и (2) что P сохраняется в l oop body.

Необходимым инвариантом для l oop в вашем примере является sum = n + (n-1) + ... + (cont+1), т.е. сумма чисел от cont+1 до n. В общем, не существует систематического c способа найти правильный инвариант l oop для использования; Вы должны использовать свое понимание алгоритма и свою интуицию / опыт, чтобы придумать его самостоятельно.


Этого достаточно, чтобы показать, что , если l oop завершается тогда его постусловие будет выполнено; вам также нужно установить sh, что l oop действительно завершится. Техника, которую вы должны применить здесь, состоит в том, чтобы найти l oop вариант ; обычно это некоторая целочисленная величина, которая (1) уменьшается на каждой итерации l oop и (2) приводит к завершению l oop, когда количество достигает нуля.

В вашем примере cont является вариантом oop, поскольку l oop уменьшает cont := cont-1, а условие l oop завершает l oop, когда cont достигает нуля. В общем, как и при поиске полезного инварианта, не существует системной c процедуры, которая бы находила вариант во всех случаях, но вы можете начать с просмотра условия l oop, чтобы увидеть, какие переменные определяют, когда l oop заканчивается.

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