Kalkulus Pohon
(treecalcul.us)- Sebuah sistem yang berupaya menyusun komputasi dengan sintaks minimal, membahas minimalitas, kelengkapan Turing, reflektivitas, dan modularitas hanya dengan satu operator △ serta aplikasi
- Sintaksnya adalah
E::= △ | E E, dan ketika △ bekerja pada tiga nilai, komputasi dilakukan; nilainya adalah pohon biner alami yang terdiri dari node daun, batang, dan percabangan - K dan S dari logika kombinator dapat diekspresikan di dalam Tree Calculus, sehingga bersifat Turing-complete; berbeda dari λ-calculus, fungsi rekursif dapat diekspresikan dalam bentuk normal
- Karena program juga diperlakukan sebagai nilai, introspection dan refleksi melalui self-application dimungkinkan; ada contoh
size sizeyang dievaluasi menjadi 168 - Subterm tampak sebagai subtree, yang berlanjut ke demo seperti bootstrap fungsi umum, serialisasi, analisis dan optimisasi program, serta static/dynamic typing
Pohon biner alami yang dibuat dengan satu operator
- Tree Calculus ditemukan oleh Barry Jay, dan situsnya menautkan ke buku serta blognya, juga demo yang dikembangkan oleh Johannes Bader
- Karakteristik intinya dirangkum menjadi empat: minimal, Turing-complete, reflective, dan modular
-
Minimalitas
- Tree Calculus hanya memiliki satu operator, △
- Sintaksnya berbentuk
E ::= △ | E E - Secara visual, △ adalah node pohon, dan ketika
E1diterapkan padaE2,E2ditempelkan di sisi kanan rootE1 - Nilainya adalah pohon biner alami, dan node disebut leaf, stem, dan fork
- Demo praktis
- portability: memungkinkan pembuatan interpreter yang sederhana dan aman di berbagai platform
- emit-json: menunjukkan contoh yang cocok untuk menghasilkan konfigurasi lintas platform
Kelengkapan Turing dan refleksi
-
Kelengkapan Turing
- Operator K dan S dari logika kombinator dapat diekspresikan dengan Tree Calculus
K = △ △S x = △ (△ x)- Karena basis K/S dalam logika kombinator bersifat lengkap, Tree Calculus juga Turing-complete
- Berbeda dari λ-calculus, fungsi rekursif dapat diekspresikan dalam bentuk normal dengan konstruksi fixed point seperti orange/brown
-
Reflektivitas
triage {l, s, f} = △ (△ l s) fmelakukan analisis kasus untuk leaf, stem, dan fork- Bilangan natural
ndapat direpresentasikan sebagai△^n △ - Uji 0 disusun sebagai
triage {true, K false, K² false} - Karena program juga merupakan nilai, program intensional dapat melakukan introspection dan refleksi melalui self-application
- Contoh program
sizemenghitung jumlah node pada argumennya, dansize sizedievaluasi menjadi 168 - Demo praktis
- serialize-anything: membahas kemungkinan serialisasi program
- halting-problem: memformulasikan masalah halting dengan lebih sederhana
- fusion: mengekspresikan analisis dan optimisasi program sebagai fungsi
- gradual-typing: menyediakan contoh yang menangani static typing dan dynamic typing sebagai pemanggilan fungsi
Modularitas dan demo
- Subterm direpresentasikan sebagai subtree
- Program
sizedi bagian atas halaman menggunakantriageuntuk menghitung node secara rekursif - Demo praktis
- bootstrap-basics: memungkinkan bootstrap fungsi umum dengan mudah
- size-of-meaningful-programs: menunjukkan bahwa program yang kuat tidak harus berupa pohon besar
1 komentar
Opini Hacker News
Tree Calculus adalah topik keren dengan implikasi yang melampaui situs web ini
Namun sayang situs webnya tidak secara eksplisit mencantumkan Prof. Barry Jay sebagai pencetus sekaligus penulisnya. Jika ingin tahu lebih lanjut, lihat buku Jay: https://github.com/barry-jay-personal/tree-calculus/blob/mas...
Atribusi bisa dibuat lebih jelas, dan kami memang berniat melakukannya, tetapi sama sekali tidak ada niat untuk mengambil kredit. Latar belakangnya saya tulis lebih lanjut di balasan ini: https://news.ycombinator.com/item?id=42375914
Memang terlihat keren, tetapi halaman ini memberi terlalu sedikit panduan sehingga sulit dipahami
Akan bagus kalau ada penjelasan “untuk pemula”
Bedanya dari SKI calculus adalah ia dapat merefleksikan struktur programnya sendiri, misalnya memungkinkan untuk menentukan apakah dua program sama: https://github.com/barry-jay-personal/tree-calculus/blob/mas...
Selain itu, berbeda dari lambda calculus, jika aturan reduksi yang diberikan diterapkan, program akan konvergen ke normal form yang stabil, sehingga menghindari kasus yang bisa masuk ke rantai reduksi tak hingga: https://treecalcul.us/specification/, https://sci-hub.se/https://dl.acm.org/doi/abs/10.1016/j.tcs....
Jadi refleksi dimungkinkan tanpa harus mengutip atau menserialisasi program lalu memutar lewat struktur data yang stabil, dan ada kemiripan dengan homoiconicity pada Lisp
Ia memakai judul satu kata, frasa yang agak seperti buzzword, dan contoh kode bergerak seperti situs web bahasa pemrograman atau framework yang sedang tren, tetapi isi teksnya justru bergaya akademis yang terlalu padat dan panjang. Namun gaya akademis itu sendiri pun tidak menyediakan detail yang cukup untuk memahami apa yang sebenarnya terjadi
Saya mencoba mem-parsing paragraf-paragrafnya cukup lama, tetapi meski bertele-tele, seperti halaman landing bahasa pemrograman pada umumnya ia hanya mengatakan “apa yang menurut penulis bagus dari bahasa ini”, bukan menjelaskan cara kerjanya. Pada akhirnya sepertinya harus melihat spesifikasinya
E ::= t | E E, saat pertama dilihat mudah membuat orang keliru mengira semua ekspresi hanyalah sepertit t t t t t tKenyataannya struktur tanda kurung harus dipertahankan, sehingga bentuknya menjadi seperti
(t t) (t ((t t) (t t))), dan pada tingkat teratas maupun di dalam setiap tanda kurung selalu ada tepat dua subekspresi. Dengan kata lain, karakter spasi bertindak seperti operator binerKarena ekspresi ini memiliki banyak tanda kurung, operator biner ini dipandang sebagai left-associative.
a b cditafsirkan sebagai(a b) c, dana b c dsebagai((a b) c) dDengan cara pandang ini, terlihat dari mana pohonnya berasal. Karena satu-satunya simbol terminal adalah
t, jika tanda kurung yang tidak perlu dihapus, semua ekspresi selalu diawalitdan diikuti beberapa ekspresi. Gambartpertama sebagai node, lalu untuk setiap ekspresi yang mengikutinya, gambar subtree dengan prosedur yang samaAturan semantik di halaman spesifikasi menjelaskan cara “menyederhanakan” node yang memiliki tiga subtree atau lebih, yaitu cara mereduksi ekspresi yang memiliki tiga atau lebih subekspresi setelah
tArtikel Wikipedia biasanya dimulai seperti “Lambda calculus adalah sistem formal untuk …”, “Matrix calculus adalah notasi khusus untuk …”, dan semacamnya
Pohon tanpa label adalah struktur data berbentuk pohon yang node-nya tidak memiliki data, tetapi urutan anak-anaknya ada. Tree Calculus mendefinisikan sekumpulan aturan untuk mengevaluasi pohon tanpa label menjadi pohon tanpa label lain
Jika aturan diterapkan berulang-ulang, hasilnya bisa masuk loop tak hingga, atau mencapai pohon yang tidak berubah lagi. Aturan dirancang agar tidak memengaruhi pohon biner, sehingga jika pohon biner dievaluasi, hasilnya adalah pohon yang sama dan komputasinya berada dalam keadaan selesai
Aturan-aturan ini ditulis di halaman “Specification” dalam bentuk small-step semantics yang umum dalam teori bahasa pemrograman
Klaimnya adalah aturan evaluasi ini Turing complete sehingga dapat mengekspresikan komputasi apa pun, dan evaluasinya secara asimtotik optimal sehingga program dari bahasa apa pun dapat dijalankan di Tree Calculus dengan overhead yang hampir konstan. Sekilas klaim ini tidak terdengar mustahil, tetapi seberapa penting dalam praktiknya belum jelas
Kegunaannya mungkin menarik bagi sebagian peneliti teori bahasa pemrograman, dan mungkin bisa dipakai untuk menyederhanakan pembuktian dalam teori komputasi. Jika hal semacam ini menarik bagi Anda, saya menyarankan mempelajari lambda calculus terlebih dahulu, karena lebih sederhana, lebih dikenal, dan lebih berguna daripada Tree Calculus
Di beranda tertulis “Democratizing Functions” dan “Democratizing Metatheory”; apa pun maksudnya, terasa sekali kata democratizing dipakai berlebihan
Definisi kedua Britannica juga berarti “membuat sesuatu tersedia untuk semua orang, membuatnya dapat dipahami semua orang”: https://www.britannica.com/dictionary/democratize
“Bahasa dibentuk oleh budaya, dan Anda juga bagian dari budaya itu. Tidak perlu melepaskan tanggung jawab. Ada pilihan”
Saya membuat sendiri gambar untuk memahami logika aturan reduksi Tree Calculus dengan “intuisi”: https://latypoff.com/tree-calculus-visualized/
Ini mungkin membantu orang yang berpikir secara visual
Namun pada gambar kedua, “Stem with a single leaf child”, tampaknya ada kesalahan. Garis yang turun dari segitiga tersambung ke persegi, padahal sepertinya persegi itu seharusnya lingkaran
Saya penasaran apakah orang-orang yang merekomendasikan ini benar-benar memahami apa ini lalu merekomendasikannya
Bisakah seseorang menjelaskan mengapa ini bukan sekadar Lisp atau Forth dengan sintaks berbeda?
Saya bukan bermaksud mengkritik atau meremehkan secara dangkal; saya benar-benar ingin memahami
Karena kemampuan ini berguna, bahasa-bahasa keluarga Lisp menambahkan hal seperti makro, dan cara implementasinya pun beragam. Bahkan
evalyang umum di keluarga Lisp bukan bagian dari kalkulus lambda. Kalkulus lambda hanya memiliki abstraksi, aplikasi, dan variabel; tidak ada environmentJika konsep refleksi terdefinisi dengan baik dan Tree Calculus bersifat reflektif, maka ini jelas bukan sekadar Lisp dengan sintaks berbeda, apalagi Forth
Saya bukan pakar, jadi anggap dengan banyak catatan. Secara praktis ini mungkin terlihat seperti Lisp yang lambat, tetapi secara teoretis berbeda dari kalkulus lambda dan bisa dipakai sebagai dasar yang lebih sederhana untuk mengimplementasikan sesuatu seperti Lisp yang lambat
Selera lain tentu saja tidak masalah, tetapi sayang homoikonisitas sebagian besar terkurung di dalam dialek-dialek Lisp
Saya mencoba mengubah kombinator Z dari SKI ke Tree Calculus melalui contoh kalkulus lambda, lalu mencetaknya sebagai pohon
Belum saya uji, tetapi aslinya adalah kode belum dioptimalkan yang dikonversi dengan alat. Untuk latar belakang terkait, lihat dokumen kombinator titik tetap: https://en.wikipedia.org/wiki/Fixed-point_combinator
Z = \f. (\x. f (\v. x x v)) (\x. f (\v. x x v)), dan juga bisa diekspresikan lebih pendek dalam SKISenang melihat Johannes bereksperimen dengan Tree Calculus dan secara eksplisit menunjukkan kemungkinan yang hanya tersirat dalam buku saya di GitHub.com/barry-jay-personal/tree-calculus/tree_book.pdf
Akhirnya ada Tree Calculus bertipe, sehingga saya mulai menulis blog di GitHub.com/barry-jay-personal
Cari saja tombol unduh di sisi kanan
Setelah cukup lama menelaah ini, ada beberapa hal yang saya sadari. Ini terutama bisa membantu orang yang sudah cukup akrab dengan kalkulus lambda atau semantik formal untuk mulai memahami
Saya sampai harus turun ke implementasi OCaml untuk memahami apa arti semantik langkah kecil, karena struktur pohon dasarnya tidak terlihat jelas. Dalam empat rumus reduksi elemen pada definisi, jika tiga suku pertama diberi tanda kurung, terlihat apa yang diaplikasikan ke apa. Sisi kanan juga tampak kurang tanda kurung
Misalnya, lebih baik membacanya sebagai
(t (t) a) b -> a,(t (t a) b) c -> (a c) (b c),(t (t a b) c) t -> a,(t (t a b) c) (t u) -> b u,(t (t a b) c) (t u v) -> (c u) vSelain itu, tabelnya melewatkan beberapa kasus yang tampaknya dianggap “jelas” dari asosiativitas sintaks. Jika ditambahkan seperti
t a -> (t a),(t a) b -> (t a b), reduksi makna dapat diterapkan dengan lebih rapi pada ekspresi dalam tata bahasaE EIntinya, seperti dalam kalkulus lambda kita membungkus lambda agar “memilih” salah satu dari dua opsi, Tree Calculus ini dibuat agar melakukan tiga pilihan bergantung pada apakah node yang diberikan adalah daun, batang, atau cabang. Inilah inti aturan 3a, 3b, 3c, dan sisa fungsi sistem dibangun di atas pilihan tiga-cabang ini
Berkat penjelasan ini, memang terlihat seperti kalkulus yang menarik, tetapi apakah ini lebih cocok untuk inversi, serialisasi, dan kompilasi dibanding SKI atau kalkulus lambda adalah soal lain. Inversi sulit, serialisasi mudah, dan kompilasi lumayan mudah
Di Python, Leaf dapat direpresentasikan sebagai daftar kosong, Stem sebagai daftar berisi satu elemen, dan Fork sebagai daftar berisi dua elemen, lalu
applydapat diimplementasikan sesuai kode OCaml dalam spesifikasiJika
false,true, dannotdidefinisikan sebagai pohon, makanot false -> truedannot true -> falseakan berfungsiLeafcukup dibuat sebagainull,Stemsebagailist, danForksebagaicons; hasil yang sama dapat diperiksa denganapply t-not t-falsedanapply t-not t-true