2011-12-01 21 views
5

Kết hợp mẫu (như Prolog, ngôn ngữ gia đình ML và các hệ vỏ chuyên gia khác nhau) thường hoạt động bằng cách khớp truy vấn với phần tử dữ liệu theo phần tử theo thứ tự nghiêm ngặt.Đối sánh mẫu với toán tử kết hợp và giao hoán

Trong các miền như chứng minh định lý tự động, tuy nhiên, có một yêu cầu phải tính đến một số toán tử là liên kết và giao hoán. Giả sử chúng ta có dữ liệu

A or B or C 

và truy vấn

C or $X 

Đi theo cú pháp bề mặt này không phù hợp, nhưng logic nó phải phù hợp với $X ràng buộc để A or Bor là kết hợp và giao hoán.

Có bất kỳ hệ thống hiện có nào, bằng bất kỳ ngôn ngữ nào, điều này có thực hiện được không?

+0

Tôi không chắc chắn tôi đồng ý với sự nhầm lẫn của bạn đối sánh mẫu Prolog và so khớp mẫu ML. ML mô hình phù hợp hoàn toàn là cú pháp, và trong Prolog tôi không tin rằng đây là trường hợp. – Gian

+0

Tôi không nói chúng giống nhau, chỉ có chúng có điểm chung so với các yếu tố theo thứ tự nghiêm ngặt. – rwallace

+0

Tôi giả sử phần mềm chứng minh định lý chuyên dụng như Otter đã thực hiện điều này bằng cách đặt các công thức logic dưới dạng bình thường và xử lý các mệnh đề như cấu trúc dữ liệu đã đặt, tốn thời gian O (n log n) cho cả việc tạo và xác minh. Trong thực tế, tôi cho rằng chúng đã được lập trình tối ưu hóa cho các hoạt động cho các thuộc tính như kết hợp và giao hoán. –

Trả lời

6

Kết hợp mẫu tương tác-giao hoán đã có từ khoảng 1981 and earlier và vẫn là chủ đề nóng today.

Có rất nhiều hệ thống triển khai ý tưởng này và làm cho nó hữu ích; điều đó có nghĩa là bạn có thể tránh viết các mẫu khớp phức tạp khi có thể sử dụng tính tương hợp hoặc giao hoán để làm cho khớp mẫu. Có, nó có thể tốn kém; tốt hơn các mô hình matcher làm điều này tự động, hơn bạn làm điều đó nặng bằng tay.

Bạn có thể xem ví dụ trong một rewrite system for algebra and simple calculus được triển khai bằng cách sử dụng hệ thống chuyển đổi chương trình của chúng tôi. Trong ví dụ này, ngôn ngữ ký hiệu được xử lý được xác định bởi các quy tắc ngữ pháp và các quy tắc có thuộc tính A-C được đánh dấu. Viết lại trên cây được tạo ra bằng cách phân tích cú pháp ngôn ngữ tượng trưng được tự động mở rộng để khớp.

1

Tôi chưa bao giờ gặp phải điều như vậy và tôi chỉ có một cái nhìn chi tiết hơn. Có một lý do tính toán âm thanh để không thực hiện điều này theo mặc định - người ta phải chủ yếu tạo ra tất cả các kết hợp của đầu vào trước khi khớp mẫu hoặc bạn phải tạo giá trị sản phẩm chéo đầy đủ của mệnh đề kết hợp.

Tôi nghi ngờ rằng cách thông thường để thực hiện điều này sẽ đơn giản là viết cả hai mẫu (trong trường hợp nhị phân), tức là, có các mẫu cho cả C or $X$X or C.

Tùy thuộc vào tổ chức dữ liệu cơ bản (thường là bộ dữ liệu), kết hợp mẫu này sẽ liên quan đến việc sắp xếp lại thứ tự các phần tử tuple, rất lạ (đặc biệt trong môi trường được gõ mạnh!). Nếu đó là danh sách thay vào đó, sau đó bạn đang trên mặt đất thậm chí còn run rẩy hơn.

Ngẫu nhiên, tôi nghi ngờ rằng các hoạt động cơ bản bạn muốn là mô hình công đoàn rời nhau trên bộ, ví dụ:

foo (Or ({C} disjointUnion {X})) = ... 

