Aksioma Anda bukan benar-benar aksioma, ini hipotesis yang hilang. Presentasi sederhana dari logika Hoare memanipulasi rumus bentuk mana dan adalah rumus logis dan adalah sebuah perintah. Anda perlu memastikan bahwa terbentuk dengan baik . Dalam bahasa sederhana seperti yang sering digunakan untuk pengenalan pertama yang Hoare logika, baik-formedness adalah sintaksis: itu biasanya masalah memeriksa bahwaP P ′ C C C{P}C{P′}PP′CCCsesuai dengan tata bahasa bebas konteks, dan mungkin bahwa variabel bebas berada dalam set yang diizinkan. Jika bahasa menyertakan konstruk yang memiliki kebenaran semantik, seperti akses ke elemen array, Anda perlu menambahkan hipotesis untuk mengekspresikan kebenaran semantik ini.
Secara formal, Anda dapat menambahkan penilaian untuk mengekspresikan koreksi ekspresi dan perintah. Jika ekspresi tidak memiliki efek samping, mereka tidak memerlukan kondisi akhir, hanya kondisi awal. Misalnya, Anda dapat menulis aturan yang terbentuk dengan baik seperti
dan hanya memungkinkan ekspresi yang terbentuk dalam perintah:
{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}
Pendekatan yang berbeda adalah memperlakukan semua ekspresi sebagai well-formed, tetapi untuk membuat ekspresi apa pun yang melibatkan penghitungan yang salah memiliki nilai khusus . Dalam bahasa dengan pemeriksaan run-time bounds, berarti "program ini menimbulkan pengecualian fatal". Anda kemudian akan melacak apakah suatu program salah melalui predikat logiserrorerrorError¬Error
{P[x←E]}x:=E{P∨Error}P[x←E]⟹E↛error{P[x←E]}x:=E{P}
Namun pendekatan lain adalah dengan mempertimbangkan triple Hoare untuk menampung hanya jika program berakhir dengan benar. Ini adalah pendekatan yang biasa untuk program nonterminating: postcondition berlaku ketika perintah berakhir, yang mungkin tidak selalu terjadi. Jika Anda memperlakukan kesalahan run-time sebagai non-terminasi, Anda menyapu semua masalah kebenaran di bawah tenda. Anda masih perlu membuktikan kebenaran program tersebut, tetapi itu tidak perlu dalam logika Hoare jika Anda lebih suka formalisme lain untuk tugas itu.
By the way, perhatikan bahwa mengekspresikan apa yang terjadi ketika variabel majemuk seperti array diubah lebih terlibat daripada apa yang Anda tulis. Misalkan adalah, katakanlah, : substitusi tidak akan mengubah , namun tugas dapat membatalkan . Bahkan jika Anda membatasi sintaksis predikat hanya untuk berbicara tentang atom, pertimbangkan tugas bawah prasyarat : Anda tidak dapat membuat substitusi sederhana untuk mendapatkan postcondition yang benar , Anda perlu mengevaluasiPIsSorted(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](yang bisa sulit secara umum, karena prasyarat mungkin tidak menentukan nilai tunggal yang mungkin untuk ). Anda perlu melakukan substitusi pada array itu sendiri: . Catatan kuliah Mike Gordon memiliki presentasi logika Hoare yang baik dengan array (tetapi tanpa pengecekan kesalahan).A[0]A←A[i←E]
length
keA
?length
Berganti namaA_length
.) Kedua, kita perlu berbagai aksioma "penciptaan" sepertiint[] a = int[length] {a_length==length}
. Saya pikir ini sudah cukup.