Định nghĩa PA

Một phần của tài liệu bài giảng automat (Trang 61)

2. Ôtômát đẩy xuống (Pushdown Automata PA)

2.1. Định nghĩa PA

Nếu như ngôn ngữ chính quy được đoán nhận bởi automat hữu hạn thì ngôn ngữ phi ngữ cảnh cũng được đoán nhận bởi 1 loại automat có tên gọi là “Pushdown Automata” viết tắt là PA, được dịch là “Ôtômát đẩy xuống”. Tương tự FA, cũng có 2 loại PA đơn định và không đơn định. Loại đơn định không có khả năng đoán nhận tất cả các ngôn ngữ phi ngữ cảnh còn loại không đơn định thì đoán nhận được toàn bộ lớp ngôn ngữ phi ngữ cảnh. Vì vậy ở đây chỉ giới hạn xét về loại PA không đơn định và để đơn giản khi nói automat đẩy xuống PA là chỉ nói đến loại không đơn định.

Về cơ bản PA là một NFA và thêm một khả năng có thể “ghi nhớ” một lượng thông tin vô hạn nhờ được trang bị thêm một thiết bị nhớ gọi là ngăn xếp “stack” dùng để truy xuất thông tin theo phương thức vào sau ra trước Last-In- First-Out (LIFO). Về cấu trúc PA gồm một băng vào chứa xâu ký tự cần đọc để đoán nhận, một ngăn xếp để truy xuất thông tin và một bộ điều khiển để điều khiển toàn bộ hoạt động của PA. Bộ điều khiển của PA tương tự như FA, nghĩa là cũng gồm hữu hạn trạng thái và khi hoạt động tại 1 thời điểm PA sẽ ở một trạng thái xác định nào đó. Còn ngăn xếp có kích thước vô hạn, nghĩa là có thể ghi nhớ được vô hạn thông tin, đây chính là yếu tố khác biệt làm cho PA có khả năng đoán nhận ngôn ngữ mạnh hơn so với FA, nói cách khác, PA có thể đoán nhận ngôn ngữ

- 62 -

chính quy như FA ngoài ra còn có thể đoán nhận những ngôn ngữ không phải chính quy, đó chính là ngôn ngữ phi ngữ cảnh. Có thể mô tả PA về cấu trúc bởi hình vẽ sau đây:

x1 x2 . . . xn-1 xn

Bộ điều khiển có hữu hạn trạng thái coi như bộ nhớ trong của máy tính (giống như FA), ngăn xếp có kích thước không giới hạn coi như bộ nhớ ngoài của máy tính vì vậy có thể “ghi nhớ” vô hạn thông tin. PA hoạt động bằng cách đọc từng ký hiệu trên băng vào và bộ điều khiển truy cập đến ký hiệu trên đỉnh ngăn xếp để thực hiện di chuyển trạng thái dựa vào 3 yếu tố: ký hiệu ở vị trí hiện tại trên băng vào, trạng thái hiện hành của bộ điều khiển và ký hiệu trên đỉnh của ngăn xếp. Sau khi đọc xong xâu ký tự trên băng vào, PA đưa ra quyết định là có đoán nhận được xâu ký tự đó hay không theo 1 trong 2 cách: Dựa vào trạng thái của PA ngay sau khi kết thúc đọc có phải là trạng thái thuộc tập trạng thái kết thúc hay không hoặc dựa vào tình trạng của ngăn xếp có rỗng hay không. Như vậy, dựa vào cách đoán nhận ngôn ngữ mà người ta phân biệt 2 loại PA: Loại đoán nhận ngôn ngữ theo trạng thái kết thúc và loại dựa vào ngăn xếp rỗng.

Định nghĩa:

Automat đẩy xuống (Pushdown Automata PA) là bộ có thứ tự gồm 7 thành phần M=<, Q, , , q0, Z0, F>, trong đó:

  là tập hữu hạn các ký hiệu vào (input symbol)

 Q là tập hữu hạn các trạng thái (state)

  là tập hữu hạn các ký hiệu cho ngăn xếp

 q0  Q là trạng thái ban đầu Băng vào Bộ điều khiển Ngăn xếp Stack

