Xây dựng ôtômát hữu hạn đơn định từ ôtômát hữu hạn không đơn định

Một phần của tài liệu Ôtômát hữu hạn và ứng dụng (Trang 34)

định

Giả sử A = (Q, , δ, q0, F) là một ôtômát không đơn định, khi đó ta có thể xây dựng ôtômát hữu hạn đơn định và đầy đủ M = (Q’, , δ’, q0’, F’) tương ứng với ôtômát A ( theo nghĩa cùng đoán nhận một ngôn ngữ). Việc xây dựng M được thực hiện :

B

ư ớc 1 :Xây dựng hàm hai biến T : 2Q→2Q thỏa mãn các điều kiện 1. ∀qQ, ∀a thì T(q, a) = {q’ Q| q’ = δ(q, a)}. 2. ∀B  Q mà δ(q, a) = B, ∀a thì T(B, a) =  δ(p, a). pB B ư ớc 2 : Xác định tập trạng thái mới Q’ ={s0,s1,….,sk|k≤2Q-1} 1. Đặt s0 = q0, s1= q1,…., si = qi, ∀{q0}, {q1}, …. {qi} Q. 2. Đặt si+1= B1, si+2 = B2, …. ∀ B1, B2, …….  Q mà δ(qj, a) = Bj. 3. Nếu ôtômát A không đầy đủ, đặt sk= và thêm vào hàm chuyển δ’

các giá trị δ’(sk, a) = sk ∀ a để ôtômát M là ôtômát đầy đủ 4. Trạng thái khởi đầu của M là s0

5. Tập trạng thái kết thúc của M là F’={sQ’|sF≠} B

ư ớc 3 : Xác định hàm chuyển δ’:Q’→Q’ của ôtômát M ∀sQ’, ∀a thì δ’(s, a) = T(s, a).

Ví dụ 2.9: Cho ôtômát A = ({q0, q1, q2}, {a, b, c}, δ, q0, {q1, q2}) và hàm chuyển δ cho bởi bảng sau:

δ a b C

q0 {q1} {q1, q2} {q2}

q1 {q2} {q0, q2}

Hãy xây dựng M = (’,{a, b, c}, δ’, s0, F’} đơn định và đầy đủ, tương đương với ôtômát A.

B ư ớc 1 : Xây dựng T: 2Q→2Q T(q0, a) = q1; T(q0, b) = {q1, q2}; T(q0, c) = {q2} T(q1, a) = {q2}; T(q1, b) = ; T(q1, c) = {q0, q2} T(q2, a) = {q1}; T(q2, b) = {q1}; T(q2, c) = {q2} T({q1, q2}, a) = {q1, q2}; T({q1, q2}, b) = {q1};T({q1, q2}, c) = {q0, q2} T({q0, q2}, a) = {q1}; T({q0, q2}, b) = {q1, q2}; T({q0, q2}, c) = {q2} B ư ớc 2 : Đặt s0 = q0 ; s1 = q1; s2 = q2; s3 = {q1, q2}; s4 = {q0, q2}; s5 =  Khi đó Q’ = {s0, s1, s2, s3, s4, s5}

Trạng thái khởi đầu của M là s0

Tập trạng thái kết thúc F’ = {s1, s2, s3, s4} Bước 3: Hàm chuyển δ’ được xác định như sau

δ’ a b c s0 s1 s3 s2 s1 s2 s5 s4 s2 s1 s1 s2 s3 s3 s1 s4 s4 s1 s3 s2 s5 s5 s5 s5

Vậy ôtômát M = ({s0, s1, s2, s3, s4, s5}, {a, b, c}, δ’, s0, {s1, s2, s3, s4}) với hàm chuyển δ’ được xác định như trên tương ứng với ôtômát A.

CHƯƠNG 3: MỘT VÀI ỨNG DỤNG CỦA ÔTÔMÁT HỮU HẠN 3.1 Ứng dụng trong máy tính

3.1.1 Tìm kiếm xâu trong văn bản

