1 puan yazan GN⁺ 2024-08-01 | 1 yorum | WhatsApp'ta paylaş
  • Yalnızca GNU find ve mkdir ile bile, dizin oluşturma ve dolaşma sırası kullanılarak döngüler ve durum geçişleri kurulabiliyor; böylece basit dosya yardımcı programlarının birleşimi bir hesaplama modeli haline geliyor
  • Kanıt, bir tag system uygulaması üzerinden ilerliyor; Rule 110 tabanlı ilk sürümdeki kanıt, sonsuz yineleme işleme sorunu nedeniyle düzeltilmiş
  • Temel döngü, find x -execdir mkdir x/x \; komutunun yeni dizinleri sürekli keşfetmesi üzerine kurulu ve -regex eklendiğinde FizzBuzz benzeri koşullu dallanma da mümkün oluyor
  • Tag system uygulaması durumu dosya yolu olarak ifade ediyor ve back-reference kullanarak baştaki m karakter çıkarıldıktan sonra kalanı kopyalıyor
  • POSIX, arama yapılan dizine dosya eklendiğinde davranışı unspecified bırakıyor; bu nedenle sonuç, GNU araçlarının gözlemlenen davranışına ve verilen ortama bağlı

GNU find ve mkdir ile hesaplama modeli kurmak

  • Amaç, yalnızca GNU find ve mkdir komutlarının bulunduğu bir sistemin Turing tam olduğunu göstermek
  • Kanıt, bir tag system uygulanarak ilerliyor
  • Genel akış; döngü kurma, FizzBuzz ve tag system uygulaması sırasını izliyor
  • 2 Ağustos 2024 tarihli ilk Rule 110 tabanlı kanıttaki hata düzeltildi ve mevcut sürüm artık tag system uygulamasına dayanıyor
    • İlk sürüm, sonsuz tekrar sayılarını işleyememe sorununa sahipti
  • İlgili makale Turing Completeness of GNU find: From mkdir-assisted Loops to Standalone Computation, FUN with Algorithms 2026 etkinliğine kabul edildi

Dizin oluşturmanın yarattığı döngü

  • Aşağıdaki kod, dizinleri özyinelemeli olarak oluşturup sonsuz döngüye giriyor
mkdir x
find x -execdir mkdir x/x \;
  • find x, x altındaki dosyaları listeliyor ve buna x'in kendisi de dahil
  • x listelendiğinde mkdir, x/x dizinini oluşturuyor; sonraki find yinelemesinde ise yeni oluşan x/x da dahil ediliyor
  • Bu süreç tekrarlandıkça x/x/x, x/x/x/x gibi yollar oluşmaya devam ediyor
  • -maxdepth seçeneği kullanılırsa oluşturma derinliği sınırlandırılabiliyor
mkdir x
find x -maxdepth 3 -execdir mkdir x/x \;
  • Bu örnek, x/x/x/x/x oluşturduktan sonra sonlanıyor

find -regex ile FizzBuzz uygulaması

  • find komutunun -regex seçeneği, sonraki eylemin uygulanacağı dosya adlarını filtreleyebiliyor
  • Bu filtre döngüyle birleştirilerek, x/ sayısının 3, 5 ve 15'in katı olup olmadığını ayırt eden bir FizzBuzz uygulanıyor
  • Örnek, okunabilirlik için -regextype posix-extended kullanıyor; ancak aynı yaklaşımın başka regex sözdizimleriyle de mümkün olduğu belirtiliyor
mkdir -p d/x
find d/x -regextype posix-extended -regex 'd(/x){0,29}' -execdir mkdir x/x \;
find d -regextype posix-extended \
-regex 'd((/x){15})+' -printf "FizzBuzz\n" -o \
-regex 'd((/x){5})+' -printf "Buzz\n" -o \
-regex 'd((/x){3})+' -printf "Fizz\n" -o \
-regex 'd(/x)+' -printf "%d\n"
  • İkinci satır, d altında art arda 30 adet x içeren bir yol oluşturuyor
  • Üçüncü satır, x sayısı 15'in katıysa FizzBuzz, 5'in katıysa Buzz, 3'ün katıysa Fizz, aksi halde d'ye göre derinliği yazdırıyor
  • Çalışma çıktısı OneCompiler örneğinde görülebilir

