Mục Lục
MỞ ĐẦU
Lý thuyết automat và ngôn ngữ hình thức đóng một vai trò rất quan trọng
trong các cơ sở toán học của tin học. Ngôn ngữ hình thức được sử dụng trong
việc xây dựng các ngôn ngữ lập trình, lý thuyết về các chương trình dịch. Các
ngôn ngữ hình thức tạo thành một công cụ mô tả đối với các mô hình tính toán
cả cho dạng thông tin vào ra lẫn kiểu thao tác. Vì thực chất của nó là một lĩnh
vực khoa học liên ngành, nhu cầu mô tả hình thức văn phạm được phát sinh
trong nhiều ngành khoa học khác nhau từ ngôn ngữ học đến sinh vật học. Chính
1
vì vậy, đối với những người trong lĩnh vực công nghệ thông tin thì việc tìm hiểu
các khái niệm về lý thuyết automat và ngôn ngữ hình thức là không thể thiếu.
Cũng chính vì vậy, ngôn ngữ hình thức được đưa vào làm môn học cơ sở chuyên
ngành cho tất cả các sinh viên công nghệ thông tin.
Đây là môn học cơ bản, mang tính phức tạp, trừu tượng cao. Chính vì
vậy, khi gặp những giải thuật phức tạp thì các lời giải hàn lâm sẽ rất buồn tẻ và
dễ gây nhàm chán. Vì vậy, nếu như có thể xây dựng một bộ công cụ hỗ trợ trong
việc giảng dạy môn automata và ngôn ngữ hình thức với ứng dụng trực tiếp
trong công tác học tập thì em tin chắc rằng nó có thể giúp các bài giảng bộ môn
Automata và ngôn ngữ hình thức phong phú và sinh động hơn. Dựa trên ý tưởng
trên, cùng với sự hướng dẫn, giúp đỡ nhiệt tình của thầy giáo Hà Chí Trung em
tham gia nghiên cứu đề tài: “Tìm hiểu và xây dựng chương trình mô phỏng
các thuật toán hỗ trợ học tập và giảng dạy môn học automata và ngôn ngữ
hình thức”.
Hình thức làm bài em sẽ mô tả cụ thể và chi tiết vào phần dưới và em sử
dụng hoàn toàn bằng ngôn ngữ lập trình C#.
Lúc mới nhận đề tài em dự định và mong muốn làm được tất cả các phần
trong giáo trình đại cương môn automata và ngôn ngữ hình thức. Nhưng do thời
gian và kiến thức của em còn có hạn nên em vẫn chưa hoàn thiện được tất cả và
không thể tránh khỏi những sai sót. Em rất mong sự đóng góp của thầy cô để đề
tài của em có thể mở rộng hơn, sâu sắc hơn và đặc biệt là có thể được ứng dụng
trong học tập và công tác giảng dạy.
Chương 1. GIỚI THIỆU CHUNG
1.1. Nêu bài toán
Bài toán: “Tìm hiểu và xây dựng chương trình mô phỏng các thuật toán
hỗ trợ học tập và giảng dạy môn học automata và ngôn ngữ hình thức”.
Môn học automat và ngôn ngữ hình thức là môn học cơ bản hết sức cần
thiết đối với chuyên ngành tin học, bản thân nó mang tính phức tạp, trừu tượng
cao. Chính vì vậy, khi gặp những giải thuật phức tạp thì các lời giải hàn lâm sẽ
rất buồn tẻ và dễ gây nhàm chán. Vì vậy, cần có một bộ công cụ mô phỏng trực
quan các thuật toán cũng như các hoạt động của automat hỗ trợ trong việc giảng
2
dạy với ứng dụng trực tiếp trong công tác học tập thì có thể giúp các bài giảng
môn học trở nên phong phú và sinh động hơn. Giúp việc giảng dạy đạt được yêu
cầu đề ra.
1.2. Yêu cầu bài toán
Bài toán: “Tìm hiểu và xây dựng chương trình mô phỏng các thuật toán
hỗ trợ học tập và giảng dạy môn học automata và ngôn ngữ hình thức” gồm hai
phần đó là:
1. Nghiên cứu, tìm hiểu các thuật toán trong môn automat và ngôn ngữ
hình thức.
2. Xây dựng chương trình mô phỏng các thuật toán đó, đồng thời là công
cụ cho phép hỗ trợ người dùng thuận tiện hơn khi muốn làm việc trên file word.
Để đạt được mục đích đề ra cần phải nắm tìm hiểu rõ về lý thuyết
Automat, văn phạm, các thuật toán có liên quan. Sau đã tìm hiểu thì xây dựng
chương trình để giải quyết yêu cầu của bài toán.
3
Chương 2. CƠ SỞ LÝ THUYẾT
2.1. Ngôn ngữ hình thức
2.1.1. Khái niệm ngôn ngữ hình thức
Ngôn ngữ: theo từ điển, là một hệ thống thích hợp cho việc biểu thị các ý
nghĩ, các sự kiện, hay các khái niệm, bao gồm tập các ký hiệu, các qui tắc để
vận dụng chúng.
Một ngôn ngữ hình thức L: trên bộ chữ cái S là một tập hợp các chuỗi từ
các ký hiệu của bộ chữ cái S.
Trong đó:
S* : tập hợp tất cả các chuỗi con, kể cả chuỗi rỗng ε, sinh ra S.
S+ : tập hợp tất cả các chuỗi con, ngoại trừ chuỗi rỗng ε, sinh ra S.
S* = S+ + {ε}
S+ = S* - {ε}
Cách biểu diễn ngôn ngữ: Có ba cách:
Liệt kê các phần tử chuỗi. Ví dụ biểu diễn các phần tử của ngôn ngữ L
gồm các chuỗi aa,aba,baa,baba như sau: L = {aa, aba, baa, baba}
Mô tả ngôn ngữ thông qua đặc điểm chủ yếu. Ví dụ một ngôn ngữ gồm
các chuỗi có chữ cái a và theo sau là số nguyên tố biểu diễn như sau: L = {ai | i
là số nguyên tố}
Biểu diễn ngôn ngữ một cách tổng quát thông qua văn phạm và automata.
Đó là cơ chế sản sinh và cơ chế đoán nhận. Trong đó:
Văn phạm: cơ chế sản sinh ra mọi chuỗi của ngôn ngữ.
Automata: là một máy trừu tượng hay một cơ chế cho phép đoán nhận
một chuỗi bất kỳ có thuộc một ngôn ngữ L hay không.
2.1.2. Các khái niệm liên quan
Bảng chữ cái: Tập Σ khác rỗng gồm hữu hạn hay vô hạn các ký hiệu. Mỗi
phần tử a được gọi là một chữ cái hay một ký hiệu.
Ví dụ: {0, 1, 2, ... , 9}: được gọi là bảng chữ số thập phân.
4
Chuỗi: Là một dãy hữu hạn các kí hiệu từ bảng chữ cái. Ví dụ: Cho
∑={}, một dãy α=,
∑ được gọi là một từ hay một chuỗi trên bảng Σ. Cụ thể
với Σ = {a, b}, thì abab và aaabbba là các chuỗi trên Σ.
Độ dài chuỗi: là số các ký hiệu tạo thành chuỗi.
Ví dụ:|abca| = 4
Chuỗi rỗng: ký hiệu ε, chuỗi không có ký hiệu nào và |ε| = 0
Chuỗi con: chuỗi v là chuỗi con của w nếu v được tạo bởi các ký hiệu liền
kề nhau trong chuỗi w.
Ví dụ: chuỗi 10 là chuỗi con của chuỗi 010001
Chuỗi tiền tố: là chuỗi con bất kỳ nằm ở đầu chuỗi.
Ví dụ: chuỗi 010 là chuỗi tiền tố của chuỗi 010001
Chuỗi hậu tố: là chuỗi con bất kỳ nằm ở cuối chuỗi.
Ví dụ: chuỗi 001 là chuỗi hậu tố của chuỗi 010001
Chuỗi nối kết:chuỗi được tạo thành bằng cách viết chuỗi thứ nhất, sau đó
chuỗi thứ hai, ...
Ví dụ: w = và v = nối kết của hai chuỗi này là chuỗi wv = . Hay nối ghép
của chuỗi Long và Int là LongInt
Chú ý: nối kết của chuỗi rỗng εw = wε = w (với mọi w). Vì vậy, ε là đơn
vị của phép nối kết.
Chuỗi đảo ngược: của chuỗi w, ký hiệu wR, là chuỗi w được viết theo thứ
tự ngược lại.
Ví dụ: chuỗi w = abcd đả ngược của w là wR = dcba và ta có εR = ε.
Phép cắt trái: của từ α cho từ β là phần còn lại của từ α sau khi cắt bỏ
phần đầu β trong từ α.
Phép cắt phải: của từ α cho từ β là phần còn lại của từ α sau khi cắt bỏ
phần đuôi β trong từ α.
2.2. Văn phạm
2.2.1. Khái niệm văn phạm
Văn phạm: theo từ điển là một tập các qui tắc về cấu tạo từ và các qui tắc
về cách liên kết các từ lại thành câu.
5
Định nghĩa văn phạm G là một bộ sắp thứ tự gồm 4 thành phần
G = < Σ, Δ, S, P > . trong đó:
Σ: bảng chữ cái, gọi là bảng chữ cái cơ bản. Tập các kí hiệu kết thúc.
Δ: (Δ ∩ Σ =Ø), gọi là bảng ký hiệu phụ. Tập các kí hiệu không kết thúc.
S ∈ Δ: Được gọi là biến khởi đầu(kí hiệu mục tiêu)
P: tập hữu hạn các luật sinh dạng α→β, trong đó:α, β ∈ (Σ ∪ Δ)* trong α
chứa ít nhất một ký hiệu không kết thúc (đôi khi, ta gọi chúng là các qui tắc
hoặc luật viết lại).
Ví dụ
Cho văn phạm sau:
G = ({a, b},{S, A, B},, S, P)
Trong đó P là các luật sinh có dạng:
S → aAS | bBS | λ,
A → aaA | b,
B → bbB | a,
2.2.2.Các khái niệm liên quan
Dẫn xuất trực tiếp: nếu α→β là một luật sinh thì áp dụng đối với chuỗi
w= gαd ta có được gαd → gβd
Dẫn xuất gián tiếp: nếu các chuỗi a1, a2, ...., am và a1 → a2, a2 → a3, ..., am-1
→ am thì am có thể được dẫn xuất gián tiếp từ a1 như sau a1 → * am
Ngôn ngữ L sinh bởi văn phạm G:
Cho G = < Σ, Δ, S, P > là một văn phạm, thì tập L (G) = {w | w Σ* và S
→ * w} được gọi là ngôn ngữ được sinh ra bởi G.
Văn phạm tương đương: là 2 văn phạm sinh ra cùng một ngôn ngữ (G1
tương đương G2 L(G1)=L(G2))
Dẫn xuất câu: Nếu w ∈ L(G) thì phải tồn tại dãy dẫn xuất:
S ⇒ w1 ⇒w2 ⇒... ⇒ wn ⇒ w
Dãy này được gọi là một sự dẫn xuất câu của w.
6
2.2.3. Phân loại văn phạm
Theo Chomsky văn phạm được chia thành 4 loại sau:
Văn phạm không hạn chế, văn phạm cảm ngữ cảnh, văn phạm phi ngữ
cảnh và văn phạm chính quy. Mối quan hệ của chúng thể hiện như sau:
Recursively enumerable
Context-sensitive
Regular Context-free
Văn phạm loại 0: (văn phạm không hạn chế) là văn phạm không cần thỏa
điều kiện ràng buộc nào trên tập các luật sinh. Tất cả các loại văn phạm đều
thuộc văn phạm loại 0.
Văn phạm loại 1: (văn phạm cảm ngữ cảnh) nếu văn phạm G có các luật
∗
α = α ′ Aα ′′, A ∈ ∆, α ′, α ′′, β ∈ ( Σ ∪ ∆ )
sinh dạng α→β và ,|β| ≥ |α| ví dụ:
Văn phạm loại 2: (văn phạm phi ngữ cảnh) là văn phạm có luật sinh dạng
A→α với A là một biến đơn và α là chuỗi các ký hiệu thuộc (Σ Δ)*;
Văn phạm loại 3: (văn phạm chính quy) có mọi luật sinh dạng tuyến tính
phải hoặc tuyến tính trái. Trong đó:
Tuyến tính phải là luật sinh có dạng: A → wB hoặc A → w;
Tuyến tính trái là luật sinh có dạng: A → Bw hoặc A → w;
(Với A, B là các biến đơn, w là chuỗi ký hiệu kết thúc (có thể là rỗng)).
Nếu ký hiệu L0, L1, L2, L3 là lớp các ngôn ngữ được sinh ra bởi văn phạm
loại 0, 1, 2, 3 tương ứng, ta có:
L3L2 L1 L0.
7
2.3. Automata hữu hạn
2.3.1 Khái niệm chung về automat
Automat: là máy tự động, là thiết bị có thể tự thực hiện công việc mà
không cần sự can thiệp của con người. Nó hoạt động dựa trên một số quy tắc và
dựa vào các quy tắc này con người lập trình cho nó hoạt động theo ý muốn của
mình. Máy tính số ngày nay chính là một máy tự động điển hình và mạnh nhất
hiện nay. Cụ thể automat là một mô hình toán học hay máy trừu tượng có cơ cấu
và hoạt động đơn giản nhưng có khả năng đoán nhận ngôn ngữ.
Finite automata (FA) là mô hình tính toán hữu hạn: có khởi đầu và kết
thúc, mọi thành phần đều có kích thước hữu hạn cố định và không thể mở rộng
trong suốt quá trình tính toán.
Automata làm việc theo các bước thời gian rời rạc (steps).
Nói chung, thông tin ra sản sinh bởi một FA phụ thuộc vào cả thông tin
vào hiện tại và trước đó.
Biểu diễn một FA: Có hai cách: biểu đồ dịch chuyển và bảng dịch
chuyển.
Ví dụ:
Cho automat A=<Q,∑,δ,,F> với:
Q={,,,}
∑={0,1}
Ta có biểu diễn dạng đồ thị như sau:
Trong đó:
8
Ngoài ra có thể biểu diễn dưới dạng bảng chuyển trạng thái như sau:
Trạn
Đầu vào
g thái
…
..
δ
()
δ
()
δ
()
…..
()
..
)
…
δ ()
…
…..
…
δ()
..
…
..
δ(
δ ()
..
δ
…
…
..
δ(
)
..
2.3.2. Các loại automat
Sự phân biệt giữa các loại automata khác nhau chủ yếu dựa trên việc
thông tin có thể được đưa vào memory hay không. Cụ thể chia làm 3 loại:
a)Automata hữu hạn đơn định (DFA)
Định nghĩa
DFA được biểu diễn bởi một bộ năm A=(Q, Σ, δ, q0, F), trong đó:
Q : tập khác rỗng, tập hữu hạn các trạng thái (p, q…);
Σ : bộ chữ cái nhập vào (a, b, c …);
δ : D→ Q là hàm chuyển (hay ánh xạ), D ⊆ Q × Σ, có nghĩa là δ(p, a) =q
hoặc δ(p, a) = Ø, trong đó p, q ϵQ , a ϵ Σ;
q0Q : trạng thái bắt đầu.
F Q : tập các trạng thái kết thúc.
(Trong trường hợp D = Q × Σ ta nói A là một DFA đầy đủ.)
Ánh xạ mở rộng
Mở rộng của ánh xạ δ là δ’ biến đổi (trạng thái, chuỗi) sang trạng thái:
1.δ’(q, e) = q.
2.δ’(q, wa) = δ’(δ’(q,w), a) với " w, a.
9
Ví dụ
b)Automat hữu hạn đa định(NFA)
Định nghĩa
Automat hữu hạn đa định được biểu diễn bởi bộ 5 A = (Q, Σ, δ, q0, F).
Trong đó:
Q: tập hữu hạn các trạng thái.
Σ : là tập hữu hạn các chữ cái.
δ: là ánh xạ chuyển trạng thái. δ: Q× Σ → 2Q
q0 ∈ Q là trạng thái khởi đầu.
F ⊆ Q là tập trạng thái kết.
(Ánh xạ δ là một hàm đa trị (hàm không đơn định), vì vậy A được gọi là
không đơn định.)
Ánh xạ mở rộng
1. δ(q, ɛ) = {q}
2. δ(q, wa) = { p | r trong δ(q, w) mà pÎδ(r, a) }
= δ( δ(q,w), a)
3. δ(P, w) = δ(q, w) với "PQ
Ví dụ
c)Automat có dịch chuyển ɛ
Định nghĩa
NFA với ε-dịch chuyển (ký hiệu: NFAε) là bộ năm: A= (Q, Σ, δ, q0, F).
Trong đó:
10
Q: tập hữu hạn các trạng thái.
Σ: tập hữu hạn các chữ cái.
δ: Q×(Σ ∪{ε}) → 2Q .
q0⊆ Q là trạng thái ban đầu.
F⊆ Q là tập trạng thái kết thúc.
Ánh xạ mở rộng
1.ɛ*(q) = { p | có đường đi từ q tới p theo nhãn e }
2.ɛ*(P) = ɛ*(q)
3.δ*(q, e) = e*(q)
4.δ*(q,a) = e*(δ(δ*(q, e),a)) = e*(δ(e*(q),a))
5.δ*(q, wa) = e*( δ( δ*(q, w), a)) hoặc
δ*(q, wa) = e*(P) với P = { p | r Î δ*(q, w), p Î δ(r, a)}
6.δ*(R, w) = ÈqÎR δ*(q, w)
Ví dụ
11
Chương 3. CÁC THUÂT TOÁN
3.1. Các thuật toán biến đổi trên automat
3.1.1. Thuật toán kiểm tra đoán nhận chuỗi
a. Tư tưởng
Duyệt lần lượt các kí tự của chuỗi cần đoán nhận, bắt đầu từ trạng thái bắt
đầu của automat. Nếu kí tự cuối cùng của chuỗi được duyệt tới trạng thái kết
thúc của Automat thì kết luận automat đó đoán nhận chuỗi đó.
b. Giả mã
Input: Chuỗi cần đoán nhận và FA dùng để đoán nhận chuỗi.
Output:Chuỗi có được đoán nhận bởi FA này không
Thuật toán
q:= q0;
c:= ký hiệu tiếp theo của chuỗi;
while (c < > ε) do {
q:= δ(q, c);
c:= ký hiệu tiếp theo của chuỗi;
};
if (q in F) return (true);
else return (false);
c. Ví dụ
Cho automat sau:
12
Quá trình đoán nhận 00101 như sau:
d. Chú ý
Trong trường hợp FA là DFA, q là một trạng thái. Nếu FA là NFA, q là
một tập hợp.
3.1.2 Tối giản automat
a. Tư tưởng
Gom nhóm những trạng thái không thể phân biệt được thành một
nhóm(gọi là nhóm trạng thái tương đương).
Đánh dấu các trạng thái có thể phân biệt được và những trạng thái không
thể phân biệt được. Trạng thái không thể phân biệt được là những trạng thái
tương đương. Sau đó tiến hành rút gọn thông qua việc gom nhóm.
b.Giả mã
Giải thuật bắt đầu bằng việc đánh dấu các cặp trạng thái qi và qj là khác
nhau (phân biệt) nếu một trạng thái là đoán nhận còn trạng thái còn lại thì không
đoán nhận. Phần còn lại của giải thuật là xem xét một cách hệ thống các cặp
trạng thái không được đánh dấu. Khi hai trạng thái cho thấy là phân biệt, thì có
lời gọi chuỗi đệ quy DIST để thiết lập D[i,j]=1. Lời gọi DIST(i,j) không chỉ
đánh dấu qi và qj là phân biệt , nó còn đánh dấu mỗi cặp trạng thái qm,qn (với
[m,n] thuộc S[i,j]) là khác nhau cho tới lời gọi DIST(m,n).
Thuật toán
Input: DFA M = (Q, ∑, δ, q0, F)
Output: DFA tối giản Mmin
1. (Chuẩn bị)
For với mọi cặp trạng thái qi và qj , i< j Do
1.1.
D[i,j] := 0
End for
13
2. For mọi cặp i, j , i
còn lại không phải là 1 trạng thái đoán nhận, Then D[ i,j] := 1
3. For mọi cặp i, j, i
3.1. If có tồn tại 1 a € ∑ như là δ(qi, a) =q m , δ(qj ,a) = qn và D[m,n] =
1 hoặc D[n,m] =1
Then DIST(i,j)=1
3.2.
Else
For mỗi a € ∑ Do : cho δ(qi ,a) =qm và δ( qj, a) = qn
If m
Else If m>n và [ i,j ] ≠ [n,m] Then thêm [ i, j ] vào S[m,n]
End For
DIST (i, j);
Begin
D[i,j] := 1
For tất cả [m, n] € S[i, j], DIST(m,n)
End
c.Ví dụ
Cho automat đơn định sau:
Sau bước đanh dấu ta có bảng đánh dấu như sau:
Ghép các trạng thái không phân biệt được ta được DFA rút gọn:
14
3.1.3. Chuyển NFA sang DFA
a. Tư tưởng
Từ định lý nếu ngôn ngữ L là tập được chấp nhận bởi một NFA thì tồn tại
một DFA chấp nhận L. Vì vậy sẽ tồn tại một DFA tương đương NFA chấp nhận
cùng một ngôn ngữ.
b. Giả mã
Input: NFA M=(Q,∑,δ,q0,F) vào hàm dịch t của M.
OutPut: DFA tương đương
Thuật toán
1. Q’=q0
2. Repeat
2.1. If Có 1 nút X
X mà được đánh nhãn là a
Q’ và một ký tự a
với cung rời khỏi
Then
2.1.1 Cho Y = δ’(q, a)=
.
2.1.2. If Y Q’, then Q’ := Q’ {Y}
2.1.3. Thêm một cung từ X vào Y nhãn là a.
Else done := true
Until done
3. Tập các trạng thái đoán nhận của DM là F’ = { X
1 thành phân qi ϵ F}
c.Ví dụ
15
Q’ | X chưá
Cho automat đa định (NFA) sau:
Từ đồ thị chuyển trạng thái trên ta có bảng chuyển như sau:
Trạng Thái
q0
0
1
[q0,q1
q0
]
[q0,q1]
[q0,q1 [q0,q2
]
]
[q0,q2]
[q0,q1 [q0,q2
]
]
Vậy ta có DFA sau:
d. Chú ý
Cung rời từ trạng thái X xét ở trên trạng thái đích sẽ là hợp của tất cả
trạng thái bao gồm các trạng thái nằm trên đường dịch chuyển ɛ
3.1.4 Chuyển NFAɛ sang NFA
a. Tư tưởng
Từ định lý nếu L được chấp nhận bởi một NFAɛ thì L cũng được chấp
nhận bởi một NFA không có ɛ-dịch chuyển. Do đó, luôn tồn tại một NFA tương
đương cùng chấp nhận một ngôn ngữ với NFAɛ.
b. Giả mã
Input: NFAɛ A(Q, Σ, δ, q0, F) chấp nhận L
Output: NFA A’={Q, Σ, δ’, q0, F’}
16
Thuật toán
Tìm các thành phần của NFA như sau:
-F’ = F q0 nếu ɛ*( q0) chứa ít nhất một trạng thái thuộc F. Ngược lại, F’
= F;
-δ’(q, a) = δ*(q, a).
c. Ví dụ
cho NFAɛ sau:
Xá định NFA M’ = {Q, Σ, δ’, q0, F’} tương đương theo thuật toán trên
như sau:
-Q = {q0, q1, q2}
-Σ = {0, 1, 2}
-Trạng thái bắt đầu: q0
-F’ = {q0, q2}
Hàm chuyển δ’:
NFA có dạng:
17
3.1.5 Chuyển NFAɛ sang DFA
a. Tư tưởng
Xuất phát từ nếu L được chấp nhận bởi một NFAɛ thì L cũng được chấp
nhận bởi một NFA không có ɛ-dịch chuyển. Mà hoàn toàn có thể chuyển từ một
NFA sang DFA.
b. Giả mã
Input : NFAɛ M=(Q,∑,δ,q0,F) vào hàm dịch t của M.
Output: DFA tương đương
Thuật toán
1. Gán Q' =δ*(q0)
2. Repeat
2.1. If (X
Q’ và a
)
Then
2.1.1 Trạng thái Y = δ*(q, a).
.
2.1.2. If Yϵ
Q’, then Q’ := Q’ U {Y}
2.1.3. Thêm một cung từ X vào Y nhãn là a.
Else done := true
Until done
3. Tập các trạng thái kết thúc của DM là F’ = { X
thành phân qi F}
c.Ví dụ
Cho NFAɛ:
18
Q’ | X chưá 1
Theo thuật toán trên ta tìm được các bao đóng sau:
ɛ*(q0) = {0, 1, 2, 4, 7} → q0’ = [0, 1, 2, 4, 7] = A
ɛ*(δ(A, a)) = ɛ*({3, 8}) = {1, 2, 3, 4, 6, 7, 8} → B
ɛ*(δ(A, b)) = ɛ*({5}) = {1, 2, 4, 5, 6, 7} → C
ɛ*(δ(B, a)) = ɛ*({3, 8}) → B
ɛ*(δ(B, b)) = ɛ*({5, 9}) = {1, 2, 4, 5, 6, 7, 9} → D
ɛ*(δ(C, a)) = ɛ*({3, 8}) → B
ɛ*(δ(C, b)) = ɛ*({5}) = → C
ɛ*(δ(D, a)) = ɛ*({3, 8}) → B
ɛ* (δ(D, b)) = ɛ*({5,10}) = {1, 2, 4, 5, 6, 7, 10} → E
ɛ*(δ(E, a)) = ɛ*({3, 8}) → B
ɛ*(δ(E, b)) = ɛ*({5}) = → C
Ký hiệu bắt đầu: q0’ = A (↔ɛ *(q0) )
Tập trạng thái kết thúc: F’ = {E} (vì trong E có chứa trạng thái 10 F)
19
DFA tương ứng:
3.2. Các thuật toán biến đổi giữa automata và văn phạm
3.2.1. Chuyển FA sang văn phạm chính quy
a. Tư tưởng
Nếu L là một tập hợp chính quy thì L được sinh ra từ một RG (văn phạm
tuyến tính trái hoặc tuyến tính phải) nào đó. Do đó, một FA có thể được biểu
diễn bởi một RG.
b. Giả mã
Giải thuật xây dựng RG tuyến tính phải cho FA:
Forearch(các hàm chuyển trạng thái δ của FA):
If( δ(p, a) = q)
20
Then RG có luật sinh: p aq.
If(q)
Then RG có luật sinh:p a.
If(q0)
Then RG có luật sinh S q0 | ε.
c.Ví dụ
xét DFA cho 0(10)* sau:
Biểu diễn bởi văn phạm sau:
A 0B | 1D | 0
B 0D | 1C
C 0B | 1D | 0
D 0D | 1D
3.2.2. Chuyển văn phạm sang FA
a.Giả mã
Giải thuật xây dựng FA cho văn phạm tuyến tính phải:
Xây dựng tập Q gồm các trạng thái có dạng [α] với α là S hoặc chuỗi hậu
tố của vế phải một luật sinh nào đó trong P.
If( A là một biến và (A) P)
Then δ([A], ε) = {[a]}
If(a là một ký hiệu kết thúc)
Then δ([a], a) = {[]}
Trạng thái bắt đầu [S], trạng thái kết thúc [ε]
21
b.Ví dụ
Xây dựng FA cho RG:
S0A ; A 10A | e
Ta xây dựng được FA biểu diễn nó như sau:
c. Chú ý
Giải thuật xây dựng FA cho văn phạm tuyến tính trái được xây dựng dựa
trên tính chất sau:
Cho văn phạm G = < Σ, Δ, S, P >, và G’ = < Σ, Δ, S, P’ >, trong đó nếu:
P’ = { A → α | A → αR ∈ P } ,
thì L(G’)R = L(G).
Như vậy ta có thể xây dựng giải thuật theo 3 bước:
Xác định văn phạm tuyến tính phải G’ = < Σ, Δ, S, P’ >
Xây dựng NFA cho G’;
Đảo ngược chiều các cạnh của NFA này, vị trí kết thúc trở thành vị trí bắt
đầu và ngược lại.
3.3.Các thuật toán biến đổi trên văn phạm
3.3.1. Chuyển văn phạm tuyến tính phải thành văn phạm tuyến tính trái(ngược
lại)
a. Tư tưởng
Cho văn phạm G = < Σ, Δ, S, P >, và G’ = < Σ, Δ, S, P’ >, trong đó nếu:
P’ = { A → α | A → αR ∈ P } ,
thì L(G’)R = L(G).
22
b. Giả mã
Input: văn phạm G là văn phạm tuyến tính phải.
Output: văn phạm G’ là văn phạm tuyến tính trái.
Thuật toán
Forearch(luật sinh p của văn phạm G)
{
Đảo ngược thứ tự nhãn vế phải của p;
G.add(p);
}
Chú ý: Chuyển dạng tuyến tính trái thành tuyến tính phải thì ngược lại.
c. ví dụ
Cho văn phạm G = < Σ, Δ, S, P > :
P:
S S10 | 0
Ta có văn phạm tuyến tính phải G’=< Σ, Δ, S, P’ >
P’:S01S|0
3.3.2. Rút gọn văn phạm phi ngữ cảnh
a. Ý tưởng
Xuất phát từ khái niệm văn phạm rút gọn: là văn phạm vẫn giữ khả năng
sản sinh ngôn ngữ đó mà không chứa những yếu tố vô ích không sinh ra chuỗi,
làm phức tạp hay kéo dài dẫn xuất sinh chuỗi.
1. Mọi x ∈ (Σ ∪ Δ), tồn tại chuỗi w sử dụng nó trong dẫn xuất;
2. Không có luật sinh dạng A B (với A, B ∈ Δ)
3. Nếu ngôn ngữ không chấp nhận chuỗi rỗng ε thì loại bỏ luật sinh A ε.
Để rút gọn văn phạm phi ngữ cảnh cần thực hiện 3 bước sau:
1. Loại bỏ các ký hiệu thừa
2. Loại bỏ các luật sinh ε
3. Loại bỏ các luật sinh đơn vị
23
Do đó có định lý: Cho CFG G = < Σ, Δ, S, P > với L(G) ≠ Ø, có một
CFG G = < Σ’, Δ’, S, P’ > tương đương sao cho mỗi A ϵΔ’ tồn tại w ϵ Σ* để A*
w.
b. Giả mã
1. Giải thuật loại bỏ ký hiệu thừa
Bổ đề: ký hiệu X được gọi là có ích nếu có một dẫn xuất dạng S αXβ * w
với a, b là các chuỗi bất kỳ và w ϵ Σ*.
Giả mã giải thuật tìm ký hiệu phụ Δ’.
1. OldΔ' := Ø;
2. NewΔ' := { A|A w với w ϵT* };
3. while (OldΔ' NewΔ' ) do
{
3.1 OldΔ' := NewΔ';
3.2 NewΔ' := OldΔ' A{A| A α; αϵ(Σ OldΔ’)* }
};
4. Δ' := NewΔ’;
Giả mã giải thuật loại bỏ ký hiệu không dẫn ra từ ký hiệu bắt đầu:
1. Đặt Δ’ := {S};
2. if (A ϵΔ’ và A a1|a2|...|an là các luật sinh trong P)
if (X là ký một hiệu phụ trong a1, a2, ..., an và X chưa có trong Δ’ )
Thêm X trong vào Δ’ ;
3. Lặp lại bước (2) cho đến khi không còn biến nào được thêm vào nữa.
2. Giải thuật loại bỏ các luật sinh ε
Giải thuật loại bỏ luật sinh dạng Aε: Xét G = < Σ, Δ, S, P >, G’ = < Σ, Δ,
S, P’ > không chứa luật sinh ε.
Giải thuật:
Bước 1:
Ω := Ø;
Nếu luật sinh A ε thì thêm A vào Ω;
24
Nếu B X1X2...Xn, Xi ∊ Ω thêm B vào Ω;
Bước 2: Xây dựng P’. Với mỗi luật A →X1X2...Xn , Xi ∊ (Σ+Δ) trong P, ta
xây dựng luật sinh A → a1a2...an trong P’ với điều kiện:
Nếu Xi ∉ Ω thì ai = Xi
Nếu Xi ∊Ω thì ai = Xi | ε
Không gán đồng thời tất cả ai đều bằng ε
3. Giải thuật loại bỏ các luật sinh đơn vị
for (mỗi biến A ∊Δ) {
Tính ΔA = { B | B ∊ Δ và A →* B } ;
for (mỗi biến B ∊ΔA){
for (mỗi luật sinh B → a thuộc P){
if (B →a không là luật sinh đơn vị) {
Thêm luật sinh A → a vào P’;
}
}
}
}
c. Ví dụ
Xét văn phạm G = < Σ, Δ, S, P > :
S→A
A → aBb | ε
B → A | cB | cC
C → AC | BCD
D → ab
Áp dụng thuật toán tìm Δ’ ta có:
Δ' = {S, A, B, D}
S→A
A → aBb | ε
25