- 63 -

 Z0  là ký hiệu ban đầu của ngăn xếp

 F  Q là tập các trạng thái kết thúc

  là hàm chuyển, điều khiển hoạt động của PA, là ánh xạ từ tích Đề các của 3 tập hợp (  {})xQx vào tập hợp các tập con của tích Đề các của 2 tập hợp Qx*

: : (  {})xQx 2Qx*

cho tương ứng mỗi bộ ba (a, q, X) a    {}, q  Q, X , vào 1 tập hợp gồm các cặp (p, ) với p  Q,  *

:

(a, q, X) a    {}, q  Q, X  :  (a, q, X)={(p1, 1); (p2, 2); … ; (pk, k)}

ý nghĩa của hàm : khi PA đang ở trạng thái q, đọc ký hiệu a trên băng vào (a   hoặc a có thể là ký hiệu rỗng ) thì có thể chuyển sang một trong các trạng thái pi (i=1, … , k) và thay thế ký hiệu X trên đỉnh ngăn xếp bởi xâu i và đầu đọc trên băng vào sẽ dịch chuyển sang phải 1 vị trí nếu a   hoặc ở nguyên vị trí cũ nếu như a là . Nếu xâu i rỗng thì sẽ loại X khỏi đỉnh ngăn xếp, còn nếu xâu i khác rỗng thì sẽ loại X khỏi đỉnh ngăn xếp và đưa các ký hiệu của xâu i vào ngăn xếp theo thứ tự từ phải sang trái, sao cho ký hiệu đầu tiên bên trái của xâu i sẽ ở trên đỉnh ngăn xếp.

2.2. Bước chuyển của PA

Khi hoạt động, có 3 yếu tố quyết định đến quá trình làm việc của PA là: trạng thái hiện tại q, phần còn lại chưa được đọc  trên băng vào và  là nội dung của ngăn xếp trong đó ký hiệu đầu trái của  ở trên đỉnh còn ký hiệu đầu phải của 

ở phía đáy của ngăn xếp. Một bộ ba (, q, ) như vậy được gọi là mô tả tức thời của PA (instantaneous description) viết tắt là ID. Để biểu diễn sự hoạt động của PA chuyển trực tiếp từ thời điểm này sang thời điểm khác, ta sử dụng ký hiệu ╞ , được hiểu như sau: Giả sử chọn cặp (p,) làm giá trị của hàm chuyển đối với bộ (a, q, X), tức là có (a, q, X)=(p, ) thì với mọi xâu  thuộc * và  thuộc * ta có: (a, q, X) ╞ (, p, ). Biểu diễn này được gọi là 1 bước chuyển của PA. Trường hợp a là ký hiệu rỗng thì bước chuyển được gọi là bước chuyển “nhắm mắt” tức là đầu đọc trên băng vào không dịch chuyển sang phải 1 vị trí như đối với

- 64 -

trường hợp a  . Như vậy PA hoạt động bằng cách thay đổi các ID liên tục theo hàm chuyển . Để biểu diễn quá trình chuyển từ một ID (, q, ) đến ID (, p, ) ta dùng ký hiệu ├ và viết là (, q, ) ├ (, p, ) và gọi là 1 suy dẫn. Như vậy 1 suy dẫn là 1 dãy liên tiếp các bước chuyển của PA.

2.3. Ngôn ngữ đoán nhận của PA

Cho automat đẩy xuống M=<, Q, , , q0, Z0, F>. M có thể đoán nhận 1 xâu vào * theo 2 cách:

Cách 1: Sử dụng trạng thái kết thúc (cách này giống như FA)

Xâu vào  được coi là đoán nhận được bởi M theo trạng thái kết thúc nếu như sau khi đọc xong  M ở vào 1 trong các trạng thái kết thúc thuộc F

Tập tất cả các xâu thuộc * đoán nhận được bởi M theo trạng thái kết thúc được gọi là ngôn ngữ đoán nhận bởi M theo trạng thái kết thúc và ký hiệu là T(M)