Tag system ile Turing tamlığını göstermek

  • Tag system, (m, A, P) bileşenlerinden oluşuyor
    • m pozitif bir tamsayı
    • A, durma simgesi H'yi içeren sonlu bir alfabe
    • P, her alfabe sembolü için üretim kuralı
  • Başlangıç dizgesi verildiğinde sistem şu süreci tekrar ediyor
    • Dizge uzunluğu m'den küçükse veya ilk karakter H ise duruyor
    • Aksi halde ilk karakter x için P(x) dizgenin sonuna ekleniyor
    • Baştaki m karakter siliniyor
  • m=2, |A|=576 olan bir tag system'in evrensel Turing makinesi olduğu biliniyor; dolayısıyla bu boyuttaki bir tag system'i çalıştırabilen sistem Turing tam sayılıyor
  • Pratik uygulama örneği olarak Wikipedia'daki m=2, |A|=4 olan basit 2-tag system kullanılıyor

Durumu dosya yolu olarak kullanma yöntemi

  • Temel fikir, durumu temsil eden dosya yolunun sonuna bir sonraki durumu sürekli eklemek
  • Durumlar arasında ayırıcı olarak _ kullanılıyor
    • Örnek: _/b/a/a/_
    • Sonraki durum a/c/c/a ise yol _/b/a/a/_/a/c/c/a/_ oluyor
  • Çalışma sırasında herhangi bir dizinin içinde birden fazla dosya bulunmaması sağlanıyor
  • Uygulama, durma simgesine rastlanana veya dizge uzunluğu m'ye eşit ya da ondan küçük olana kadar sonraki durumu eklemeyi sürdürüyor
  • find koşul ifadesi genel olarak üç bölüm halinde çalışıyor
    • Durma koşulu denetimi
    • Back-reference kullanarak önceki durumdan ilk M karakter çıkarıldıktan sonra kalan kısmı kopyalama
    • a, b, c için üretim kurallarını uygulama
  • Örnek üretim kuralları şöyle
M=2
PROD_A="c/c/b/a/H"
PROD_B="c/c/a"
PROD_C="c/c"
  • Çalışma sonucunda beklenen _/H/c/c/c/c/c/c/a/_ çıktısı elde ediliyor
  • Bu çalıştırmanın çıktısı da OneCompiler örneği olarak sunuluyor

Back-reference ve genişletilebilirlik

  • FizzBuzz uygulaması genel regex kullanırken, tag system uygulaması back-reference \2 kullanıyor
  • Back-reference sayesinde önceki durumdan ilk m karakter dışındaki kısım kopyalanabiliyor
  • Bu yapı, daha büyük sabit boyutlu alfabelere genişletilebiliyor
  • Kullanılabilecek karakterler yetersiz kalırsa, her dosya adında tek karakter yerine birden fazla karakter kullanılarak bu aşılabiliyor
  • Böylece find + mkdir birleşiminin Turing tam olduğu sonucuna varılıyor

POSIX kısıtları ve çalışma ortamı

  • Dosya yolu uzunluğu sınırları yüzünden keyfi büyüklükte otomatları çalıştırmak mümkün olmayabilir; ancak sunulan kod, keyfi uzunluktaki dosya yollarını doğrudan mkdir'e vermeyecek şekilde tasarlanmış
  • Testlerde find, 30000 karakteri aşan yollarda da çalıştı ve ek bir sınır bulunamadı
  • POSIX düzeyinde bir garanti yok
    • POSIX find belgesi, arama sırasında dizine dosya eklenmesi durumundaki davranışın unspecified olduğunu açıkça belirtiyor
    • GNU dışındaki araçların davranışı doğrulanmadı
  • Kullanılan ortam şu şekilde
find (GNU findutils) 4.8.0
mkdir (GNU coreutils) 8.32
Linux DESKTOP-5JU1LI7 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

