Tiên đề của bạn không thực sự là một tiên đề, nó thiếu các giả thuyết. Bài thuyết trình đơn giản của Luận lý Hoare thao tác công thức có dạng nơi P và P ' là công thức hợp lý và C là một lệnh. Bạn cần phải đảm bảo rằng C được hình thành tốt . Trong các ngôn ngữ đơn giản như những ngôn ngữ thường được sử dụng cho lần giới thiệu đầu tiên về logic Hoare, sự hình thành tốt là cú pháp: đó thường là vấn đề kiểm tra C{P}C{P′}PP′CCCphù hợp với một ngữ pháp không ngữ cảnh và có thể các biến miễn phí nằm trong một tập hợp được phép. Nếu ngôn ngữ bao gồm các cấu trúc có tính chính xác về ngữ nghĩa, chẳng hạn như truy cập vào các phần tử mảng, bạn cần thêm các giả thuyết để diễn tả tính chính xác ngữ nghĩa này.
Chính thức, bạn có thể thêm các phán đoán để diễn tả sự điều chỉnh biểu thức và lệnh. Nếu các biểu thức không có tác dụng phụ, chúng không cần hậu điều kiện, chỉ có điều kiện tiên quyết. Ví dụ: bạn có thể viết các quy tắc định dạng tốt, chẳng hạn như
{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}
Tuy nhiên, một cách tiếp cận khác là xem xét bộ ba Hoare chỉ giữ nếu chương trình kết thúc chính xác. Đây là cách tiếp cận thông thường cho các chương trình sắp hết hạn: postcondition giữ khi lệnh kết thúc, điều này có thể không luôn luôn xảy ra. Nếu bạn coi các lỗi thời gian chạy là không chấm dứt, bạn sẽ quét tất cả các vấn đề chính xác dưới mui xe. Bạn vẫn sẽ cần phải chứng minh tính đúng đắn của chương trình bằng cách nào đó, nhưng nó không cần phải theo logic Hoare nếu bạn thích một số hình thức khác cho nhiệm vụ đó.
Nhân tiện, lưu ý rằng việc diễn tả những gì xảy ra khi một biến tổng hợp như một mảng được sửa đổi có liên quan nhiều hơn đến những gì bạn đã viết. Giả sử là, nói, : sự thay thế sẽ không thay đổi , tuy nhiên sự phân có thể làm mất hiệu lực . Ngay cả khi bạn hạn chế cú pháp của các vị từ chỉ nói về các nguyên tử, hãy xem xét phép gán theo điều kiện tiên quyết : bạn không thể thực hiện một sự thay thế đơn giản để có được kết quả chính xác , bạn cần đánh giáPIsSorted(A)A[i]←EPA[i]←PPA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A [ 0 ] A [ 0 ] A ← A [ i ← E ]A[0]=1∧A[1]=1A[0](nói chung có thể khó khăn, vì điều kiện tiên quyết có thể không chỉ định một giá trị khả dĩ duy nhất cho ). Bạn cần thực hiện thay thế trên chính mảng: . Ghi chú bài giảng của Mike Gordon có phần trình bày logic Hoare tốt với các mảng (nhưng không kiểm tra lỗi).A[0]A←A[i←E]
length
đếnA
?