Ağaç hesabı
(treecalcul.us)- Hesaplamayı asgari söz dizimiyle kurmayı amaçlayan bir sistem; tek bir operatör △ ve uygulama ile minimalite, Turing tamlığı, yansıtma ve modülerliğin tümünü ele alır
- Söz dizimi
E::= △ | E Ebiçimindedir; △ üç değere uygulandığında hesaplama yapılır ve değerler yaprak, gövde ve çatal düğümlerden oluşan doğal ikili ağaçlardır - Kombinatoryal mantığın K ve S operatörleri Tree Calculus içinde ifade edilebildiği için Turing tamdır; λ-calculus’tan farklı olarak özyinelemeli fonksiyonları normal formda ifade edebilir
- Programlar da değer olarak ele alındığından, kendi kendine uygulama yoluyla içe bakış ve yansıtma mümkündür;
size sizeifadesinin 168 olarak değerlendirildiği bir örnek vardır - Alt terimler alt ağaçlar olarak görünür; bu da ortak işlevlerin bootstrap edilmesi, serileştirme, program analizi ve optimizasyonu, statik ve dinamik tipleme gibi demolara uzanır
Tek operatörle oluşturulan doğal ikili ağaç
- Tree Calculus, Barry Jay tarafından keşfedildi; sitede onun kitabı ve blogunun yanı sıra Johannes Bader tarafından geliştirilen demoya bağlantılar yer alıyor
- Temel özellikler dört başlıkta özetleniyor: minimal, Turing-complete, reflective, modular
-
Minimalite
- Tree Calculus’ta yalnızca tek bir operatör △ vardır
- Söz dizimi
E ::= △ | E Ebiçimindedir - Görsel olarak △ bir ağaç düğümüdür;
E1,E2ye uygulandığındaE2,E1in kökünün sağına eklenir - Değerler doğal ikili ağaçlardır; düğümler leaf, stem, fork olarak adlandırılır
- Pratik demolar
- portability: Birden fazla platformda basit ve güvenli yorumlayıcılar oluşturulabilir
- emit-json: Çapraz platform yapılandırma üretimine uygun bir örnek gösterir
Turing tamlığı ve yansıtma
-
Turing tamlığı
- Kombinatoryal mantığın K ve S operatörleri Tree Calculus ile ifade edilebilir
K = △ △S x = △ (△ x)- Kombinatoryal mantığın K/S temeli tam olduğundan Tree Calculus da Turing tamdır
- λ-calculus’tan farklı olarak, orange/brown gibi sabit nokta yapılarıyla özyinelemeli fonksiyonlar normal form olarak ifade edilebilir
-
Yansıtma
triage {l, s, f} = △ (△ l s) f, leaf, stem ve fork için durum analizi yapar- Doğal sayı
n,△^n △olarak ifade edilebilir - 0 testi
triage {true, K false, K² false}ile kurulur - Programlar da değer olduğundan intensional programlar, kendi kendine uygulama ile içe bakış ve yansıtma yapabilir
- Örnek program
size, argümanının düğüm sayısını hesaplar;size sizeise 168 olarak değerlendirilir - Pratik demolar
- serialize-anything: Program serileştirme olanağını ele alır
- halting-problem: Durma problemini daha basit şekilde formüle eder
- fusion: Program analizi ve optimizasyonunu fonksiyon olarak ifade eder
- gradual-typing: Statik tipleme ve dinamik tiplemeyi fonksiyon çağrılarıyla ele alan bir örnek sunar
Modülerlik ve demolar
- Alt terimler alt ağaçlar olarak ifade edilir
- Sayfanın üst kısmındaki
sizeprogramı, düğümleri özyinelemeli olarak saymak içintriagekullanır - Pratik demolar
- bootstrap-basics: Ortak işlevlerin kolayca bootstrap edilmesini sağlar
- size-of-meaningful-programs: Güçlü programların mutlaka büyük ağaçlar olmak zorunda olmadığını gösterir
1 yorum
Hacker News yorumları
Tree Calculus, bu web sitesinin ötesine uzanan sonuçları olan harika bir konu.
Yine de sitenin kurucu ve yazar Prof. Barry Jay’i açıkça belirtmemesi üzücü. Daha fazlasını öğrenmek isterseniz Jay’in kitabına bakabilirsiniz: https://github.com/barry-jay-personal/tree-calculus/blob/mas...
Atfı daha görünür kılabiliriz ve bunu yapmayı planlıyoruz, ancak emeği sahiplenme gibi bir niyet kesinlikle yok. Arka planı şu yanıtta daha ayrıntılı anlattım: https://news.ycombinator.com/item?id=42375914
İlginç görünüyor ama bu sayfa o kadar az yönlendirme sunuyor ki anlaması zor.
“Yeni başlayanlar için” bir açıklama olsa iyi olurdu
SKI calculus’tan farkı, kendi program yapısını yansıtabilmesi; örneğin iki programın aynı olup olmadığını belirlemek mümkün: https://github.com/barry-jay-personal/tree-calculus/blob/mas...
Ayrıca lambda calculus’tan farklı olarak, verilen indirgeme kuralları uygulandığında program kararlı bir normal form’a yakınsar; böylece sonsuz indirgeme zincirlerine düşülebilen durumlar önlenebilir: https://treecalcul.us/specification/, https://sci-hub.se/https://dl.acm.org/doi/abs/10.1016/j.tcs....
Bu yüzden programları alıntılayıp ya da serileştirip kararlı veri yapılarına dolanmak zorunda kalmadan yansıtma yapılabiliyor; bu da Lisp’in homoiconicity özelliğine benziyor
Popüler programlama dili veya framework siteleri gibi tek kelimelik bir başlık, hafif buzzword kokan ifadeler ve hareketli kod örnekleri kullanıyor; ama asıl metin gereğinden fazla yoğun ve uzun bir akademik üslupla yazılmış. Üstelik o akademik üslup, neler olup bittiğini anlamaya yetecek kadar ayrıntı da vermiyor
Paragrafları epey çözmeye çalıştım ama uzunluğuna rağmen, tipik bir programlama dili açılış sayfası gibi yalnızca “yazarın bu dilde neyi iyi bulduğu” anlatılıyor, nasıl çalıştığı açıklanmıyor. Sonunda galiba spesifikasyona bakmak gerekiyor
E ::= t | E Egrameri ilk bakışta tüm ifadelerin sadecet t t t t t tgibi göründüğü yanılgısına yol açabiliyor.Oysa parantez yapısını korumak gerekiyor; dolayısıyla biçim
(t t) (t ((t t) (t t)))gibi oluyor ve en üst düzeyde de her parantezin içinde de her zaman tam olarak iki alt ifade bulunuyor. Yani boşluk karakteri ikili bir işleç gibi davranıyorBu ifadede çok fazla parantez olduğundan, bu ikili işleç sol bağlaşımlı kabul ediliyor.
a b c,(a b) c;a b c dise((a b) c) ddiye yorumlanıyorBuna bu şekilde bakınca ağacın nereden geldiği görülüyor. Yaprak sembol olarak yalnızca
tbulunduğu için, gereksiz parantezleri kaldırınca tüm ifadeler her zamantile başlıyor ve ardından bir dizi ifade geliyor. İlkt’yi düğüm olarak çizin, ardından gelen her ifade için aynı işlemi uygulayarak alt ağaçları çizinSpesifikasyon sayfasındaki anlam kuralları, üç veya daha fazla alt ağacı olan düğümlerin nasıl “basitleştirileceğini”, yani
tsonrasına üçten fazla alt ifade eklenmiş bir ifadenin nasıl küçültüleceğini anlatıyorWikipedia maddeleri genelde “Lambda calculus, … için biçimsel bir sistemdir”, “Matrix calculus, … için özel bir gösterimdir” gibi başlar
Etiketsiz ağaç, düğümlerinde veri bulunmayan ve çocuklarının sırası olan ağaç biçimli bir veri yapısıdır. Tree Calculus, etiketsiz ağaçları değerlendirip başka etiketsiz ağaçlar üreten kurallar kümesini tanımlar
Kurallar tekrar tekrar uygulandığında ya sonsuz döngüye girilir ya da artık değişmeyen bir ağaca ulaşılır. Kurallar, ikili ağaçları etkilemeyecek şekilde tasarlandığından, bir ikili ağaç değerlendirildiğinde aynı ağaç elde edilir ve hesaplama tamamlanmış olur
Bu kurallar, “Specification” sayfasında programlama dili kuramında yaygın olan small-step semantics biçiminde yazılmış
İddia şu: değerlendirme kuralları Turing-complete, yani her türlü hesaplamayı ifade edebiliyor; ayrıca değerlendirme asimptotik olarak optimal, yani herhangi bir dildeki bir program Tree Calculus üzerinde neredeyse sabit bir ek yükle çalıştırılabiliyor. İlk bakışta bu imkânsız bir iddia gibi görünmüyor ama pratikte ne kadar önemli olduğu da net değil
Kullanım alanı, bazı programlama dili kuramı araştırmacıları için ilgi çekici olabilir ve hesaplama kuramı ispatlarını sadeleştirmede işe yarayabilir. Eğer bu tür şeyler ilginizi çekiyorsa, Tree Calculus’tan önce daha basit, daha bilinen ve daha kullanışlı olan lambda calculus’u öğrenmenizi öneririm
Ana sayfada “Democratizing Functions”, “Democratizing Metatheory” yazıyor; ne kastedilirse kastedilsin democratizing kelimesinin fazla kullanıldığı hissi güçlü
Britannica’nın ikinci tanımı da “bir şeyi herkes için erişilebilir hâle getirmek, herkesin anlayabileceği hâle getirmek” şeklinde: https://www.britannica.com/dictionary/democratize
“Dil kültür tarafından şekillendirilir ve sen de o kültürün bir parçasısın. Sorumluluktan vazgeçmek zorunda değilsin. Seçeneklerin var”
Tree Calculus’un indirgeme kurallarının mantığını sezgisel olarak anlamaya çalışırken kendim çizimler yaptım: https://latypoff.com/tree-calculus-visualized/
görsel düşünen kişiler için faydalı olabilir
Yalnız ikinci şekil olan “Stem with a single leaf child” içinde bir hata var gibi görünüyor. Üçgenden inen çizgi kareye bağlanıyor, ama o karenin daire olması gerekiyor gibi
Bunu öneren kişilerin gerçekten ne olduğunu anlayarak mı önerdiğini merak ediyorum
Bunun sadece sözdizimi farklı bir Lisp ya da Forth olmamasının nedenini açıklayabilir misiniz?
Eleştirmek ya da yüzeysel biçimde geçiştirmek istemiyorum; gerçekten anlamak istiyorum
Bu işlev kullanışlı olduğu için Lisp ailesi dillere makrolar gibi şeyler eklenmiştir ve bunların uygulanma biçimi de çeşitlidir. Lisp ailesinde yaygın olan
evalbile lambda calculus’un bir parçası değildir. Lambda calculus’ta soyutlama, uygulama ve değişkenler vardır; ortam yokturEğer yansıtma kavramı iyi tanımlanmışsa ve Tree Calculus yansıtmalıysa, o zaman kesinlikle sadece sözdizimi farklı bir Lisp değildir; Forth ise hiç değildir
Uzman değilim, o yüzden buna fazla güvenmeyin. Pratikte yavaş bir Lisp gibi görünebilir ama teorik olarak lambda calculus’tan farklıdır ve yavaş Lisp benzeri bir şeyi daha basit biçimde uygulamak için temel olarak kullanılabilir
Başka zevkler elbette olabilir ama homoiconicity özelliğinin çoğunlukla Lisp lehçelerinin içine hapsolmuş olması üzücü
SKI’nin Z combinator’ünü lambda calculus örneğinden geçirip Tree Calculus’a dönüştürdüm ve ağaç olarak yazdırdım
Test etmedim ama kaynak, bir araçla dönüştürülmüş optimize edilmemiş koddu. İlgili arka plan için fixed-point combinator maddesine bakılabilir: https://en.wikipedia.org/wiki/Fixed-point_combinator
Z = \f. (\x. f (\v. x x v)) (\x. f (\v. x x v))biçiminde çok daha basit yazılabilir ve SKI ile de daha kısa ifade edilebilirJohannes’in Tree Calculus ile deneyler yapıp kitabım GitHub.com/barry-jay-personal/tree-calculus/tree_book.pdf içinde yalnızca ima edilmiş olan imkânları açıkça göstermesini görmek güzel
Sonunda typed Tree Calculus ortaya çıktı ve ben de bu yüzden GitHub.com/barry-jay-personal üzerinde blog yazmaya başladım
Sağ taraftaki indirme düğmesini bulmanız yeterli
Bunu epey inceledikten sonra birkaç şey fark ettim. Özellikle lambda calculus veya biçimsel anlambilim konusunda biraz aşinalığı olan kişilerin bir başlangıç noktası bulmasına yardımcı olabilir
Küçük adım anlambilimin ne demek olduğunu anlamak için OCaml uygulamasına kadar inmem gerekti, çünkü temel ağaç yapısı pek görünmüyordu. Tanımdaki dört öğeli indirgeme ifadelerinde ilk üç terimi parantez içine alınca neyin neye uygulandığı ortaya çıkıyor. Sağ tarafta da sanki yeterince parantez yok
Örneğin bunu
(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) vşeklinde görmek daha iyiAyrıca tabloda, sözdizimin birleşme özelliğinden “zaten açıkça” çıktığı varsayılan bazı durumlar eksik;
t a -> (t a),(t a) b -> (t a b)gibi eklemeler yapılırsaE Edilbilgisinin ifadelerine anlamsal indirgeme daha temiz uygulanabilirAsıl mesele şu: lambda calculus’ta bir lambda, iki seçenekten birini “seçmeye” yarayacak şekilde bağlanırken, bu Tree Calculus verilen düğümün yaprak, gövde ya da dal olmasına göre üçlü bir seçim yapacak şekilde kurulmuş. 3a, 3b ve 3c kurallarının özü bu ve sistemin geri kalan işi bu üçlü ayrımın üzerine inşa ediliyor
Bunun ilginç bir calculus gibi görünmesini sağlıyor ama SKI ya da lambda calculus’tan daha uygun biçimde tersine dönüştürme, serileştirme ve derlemeye yarayıp yaramadığı ayrı mesele. Tersine dönüştürme zor, serileştirme kolay, derleme ise orta karar kolaylıkta görünüyor
Python'da Leaf boş liste, Stem tek öğeli liste, Fork ise iki öğeli liste olarak alınabilir ve
apply, spesifikasyondaki OCaml koduna uygun şekilde uygulanabilirfalse,true,notağaç olarak tanımlandığındanot false -> true,not true -> falseçalışırLeafiçinnull,Stemiçinlist,Forkiçinconsalınabilir;apply t-not t-falseveapply t-not t-trueile aynı sonuçlar doğrulanabilir