Combinator titik tetap FIX (alias combinator Y) dalam kalkulus lambda (tidak diketik) ( ) didefinisikan sebagai:
FIX
Saya mengerti tujuannya dan saya bisa melacak pelaksanaan aplikasinya dengan sangat baik; Saya ingin memahami cara menurunkan FIX dari prinsip pertama .
Di sini sejauh yang saya dapatkan ketika saya mencoba menurunkannya sendiri:
- FIX adalah fungsi: FIX
- FIX mengambil fungsi lain, , untuk membuatnya rekursif: FIX
- Argumen pertama dari fungsi adalah "nama" dari fungsi, digunakan di mana aplikasi rekursif dimaksudkan. Oleh karena itu, semua tampilan argumen pertama ke harus diganti dengan fungsi, dan fungsi ini harus mengharapkan sisa argumen (anggap saja mengambil satu argumen): FIX
Di sinilah saya tidak tahu bagaimana "mengambil langkah" dalam penalaran saya. Elips kecil menunjukkan di mana FIX saya kehilangan sesuatu (meskipun saya hanya bisa tahu dengan membandingkannya dengan FIX "nyata").
Saya sudah membaca Jenis dan Bahasa Pemrograman , yang tidak berusaha menurunkannya secara langsung, dan sebagai gantinya merujuk pembaca ke The Little Schemer untuk derivasi. Saya telah membaca itu juga, dan "turunannya" tidak begitu membantu. Selain itu, ini bukan turunan langsung dan lebih banyak menggunakan contoh yang sangat spesifik dan upaya ad-hoc untuk menulis fungsi rekursif yang sesuai di .
Jawaban:
Saya belum membaca ini di mana pun, tapi ini adalah bagaimana saya percaya dapat diturunkan:Y
Mari kita memiliki fungsi rekursif , mungkin faktorial atau yang lainnya. Secara informal, kami mendefinisikan sebagai istilah pseudo-lambda di mana muncul dalam definisi sendiri:f f f
Pertama, kami menyadari bahwa panggilan rekursif dapat difaktorkan sebagai parameter:
Sekarang kita bisa mendefinisikan jika kita hanya punya cara bagaimana menyampaikannya sebagai argumen untuk dirinya sendiri. Ini tidak mungkin, tentu saja, karena kita tidak punya di tangan. Apa yang kita miliki di tangan adalah . Karena berisi semua yang perlu kita definisikan , kita dapat mencoba meneruskan sebagai argumen alih-alih dan mencoba merekonstruksi darinya nanti di dalam. Upaya pertama kami terlihat seperti ini:f f M M f M f f
Namun, ini tidak sepenuhnya benar. Sebelum, mendapat menggantikan dalam . Tapi sekarang kita melewati sebagai gantinya. Kita harus entah bagaimana memperbaiki semua tempat di mana kita menggunakan sehingga mereka merekonstruksi dari . Sebenarnya, ini tidak sulit sama sekali: Sekarang kita tahu bahwa , di mana-mana kita menggunakan kita cukup menggantinya dengan .f r M M r f M f=MM r (rr)
Solusi ini bagus, tapi kami harus mengubah di dalamnya. Ini sangat tidak nyaman. Kita dapat melakukan ini dengan lebih elegan tanpa harus memodifikasi dengan memperkenalkan yang mengirim ke argumennya berlaku untuk dirinya sendiri: Dengan menyatakan sebagai kita dapatkanM M λ M M′ λx.M(xx)
Dengan cara ini, ketika diganti untuk , diganti untuk , yang menurut definisi sama dengan . Ini memberi kita definisi non-rekursif dari , yang dinyatakan sebagai istilah lambda yang valid!M x MM r f f
Transisi ke sekarang mudah. Kita dapat mengambil istilah lambda sewenang-wenang alih-alih dan melakukan prosedur ini. Jadi kita dapat faktor dan mendefinisikanY M M
Memang, berkurang menjadi seperti yang kita mendefinisikannya.YM f
Catatan: Saya telah menurunkan seperti yang didefinisikan dalam literatur. Combinator yang telah dijelaskan adalah varian dari untuk panggilan-by-nilai bahasa, kadang-kadang juga disebut . Lihat artikel Wikipedia ini .Y Y Z
sumber
Seperti yang ditunjukkan Yuval, tidak hanya ada satu operator fixed-point. Mereka ada banyak. Dengan kata lain, persamaan untuk teorema titik tetap tidak memiliki jawaban tunggal. Jadi Anda tidak dapat menurunkan operator dari mereka.
Itu seperti bertanya bagaimana orang memperoleh sebagai solusi untuk . Mereka tidak! Persamaannya tidak memiliki solusi unik.(x,y)=(0,0) x=y
Kalau-kalau Anda ingin tahu adalah bagaimana teorema titik tetap pertama ditemukan. Biarkan saya mengatakan bahwa saya juga bertanya-tanya tentang bagaimana mereka datang dengan teorema titik-tetap / rekursi ketika saya pertama kali melihat mereka. Sepertinya sangat cerdik. Terutama dalam bentuk teori komputabilitas. Tidak seperti apa yang dikatakan Yuval, bukan itu masalahnya orang bermain-main sampai mereka menemukan sesuatu. Inilah yang saya temukan:
Sejauh yang saya ingat, teorema ini awalnya karena SC Kleene. Kleene datang dengan teorema titik tetap asli dengan menyelamatkan bukti ketidakkonsistenan kalkulus lambda asli Gereja. Kalkulus lambda asli Gereja menderita paradoks jenis Russel. Kalkulus lambda yang dimodifikasi menghindari masalah. Kleene mempelajari bukti inkonsistensi mungkin untuk melihat bagaimana jika kalkulus lambda yang dimodifikasi akan menderita masalah yang sama dan mengubah bukti inkonsistensi menjadi teorema yang berguna dalam kalkulus lambda yang dimodifikasi. Melalui karyanya tentang kesetaraan kalkulus lambada dengan model komputasi lain (mesin Turing, fungsi rekursif, dll.) Ia memindahkannya ke model komputasi lain.
Bagaimana cara menurunkan operator yang mungkin Anda tanyakan? Inilah cara saya mengingatnya. Teorema titik tetap adalah tentang menghilangkan referensi-diri.
Semua orang tahu paradoks pembohong:
Atau dalam bentuk yang lebih linguistik:
Sekarang kebanyakan orang berpikir masalah dengan kalimat ini adalah dengan referensi diri. Bukan itu! Referensi-diri dapat dihilangkan (masalahnya adalah dengan kebenaran, sebuah bahasa tidak dapat berbicara tentang kebenaran dari kalimatnya sendiri secara umum, lihat teorema kebenaran Tarski yang tidak dapat ditentukan ). Bentuk rujukan diri dihapus adalah sebagai berikut:
Tanpa referensi-diri, kami memiliki instruksi tentang cara membuat kalimat dan kemudian melakukan sesuatu dengannya. Dan kalimat yang dibangun sama dengan instruksi. Perhatikan bahwa dalam -calculus kita tidak perlu tanda kutip karena tidak ada perbedaan antara data dan instruksi.λ
Sekarang jika kita menganalisis ini kita memiliki mana adalah instruksi untuk membangun dan melakukan sesuatu untuk itu.MM Mx xx
Jadi adalah dan yang kita milikiM λx.f(xx)
Ini untuk diperbaiki . Jika Anda ingin menjadikannya operator, kami hanya menambahkan dan kami mendapatkan :f λf Y
Jadi aku hanya perlu diingat paradoks tanpa referensi diri dan yang membantu saya memahami apa adalah tentang.Y
sumber
Jadi, Anda perlu mendefinisikan kombinator titik tetap
tetapi tanpa rekursi eksplisit. Mari kita mulai dengan kombinator irreducible sederhana
Di
x
lambda pertama berulang kali diganti dengan lambda kedua. Konversi alpha sederhana membuat proses ini lebih jelas:Yakni variabel dalam lambda pertama selalu menghilang. Jadi jika kita menambahkan
f
ke lambda pertamasurat
f
wasiat itu munculKami sudah
omega
mendukung kami . Harus jelas sekarang, bahwa jika kita menambahkanf
lambda kedua, makaf
akan muncul di lambda pertama dan kemudian akan muncul:Sejak
kita dapat menulis ulang ekspresi sebagai
yang mana saja
dan kami sudah mendapatkan persamaan kami
Y f = f (Y f)
. JadiY
kombinator pada dasarnyaf
f
munculsumber
Anda mungkin telah melihat contoh klasik dari persamaan tanpa bentuk normal:
Persamaan serupa disarankan oleh itu untuk rekursi umum:
(A) adalah cara untuk menulis persamaan rekursif umum dalam kalkulus lambda (di luar primitif rekursif). Jadi bagaimana Anda menyelesaikan persamaan ? Hubungkan untuk dalam persamaan di atas untuk mendapatkan:Yf=f(Yf) f R
sumber