Một vấn đề phổ biến trên các trang web và các kho văn bản khác trên mạng đó là:cho một tập các từ, tìm tất cả các tài liệu có chứa một (hoặc tất cả ) những từ đó. Một công cụ tìm kiếm là một ví dụ điển hình của quá trình này. Công cụ tìm kiếm sử dụng một công nghệ đặc biệt gọi là chỉ số ngược, nơi cho mỗi từ xuất hiện trên web ( có 100.000.000 từ khác nhau), một danh sách của tất cả những nơi mà từ đó xuất hiện được lưu trữ. Máy móc với lượng lớn bộ nhớ giữ đa số các danh sách có sẵn, cho phép nhiều người tìm kiếm các tài liệu cùng một lúc.

Chỉ số kỹ thuật đảo ngược không sử dụng các thiết bị tự động hữu hạn, nhưng họ cũng mất một lượng rất lớn thời gian cho trình thu thập để sao chép web và thiết lập các chỉ số. Có một số ứng dụng liên quan không thích hợp cho các chỉ số đảo ngược những ứng dụng tốt cho cơ sở kỹ thuật máy tự động. Các đặc tính làm cho một ứng dụng phù hợp cho các tìm kiếm sử dụng máy tự động là:

1. Việc tìm kiếm trên các kho lưu trữ có thể thay đổi nhanh chóng. Ví dụ: (a) Mỗi ngày các nhà phân tích tin tức muốn tìm kiếm trên mạng các bài báo trong ngày cho các chủ đề liên quan. Ví dụ một nhà phân tích tài chính có thể tìm kiếm một mã chứng khoán hoặc tên công ty.

(b) Một robot mua sắm muốn tìm kiếm các giá hiện hành tính phí cho các mục mà khách hàng yêu cầu. Các robot sẽ truy xuất các trang danh mục hiện tại từ web và sau đó tìm kiếm các trang cho lời đề nghị một mức giá cho một cụ thể.

Ví dụ: amazon.com không dễ dàng tìm kiếm tất cả các trang cho tất cả các sách mà công ty bán. Thay vào đó, các trang này được tạo ra "một cách nhanh chóng" trong phản ứng để truy vấn. Tuy nhiên, chúng ta có thể gửi một truy vấn cho cuốn sách về một chủ đề nhất định.

3.1.2 Tìm kiếm văn bản

Giả sử chúng ta đưa ra một tập các từ mà chúng ta sẽ gọi các từ khóa mà chúng ta muốn tìm. Tại các ứng dụng như thế này, một cách hữu ích để tiến hành là để thiết kế một máy tự động hữu hạn không đơn định mà tín hiệu bằng cách nhập một trạng thái chấp nhận rằng nó đã nhìn thấy một trong các từ khóa. Các văn bản của một tài liệu được cho, một ký tự tại một thời gian để NFA này nhận lần xuất hiện của từ khóa trong văn bản này. Có một hình thức đơn giản đến một NFA có thể nhận diện một bộ từ khóa.

1. Có một trạng thái bắt đầu với một sự chuyển tiếp trên tất cả biểu tượng đầu vào, ví dụ mỗi ký tự ASCII in được nếu chúng ta đang kiểm tra văn bản. Bằng trực giác, trạng thái bắt đầu đại diện cho một "dự đoán" mà chúng ta chưa bắt đầu để xem một trong những từ khóa, ngay cả khi chúng ta đã thấy một số chữ cái của một trong những từ này.

2. Đối với mỗi từ khóa a1a2……ak, có k trạng thái là q1,q2,….,qk.Hàm chuyển trạng thái từ trạng thái khởi đầu đến q1 trên ký hiệu a1, một hàm chuyển trạng thái từ q1 đến q2 trên ký hiệu a2 và tiếp tục như vậy. Trạng thái qk là trạng thái trả lời và chỉ ra rằng từ khóa a1a2…..ak được tìm thấy.

Ví dụ 3.1: Giả sử chúng ta muốn thiết kế một NFA để nhận ra sự xuất hiện của các từ web và ebay. Trạng thái 1 là trạng thái bắt đầu, và chúng tôi sử dụng để  đặt cho các thiết lập của tất cả các ký tự ASCII . trạng thái 2 đến 4 nhận web, trong khi các trạng thái 5 đến 8 nhận ebay.

