Saya mencoba untuk mendapatkan gambaran besar tentang pentingnya titik tetap (lfp) dalam analisis program. Misalnya interpretasi abstrak tampaknya menggunakan keberadaan lfp. Banyak makalah penelitian tentang analisis program juga sangat berfokus pada menemukan titik paling tidak tetap.
Lebih khusus lagi, artikel ini di wikipedia: Knaster-Tarski Theorem menyebutkan bahwa lfp digunakan untuk mendefinisikan semantik program.
Mengapa ini penting? Contoh sederhana apa pun membantu saya. (Saya mencoba untuk mendapatkan gambaran besar).
EDIT
Saya pikir kata-kata saya salah. Saya tidak menantang pentingnya lfp. Pertanyaan persis saya (pemula) adalah: Bagaimana komputasi lfp membantu dalam analisis program? Misalnya, mengapa / bagaimana interpretasi abstrak menggunakan lfp? apa yang terjadi jika tidak ada lfp di domain abstrak?
Semoga pertanyaan saya lebih konkret sekarang.
Jawaban:
Segala bentuk rekursi atau iterasi dalam pemrograman sebenarnya adalah titik tetap. Misalnya, sebuah
while
loop ditandai oleh persamaanyang mengatakan itu
while b do c done
adalah solusiW
dari persamaanmana
Φ(x) ≡ if b then (c ; x)
. Tetapi bagaimana jikaΦ
memiliki banyak poin tetap? Yang mana yang berhubungan denganwhile
loop? Salah satu wawasan dasar pemrograman semantik adalah bahwa itu adalah titik paling tidak tetap.Mari kita ambil contoh sederhana, rekursi kali ini. Saya akan menggunakan Haskell. Fungsi rekursif
f
didefinisikan olehadalah fungsi di mana-mana yang tidak terdefinisi, karena hanya berjalan selamanya. Kami dapat menulis ulang definisi ini dengan cara yang lebih tidak biasa (tetapi masih berfungsi di Haskell) sebagai
Jadi
f
adalah titik tetap dari fungsi identitas:Tetapi setiap fungsi adalah titik tetap
id
. Di bawah urutan teoretis domain, "undefined" adalah elemen yang paling sedikit. Dan memang, fungsi kitaf
adalah fungsi di mana-mana yang tidak ditentukan.while
while true do skip done
Hanya untuk memberi Anda gambaran tentang bagaimana ini bekerja, semantik program
e
sumber
But what if Φ has many fixed points?
Sementara saya memahami persamaan titik tetap, dalam konteks ini, apakah W \ dalam L? Bagaimana kita mendefinisikan kisi di sini? Saya menghargai elaborasi lebih lanjut Anda tentang itu.Inilah intuisi: titik-titik tetap paling tidak membantu Anda menganalisis loop.
Analisis program melibatkan pelaksanaan program - tetapi mengabstraksi beberapa detail data. Ini semua baik. Abstraksi membantu analisis berjalan lebih cepat daripada benar-benar menjalankan program, karena memungkinkan Anda untuk mengabaikan aspek yang tidak Anda pedulikan. Misalnya, itulah cara interpretasi abstrak bekerja: pada dasarnya mensimulasikan pelaksanaan program, tetapi hanya melacak informasi parsial tentang keadaan program.
Yang sulit adalah ketika Anda sampai pada satu lingkaran. Loop dapat menjalankan banyak, berkali-kali. Biasanya, Anda tidak ingin analisis program Anda harus mengeksekusi semua iterasi loop, karena kemudian analisis program akan memakan waktu lama ... atau bahkan mungkin tidak berakhir. Jadi, di situlah Anda menggunakan titik paling tidak tetap. Titik paling tidak tetap pada dasarnya mencirikan apa yang bisa Anda katakan pasti akan benar setelah loop selesai, jika Anda tidak tahu berapa kali loop akan beralih.
Itulah gunanya titik paling tidak tetap digunakan. Karena loop hadir di seluruh program, titik tetap paling tidak digunakan sepanjang analisis program. Poin tetap paling tidak penting karena loop ada di mana-mana, dan penting untuk dapat menganalisis loop.
Kebetulan, rekursi dan rekursi timbal balik hanyalah bentuk lain dari loop - jadi mereka juga cenderung ditangani dengan titik paling tidak tetap.
sumber