Ini adalah jawaban parsial: Saya tidak tahu kesalahan atau orang mana yang SICP rujuk. Saya hanya bisa memberikan beberapa petunjuk tentang "mengapa" penggantian nama variabel bisa menyakitkan untuk ditangani secara tepat.
Pertama-tama, tampaknya sepele untuk didefinisikan. Misalnya, kita bisa mengganti nama variabel terikat dalam jumlah yang diindeks
∑xe=∑y(e{y/x})
di mana e adalah ekspresi apa pun, dan e{y/x} menunjukkan penggantian sintaksis masing-masing x dengan y . Sepele, kan?
Nah, jika kita membabi buta menerapkan aturan di atas, kita dapatkan
∑x(x+y)=∑y(y+y)
Itu tidak baik. Kita perlu menambahkan persyaratan " y tidak terjadi di e ", atau kita mendapatkan bentrokan nama.
Sekarang, pertimbangkan penggantian nama yang benar ini
∑x∑y(x+y)=∑x∑z(x+z)
jika kita ingin mengganti nama x menjadi y , dengan aturan di atas kita dapat melakukannya di sisi kanan, tetapi tidak di sisi kiri. Itu merepotkan, karena keduanya hanya berbeda dengan penggantian nama, jadi mereka harus ditangani dengan cara yang sama.
Pendekatan khas di sini adalah untuk menggunakan mendefinisikan kembali e{y/x} sebagai "substitusi penangkapan-hindari", dan mengendurkan persyaratan " y tidak terjadi di e " dan menggunakan sebagai gantinya " y tidak terjadi gratis di e ".
Kami kemudian mendefinisikan kejadian gratis:
free(x)={x}free(e+t)=free(e)∪free(t)free(∑xe)=free(e)∖{x}
Akhirnya, tangkap menghindari subtitusi:
- x{t/y} adalaht jikax=y , danx sebaliknya.
- (e+e′){t/y}=e{t/y}+e′{t/y} (huruf mudah)
- (∑xe){t/y}=??
Kasus terakhir menyakitkan. Jika x=y , substitusi adalah no-op, karena kami ingin itu hanya mempengaruhi variabel bebas, dan x terikat. Jadi hasilnya hanya ∑xe .
Jika y≠x , kami ingin mengatakan itu (∑xe){t/y}=∑x(e{t/y}) . Namun ini salah, secara umum, karena jika x terjadi gratis di t kita mendapatkan tangkapan.
Mendesah. Jadi, kita membiarkan z menjadi "pertama" variabel yang 1) tidak y , 2) tidak bebas dalam t , dan 3) tidak bebas dalam ∑xe . Di sini, "pertama" berarti bahwa kita perlu mengatur urutan nama-nama variabel dengan baik (misalnya dengan memilih penambangan antara nama dan alami). Kemudian, kami akhirnya membiarkan
(∑xe){t/y}=∑z(e{z/x}{t/y}) .
Saya harap saya melakukannya dengan benar. (Omong-omong upaya pertama saya salah)
zz
αλx
Sekarang, bayangkan harus berurusan dengan definisi rumit ini setiap kali kita ingin membuktikan sesuatu dalam teori PL. Kita bisa, tetapi kita tidak mau. Membosankan, membosankan, rentan kesalahan, mengacaukan buktinya dan tidak memberikan wawasan kepada pembaca. Untuk alasan ini, banyak penulis PL hanya melewatkan detail dengan mengatakan (atau bahkan menerima begitu saja!) Bahwa istilah harus diambil "hingga penggantian nama variabel", bahwa semua variabel terikat dianggap berbeda dari apa pun yang mereka perlukan untuk membedakan, bahwa kita menganggap "konvensi Barendregt", atau sesuatu dengan efek yang sama.
Jujur saja, ini curang dalam bukti. Kita juga bisa menambahkan "wink wink, nudge nudge, say no more!" dalam semangat yang sama. Kami pada dasarnya meminta belas kasihan dan memberi tahu pembaca: "lihat, ini membosankan, saya tidak ingin melakukannya, Anda tidak ingin membacanya - kami berdua tahu bahwa, dengan upaya besar, kami dapat menulis ulang bukti ini untuk sertakan semua detail ".
Secara teknis, itu adalah mungkin untuk mengeksploitasi shortcut ini untuk membuktikan pernyataan palsu. Namun, reviewer bukti yang berpengalaman tahu apa yang "baik secara moral" dan bisa menjadi sempurna (dengan usaha keras), dan apa yang mencurigakan. Yang terakhir dapat mencakup sesuatu yang tergantung pada pilihan sebenarnya dari nama terikat (jadi kami tidak benar - benar bekerja "hingga" seperti yang dijanjikan!). Dalam kasus tersebut, ulasan akan meminta rincian lebih lanjut, sehingga dia dapat diyakinkan.