Tất nhiên NFA không phải là một chương trình. Chúng ta có 2 sự lựa chọn chính cho việc thực hiện NFA này.

b (adsbygoogle = window.adsbygoogle || []).push({});

1. Viết một chương trình mô phỏng NFA này bằng cách tính toán các thiết lập của các trạng thái đó là sau khi đọc mỗi ký hiệu đầu vào. 2. Chuyển đổi NFA sang một DFA tương đương sử dụng xây dựng tập

hợp con. Sau đó, mô phỏng các DFA trực tiếp.

 2 e 3 b 4W 1 e 5 6 a 7 y 8 Start

Một số chương trình xử lý văn bản, chẳng hạn như các hình thức tiên tiến của lệnh grep unix (egrep và fgrep) thực sự sử dụng một hỗn hợp của hai phương pháp này. Tuy nhiên, mục đích của chúng tôi. chuyển đổi một DFA là dễ dàng và được đảm bảo không để tăng số lượng của các trạng thái.

3.1.3 Nhận diện một bộ từ khóa

Chúng ta có thể áp dụng việc xây dựng tập hợp con cho bất kỳ NFA. Tuy nhiên, khi chúng tôi áp dụng xây dựng có một NFA đã được thiết kế từ một bộ từ khóa, chúng ta thấy rằng số lượng các trạng thái của DFA là không bao giờ lớn hơn số trạng thái của NFA. Vì trong trường hợp xấu nhất về số lượng lũy thừa trạng thái chúng ta đi đến DFA, điều này giải thích lý do tại sao các phương pháp thiết kế một NFA cho các từ khóa và sau đó xây dựng một DFA từ nó được sử dụng thường xuyên. Các quy tắc để xây dựng tập các trạng thái của DFA là như sau.

a) Nếu q0 là trạng thái khởi đầu của NFA, thì q0 là một trạng thái của DFA.

b) Giả sử p là một trạng thái của NFA, là trạng thái đạt được từ trạng thái bắt đầu dọc theo ký hiệu a1a2…..am. Thì một trạng thái của DFA là tập trạng thái của NFA bao gồm:

1. q0. 2. P.

3. Mọi trạng thái của NFA có thể xây dựng từ q0 bằng cách đi theo một con đường có nhãn là hậu tố của a1a2…..am, mọi dãy ký tự có dạng ajaj+1….am. Chú ý rằng nói chung, sẽ có một trạng thái DFA cho mỗi trạng thái p của NFA . Tuy nhiên, trong bước (b), hai trạng thái có thể thực sự mang lại cùng một tập các trạng thái của NFA, và do đó trở thành một trạng thái của NFA. Ví dụ, nếu hai trong các từ khóa bắt đầu với cùng một chữ, là a, sau đó hai trạng thái NFA được đạt từ q0 bởi một vòng cung dán nhãn là sẽ mang lại cùng một tập hợp của các trạng thái NFA và do đó nhận được sáp nhập trong DFA.

Ví dụ 3.2: Một DFA nhận diện từ khóa float

f l o a t

1 2 3 4 5 6

3.1.4 Bộ phân tích từ vựng

Các ký hiệu từ vựng (token) trong một ngôn ngữ lập trình thì hầu hết không có sự ngọai lệ, được biểu diễn như các tập hợp chính quy. Chẳng hạn, các định danh của ALGOL: các chữ cái viết hoa hoặc thường, theo sau bởi một dãy bất kỳ của chữ cái (letter) hoặc chữ số (digit) với độ dài không giới hạn có thể được biểu diễn như sau :

(letter) (letter + digit)*. Trong đó "letter" thay thế cho A + B +...+ Z + a + b +...+ z và "digit" là 0 + 1 +...+ 9.

Một ví dụ khác, các định danh của FORTRAN có độ dài giới hạn là 6 và các chữ cái chỉ cho phép dùng chữ viết hoa hoặc ký hiệu $ được biểu diễn như sau :

(letter) (ε + letter + digit)5