Môi trường lập trình duy nhất mà tôi đã nhìn thấy rằng giao dịch với bộ tại bất kỳ chi tiết sẽ là Isabelle/HOL và tôi vẫn không chắc chắn rằng bạn có thể xây dựng các đối sánh mẫu trên chúng.

EDIT: Có vẻ như chức năng function của Isabelle (thay vì fun) sẽ cho phép bạn xác định các mẫu phức tạp không phải là nhà xây dựng, ngoại trừ bạn phải chứng minh rằng chúng được sử dụng nhất quán và bạn không thể sử dụng trình tạo mã nữa.

EDIT 2: Con đường tôi thực hiện chức năng tương tự trên n giao hoán, kết hợp và bắc cầu nhà khai thác là thế này:

thuật ngữ của tôi đã có dạng A | B | C | D, trong khi truy vấn là có dạng B | C | $X, nơi $X được phép phù hợp không hoặc nhiều thứ. Tôi đã sắp xếp trước những thứ này bằng cách sử dụng thứ tự từ vựng, để các biến luôn xuất hiện ở vị trí cuối cùng.

Trước tiên, bạn xây dựng tất cả các kết quả trùng khớp theo cặp, bỏ qua các biến cho bây giờ và ghi lại các biến phù hợp với quy tắc của bạn.

{ (B,B), (C,C) } 

Nếu bạn coi đây là biểu đồ hai bên, thì về cơ bản bạn đang làm một vấn đề perfect marriage. Có tồn tại các thuật toán nhanh cho việc tìm kiếm các.

Giả sử bạn tìm thấy một, sau đó bạn thu thập tất cả mọi thứ mà không xuất hiện ở phía bên trái của mối quan hệ của bạn (trong ví dụ này, AD), và bạn nhét chúng vào biến $X, và phù hợp với bạn là hoàn thành. Rõ ràng bạn có thể thất bại ở bất kỳ giai đoạn nào ở đây, nhưng điều này chủ yếu sẽ xảy ra nếu không có biến miễn phí trên RHS, hoặc nếu tồn tại một hàm tạo trên LHS không khớp với bất kỳ thứ gì (ngăn cản bạn tìm một kết quả hoàn hảo).

Xin lỗi nếu điều này bị nhầm lẫn một chút. Đã một thời gian kể từ khi tôi viết mã này, nhưng tôi hy vọng điều này sẽ giúp bạn, thậm chí một chút!

Để lưu nội dung này, có thể không phải là cách tiếp cận tốt trong mọi trường hợp. Tôi đã có khái niệm rất phức tạp về 'trận đấu' trên subterms (tức là, không đơn giản bình đẳng), và vì vậy xây dựng bộ hoặc bất cứ điều gì sẽ không làm việc. Có lẽ điều đó sẽ làm việc trong trường hợp của bạn mặc dù và bạn có thể tính toán các công đoàn tách rời trực tiếp.

+0

Tôi đồng ý, suy nghĩ của tôi cho đến nay về cách thực hiện điều này là chuyển đổi đại diện dựa trên tuple thành một bộ đại diện phía trước để có thể thực hiện loại truy vấn này một cách hợp lý một cách hiệu quả. Tôi nghĩ rằng nó là giá trị kiểm tra để xem nếu có ai đã phát minh ra bánh xe này đầu tiên, mặc dù. – rwallace

+0

Tôi đã thực hiện một cái gì đó tương tự trong một mô hình kiểm tra cho bigraphs. Thành phần song song cho bigraphs là giao hoán, vì vậy tôi đã phải thực hiện chính xác chức năng này. Nó thực sự là khủng khiếp để thực hiện, tôi phải nói.Mã này có sẵn, nhưng tôi nghi ngờ nó sẽ không hữu ích bởi vì nó rất gắn với mã vạch lớn phù hợp khác, và không thể sử dụng lại được một cách hữu ích. Tôi sẽ chỉnh sửa câu trả lời của tôi để phác thảo cách tôi thực hiện nó mặc dù. – Gian

+1

Cảm ơn! Upvoted; Tôi không biết downvote là ai. – rwallace

5

Trình ghi lại thuật ngữ maude thực hiện khớp mẫu kết hợp và giao hoán.

http://maude.cs.uiuc.edu/

+0

bạn có thể cung cấp liên kết cụ thể hơn không? có lẽ với một ví dụ mã? –

Các vấn đề liên quan