Vấn đề của bạn có thể được giải quyết trong thời gian đa thức.
Để bắt đầu, chuyển đổi NFA đã cho thành NFA tương đương với các thuộc tính bổ sung sau:
- Không có chuyển tiếp epsilon
- Tất cả các trạng thái có thể truy cập từ trạng thái bắt đầu
Chương trình con hữu ích
Giả sử chúng ta có NFA N , trạng thái q và chuỗi không trống s . Chương trình con sau đây sẽ cho phép chúng ta đánh giá giá trị thật của câu lệnh sau: "mọi đường dẫn trong N từ trạng thái q đến trạng thái chấp nhận tương ứng với một chuỗi là tiền tố của chuỗi sn cho một số n ." Hơn nữa, chương trình con này sẽ chạy trong thời gian đa thức.
Đầu tiên, xây dựng NFA S với |s|+1 bang mà chấp nhận tất cả các chuỗi mà không phải là tiền tố của sn cho bất kỳ n ( |s| phi chấp nhận quốc gia trong vòng một để theo dõi các nơi trong "mô hình" của sssss… chúng tôi cho đến nay, và một trạng thái chấp nhận nếu chúng ta đã đi chệch khỏi mô hình đó). Tiếp theo, xây dựng NFA N′ mà là chính xác như N nhưng có q là trạng thái bắt đầu của nó. Cuối cùng, xây dựng một thức NFA N′′có ngôn ngữ là bằng cách sử dụng cấu trúc giao cắt NFA tiêu chuẩn. Lưu ý rằng tất cả các cấu trúc này là đa thức về kích thước của đầu vào.L(N′′)L(S)∩L(N′)
Sau đó, chỉ cần kiểm tra xem ngôn ngữ của có trống không (có thể được thực hiện trong thời gian đa thức với một tìm kiếm biểu đồ đơn giản). khi và chỉ khi , hay nói cách khác, mọi chuỗi trong không nằm trong . Nói cách khác, ngôn ngữ của trống khi và chỉ khi chỉ chấp nhận các chuỗi là tiền tố của đối với một số . Điều này có thể được chia sẻ lại chính xác như tuyên bố mà chúng tôi đang cố gắng đánh giá: "mọi đường dẫn trong từ trạng thái đến trạng thái chấp nhận tương ứng với một chuỗi là tiền tố của chuỗiN′′L(N′′)=∅L(S)∩L(N′)=∅L(N′)L(S)N′′N′snnNqsn n ncho một số . "n
Thuật toán chính
Hãy xem xét tập hợp các trạng thái trong NFA trong một số vòng lặp. Đối với mỗi trạng thái như vậy, , làm như sau:q
Đặt là bất kỳ vòng lặp đơn giản nào chứa . Gọi là chuỗi tương ứng với vòng lặp . Vì NFA không có chuyển tiếp epsilon, không trống. Sau đó áp dụng chương trình con cho NFA, trạng thái và chuỗi . Nếu chương trình con cho chúng ta biết rằng mọi đường dẫn bắt đầu từ trong NFA và kết thúc ở trạng thái chấp nhận tương ứng với tiền tố cho một số thì tiếp tục đến trạng thái tiếp theo . Mặt khác, đầu ra mà ngôn ngữ của NFA đã cho chứa một tập hợp con không có tiền tố vô hạn.P2qsP2sqsqsnnq
Nếu chúng ta thử mọi trạng thái trong một vòng lặp và thuật toán không bao giờ xuất ra, thì đầu ra rằng ngôn ngữ của NFA đã cho không chứa tập hợp con không có tiền tố vô hạn.q
Đúng (nửa đầu)
Đầu tiên, giả sử rằng thuật toán trên khẳng định rằng ngôn ngữ của NFA đã cho có chứa một tập hợp con không có tiền tố vô hạn. Giả sử rằng đầu ra này đã được chọn trong khi xem xét một số vòng lặp và một số trạng thái . Như trước, là chuỗi tương ứng với . Sau đó, chúng ta biết theo chương trình con rằng không phải mọi đường dẫn bắt đầu từ trong NFA và kết thúc ở trạng thái chấp nhận tương ứng với tiền tố của đối với một số (vì đây là đầu ra duy nhất của chương trình con sẽ dẫn đến chính thuật toán xuất ra tại đó ).P2qsP2qsnnq
Đặt là một đường dẫn mà sự tồn tại của nó được khẳng định bởi chương trình con: một đường dẫn từ đến trạng thái chấp nhận sao cho chuỗi tương ứng không phải là tiền tố của cho bất kỳ .P3qtsnn
Đặt bao gồm bản sao của trong đó đủ lớn mà. Vì là một vòng lặp qua , có thể được coi là một đường dẫn từ đến . Chuỗi tương ứng với làP′2mP2mm|s|>|t|P2qP′2qqP′2sm
Đặt là một đường dẫn từ trạng thái bắt đầu đến (tồn tại vì mọi trạng thái đều có thể truy cập từ đầu) và gọi là chuỗi tương ứng với đường dẫn này.P1qr
Sau đó, đường dẫn bao gồm , bản sao của và là đường dẫn tính toán chấp nhận. Chuỗi tương ứng với đường dẫn này là . Do đó, NFA chấp nhận mọi chuỗi có dạng . Đây là một chuỗi vô hạn được NFA chấp nhận và tôi cho rằng bộ chuỗi này không có tiền tố. Cụ thể, giả sử là tiền tố của với . Nói cách khác, là tiền tố của . Vì có độ dài, điều này ngụ ý rằngP1xP′2P3r(sm)xtr(sm)xtr(sm)xtr(sm)yty>xt(sm)y−xt(sm)y−xm(y−x)|s|≥m|s|>|t|t là tiền tố của . Nhưng chúng ta biết bằng đầu ra của chương trình con rằng không phải là tiền tố của cho bất kỳ . Do đó, không thể là tiền tố của và như mong muốn, bộ chuỗi không có tiền tố.(sm)y−x=sm(y−x)tsnnr(sm)xtr(sm)yt
Do đó, tôi đã chỉ ra rằng nếu thuật toán chính xuất ra ngôn ngữ của NFA đã cho có chứa một tập hợp con không có tiền tố vô hạn thì thực tế đây là trường hợp.
Tính đúng đắn (nửa sau)
Tiếp theo, tôi sẽ chỉ cho nửa kia: nếu ngôn ngữ của NFA đã cho có một tập hợp con không có tiền tố vô hạn thì thuật toán chính sẽ đưa ra thực tế này.
Giả sử ngôn ngữ của NFA đã cho chứa tập hợp con không có tiền tố vô hạn. Đặt là tập hợp các đường dẫn tính toán (chấp nhận) tương ứng với các chuỗi này. Lưu ý rằng là một tập hợp vô hạn các đường dẫn tính toán có các chuỗi tương ứng không bao giờ là tiền tố của nhau.AA
Giả sử rằng một trạng thái đang "lặp" trong NFA nếu tồn tại một vòng lặp trong NFA thông qua trạng thái đó và "không lặp" theo cách khác. Xem xét tất cả các đường dẫn từ trạng thái bắt đầu đến bất kỳ trạng thái vòng lặp nào chỉ đi qua trạng thái không lặp (ngoại trừ trạng thái vòng lặp nơi chúng kết thúc). Đặt là tập hợp các đường dẫn này. Mỗi đường dẫn không thể có một vòng lặp vì khi đó các trạng thái trong vòng lặp đó sẽ là các trạng thái lặp và do đó sẽ chuyển qua trạng thái lặp. Do đó, độ dài của các đường dẫn trong được giới hạn ở trên bởi số lượng trạng thái trong NFA và do đó là hữu hạn (ví dụ: nếu trạng thái bắt đầu là trạng thái lặp thì chỉ có đường dẫn đó là đường dẫn trống).Pp∈PpPP
Chúng ta có thể phân vùng thành các tập con dựa trên cách các đường dẫn tính toán trong bắt đầu. Đặc biệt, đối với , chúng ta hãy là tập hợp của tất cả các đường dẫn tính toán trong bắt đầu bằng con đường và để cho là tập hợp của tất cả các đường dẫn khác trong . Rõ ràng, tất cả s và là rời nhau và công đoàn của họ là toàn bộ tập . Hơn nữa, chỉ chứa các đường dẫn không bao giờ đi qua trạng thái lặp và do đó không bao giờ lặp; do đó là hữu hạn. Chúng ta có thể kết luận rằng một sốA|P|+1Ap∈PApApBAApBABBApphải là vô hạn (nếu không sẽ là một tập hợp hữu hạn của nhiều tập hợp hữu hạn).A
Vì là vô hạn, có vô số đường dẫn tính toán, không có chuỗi nào là tiền tố của nhau, đó là các đường dẫn chấp nhận bắt đầu bằng . Đặt là trạng thái đạt được ở cuối đường dẫn . Chúng ta có thể kết luận rằng có vô số đường dẫn chấp nhận, gọi tập hợp này là , bắt đầu từ tất cả các đường dẫn tương ứng với các chuỗi không phải là tiền tố của nhau.AppqpA′q
Trong thuật toán chính, chúng tôi chạy chương trình con ở trạng thái và một số chuỗi . Chương trình con này cho chúng ta biết mọi đường dẫn chấp nhận bắt đầu từ tương ứng với một chuỗi là tiền tố của đối với một số . Nếu đây là trường hợp, thì tất cả các đường dẫn chấp nhận vô hạn trong sẽ là tiền tố của cho nhiều khác nhau , điều này có nghĩa là tất cả chúng đều là tiền tố của nhau. Đây không phải là trường hợp, vì vậy chúng tôi kết luận rằng khi thuật toán chính chạy chương trình con ở trạng tháiqsqsnnA′snnq, kết quả là kết quả khác có thể. Tuy nhiên, điều này dẫn đến thuật toán chính đưa ra rằng ngôn ngữ của NFA chứa một tập hợp con không có tiền tố vô hạn.
Điều này kết luận bằng chứng về sự đúng đắn.