với "letter" là $ + A + B + ... + Z .

Một số công cụ phát sinh bộ phân tích từ vựng nhận input như một dãy các biểu thức chính quy mô tả các ký hiệu từ vựng và phát sinh một ôtômát hữu hạn đơn giản nhận dạng mọi ký hiệu từ vựng. Thông thường, chúng chuyển đổi biểu thức chính quy thành một NFA với ε-dịch chuyển và sau đó xây dựng tập hợp con các trạng thái để có thể phát sinh DFA một cách trực tiếp hơn là tìm cách loại bỏ các phép chuyển nhãn ε. Mỗi trạng thái kết thúc xác định ký hiệu từ vựng cụ thể đã tìm thấy. Hàm chuyển của FA sẽ được mã hóa bằng một trong vài cách nhằm chiếm ít không gian hơn so với bảng hàm chuyển tổ chức dưới dạng mảng hai chiều. Bộ phân tích từ vựng được thiết lập bằng cách phát sinh một chương trình cố định thông dịch các bảng mã, cùng với các bảng minh họa cụ thể sự nhận dạng của FA trên các ký hiệu từ vựng (viết dưới dạng các biểu thức chính quy). Bộ phân tích từ vựng dạng này có thể được dùng như một chương trình con độc lập (module) trong một trình biên dịch ngôn ngữ.

3.1.5 Trình soạn thảo văn bản

Hiển nhiên, các trình soạn thảo văn bản hoặc các chương trình tương tự cho phép thay thế một chuỗi bởi mọi chuỗi kết hợp với một biểu thức chính quy cho trước.

Chẳng hạn, trình soạn thảo văn bản ed trong UNIX cho phép một câu lệnh như sau :/aba*c/ để tìm sự xuất hiện đầu tiên của chuỗi có dạng như trên.

Hay câu lệnh :s/bbb*/b/ cho phép thay thế các chuỗi có dạng bbb* thành chuỗi có một ký tự b.

Hay trong các câu lệnh của MS-DOS và NC, ví dụ câu lệnh :

Del tmp * . ??? sẽ cho phép xóa đi tất cả các file với tên tập tin bắt đầu bằng tmp, sau đó là một chuỗi bắt kỳ và có phần mở rộng là 3 ký tự tùy ý.

Dấu * trong trường hợp này ký hiệu cho một chuỗi bất kỳ, còn dấu ? ký hiệu cho một ký tự tùy ý. Đây cũng là một dạng ký hiệu của biểu thức chính quy thay thế cho chuỗi.

Hay chẳng hạn, một ví dụ về xử lý chuỗi khác được áp dụng cho việc tìm kiếm theo mẫu trên các trang Web.

Trong tất cả các ví dụ trên, ký hiệu * xác định “mọi” biểu thức

a1 + a2 + ... + an trong đó các ai là tất cả các ký tự cho phép trong máy tính trừ ký tự xuống dòng (newline). Ta có thể chuyển một biểu thức chính quy r sang DFA chấp nhận mọi r. Chú ý rằng sự hiện diện của ký hiệu * sẽ cho phép ta nhận dạng một thành phần của L(r) bắt đầu từ bất kỳ vị trí nào trong dòng. Để làm được điều này, các ứng dụng phải thực hiện quá trình chuyển đổi từ một biểu thức chính quy sang NFA. Và vì cơ chế hoạt động của NFA khá phức tạp nên thông thường ngay sau đó, NFA lại phải được biến đổi tiếp thành dạng DFA tương đương. Tuy nhiên, sự chuyển đổi từ một biểu thức chính quy sang DFA tốn nhiều thời gian hơn việc sử dụng DFA để kiểm tra các mẫu bằng cách duyệt qua chúng một lần, tuy DFA có thể có số trạng thái là hàm mũ của độ dài biểu thức chính quy. (adsbygoogle = window.adsbygoogle || []).push({});

3.2 Ứng dụng thực tế3.2.1 Máy giặt 3.2.1 Máy giặt