T(M)={*  (, q0, Z0) ├ (, p, ) với p  F, *}

Cách 2: Theo tình trạng rỗng của ngăn xếp

Xâu vào  được coi là đoán nhận được bởi M theo ngăn xếp rỗng nếu như sau khi đọc xong  ngăn xếp của M rỗng.

Tập tất cả các xâu thuộc * đoán nhận được bởi M theo ngăn xếp rỗng được gọi là ngôn ngữ đoán nhận bởi M theo ngăn xếp rỗng và ký hiệu là Null(M)

Null(M)={*  (, q0, Z0) ├ (, p, ) với p  Q}

Nhận xét: Trường hợp PA đoán nhận ngôn ngữ theo ngăn xếp rỗng thì không sử dụng đến tập trạng thái kết thúc, khi F có thể là tập con tùy ý của Q, để đơn giản trong trường hợp này ta cho F là  hoặc có thể bỏ qua trong định nghĩa PA, khi đó PA chỉ còn là bộ 6 thành phần.

Ví dụ: Cho ngôn ngữ phi ngữ cảnh L={0n1n  n  0}. Hãy xây dựng PA đoán nhận L theo trạng thái kết thúc.

Giải: Để nhận biết các từ của ngôn ngữ đã cho ta sử dụng ngăn xếp để ghi

nhớ các bit 0 đã đọc vào, sau khi đọc hết bit 0 chuyển sang đọc bit 1 thì cứ đọc được bit 1 nào sẽ lấy ra khỏi ngăn xếp một bit 0. Hàm chuyển cần xây dựng sao cho sau khi đã đọc hết bit 0 chuyển sang đọc bit 1 thì trong lúc đọc bit 1 không

- 65 -

được phép đọc bit 0 nữa. Ta sử dụng 3 trạng thái: ở trạng thái q0 thì chỉ được phép đọc bit 0, khi đọc bit 1 thì chuyển sang trạng thái q1, sau khi đọc xong xâu vào và đỉnh ngăn xếp là Z0 thì thực hiện 1 bước chuyển “nhắm mắt” sang trạng thái kết thúc q2. PA cần tìm như sau:

M=<, Q, , , q0, Z0, F>, với

Q={q0, q1, q2}; ={0,1}; ={Z0, 0}; F={q2}; Hàm chuyển  cho như sau:

(, q0, Z0)={(q2, Z0)} (0, q0, Z0)={(q0, 0Z0)} (0, q0, 0)={(q0, 00)} (1, q0, 0)={(q1, )} (1, q1, 0)={(q1, )} ( , q1, Z0)={(q2, Z0)}

Theo cách xây dựng thì sau khi đọc xong xâu vào   *, M chỉ có thể chuyển sang được trạng thái q2 khi và chỉ khi  có dạng 0n1n, suy ra T(M)=L.

Nếu trong M ở trên ta bổ sung thêm công thức cho hàm chuyển  để làm cho ngăn xếp rỗng khi M đã ở trạng thái q2 để được M’, tức là thêm công thức:

(, q2, Z0)={(q2, )}

thì sẽ được M’ đoán nhận ngôn ngữ L đã cho theo ngăn xếp rỗng, hay là Null(M’)=L.

Vấn đề đặt ra là 2 lớp ngôn ngữ đoán nhận được bởi PA theo 2 cách khác nhau có trùng nhau hay không? Câu trả lời là khẳng định, được cho bởi định lý sau:

Định lý:

Lớp ngôn ngữ đoán nhận bởi tất cả các PA theo trạng thái kết thúc trùng với lớp ngôn ngữ đoán nhận bởi tất cả các PA theo ngăn xếp rỗng.

Chứng minh: Cần phải chứng minh 2 ý

a) Với mỗi PA M đoán nhận ngôn ngữ theo trạng thái kết thúc tồn tại PA N đoán nhận ngôn ngữ theo ngăn xếp rỗng sao cho T(M)=Null(N).

- 66 -

b) Với mỗi PA N đoán nhận ngôn ngữ theo ngăn xếp rỗng tồn tại PA M đoán nhận ngôn ngữ theo trạng thái kết thúc sao cho T(M)=Null(N).

