Я не уверен, что
{ true } x := y { 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
больше не удовлетворяет условию публикации.