Đếm các từ được chấp nhận bởi một ngữ pháp thông thường


26

Cho một ngôn ngữ thông thường (NFA, DFA, ngữ pháp hoặc regex), làm thế nào có thể đếm số lượng từ chấp nhận trong một ngôn ngữ nhất định? Cả "với chính xác n chữ cái" và "có nhiều nhất n chữ cái" đều được quan tâm.

Margareta Ackerman có hai bài báo về chủ đề liên quan đến việc liệt kê các từ được chấp nhận bởi NFA, nhưng tôi không thể sửa đổi chúng để đếm hiệu quả.

Có vẻ như tính chất hạn chế của các ngôn ngữ thông thường sẽ khiến việc đếm chúng tương đối dễ dàng - tôi gần như mong đợi một công thức hơn thuật toán Thật không may, các tìm kiếm của tôi cho đến nay không tìm thấy bất cứ điều gì, vì vậy tôi phải sử dụng sai thuật ngữ.


Tôi đoán bạn có nghĩa là "số lượng từ chấp nhận kích thước ", hoặc một cái gì đó như thế? khác, số lượng từ chấp nhận cho Σ nΣ
Suresh Venkat

Câu trả lời:


37

Đối với DFA, trong đó trạng thái ban đầu là trạng thái , số lượng từ có độ dài k kết thúc ở trạng thái iA k [ 0 , i ] , trong đó A là ma trận chuyển của DFA (ma trận trong đó số ở hàng i và cột j là số ký hiệu đầu vào khác nhau gây ra sự chuyển đổi từ trạng thái i sang trạng thái j ). Vì vậy, bạn có thể đếm việc chấp nhận các từ có độ dài chính xác k một cách dễ dàng, ngay cả khi k0kiAk[0,i]Aijijkk có kích thước vừa phải, chỉ bằng cách tính công suất ma trận và thêm các mục tương ứng với trạng thái chấp nhận.

Điều tương tự cũng hoạt động để chấp nhận các từ có độ dài tối đa , với ma trận hơi khác. Thêm một hàng và cột bổ sung của ma trận, với một hàng trong ô có cả hàng và cột, một hàng trong hàng mới và cột của trạng thái ban đầu và số 0 trong tất cả các ô khác. Tác động của sự thay đổi này đối với ma trận là thêm một đường dẫn đến trạng thái ban đầu ở mỗi công suất.k

Điều này không làm việc cho NFA. Tôi nghi ngờ điều tốt nhất để làm là chỉ chuyển đổi sang DFA và sau đó áp dụng thuật toán cấp nguồn ma trận.


2
Câu trả lời hoàn hảo: chỉ rõ ràng khi bạn đọc nó.
Charles

1
Cách tiếp cận này có thời gian chạy trường hợp xấu nhất theo cấp số nhân nếu bạn có đầu vào khác ngoài DFA. Đây không phải là một vấn đề cho bạn, @Charles? Bạn dường như bao gồm các biểu thức thông thường, NFA và ngữ pháp trong các câu hỏi của bạn và cũng yêu cầu một cách hiệu quả.
Raphael

17

Hãy là một (không xác định) tự động hóa hữu hạn với bắt đầu từ trạng thái q 1 , Q FQδ Q × Σ × Q .A=(Q={q1,,qn},Σ,δ,QF)q1QFQδQ×Σ×Q

Đặt hàm tạo cho tất cả các từ có thể được chấp nhận bắt đầu từ q i , đó là hệ số thứ n của việc mở rộng chuỗi của nó [ z n ] Q i = | { w | w | = n w  được chấp nhận từ  q i } | .Qi(z)qin[zn]Qi=|{w|w|=nw accepted from qi}|

Thông suốt:

Qi(z)=[qiQF]+(qi,a,qj)δxQj(z)

Q1[zn]Q1

Điều này quay trở lại một kỹ thuật được giới thiệu cho ngữ pháp của Chomsky và Schützenberger (1963); nó dễ dàng chuyển sang automata hữu hạn.

εxaΣwΣkxxk


Tôi đánh giá cao các ghi chú lịch sử!
Charles

1
Er, đây thực sự là một phương pháp hoạt động thực sự tốt (và đơn giản, một khi bạn có được nó) trong nhiều trường hợp. Ví dụ: bạn có thể thực hiện CFG theo cùng một cách chính xác.
Raphael

1
Tôi thấy, tôi hiểu lầm. Trong trường hợp đó, nếu bạn muốn đọc về điều này, tôi khuyên bạn nên giới thiệu Kuich (1970) mà tôi thấy dễ tiếp cận hơn công việc của C & S. Anh ấy cũng đề cập đến điều này trong một cuốn sách mà tôi không nhớ.
Raphael

1
n

1
@joro Trong trường hợp ngữ pháp không rõ ràng, tôi nghĩ rằng điều này là đúng, vâng.
Raphael

7

Tôi nghĩ rằng đây là một vấn đề khó khăn, hãy xem bài viết này: Đếm kích thước của các chuỗi thông thường có độ dài nhất định là # P-Complete: S. Kannan, Z. Sweedyk và SR Mahaney. Đếm và tạo chuỗi ngẫu nhiên trong các ngôn ngữ thông thường. Trong Hội nghị chuyên đề ACM-SIAM về các thuật toán rời rạc (SODA), trang 551 Lỗi557, 1995.


1
Bài viết ở trên giả định rằng độ dài nhất định là đơn nhất. Nếu thay vào đó, độ dài là nhị phân, thì vấn đề là PSPACE-hard. Tôi nói điều này dựa trên bằng chứng quyết định sự tương đương của hai biểu thức chính là PSPACE-hard. Trong phần giảm đó, một reg-ex được xây dựng để chấp nhận tất cả các chuỗi và chuỗi còn lại chấp nhận tất cả các chuỗi không hợp lệ từ chối lịch sử tính toán của máy PSPACE M trên đầu vào w. Việc sử dụng biểu thức chính quy thứ hai đó và độ dài của lịch sử tính toán của M trên w làm đầu vào cho vấn đề đang nói đến khiến vấn đề này trở nên khó khăn hơn PSPACE.
Mikhail Rudoy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.