Sebuah aturan bingkai , seperti yang diberikan di bawah ini, menangkap gagasan bahwa, mengingat program c
dengan prasyarat p
yang memegang sebelum berjalan dan postcondition q
yang memegang sesudahnya, beberapa kondisi menguraikan r
harus memegang baik sebelum dan sesudah c
berjalan. ( Konektif *
mensyaratkan bahwa argumennya terpisah.) Seringkali, kondisi pra dan pasca adalah keadaan tumpukan, dan c
merupakan program yang efektif yang memodifikasi tumpukan dengan beberapa cara.
{p} c {q}
----------------- (where no free variable in r is modified by c)
{p * r} c {q * r}
Diskusi tentang aturan bingkai yang saya lihat selalu tampak berfokus pada bagaimana bagian yang terpisah dari tumpukan, r
dipertahankan. Ini memungkinkan "penalaran lokal": ketika berpikir tentang efek yang c
dimilikinya, kita dapat mengabaikan r
bagian tumpukan dan hanya memusatkan perhatian pada bagian yang benar-benar berubah. Tetapi cara lain untuk melihatnya adalah bahwa perubahan dari p
keq
dipertahankan, meskipun r
sekarang duduk di sana. Dengan kata lain, penting bahwa kita berakhir dengan kondisi akhir {q * r}
, bukan {q' * r}
untuk beberapa lainnya q'
.
Jadi, pertanyaan saya adalah apakah ada perawatan dari aturan frame yang dibahas atau merek penggunaan pelestarian-of-perubahan-dari- p
-to- q
hal.
sumber
Jawaban:
Tapi properti no-change-to-
q
property ini sebenarnya tidak berlaku!Pertimbangkan
{emp} x := alloc(0) {x |-> 0}
. Sekarang, jika saya membingkaiy |-> 3
, saya mengerti{y |-> 3} x := alloc(0) {x |-> 0 * y |-> 3}
tetapi, dengan aturan konsekuensi, saya bisa mengubah postcondition menjadi
{y |-> 3} x := alloc(0) {(x |-> 0 /\ x != y) * y |-> 3}
Untuk membuat ini lebih konkret, anggaplah
y
angkanya37
. Ketika saya menjalankan perintah alokasi di tumpukan yang benar-benar kosong, mungkin saja saya akan akhirnya mengalokasikan alamat37
, jadix = 37
. Tetapi, jika saya mulai dengan tumpukan yang berisi sel tunggal di alamaty = 37
, hasil ini tidak lagi mungkin! Menambahkan bingkai ke prasyarat telah memangkas beberapa nondeterminisme dalam postkondisi.Makalah "Tindakan lokal dan logika pemisahan abstrak" (Calcagno, O'Hearn, dan Yang) adalah semua tentang memahami aturan bingkai dari perspektif semantik yang lebih dalam. Definisi utama dari makalah ini adalah lokalitas untuk "tindakan", di mana suatu tindakan adalah (representasi semantik dari) sebuah program. Lokalitas mengatakan bahwa ketika Anda menambahkan beberapa frame heap, satu - satunya cara postcondition asli dapat diubah adalah dengan memangkas beberapa nondeterminisme seperti di atas. Dan, pada kenyataannya, pemangkasan hanya muncul karena alokasi.
sumber
q
hanya dapat berubah menjadi "q
, dan juga ..."? Dan, lebih jauh lagi, jika alokasi adalah satu-satunya hal yang dapat memangkas nondeterminisme dalam postcondition (yang merupakan hasil yang keren dalam dirinya sendiri), maka, jika ada beberapa bagian dari postcondition yang independen terhadap lokasi, maka adalah bagian dari postcondition dijamin tetap sama? Bisakah kita mengatakan bahwa postcondition tetap sama hingga penggantian nama alpha dari lokasi? (Saya punya contoh, tetapi mungkin ini lebih baik dijelaskan melalui email.)q
hanya bisa berubah menjadi "q
, dan juga ..." Dengan kata lain, postcondition hanya bisa menjadi lebih kuat : itu akan menyiratkan postcondition asli. Ini adalah bagian dari definisi lokalitas untuk tindakan. Namun, tidak benar bahwa perubahan pada kondisi akhir hanya terkait dengan penggantian nama. Dalam contoh saya berikan, fakta tambahan yangx
dany
yang berbeda adalah benar terlepas dari alamat tertentu dipilih untuky
. Contoh ini menangkap kesegaran alokasi, yang tidak berubah di bawah penamaan ulang.Pertama, ada kesalahpahaman kecil dalam pernyataan pertanyaan Anda, yang juga diterima Harun dalam jawabannya. Predikat dalam logika pemisahan adalah kumpulan tumpukan (atau ekuivalen, predikat pada tumpukan), dan konjungsi pemisah didefinisikan sebagai:P∗Q
Jadi dalam aturan frame
(dan P dan Q ) tidak berbicara tentang tumpukan spesifik --- mereka adalahpropertitumpukan (karena himpunan bagian dan predikat adalah setara). Cara terbaik untuk memahami apa yang terjadi adalah dengan melihat definisi dari apa yang dipegang oleh Hoare triple:R P Q
Definisi ini pada dasarnya mengatakan bahwa (1) jika Anda menjalankan dengan h 1 di P , maka Anda akan menyelesaikan dalam beberapa keadaan akhir h 2 di Q , dan (2) jika Anda menambahkan memori tambahan h ′ , memori itu akan tidak berubah di akhir proses. Tetapi perhatikan bahwa h 2 spesifik yang Anda dapatkan dapat berbeda, untuk berbagai pilihan h ′ --- yang dijamin adalah bahwa properti P dan Q akan terus bertahan di bawah ekstensi, bukan bahwa Anda mendapatkan tumpukan hasil yang persis sama.c h1 P h2 Q h′ h2 h′ P Q
Ini tidak terlalu sulit, tetapi masih layak untuk dikerjakan, untuk melihat bagaimana definisi Hoare triple ini menyiratkan bahwa aturan frame berlaku. Seperti yang Anda perhatikan, ini adalah semacam properti "pelestarian-perubahan", dan ia memiliki ekspresi yang sangat jelas dalam pernyataan aturan komposisi paralel dalam logika pemisahan bersamaan:
Jika dan c 2 bertindak pada daerah memori terpisah, maka masing-masing tidak akan mengganggu properti eksekusi yang lain ketika dijalankan secara paralel.c1 c2
Ada diskusi tentang hal ini dalam makalah oleh Hoare et al, On Locality dan Exchange Law for Concurrent Processes , di mana mereka menunjukkan bagaimana memberikan aljabar gabungan program dan pernyataan.
sumber
Meskipun tidak 100% terkait, ini memiliki rasa idempoten kontrak.
Jika kita menganggap {p} sebagai prasyarat pada c dan {q} sebagai prasyarat pada c, gagasan aturan bingkai ini akan memastikan bahwa prekondisi dan pascakondisi berlaku dalam setiap konteks perhitungan, bukan kasus sederhana di mana tidak ada yang lain.
Yang mengatakan, saya tidak bisa mengatakan bahwa saya telah melihat aturan kerangka yang disajikan dalam salah satu dari puluhan makalah kontrak yang saya baca. Ini tentu saja merupakan ide yang hebat, dan membutuhkan perubahan seperti itu dapat melakukan banyak hal untuk mengembangkan pemahaman yang masuk akal dan nyata dari kontrak idempoten .
sumber