Salah satu cara untuk melihat kedua konsep ini adalah dengan mengatakan bahwa pencocokan pola adalah fitur bahasa pemrograman untuk menggabungkan diskriminasi pada konstruktor dan istilah yang merusak (sementara pada saat yang sama memilih dan menamai fragmen istilah) secara aman, kompak dan efisien. Penelitian tentang pencocokan pola biasanya berfokus pada efisiensi implementasi, misalnya tentang cara meminimalkan jumlah perbandingan yang harus dilakukan mekanisme pencocokan.
Sebaliknya, penulisan ulang istilah adalah model umum perhitungan yang menyelidiki berbagai metode (berpotensi non-deterministik) untuk mengganti subterms ekspresi sintaksis (lebih tepatnya elemen istilah-aljabar atas beberapa set variabel) dengan istilah lain. Penelitian tentang sistem penulisan ulang istilah biasanya tentang sifat-sifat abstrak dari sistem penulisan ulang seperti pertemuan, determinisme dan penghentian, dan lebih khusus tentang bagaimana sifat-sifat seperti itu atau tidak dipertahankan oleh operasi aljabar pada sistem penulisan ulang, yaitu sejauh mana sifat-sifat ini bersifat komposisional.
(l,r)C[lσ]→C[rσ]C[.]σ), sementara pencocokan pola dalam bahasa modern seperti Haskell, OCaml atau Scala hanya menyediakan untuk menulis ulang 'di bagian atas' dari suatu istilah. Batasan ini juga, saya pikir, dikenakan dalam kalkulus pola Jay. Izinkan saya menjelaskan apa yang saya maksud dengan pembatasan ini. Dengan pencocokan pola di OCaml, Haskell, Scala sense, Anda tidak bisa mengatakan sesuatu seperti
match M with
| C[ x :: _ ] -> printf "%i ...\n" x
| C[ [] ] -> printf "[]"
Ada apa C[.]
disini Itu seharusnya menjadi variabel yang berkisar pada konteks satu-holed. Tetapi bahasa seperti OCaml, Haskell atau Scala tidak memberikan variabel pemrogram yang berkisar pada konteks arbitrer (satu-holed), hanya variabel yang berkisar pada nilai. Dengan kata lain, dalam bahasa seperti itu Anda tidak dapat mencocokkan pola pada posisi sewenang-wenang dalam suatu istilah. Anda selalu harus menentukan jalur dari akar pola ke bagian yang Anda minati. Saya kira alasan utama untuk memaksakan pembatasan ini adalah bahwa jika pencocokan pola akan menjadi non-deterministik, karena istilah mungkin cocok dengan pola di lebih dari satu cara. Misalnya istilah tersebut (true, [9,7,4], "hello", 7)
cocok dengan pola C[7]
dalam dua cara, dengan asumsi C[.]
berkisar pada konteks seperti itu.
(Saya lebih suka menulis ini sebagai komentar, tetapi saat ini saya tidak bisa.)
Koreksi saya jika saya salah, tetapi sejauh yang saya mengerti, satu lagi perbedaan antara pencocokan pola dan penulisan ulang istilah, selain dari apa yang dikatakan Martin Berger dalam jawaban yang sangat bagus , adalah bahwa aturan pencocokan pola datang dengan urutan yang tetap (dalam implementasi seperti Haskell's), sedangkan dengan aturan penulisan ulang istilah ini belum tentu demikian. Fitur ini, seperti yang diharapkan, dapat membuat banyak perbedaan ketika mempertimbangkan perilaku (khususnya, penghentian) aturan (lihat "Pengantar Lembut untuk Haskell, Versi 98", bagian 4.2 , misalnya, atau hanya faktorial contoh di "Learn you a Haskell" ).
Orang yang lebih berpengetahuan luas dalam teori penulisan ulang akan memiliki lebih banyak untuk mengatakan tentang itu (misalnya, bagaimana cara mengetik cocok perbandingan seperti itu persis?), Tetapi, menurut saya adil untuk setuju dengan Martin Berger, dalam istilah menulis ulang dapat dilihat mencakup pencocokan pola (setidaknya karena ini diterapkan dalam bahasa seperti Haskell), sejauh keduanya dapat (agak kering) dipandang sebagai perangkat yang hanya menggunakan aturan terkait istilah.
sumber