Я намеревался, чтобы это был комментарий, но у меня нет репутации, чтобы высказаться.
Эти два трюка, конечно же, не эквивалентны. Если p0> = balance, правая часть первой тройки оценивается как true, а правая часть второй тройки - false. Я нахожусь на работе и не могу разобраться, какая из них правильная тройка сейчас, но я уверен, что кто-то более квалифицированный, чем я, ответит, прежде чем я закончу работу.
Если мы допустим баланс P: = p0 <, Q: = balance = b0 - p0, а R: = balance = b0, мы можем представить правые части ваших уравнений с (P => Q) v (-P => R) и (P^Q) v (-P^R) и создадим следующую таблицу истинности.
+ --- + --- + --- + ---------------------------- + ------ -------------------- +
| .P | Q | .R | (P => Q) v (-P => R) | (P^Q) v (-P^R) |
+ --- + --- + --- + ---------------------------- + ------ ------------------ +
| .T | .T | .T | , , , , , , , , T. , , , , , , , | , , , , , , .T. , , , , , , |
| .T | .T | .F | , , , , , , , , T. , , , , , , , | , , , , , , .T. , , , , , , |
| .T | .F | .T | , , , , , , , , T. , , , , , , , | , , , , , , .F. , , , , , , |
| .T | .F | .F | , , , , , , , , T. , , , , , , , | , , , , , , .F. , , , , , , |
| .F | .T | .T | , , , , , , , , T. , , , , , , , | , , , , , , .T. , , , , , , |
| .F | .T | .F | , , , , , , , , T. , , , , , , , | , , , , , , .F. , , , , , , |
| .F | .F | .T | , , , , , , , , T. , , , , , , , | , , , , , , .T. , , , , , , |
| .F | .F | .F | , , , , , , , , T. , , , , , , , | , , , , , , .F. , , , , , , |
+ --- + --- + --- + ---------------------------- + ------ ------------------ +
Это показывает, что эти два уравнения не эквивалентны.
Я бы предположил, что правильное значение для правой стороны будет (P => Q)^(-P => R), поскольку оба утверждения должны выполняться. Я новичок в hoare-logic, и кто-то более осведомленный, вероятно, может поправить меня.
Уверены ли вы? Я считаю, что они оба оценивают истину, я думаю, что пропустил некоторые скобки. – Ferus
Пусть P: = p0 <баланс, Q: = balance = b0 - p0, R: = balance = b0 Затем ((p0 < balance) => balance = b0 - p0) v ((p0> = balance) => balance = b0) (P => Q) v (P => R). Кроме того, ((p0 = balance)^(balance = b0)) становится (P^Q) v (P^R). Итак, мы имеем (P => Q) v (P => R) =? = (P^Q) v (P^R).Если P = False, левая сторона становится True, а правая сторона становится False. –
Вы используете P для p0 = balance –
Ferus