Chứng minh a): Giả sử M=<, Q, , , q0, Z0, F> đoán nhận ngôn ngữ theo trạng thái kết thúc. Ta xây dựng PA đoán nhận ngôn ngữ theo ngăn xếp rỗng N dựa theo M như sau: N=<, Q’, ’, ’, p0, Y0, > như sau:

Q’=Q  {p0, p1} với điều kiện p0 Q, p1  Q

’= {Y0} với điều kiện Y0

Hàm chuyển ’ của N thực hiện dựa theo hàm chuyển  của M như sau:

’(, p0, Y0)={(q0, Y0Z0)} ’(a, q, X)=(a, q, X)  a ,  q  Q,  X  ’(, q, X)=           X F, q nÕu X F, q nÕu )} ε , {(p X) q, δ(ε, X) q, δ(ε, 1 ’(, q, Y0)={(p1, )} nếu q  F ’(, p1, X)={(p1, )} nếu X  {Y0} Với cách xây dựng N như trên thì Null(N)=T(M).

Chứng minh b): Giả sử N=<, Q, , , q0, Z0, > đoán nhận ngôn ngữ theo ngăn xếp rỗng. Ta xây dựng PA đoán nhận ngôn ngữ theo trạng thái kết thúc M dựa theo N như sau: M=<, Q’, ’, ’, p0, Y0, F> như sau:

Q’=Q  {p0, p1} với điều kiện p0 Q, p1  Q

’= {Y0} với điều kiện Y0

F={p1}

Hàm chuyển ’ của N thực hiện dựa theo hàm chuyển  của M như sau:

’(, p0, Y0)={(q0, Z0Y0)}

’(a, q, X)=(a, q, X)  a   {},  q  Q,  X  ’(, q, Y0)={(p1, )}  q  Q

- 67 -

Nhận xét: Vì hai cách đoán nhận ngôn ngữ của PA tương đương với nhau, nên khi xây dựng PA nên chọn cách đoán nhận nào đơn giản hơn tùy từng trường hợp cụ thể.

2.4. Quan hệ giữa PA và ngôn ngữ phi ngữ cảnh Định lý 1: Định lý 1:

Với mỗi văn phạm phi ngữ cảnh luôn tồn tại 1 automat đẩy xuống đoán nhận ngôn ngữ do văn phạm phi ngữ cảnh này sinh ra.

Chứng minh:

Giả sử cho văn phạm phi ngữ cảnh G=<, , I, R>.

Ta xây dựng automat đẩy xuống M=<, Q, , , q0, Z0, > có chung bảng chữ cái  với còn các thành phần khác được xác định như sau:

Q={q0}

=  Z0=I

Hàm chuyển  cho như sau: Với mỗi A  :

(, q0, A)={(q0, )  A   R} Với mỗi a :

(a, q0, a)={(q0, )}

Với M xây dựng như trên ta có L(G)=Null(M).

Định lý 2:

Với mỗi automat đẩy xuống luôn tồn tại 1 văn phạm phi ngữ cảnh sinh ra ngôn ngữ do automat đẩy xuống này đoán nhận.

Chứng minh:

Giả sử cho automat đẩy xuống M=<, Q, , , q0, Z0, > đoán nhận ngôn ngữ theo ngăn xếp rỗng.

Ta xây dựng văn phạm phi ngữ cảnh G=<, , I, R> có chung bảng chữ cái

- 68 -

={I}  {A  A có dạng [pXq] với p, q  Q và X  } R có các quy tắc:

Với mỗi trạng thái p  Q có quy tắc I  [q0Z0p]

Nếu (a, q, X) chứa cặp (r, Y1Y2…Yk) với a    {}, k  0, (nếu k=0 thì cặp này là (r, )) thì với tất cả các danh sách trạng thái r1, r2, … , rk, R có quy tắc:

[qXrk]  a[rY1r1][r1Y2r2]…[rk-1Ykrk]

Với cách xây dựng G như trên thì ta có L(G)=Null(M).

Từ 2 định lý trên dẫn đến kết luận: lớp ngôn ngữ đoán nhận bởi tất cả các PA chính là lớp ngôn ngữ phi ngữ cảnh.

3. Thuật toán phân tích cú pháp trên lớp ngôn ngữ phi ngữ cảnh

3.1. Phân tích cú pháp

Một trong những vấn đề được quan tâm khi nghiên cứu ngôn ngữ là đối với 1 ngôn ngữ trên bảng chữ cái  cho trước thì một xâu  nào đó thuộc * có thuộc L hay không?

Vấn đề này thực chất là việc đoán nhận ngôn ngữ và là một vấn đề không đơn giản với 1 ngôn ngữ tùy ý. Đối với ngôn ngữ chính quy vấn đề này đã được giải quyết triệt để vì ngôn ngữ chính quy là lớp ngôn ngữ đơn giản nhất trong các lớp ngôn ngữ được nghiên cứu. Trên thực tế, lớp ngôn ngữ có nhiều ứng dụng trong lập trình lại là lớp ngôn ngữ phi ngữ cảnh. Với lớp ngôn ngữ này, vấn đề nhận biết ngôn ngữ phức tạp hơn nhiều so với lớp ngôn ngữ chính quy. Một trong các cách tiếp cận giải quyết vấn đề đặt ra là sử dụng phương pháp phân tích ngôn ngữ. Ý tưởng chính của phương pháp phân tích là với một xâu  đã cho, tìm cách phân tích dựa trên cấu trúc của ngôn ngữ L đã biết để đi đến quyết định là  có hay không thuộc ngôn ngữ L. Có nhiều phương pháp phân tích khác nhau: phương pháp phân tích từ trên xuống Top-Down, phương pháp phần tử từ dưới lên Bottom- Up và phương pháp phân tích tất định. Mỗi phương pháp đều có những ưu và nhược điểm khác nhau. Hai phương pháp phân tích Top-Down và Bottom-Up có ưu điểm là đơn giản nhưng có chung nhược điểm là thời gian thực hiện chậm vì độ phức tạp tính toán lớn: với xâu vào độ dài n thì số bước thực hiện tỷ lệ thuận với an, tức là có độ phức tạp lũy thừa. Vì vậy trên thực tế những phương pháp này chỉ áp dụng cho những bài toán cỡ nhỏ. Phương pháp phân tích tất định có ưu thế hơn

- 69 -

2 phương pháp nói trên về độ phức tạp tính toán: với xâu vào độ dài n thì số bước thực hiện tỷ lệ thuận với n, tức là có độ phức tạp tuyến tính. Tuy nhiên phương pháp phân tích tất định chỉ áp dụng được cho lớp ngôn ngữ phi ngữ cảnh không nhập nhằng và không đệ quy trái. Sau đây sẽ xét các điều kiện để 1 ngôn ngữ phi ngữ cảnh là không nhập nhằng và không đệ quy trái như thế nào.

3.2. Các hàm FIRST và FOLLOW Định nghĩa hàm First:

- Giả sử trong văn phạm G=<, , I, R> có các quy tắc có chung vế trái đều là A: A  1 2… k thì hàm First của A được định nghĩa là tập hợp tất cả các ký hiệu kết thúc ở vị trí đầu của các xâu có thể suy dẫn được từ các xâu i với i=1, 2, … , k. Có thể viết theo ngôn ngữ tập hợp như sau:

First(A)={a  i ├ a với  ( )*, i=1, 2, … , k}. - Nếu a  thì First(a)={a}

- Nếu =X với X   ,   ( )* thì First(X)=First(X). - Từ định nghĩa suy ra:

Nếu A 12…k

Thì: First(A)=First(1)  First(2)  …  First(k)

Định nghĩa hàm Follow:

- Giả sử trong văn phạm G=<, , I, R>, A , hàm Follow của A, ký hiệu Follow(A) là tập hợp tất cả các ký hiệu kết thúc có thể xuất hiện ở vị trí ngay sau A

Một phần của tài liệu bài giảng automat (Trang 61)