Một cách để xem xét hai khái niệm này là nói rằng khớp mẫu là một tính năng của ngôn ngữ lập trình để kết hợp phân biệt đối xử trên các hàm tạo và các thuật ngữ phá hủy (đồng thời chọn và đặt tên các đoạn thuật ngữ cục bộ) một cách an toàn, gọn gàng và hiệu quả. Nghiên cứu về khớp mẫu thường tập trung vào hiệu quả thực hiện, ví dụ về cách giảm thiểu số lượng so sánh mà cơ chế khớp phải thực hiện.
Ngược lại, viết lại thuật ngữ là một mô hình tính toán tổng quát , nghiên cứu một loạt các phương pháp (có khả năng không xác định) thay thế các tập hợp con của biểu thức cú pháp (chính xác hơn là một yếu tố của thuật ngữ đại số trên một số biến) bằng các thuật ngữ khác. Nghiên cứu về các hệ thống viết lại thuật ngữ thường là về các thuộc tính trừu tượng của các hệ thống viết lại như hợp lưu, xác định và chấm dứt, và cụ thể hơn là làm thế nào các tính chất đó được hoặc không được bảo tồn bởi các hoạt động đại số trên các hệ thống viết lại, nghĩa là các thuộc tính này được cấu tạo ở mức độ nào.
Rõ ràng có sự chồng chéo về mặt khái niệm giữa cả hai, và sự khác biệt là ở một mức độ truyền thống, chứ không phải là kỹ thuật. Một sự khác biệt về kỹ thuật là việc viết lại thuật ngữ xảy ra trong các bối cảnh tùy ý (nghĩa là một quy tắc gây ra việc viết lại cho các bối cảnh tùy ý Và thay thế ), trong khi khớp mẫu trong các ngôn ngữ hiện đại như Haskell, OCaml hoặc Scala chỉ cung cấp cho việc viết lại 'ở đầu' của một thuật ngữ. Hạn chế này cũng là, tôi nghĩ, áp đặt trong tính toán mô hình của Jay. Hãy để tôi giải thích những gì tôi có nghĩa là hạn chế này. Với kết hợp mẫu theo nghĩa OCaml, Haskell, Scala, bạn không thể nói điều gì đó như( l , r )C[ L σ] → C[ R σ]C[ . ]σ
match M with
| C[ x :: _ ] -> printf "%i ...\n" x
| C[ [] ] -> printf "[]"
Cái gì C[.]
đây Nó được coi là một biến nằm trong bối cảnh một chiều. Nhưng các ngôn ngữ như OCaml, Haskell hoặc Scala không cung cấp cho các lập trình viên các biến trong phạm vi bối cảnh tùy ý (một chiều), chỉ các biến nằm trong phạm vi giá trị. Nói cách khác, trong các ngôn ngữ như vậy, bạn không thể tạo mẫu khớp ở vị trí tùy ý trong một thuật ngữ. Bạn luôn phải chỉ định đường dẫn từ gốc của mẫu đến các phần mà bạn quan tâm. Tôi đoán lý do chính để áp đặt hạn chế này là nếu không thì khớp mẫu sẽ không xác định, vì thuật ngữ có thể khớp với mẫu trong nhiều hơn một cách Ví dụ: thuật ngữ (true, [9,7,4], "hello", 7)
khớp với mẫu C[7]
theo hai cách, giả sử C[.]
nằm trong các bối cảnh như vậy.