#python #correctness #proof-of-correctness
#python #корректность #доказательство правильности
Вопрос:
Мне нужна помощь в доказательстве корректности итеративной программы:
def term_ex_2(x,y):
''' Pre: x and y are natural numbers '''
a = x
b = y
while a >= 0 or b >= 0:
if a > 0:
a -= 1
else:
b -= 1
return x * y
Я знаю, что мне нужно каким-то образом найти инвариант цикла и доказать его путем индукции в цикле. Проблема в том, что операторы if / else здесь путают меня в том, как их придумать.
Я также должен доказать, завершается ли программа или нет после этого.
У меня есть общее представление о том, что такое пошаговый процесс, но я не знаю, с чего начать в этом примере из домашнего задания.
Любые советы будут оценены.
Ответ №1:
Обратите внимание, что на каждой итерации вашего внешнего while
цикла a
значение или b
уменьшается на 1.
Поскольку x
y
предполагается, что и являются натуральными числами, оба они изначально > 0
.
Инвариант цикла: a >= 0
(Могут быть и другие возможности!)
Кроме того, программа не завершается, что совершенно очевидно из приведенного выше инварианта цикла, поскольку он заставляет while
цикл вычислять true
всегда.
Эскиз доказательства: пока a > 0
цикл продолжает a
уменьшаться, пока не достигнет 0
. Затем else
начинается выполнение условия, которое продолжает уменьшаться b
вечно, поскольку a == 0
while
цикл повторяется снова и снова.
Классическое использование помещения самого инварианта цикла в условие завершения цикла, чтобы цикл выполнялся бесконечно!
Комментарии:
1. Будет ли b>= 0 также инвариантами цикла?
2. Не стесняйтесь обращаться за дальнейшими разъяснениями!
3. В моем домашнем задании я понял еще один вопрос, призванный доказать, что инварианты цикла для этой функции равны a, b> = 0, поэтому я и спросил. Я думал, что b> = 0 является допустимым инвариантом, потому что это одно из условий цикла
4. Также у меня есть пара других вопросов в инвариантах цикла, у меня возникают проблемы с подобными циклами с операторами if / else. Можете ли вы помочь мне с таким вопросом?
5. По определению инвариантность цикла — это условие, которое всегда оценивается как true в начале цикла, независимо от количества итераций. Как вы можете видеть, после
a
достижения0
толькоelse
часть выполняется иb
продолжает уменьшаться даже ниже 0.