Yeniden yazma terimiyle kalıp eşleştirme arasındaki fark nedir?


25

Orada olduğu gibi Lambda'ya hiçbir tepki Ultimate : Burada tekrar denemek vadeli yeniden yazma sistemleri sembolik hesaplama kanıtlayan otomatik teoremi örneğin kullanılır, ve tabii ki resmi dilbilgisi tanımlamak için. Terim yeniden yazmaya dayanan bazı programlama dilleri vardır, ancak anladığım kadarıyla kavramın örüntü eşleme olarak bilinir . Desen eşleştirme, işlevsel dillerde çokça kullanılır. Barry Jay, desen hesabı olarak adlandırılan bütün bir teori yarattı , ancak kısaca sadece yeniden yazma teriminden bahsediyor. Hepsinin aynı temel fikri ifade ettiği hissine sahibim, bu yüzden eş anlamlı olarak yeniden yazma ve kalıp eşleştirme terimini kullanabilir misiniz ?

Yanıtlar:


26

Bu iki konsepte bakmanın bir yolu, kalıp eşleştirmenin, yapıcılara ayrımcılığı birleştirme ve terimleri (aynı zamanda terim parçalarını seçerken ve yerel olarak isimlendirirken) aynı zamanda güvenli, kompakt ve verimli bir şekilde birleştirme için programlama dillerinin bir özelliği olduğunu söylemektir . Örüntü eşleştirme üzerine yapılan araştırmalar tipik olarak uygulama verimliliğine odaklanır, örneğin eşleştirme mekanizmasının yapması gereken karşılaştırma sayısının en aza indirilmesi.

Buna karşılık, yeniden yazma terimi, çok değişkenli (potansiyel olarak deterministik olmayan) sözdizimsel ifadelerin alt metinlerini (daha doğrusu bazı değişkenler dizisinin bir cebir öğesi) diğer değişkenlerle değiştirmeyi araştıran genel bir hesaplama modelidir . Yeniden yazma sistemleri üzerine yapılan araştırmalar genellikle, birleşme, determinizm ve sonlandırma gibi yeniden yazma sistemlerinin soyut özellikleri ve daha spesifik olarak, bu özelliklerin yeniden yazma sistemlerindeki cebirsel işlemler tarafından ne derece muhafaza edildiği veya korunmadığı, yani bu özelliklerin ne kadar bileşimsel olduğu ile ilgilidir.

(l,r)C[lσ]C[rσ]C[.]σ), Haskell, OCaml veya Scala gibi modern dillerde desen eşleştirmesi yalnızca bir terimin 'üstündeki' yeniden yazılmasını sağlar. Bu kısıtlama, aynı zamanda Jay'in kalıp hesaplarında da uygulandığını düşünüyorum. Bu kısıtlama ile ne demek istediğimi açıklayayım. OCaml, Haskell, Scala anlamında desen eşleştirme ile, böyle bir şey söyleyemezsiniz

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

Nedir C[.]burada? Tek delikli bağlamlarda değişen bir değişken olması gerekiyordu. Ancak, OCaml, Haskell veya Scala gibi diller, programcılara isteğe bağlı (tek delikli) bağlamlarda değişen değişkenler vermez, yalnızca değerlerin üzerinde değişen değişkenleri verir. Başka bir deyişle, bu tür dillerde terimdeki keyfi bir konumda eşleşemezsiniz. Her zaman, modelin kökünden ilgilendiğiniz kısımlara giden yolu belirtmeniz gerekir. Bu kısıtlamayı uygulamak için temel neden, aksi halde desen eşlemesinin deterministik olmamasıdır, çünkü terim bir modeldeki bir modelle eşleşebilir. birden fazla yoldan. Örneğin, terim , bu tür bağlamlara göre değiştiği varsayılarak (true, [9,7,4], "hello", 7), modelle C[7]iki şekilde eşleşir C[.].


11

Onlara eş anlamlı demenin doğru olduğunu sanmıyorum; araştırma ve uygulama açısından bazı örtüşmeler var. Jay'in çalışmasına hiç aşina değilim, ve sadece terim yeniden yazma sistemlerine aşina olduğum için, ben de bir şeyleri özlüyorum.

