Ваша аксіома насправді не є аксіомою, у ній відсутні гіпотези. Прості презентації логіки Хоара маніпулюють формулами форми де P і P ' - логічні формули, а C - команда. Вам потрібно переконатися, що C добре сформований . У простих мовах, таких як, які часто використовуються для першого вступу до логіки Хоара, добре сформована синтаксичність: зазвичай це питання перевірити, що C{P}C{P′}PP′CCCвідповідає без контекстній граматиці і, можливо, вільні змінні знаходяться в межах дозволеного набору. Якщо мова включає конструкції, які мають семантичну правильність, наприклад, доступ до елементів масиву, вам потрібно додати гіпотези, щоб висловити цю смислову правильність.
Формально ви можете додавати судження, щоб висловити виправлення виразів і команд. Якщо вирази не мають побічних ефектів, вони не потребують жодних пост-умов, а лише передумов. Наприклад, ви можете написати добре сформовані правила, такі як
і дозволяють лише добре сформовані вирази в командах:
{P[x←E]}
{P}E wf{P∧0≤E<length(A)}A[E] wf{P}E1 wf{P}E2 wf{P}E1+E2 wf
{P[x←E]}E wf{P[x←E]}x:=E{P}
errorerrorError¬Error
{P[x←E]}x:=E{P∨Error}P[x←E]⟹E↛error{P[x←E]}x:=E{P}
Ще один підхід полягає в тому, щоб вважати трійку Хоара дотриманою, лише якщо програма закінчується правильно. Це звичайний підхід для нетермінових програм: післязастереження виконується, коли команда припиняється, що може не завжди траплятися. Якщо ви ставитесь до помилок під час запуску як до припинення, ви змітаєте всі проблеми з правильністю під кришкою. Вам все одно доведеться якось доводити правильність програми, але це не повинно бути в логіці Хоара, якщо ви віддаєте перевагу якомусь іншому формалізму для цього завдання.
До речі, зауважте, що вираження того, що відбувається при зміні складної змінної, наприклад масиву, більше пов'язане з тим, що ви написали. Нехай було, скажімо, : заміна не зміниться , але привласнення може привести до анулювання . Навіть якщо ви обмежуєте синтаксис предикатів говорити лише про атоми, розгляньте призначення під умовою : ви не можете зробити просту заміну, щоб отримати правильну пост-умову , вам потрібно оцінитиI s S o r t e d ( A ) A [ i ] ← E P A [ 1 ] = 1 A [ 0 ] A [ 0 ] A ← A [ i ← E ]PIsSorted(A)A[i]←EPA[i]←PPA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A[0]=1∧A[1]=1A[0](що в цілому може бути складним, оскільки попередня умова може не задати єдиного можливого значення для ). Вам потрібно виконати підстановку на самому масиві: . Лекції Майка Гордона мають добру презентаційну логіку Хоара з масивами (але без перевірки помилок).A[0]A←A[i←E]
length
до своєї прикладної програмиA
?