Eksekusi Simbolik adalah kasus Interpretasi Abstrak?

Jawaban:

22

Saya tidak mengetahui makalah yang membahas perbandingan antara eksekusi simbolik dan interpretasi abstrak. Saya juga tidak berpikir satu pun dibutuhkan. Membaca deskripsi asli dari kedua teknik ini sudah cukup.

  • King, Eksekusi Simbolik dan Pengujian Program , 1976
  • Cousot, Cousot, Interpretasi Abstrak: Model Kisi Terpadu untuk Analisis Statis Program dengan Konstruksi Perkiraan Fixpoints , 1977

(Sebaliknya, jika ada beberapa koneksi yang tidak terduga, maka itu akan layak untuk dijelaskan. Tapi saya sangat meragukan hal ini.)

Gagasan utama eksekusi simbolik adalah bahwa, pada titik arbitrer dalam eksekusi, Anda dapat mengekspresikan nilai semua variabel sebagai fungsi dari nilai awal. Ide utama interpretasi abstrak adalah bahwa Anda dapat secara sistematis mengeksplorasi semua eksekusi program dengan serangkaian perkiraan yang berlebihan. (Saya bisa mendengar beberapa penggemar AI mengeluh pada perkiraan sebelumnya.)

Dengan demikian, setidaknya dalam formulasi asli, eksekusi simbolik tidak berkaitan dengan mengeksplorasi semua eksekusi yang mungkin. Anda dapat melihat ini bahkan dalam judul: itu termasuk kata 'pengujian'. Tapi ini lebih dari Bagian 8: "Untuk program dengan pohon eksekusi tanpa batas, pengujian simbolis tidak bisa lengkap dan tidak ada bukti absolut kebenaran dapat dibuat."

Sebaliknya, interpretasi abstrak bertujuan untuk mengeksplorasi semua eksekusi. Untuk melakukannya, ia menggunakan beberapa bahan, salah satunya sangat mirip dengan gagasan utama eksekusi simbolik. Bahan-bahan ini adalah (1) keadaan abstrak, (2) bergabung dan melebar (karenanya, 'kisi' dalam judul).

Status abstrak.Keadaan konkret dari suatu program pada titik waktu tertentu pada dasarnya adalah snapshot dari konten memori (termasuk kode program itu sendiri dan penghitung program). Ini memiliki banyak detail, yang sulit dilacak. Saat Anda menganalisis properti tertentu, Anda mungkin ingin mengabaikan sebagian besar kondisi konkret. Atau Anda mungkin ingin hanya peduli apakah variabel tertentu negatif, nol, atau positif, tetapi tidak peduli dengan nilai pastinya. Secara umum, Anda ingin mempertimbangkan versi abstrak dari kondisi konkret. Agar ini berhasil, Anda harus memiliki properti komutatif: Jika Anda mengambil keadaan konkret, menjalankan pernyataan, dan mengabstraksi keadaan yang dihasilkan, Anda harus mendapatkan hasil yang sama seperti jika Anda abstrak keadaan awal, dan kemudian jalankan yang sama pernyataan tetapi pada kondisi abstrak. Diagram komutatif ini muncul di kedua makalah. Ini adalah ide umum. Sekali lagi, interpretasi abstrak lebih umum, karena ia tidak menentukan bagaimana cara abstrak suatu negara - ia hanya mengatakan harus ada cara untuk melakukannya. Sebaliknya, eksekusi simbolik mengatakan bahwa Anda menggunakan ekspresi (simbolik) yang menyebutkan nilai awal.

Bergabung dan Melebar. Jika eksekusi program mencapai pernyataan tertentu dengan dua cara berbeda, eksekusi simbolik tidak mencoba untuk menggabungkan kedua analisis. Itulah sebabnya kutipan di atas berbicara tentang pohon eksekusi, bukan dags. Tapi, ingat bahwa interpretasi abstrak ingin mencakup semua eksekusi. Dengan demikian, ia meminta cara untuk menggabungkan analisis dari dua eksekusi pada titik di mana mereka memiliki program counter yang sama. (Gabung bisamenjadi sangat bodoh ({a} join {b} = {a, b}) sedemikian rupa sehingga sama dengan eksekusi simbolis.) Secara umum, bergabung dengan itu sendiri tidak cukup untuk menjamin bahwa Anda akhirnya akan selesai menganalisis semua eksekusi. (Secara khusus, join bodoh yang disebutkan sebelumnya tidak akan berfungsi.) Pertimbangkan program dengan loop: "n = input (); untuk i dalam range (n): dostuff ()". Berapa kali Anda harus berputar dan terus bergabung? Tidak ada jawaban tetap yang berfungsi. Jadi, sesuatu yang lain dibutuhkan, dan itu adalah pelebaran , yang dapat dilihat sebagai heuristik. Misalkan Anda berkeliling loop 3 kali dan Anda belajar bahwa "i = 0 atau i = 1 atau i = 2". Lalu Anda berkata: hmmm, ... mari kita memperluas, dan Anda mendapatkan "i> = 0". Sekali lagi interpretasi abstrak tidak mengatakan bagaimana melakukan pelebaran - ia hanya mengatakan sifat pelebaran apa yang harus dikerjakan.

(Maaf untuk jawaban panjang ini: Aku benar-benar tidak punya waktu untuk membuatnya lebih pendek.)

Radu GRIGore
sumber
5

Saya pikir ini dimaksudkan dalam arti yang sangat dangkal. Langkah pertama dari interpretasi abstrak adalah mengidentifikasi semantik pengumpul yang konkret. Daripada menggambarkan evolusi satu negara, mengumpulkan semantik menggambarkan evolusi set negara. Karena alasan eksekusi simbolis tentang representasi set negara, orang dapat berpendapat bahwa itu mewakili semantik konkret dari program. Saya tidak mengetahui adanya korespondensi yang lebih tepat.

Vijay D
sumber
Terima kasih. Tetapi jika SE mewakili semantik konkret maka apa itu semantik abstrak. Tanpa semantik abstrak, kita tidak bisa mengatakan itu adalah kasus AI. Bisakah Anda jelaskan sedikit lebih banyak? Omong-omong, saya membaca makalah Anda, pemecah SAT adalah AI, itu benar-benar menarik.
qsp
3
Pertama, abstraksi adalah gagasan refleksif, yang berarti bahwa setiap struktur adalah abstraksi sepele dari dirinya sendiri melalui fungsi identitas. Kedua, eksekusi simbolis tidak akan menghitung keseluruhan semantik konkret karena hanya beberapa jalur program yang dieksplorasi, jadi dalam hal ini, ada abstraksi yang terlalu rendah.
Vijay D
2

Lihat Patrick Cousot. Lebih lanjut tentang konstruksi dan pendekatan poin perbaikan, monophone dan non-kontrak, menganalisis beberapa program (metode berulang untuk konstruksi dan perkiraan titik tetap operator monoton pada kisi, analisis statis program). Thése ès Sciences Mathématiques, Université Joseph Fourier, Grenoble, Prancis, 21 Maret 1978. https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (sayangnya di Perancis), halaman (3) -27 untuk (3) -29

Patrick Cousot
sumber