2010-02-26 14 views
5

Tôi muốn kiểm tra xem hai ngôn ngữ có một chuỗi chung hay không. Cả hai ngôn ngữ này là từ một tập hợp con các ngôn ngữ thông thường được mô tả dưới đây và tôi chỉ cần biết liệu có tồn tại một chuỗi trong cả hai ngôn ngữ, không tạo ra một chuỗi ví dụ hay không.Kiểm tra giao điểm của hai ngôn ngữ thông thường

Ngôn ngữ được xác định bởi một chuỗi glob giống như

/foo/**/bar/*.baz

nơi ** trận 0 hoặc các ký tự hơn, và * trận đấu không hoặc nhiều ký tự mà không phải là /, và tất cả các ký tự khác là chữ.

Bất kỳ ý tưởng nào?

cảm ơn, mike

EDIT:

tôi thực hiện một cái gì đó mà dường như thực hiện tốt, nhưng vẫn chưa thử một bằng chứng đúng đắn. Bạn có thể xem sourceunit tests

+0

Bạn sẽ sử dụng ngôn ngữ nào để thực hiện kiểm tra? Bạn có lẽ sẽ cần phải viết một chiếc giường thử nghiệm cho việc này. Nếu bạn có thể đăng một chiếc giường thử nghiệm khá hoàn chỉnh, nó sẽ giúp ích cho bạn. –

+0

Điều này sẽ cần phải chạy trong JS. Dĩ nhiên tôi sẽ phải viết một testbed. Tôi đã tìm thấy một tập hợp con hữu ích để tôi có thể tính toán giao lộ hiệu quả bằng cách thực hiện một số thủ thuật. Tập hợp con hữu ích là một tập hợp con mà * và ** chỉ có thể xuất hiện lúc bắt đầu hoặc trực tiếp sau dấu /, và/không thể nằm cạnh nhau /. Điều đó có nghĩa là tôi không bao giờ phải lo lắng liệu * foo * có thể phù hợp với boo * baz hay không, nhưng không phải là một số vô lý vì tôi luôn có thể chuyển văn bản theo sau * hoặc ** thành kiểm tra hậu tố. –

Trả lời

9

xây dựng chi hội AB cho cả hai ngôn ngữ, và xây dựng các "ngã tư FA" AnB. Nếu AnB có ít nhất một trạng thái chấp nhận được từ trạng thái bắt đầu, thì có một từ có cả hai ngôn ngữ.

Xây dựng AnB có thể phức tạp, nhưng tôi chắc chắn có sách giáo khoa FA bao gồm nó. Cách tiếp cận tôi sẽ thực hiện là:

  • Các trạng thái của AnB là sản phẩm Cartesian của các bang AB tương ứng. Tiểu bang ở số AnB được viết (a, b) trong đó a là tiểu bang ở Ab là tiểu bang ở số B.
  • Một chuyển (a, b) ->r (c, d) (có nghĩa là, có một sự chuyển tiếp (a, b)-(c, d) vào biểu tượng r) tồn tại khi và chỉ khi a ->r c là một sự chuyển tiếp trong A, và b ->r d là một sự chuyển tiếp trong B.
  • (a, b) là trạng thái bắt đầu ở AnB iff ab là các trạng thái bắt đầu lần lượt là AB.
  • (a, b) là trạng thái chấp nhận trong AnB iff từng là trạng thái chấp nhận trong FA tương ứng của nó.

Đây là tất cả ngoài đỉnh đầu của tôi và do đó hoàn toàn chưa được chứng minh!

+1

Vâng, đây là một công trình được ghi chép đầy đủ có tên Cartesian Product Machine, nhiều người đánh bại bạn, và đó là một phương pháp được làm tài liệu và chính xác để có được FA công nhận giao điểm của các ngôn ngữ được các CHNC khác công nhận. Chỉ cần nói. – Patrick87

2

Tôi vừa tìm kiếm nhanh và vấn đề này là có thể giải quyết được (có thể được thực hiện), nhưng tôi không biết bất kỳ thuật toán tốt nào để thực hiện. Một là giải pháp là:

  1. Chuyển đổi cả thường xuyên biểu để NFAs A và B
  2. Tạo một NFA, C, đại diện cho giao điểm của A và B.
  3. Bây giờ hãy thử mỗi chuỗi từ 0 đến số trạng thái trong C và xem nếu C chấp nhận nó (vì nếu chuỗi dài hơn, nó phải lặp lại trạng thái tại một thời điểm).

Tôi biết điều này có thể hơi khó thực hiện nhưng đây chỉ là cách tôi biết cách thực hiện.