Một máy giặt cơ bản được dễ dàng mô hình hóa như một máy tự động hữu hạn. Bây giờ bạn hiểu máy hữu hạn trạng thái, bạn có thể nhận được quần áo thực sự sạch sẽ.

3.2.2 Máy bán hàng tự động

Hình dưới đây trình bày một DFA mô tả hoạt động của một máy bán hàng tự động chấp nhận đô la, và các chi phí cho mỗi lon soda là $1.25. Một khi máy nhận được ít nhất là $ 1.25, tương ứng với các trạng thái màu xanh trong biểu đồ, nó sẽ cho phép người dùng lựa chọn một soda. Tự vòng đại diện cho đầu vào bị bỏ qua: máy sẽ không tra ra soda khi chưa đủ $1.25và máy cũng không nhận qua nhiều tiền một khi nó đã nhận được lớn hơn hoặc bằng $ 1,25.

Để thể hiện DFA như một 5-tuple, các thành phần được quy định như sau: 1. Q = {$ 0.00, $ 0.25, $ 0.50, $ 0.75, $ 1.00, $ 1.25, $ 1.50, $ 1.75, 2.00 $} là các trạng thái. 2. Σ = {$ 0.25, $ 1.00, chọn} là bảng chữ cái. 3. δ, hàm chuyển trạng thái . 4. q0 = 0,00 $ là trạng thái bắt đầu 5. F = ∅ là tập hợp trạng thái trả lời.

25 C họ n Chọn $0.0 $1.00 $0.25 Chọn $0.25 $1.00 $0.25 Chọn $0.5 $1.00 $0.25 Chọn 0.75 $1.00 $1.0 $0. $1.2 $1.5 $1.75 $1.00 $2.0 $1.00,$0.25 $1.00,$0.25 $0.25 $1.00,$0.25 $1.00,$0.25

KẾT LUẬN

Khóa luận đã đi tìm hiểu “ Ôtômát hữu hạn và ứng dụng “ trong 3 chương. Chương 1 đã cung cấp nhứng kiến thức cơ sở về ngôn ngữ được sử dụng trong các chương sau. Chương 2 đã đi tìm hiểu về khái niệm tổng quát Ôtômát từ đó đi nghiên cứu chi tiết về ôtômát hữu hạn. Trên cơ sở đó đi tìm hiểu được các ứng dụng của Ôtômát trong máy tính cũng như trong cuộc sống thực tế. Từ đó giúp thấy được ôtômát có vai trò và ứng dụng rất rộng rãi trong thực tế.

Do thời gian và kiến thức còn hạn hẹp nên khóa luận còn nhiều thiếu sót mong thầy cô có những đóng góp để em hoàn thiện hơn.

TÀI LIỆU THAM KHẢO

Tài liệu tiếng Việt

1. Nguyễn Văn Ba (2002), Ngôn ngữ hình thức, NXB Khoa học và Kỹ thuật, Hà Nội.

2. Đoàn Văn Ban (2003), Giáo trình Ôtômát và Ngôn ngữ hình thức, NXB Đại học Quốc gia Hà Nội.

3. Phan Đình Diệu (1971), Lý thuyết otomat và thuật toán, Nhà xuất bản Đại học và Trung học Chuyên nghiệp.

4. Nguyễn Văn Định (2012), Giáo trình Otomat và Ngôn ngữ hình thức, NXB Đại học Nông nghiệp.

5. Hồ Văn Quân (2002), Giáo trình lý thuyết ôtômát và ngôn ngữ hình thức, NXB Đại học Quốc gia Tp. Hồ Chí Minh.

6. Đặng Huy Ruận (2002), Lý thuyết ngôn ngữ hình thức và Otomat, NXB Đại học Quốc gia Hà Nội.

Tài liệu tiếng Anh

7. J.E. Hopcroft, J.D.Ullman (1979), Introduction to Automata Theory, Languages and Computation, Addison-Wesley, Reading.

8. J.E. Hopcropft, R. Motwani, J.D. Ullman (2001), Introduction to Automata Theory, Languages, and Computation (2nd Edition), Addison- Wesley.

Một phần của tài liệu Ôtômát hữu hạn và ứng dụng (Trang 34)