Máy tự động hữu hạn không điều kiện là một máy trạng thái hữu hạn trong đó một tuple được ánh xạ tới nhiều trạng thái. I E. chúng tôi thay thế hàm chuyển đổi của DFA bằng một hàm khác .δ : Q × Σ → Q
Nếu bạn biết NFA là gì, bạn có thể muốn bỏ qua phần tiếp theo.
Định nghĩa chính thức
Một NFA được mô tả duy nhất bởi
- một tập hợp hữu hạn các trạng thái
- một tập hợp các ký hiệu hữu hạn
- chức năng chuyển đổi
- trạng thái ban đầu
- một tập hợp các trạng thái cuối cùng
Máy khởi động trong và đọc một chuỗi ký hiệu hữu hạn , với mỗi ký hiệu, nó sẽ đồng thời áp dụng chức năng chuyển đổi với trạng thái hiện tại và thêm từng bộ trạng thái mới vào bộ trạng thái hiện tại. w ∈ Σ *
Thử thách
Đối với thử thách này, chúng tôi sẽ bỏ qua để đơn giản hóa nó, hơn nữa bảng chữ cái sẽ luôn là các chữ cái (chữ thường) to và tập hợp các trạng thái sẽ là cho một số nguyên không âm . Trạng thái ban đầu sẽ luôn là .một z { 0 ... N } N 0
Đưa ra một từ và mô tả về NFA, nhiệm vụ của bạn là xác định tất cả các trạng thái cuối cùng.
Thí dụ
Hãy xem xét chuỗi và mô tả sau:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
Máy sẽ khởi động sau :
- đọc một : trạng thái mới
- đọc một : trạng thái mới
- đọc một : trạng thái mới
- đọc một : trạng thái mới
- đọc một : trạng thái mới
Vì vậy, các trạng thái cuối cùng và do đó đầu ra sẽ là .
Lưu ý: Trong bước (2) việc chuyển trạng thái ánh xạ sang vì mô tả chỉ bao gồm các chuyển đổi sang các tập hợp không trống.
Quy tắc
Đầu vào sẽ bao gồm một chuỗi và một số loại mô tả về NFA (không có -transitions):
- chuỗi đầu vào sẽ luôn là phần tử của
- đầu vào hợp lệ (không giới hạn):
- danh sách / mảng của bộ / danh sách
- đầu vào tách dòng mới
- mô tả của NFA sẽ chỉ chứa các hiệu ứng chuyển tiếp với các tập hợp không trống.
- bạn có thể viết tắt các quy tắc với các nhân vật tương tự nếu kết quả của họ là như nhau (ví dụ. các quy định
0,'a',[1,2]
và0,'b',[1,2]
có thể được viết tắt với0,"ab",[1,2]
- bạn có thể tách riêng từng quy tắc (ví dụ: quy tắc
0,'a',[1,2]
có thể0,'a',[1]
và0,'a',[2]
)
- bạn có thể viết tắt các quy tắc với các nhân vật tương tự nếu kết quả của họ là như nhau (ví dụ. các quy định
- bạn có thể chọn chữ in hoa nếu bạn muốn
- bạn có thể lấy số lượng trạng thái làm đầu vào
- bạn có thể giả định một số loại thứ tự của đầu vào (ví dụ: được sắp xếp theo trạng thái hoặc ký hiệu)
Đầu ra sẽ là đầu ra được phân tách danh sách / bộ / dòng mới, vv của các trạng thái cuối cùng
- thứ tự không quan trọng
- không trùng lặp (vì nó là một bộ)
Các trường hợp thử nghiệm
Các ví dụ này sẽ ở định dạng description word -> states
trong đó description
một danh sách các bộ dữ liệu (state,symbol,new-states)
:
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]