Genel olarak örüntü eşleştirme aşağıdaki sorunla ilgilidir: bir yapıya (bir ağaç veya liste veya çoklu ayar) sahip olursunuz ve yapının bir örüntüyle (veya bir dizi örüntüden biriyle) eşleşip eşleşmediğini kontrol etmek istersiniz. Bu soru kesinlikle yeniden yazma terimiyle ilgilidir, çünkü yeniden yazma sistemleri teriminde bir terimin bir örüntü ile eşleşmesi, terimin farklı bir terime yeniden yazılabileceği anlamına gelir ancak eş anlamlı terimin yeniden yazılması değildir. (Yeniden yazma şeklinde bir desen eşleştirme formülasyonu olabilir: "Bir terim verildiğinde, onu eşleme düzenine yeniden yazabilir misiniz?" Ama bunu hiç görmedim.)

İşlevsel bir programlama dilinde kalıp eşleştirme, odaklanma açısından mantıklı bir yorumlamaya sahiptir (bkz. Krishnaswami'nin “Kalıp Eşleştirme Üzerine Odaklanma” ). Öte yandan, yeniden yazma sistemleri terimi çoğu zaman çoğu işlevsel programlama dilinde bulunmayan bazı denklem özelliklerini eşleştirmektedir (ML veya Haskell'deki bir multiset ile eşleşemezsiniz). Bununla birlikte, modulo denklem özelliklerinin eşleşmesinin işlevsel dillerde olmamasının temel bir nedeni yoktur.


1
Cevabınız için teşekkürler. Genel olarak kalıp eşleştirme işleminin yeniden yazma terimi ile eşanlamlı olmadığını, ancak daha temel olduğunu kabul ediyorum . Ancak eğer biri hesaplama gücü olan bir sistemin kalıp eşleştirmeye dayandığını söylerse, hesaplama gücü olan bir terim yeniden yazma sisteminin farkını göremiyorum. "Mantıklı bir yorumu var" ve "bazı eşitlikçi özellikler" arasındaki farkı daha iyi örnekleyebilir misiniz?
Jakob

"Terim yeniden yazma sistemi ile hesaplama gücü arasındaki farkı göremiyorum" - Bunun ne anlama geldiğinden emin değilim. Martin’in dediği gibi, yeniden yazma terimi genel bir hesaplama modelidir ve kalıp eşleme bir hesaplama modeli değil bir özelliktir.
Rob Simmons

"Mantıklı bir yorumu var" ve "bazı eşitlikçi özellikler" arasındaki farkı daha iyi örnekleyebilir misiniz? - Herhangi bir sığ fark yoktur - bunlar sadece farklı özelliklerdir, elmalar ve portakallar. Bu ikisi arasındaki herhangi bir gerçek bağlantının oldukça derin bir araştırma sorusu haline gelebileceğini düşünüyorum! Derin çıkarım ile pun - alessio.guglielmi.name/res/cos - muhtemelen amaçlanan bakın.
Rob Simmons

1

(Bunu bir yorum olarak yazmayı tercih ederim ama şu anda yapamam.)

Hatalıysam beni düzeltin, ama anladığım kadarıyla, kalıp eşleştirme ile tekrar yazma arasındaki bir fark, Martin Berger'in mükemmel cevabında söylediklerinin dışında , kalıp eşleştirme kurallarının sabit bir sıra ile gelmesi (uygulamalarda olduğu gibi). Haskell'in), yazım kurallarının yeniden yazılması kurallarında bu mutlaka böyle bir şey değildir. Tahmin edilebileceği gibi, bu özellik kuralların davranışını (özellikle de fesih) dikkate alırken çok fazla fark yaratabilir (bakınız "Haskell'e Nazik Bir Giriş, Sürüm 98", bölüm 4.2 , örneğin veya sadece faktörlü en örneği "bir Haskell sizi bilgi" ).

Yeniden yazma teorisinde daha bilgili olan insanlar bunun üzerine daha fazla söyleyeceklerdir (örneğin, bu tip bir karşılaştırmaya tam olarak nasıl uyuyor?), Ancak Martin Berger ile aynı fikirde olduğumun doğru olduğunu düşünüyorum. örüntü eşleme (en azından bu, Haskell gibi dillerde uygulandığında), her ikisinin de yalnızca terim ile ilgili kuralları kullanan cihazlar olarak görülebildiği ölçüde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.