1 yorum

 
GN⁺ 2024-08-01
Hacker News yorumları
  • Sayfanın en üstünde zaten şöyle yazıyor: find + mkdir’in Turing tamlığı iddiası geri çekildi
    Kanıtta bir kusur olduğu için find + mkdir’in Turing tam olduğunu kanıtladığı iddiasını geri çektiğini söylüyor ve https://news.ycombinator.com/item?id=41117141 bağlantısına bakılmasını istiyor
    Kanıt düzeltilebilirse yazıyı güncelleyeceğini söylüyor

    • Zaten düzeltilmiş
  • Bununla Folders uygulanabilir mi?
    https://www.danieltemkin.com/Esolangs/Folders/

    • Windows’ta klasörlerin hiç disk alanı kullanmadığı açıklaması, teknik olarak tam doğru değil
      Dizin girdileri MFT içinde yer kaplar; yalnızca Explorer başka yerde ayrılmış blokları saydığı için bu görünmez
      Boş dizinler oluşturmaya devam ederseniz MFT büyür ve sonunda alan sorunu çıkar
      Küçük dosyalar için de benzer: boş bir metin dosyası boyut 0 bayt, disk boyutu 0 bayt olarak görünür; içine yaklaşık 400 bayt koysanız bile veri önceden ayrılmış MFT’nin dizin girdisinin içine sığar ve Explorer’da disk boyutu 0 görünür
      Veriyi iki katına çıkarırsanız bir disk bloğu ayrılır; uzunluk 800 bayt, disk boyutu 4.096 bayt görünür. Sonra tekrar 400 bayta düşürseniz bile veri MFT’ye geri dönmez ve 4.096 bayt kaplamaya devam eder
      Yine de genel olarak bu harika çalışmanın tadını çıkarmaya engel değil
  • Bunun Turing tamlığını nasıl gösterdiğini anlamıyorum
    Kural 110 otomatı uygulaması hem genişlik sınırına hem de yineleme sayısı sınırına takılıyor gibi görünüyor
    Verilen genişlikteki durum sayısı sonlu olduğundan Turing tam değil; her zaman sonlandığı için de yine Turing tam değil
    Keyfi, yani sonsuza kadar genişletilebilir genişlik ve derinliğe sahip bir Kural 110 uygulaması yazılabilir mi?

    • Sınır kavramda değil de yalnızca uygulamadaysa sorun yok
      Gerçek bilgisayarlar da sonsuz bant değil, sonlu bellek kullanır; dolayısıyla dil veya yöntem ne olursa olsun bu koşulu karşılamazlar
    • C de katı anlamda Turing tam olmayabilir: https://cs.stackexchange.com/questions/60965/is-c-actually-t...
    • Yazının sahibi daha sonra yazıyı güncellemiş: kanıtta bir kusur olduğu için find + mkdir’in Turing tam olduğunu kanıtladığı iddiasını geri çektiğini söylemiş ve https://news.ycombinator.com/item?id=41117141 bağlantısına bakılmasını istemiş
      Kanıt düzeltilebilirse yazıyı güncelleyeceğini söylüyor
  • Geri çekildi
    “Kanıtta bir kusur olduğu için find + mkdir’in Turing tam olduğunu kanıtladığı iddiamı geri çekiyorum” deniyor

  • İlginç bir lambda hesabı biçimi kullanacağını sanmıştım; gerçekte ise hesaplama için yalnızca find’ın regex ayrıştırıcısına dayanıyormuş

  • Bu kanıt, hücresel otomat yerine etiket sistemi (https://en.m.wikipedia.org/wiki/Tag_system) kullanılırsa çok daha basit hale gelebilir gibi görünüyor

  • Hiçbir uygulama sonsuz olamaz, ama bu durumda tipik değeri 4096 olan PATH_MAX özellikle düşük görünüyor

    • “Expected questions and answers” bölümüne bakın
      GNU’da 4096’dan uzun yol uzunluklarında da çalışıyor gibi görünüyor
    • Yazı bu sorunu göreli yol kullanarak ele alıyor
      görünüşe göre 30k yol uzunluğuna kadar test etmişler
  • Regex’i (RE, RegExp) uygulayan veya tüketen yazılımlar/servisler ya da bir yazılım/servis zincirindeki bileşenler potansiyel olarak Turing tam olabilir
    Bu bağlamda güvenlik önemliyse Turing tamlığı olup olmadığı denetlenmeli

    • Katı anlamda, asıl anlamıyla regex yalnızca yığıtsız bir sonlu durum makinesi gerektirir
      Turing tamlığı elde etmek için 2 yığıt gerekir
      Bununla birlikte birçok regex kütüphanesi basit “regex”ten çok daha fazla özellik destekler
  • Benim find’ım kanıtlanabilir biçimde Turing tam olmakla kalmıyor; Turing tarpiti de değil, yerel koda derleniyor