Является ли {true} x:= y { x = y } действительной тройкой Хоара?
Я не уверен что
{ true } x := y { x = y }
является действительной тройкой Хоара.
Я не уверен, что один может ссылаться на переменную (в этом случае, y
), без явного определения его сначала либо в теле тройной программы, либо в предварительном условии.
{ y=1 } x := y { x = y } //valid
{true} y := 1; x := y { x = y } //valid
Как это?
3 ответа
Я не уверен что
{ true } x := y { x = y }
является действительной тройкой Хоара.
Тройка должна читаться следующим образом:
"Независимо от начального состояния, после выполнения x:=y
х равно у."
и это действительно так. Формальный аргумент, почему это так
- самая слабая предпосылка
x := y
данное постусловие{ x = y }
является{ y = y }
, а также { true }
подразумевает{ y = y }
,
Тем не менее, я полностью понимаю, почему вы испытываете беспокойство по поводу этой тройки, и вы беспокоитесь по уважительной причине!
Тройка плохо сформулирована, потому что условия до и после не дают полезной спецификации. Зачем? Потому что (как вы обнаружили) x := 0; y := 0
также удовлетворяет спецификации, так как x = y
держит после исполнения.
Очевидно, что x := 0; y := 0
не очень полезная реализация, и причина, по которой она все еще удовлетворяет спецификации, заключается (по мне) в ошибке спецификации.
Как это исправить:
"Правильный" способ выражения спецификации состоит в том, чтобы убедиться, что спецификация является самодостаточной, используя некоторые метапеременные, к которым программа не может получить доступ (x₀
а также y₀
в этом случае):
{ x=x₀ ∧ y=y₀ } x := y { x=y₀ ∧ y=y₀ }
Вот x := 0; y := 0
больше не удовлетворяет почтовому условию.
{ true } x := y { x = y }
является действительной тройкой Хоара. Причина в следующем:
x := y
является назначением, поэтому замените это в предварительном условии.
Предварительное условие стоит как {y=y}
, что подразумевает {true}
,
Другими словами, {y=y} => {true}
,