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[.]
.