GV: Nguyễn Ngọc Tú 
[email protected] 
Bài 06. Ngôn ngữ phi ngữ cảnh và Dạng chuẩn 
LÝ THUYẾT TÍNH TOÁN 
INTRODUCTION TO COMPUTATION THEORY 
(FORMAL LANGUAGES & AUTOMATA) 
TIN331 
Sử dụng slides của các tác giả: Hồ Văn Quân + Nick Hopper 
Nội dung 
 Biến đổi văn phạm 
 Hai dạng chuẩn quan trọng 
 Giải thuật thành viên cho văn phạm phi ngữ cảnh 
Biến đổi văn phạm 
 Nếu L ∋ λ thì biểu diễn L = L1 ∪ λ với L1 = L - λ. 
Nếu 
 G1 = (V1, T, S1, P1) 
 thì 
 G = (V1 ∪ {S}, T, S, P1 ∪ {S → S1 | λ}) 
Biến đổi văn phạm – quy tắc 
 Định lý 6.1 
 Cho G = (V, T, S, P) là một VPPNC. Giả sử P có chứa luật 
sinh 
 A → x1Bx2 
trong đó A, B là các biến khác nhau và 
 B → y1 | y2 | ... | yn 
là tập tất cả các luật sinh trong P mà có B ở vế trái. 
 Cho G1= (V, T, S, P1) là VP được xây dựng bằng cách xóa 
đi 
 A → x1Bx2 
từ P, và thêm vào 
 A → x1y1x2 | x1y2x2| ... | x1ynx2 
Thì 
 L(G) = L(G1) 
E.x. 
 Xét văn phạm G = ({A, B}, {a, b}, A, P) với các luật 
sinh 
 A → a | aA | bBc, 
 B → abA | b. 
 Sau khi thay thế biến B ta nhận được VP tương đương 
như sau 
 A → a | aA | babAc | bbc, 
 B → abA | b 
 Chuỗi abbc có các dẫn xuất trong G và G1 lần lượt như 
sau: 
 A ⇒ aA ⇒ abBc ⇒ abbc 
 A ⇒ aA ⇒ abbc 
Biến đổi văn phạm – quy tắc 
 Định lý 6.2 (Loại bỏ đệ qui trái) 
 Cho G = (V, T, S, P) là một VPPNC. Chia tập các luật sinh 
mà vế trái của chúng là một biến đã cho nào đó (chẳng hạn 
là A), thành hai tập con riêng biệt 
 A → Ax1 | Ax2 | ... | Axn (6.2) 
 A → y1 | y2 | ... | ym (6.3) 
với xi, yi ∈ (V ∪ T)*, và A không là prefix của bất kỳ yi nào. 
 Xét G1 = (V ∪ {Z}, T, S, P1), trong đó Z ∉ V và P1 nhận 
được bằng cách thay mọi luật sinh của P có dạng (6.2) và 
(6.3) bởi 
 A → yi | yiZ, i = 1, 2, . . . , m, 
 Z → xi | xiZ, i = 1, 2, . . . , n, 
 Thì 
 L(G) = L(G1). 
 Chứng minh 
 Các dạng câu mà A sinh ra trong văn phạm G có dạng: 
 A A(x1 + x2 + ... + xn)* ⇒ yi(x1 + x2 + ... + xn)* 
 Các dạng câu này cũng có thể được sinh ra trong G1 
bằng cách chú ý Z có thể sinh ra các dạng câu có dạng 
 Z (x1 + x2 + ... + xn)(x1 + x2 + ... + xn)* ⇒ 
 mà A → yi | yiZ nên 
 A yi(x1 + x2 + ... + xn)* ⇒ 
 Vì vậy L(G) = L(G1). 
E.x. 
 Sử dụng Định lý 6.2 để loại bỏ các luật sinh đệ qui-trái 
khỏi VP 
 A → Aa | aBc | λ B → Bb | ba 
 Áp dụng định lý cho biến A ta được tập luật sinh mới 
như sau: 
 A → aBc | λ | aBcZ | Z B → Bb | ba 
 Z → a | aZ 
 Áp dụng định lý một lần nữa lần này cho biến B ta 
được tập luật sinh kết quả cuối cùng như sau: 
 A → aBc | aBcZ | Z | λ B → ba | baY 
 Z → a | aZ Y → b | bY 
Biến đổi văn phạm – Luật sinh vô dụng 
 Định nghĩa 6.1: 
 Cho G = (V, T, S, P) là một VPPNC. 
 Một biến A ∈ V được gọi là khả dụng nếu và chỉ nếu có ít 
nhất một chuỗi w ∈ L(G) sao cho 
 S ⇒ xAy⇒ w, 
với x, y ∈ (V ∪ T)*. 
 một biến là khả dụng nếu và chỉ nếu nó xuất hiện trong ít 
nhất một dẫn xuất. Một biến mà không khả dụng thì gọi là 
vô dụng. Một luật sinh được gọi là vô dụng nếu nó có chứa 
bất kỳ biến vô dụng nào. 
Biến đổi văn phạm – Luật sinh vô dụng 
 Định lý 6.3 
 Cho G = (V, T, S, P) là một VPPNC, ∃ một VP tương 
đương G0 = (V0, T, S, P0) mà không chứa bất kỳ biến vô 
dụng nào. 
 Chứng minh 
 Loại bỏ các biến và luật sinh vô dụng loại 1 
 Tạo văn phạm G1 = (V1, T, S, P1) với V1 là tập biến không 
vô dụng loại 1. Ta tìm V1 như sau: 
 1. Khởi tạo V1 = ∅. 
 2. Lặp lại bước sau cho đến khi không còn biến nào được thêm 
vào V1. 
 Đối với mỗi A ∈ V mà có luật sinh A → x, x ∈ (V1∪T)*, thì thêm A 
vào V1. 
 3. Loại khỏi P các luật sinh có chứa các biến ∉ V1, ta được P1. 
Biến đổi văn phạm – Luật sinh vô dụng 
 Để loại tiếp các biến và các luật sinh vô dụng loại 2 ta dựa 
vào G1 vừa có ở trên và vẽ đồ thị phụ thuộc cho nó, sau đó 
tìm tập các biến không đạt tới được từ S. Loại các biến này 
và các luật sinh liên quan đến nó ra khỏi G1 ta được văn 
phạm kết quả G0. 
 Đồ thị phụ thuộc (dependency graph) 
 Là một đồ thị có các đỉnh biểu diễn các biến, còn một cạnh 
nối hai đỉnh A và B khi và chỉ khi có luật sinh dạng 
 A → xBy 
A B 
E.x. 
 Loại bỏ các biến và các luật sinh vô dụng ra khỏi 
văn phạm 
 G = ({S, A, B, C}, {a, b}, S, P), với tập luật sinh P là: 
 S → aS | A | C B → aa 
 A → a C → aCb 
V1 = {S, A, B} và tập luật sinh P1 
 S → aS | A 
 A → a 
 B → aa 
S A B 
S → aS | A 
A → a 
Biến đổi văn phạm – Loại bỏ luật sinh 
 Định nghĩa 6.2 
 Bất kỳ luật sinh nào của VPPNC có dạng 
 A → λ 
 được gọi là luật sinh-λ. Bất kỳ biến A nào mà 
 là có thể thì được gọi là khả trống (nullable). 
 Định lý 6.4 
 Cho G là một VPPNC bất kỳ mà L(G) không chứa λ, 
thì tồn tại một văn phạm G0 tương đương mà không có 
chứa luật sinh-λ. 
Biến đổi văn phạm – Loại bỏ luật sinh 
 Chứng minh: 
 Bước 1 
 Tìm tập VN tất cả các biến khả trống của G bằng các bước sau. 
 1. Đối với mọi luật sinh A → λ, đưa A vào VN. 
 2. Lặp lại bước sau cho đến khi không còn biến nào được thêm vào 
VN. 
 Đối với mọi luật sinh B → A1A2  An, mà A1, A2, An ∈ VN thì đặt B vào 
VN. 
 Bước 2 
 Sau khi có tập VN ta xây dựng tập luật sinh như sau. 
 Ứng với mỗi luật sinh có dạng A → x1x2  xm, m ≥ 1, trong đó mỗi 
xi ∈ V ∪ T, đặt luật sinh này vào cùng với các luật sinh được sinh ra 
bằng cách thay thế các biến khả trống bằng λ trong mọi tổ hợp có 
thể, ngoại trừ nếu tất cả các xi đều khả trống thì không đặt luật sinh A 
→ λ vào P0 của G0 
E.x. 
 Loại bỏ các luật sinh-λ của văn phạm sau: 
 S → ABaC C → D | λ 
 A → BC D → d B → b | λ 
 Vì B → λ và C → λ  B và C là các biến khả trống. 
 Vì A → BC A cũng là biến khả trống. 
 Theo Bước 2 ta xây dựng được tập luật sinh mới tương 
đương như sau: 
 S → ABaC | BaC | AaC | Aba | aC | Aa | Ba | a 
 A → BC | B | C 
 B → b C → D D → d 
Biến đổi văn phạm – Loại bỏ luật sinh 
 Định nghĩa 6.3 
 Bất kỳ luật sinh nào của VPPNC có dạng 
 A → B 
 trong đó A, B ∈ V được gọi là luật sinh-đơn vị. 
 Định lý 6.5 
 Cho G = (V, T, S, P) là một VPPNC bất kỳ không có luật 
sinh-λ, thì tồn tại một VPPNC G1 = (V1, T, S, P1) mà không 
có bất kỳ luật sinh đơn vị nào và tương đương với G1. 
 Chứng minh 
 1. Đặt vào trong P1 tất cả các luật sinh không đơn vị của P. 
 2. Đối với mỗi biến A tìm tất cả các biến B mà A B (*) 
⇒ 
 Điều này thực hiện bằng cách vẽ đồ thị phụ thuộc cho G nhưng 
một cạnh nối 2 đỉnh A và B khi và chỉ khi có luật sinh-đơn vị A 
→ B. Hai biến A và B thỏa (*) khi và chỉ khi có một con đường 
trong đồ thị đi từ A đến B. 
 3. Đối với mỗi A, B thõa (*) thêm vào trong P1 các luật 
sinh 
 A → y1 | y2 | ... | yn 
 với B → y1 | y2 | ... | yn là các luật sinh không đơn vị của B. 
E.x. 
 Loại bỏ các luật sinh đơn vị cho VP sau 
 S → Aa | B 
 B → A | bb 
 A → a | bc | B 
Đặt các luật sinh không đơn vị 
vào trong P1 
S → Aa 
A → a | bc 
B → bb 
Từ ĐTPT 
S → a | bc | bb 
A → bb 
B → a | bc 
S A B 
S → Aa | a | bc | bb 
A → a | bc | bb 
B → bb | a | bc 
Biến đổi văn phạm – Loại bỏ luật sinh 
 Định lý 6.6 
 Cho L là một NNPNC không chứa λ, tồn tại một VPPNC 
sinh ra L mà không chứa bất kỳ luật sinh vô dụng, luật sinh-
λ, hay luật sinh-đơn vị nào. 
 Chứng minh: 
 B1. Loại bỏ luật sinh-λ 
 B2. Loại bỏ luật sinh đơn vị 
 B3. Loại bỏ luật sinh vô dụng loại 1, rồi vô dụng loại 2 
Hai dạng chuẩn quan trọng 
 Một VPPNC là thuộc dạng chuẩn Chomsky nếu mọi 
luật sinh có dạng 
 A → BC, hoặc 
 A → a 
trong đó A, B, C ∈ V, còn a ∈ T. 
 Định lý 6.7 
 Bất kỳ VPPNC G = (V, T, S, P) nào với λ ∉ L(G) đều có 
một văn phạm tương đương G1 = (V1, T, S, P1) có dạng 
chuẩn Chomsky 
Dạng chuẩn – G-to-GChomsky 
 Input: G = (V, T, S, P) với λ ∉ L(G) 
 Output: G1 = (V1, T, S, P1) có dạng chuẩn Chomsky. 
 1.Đặt các luật sinh A → a vào P1. 
 2.Đối với các luật sinh A → x1x2 ... xn với n ≥ 2, xi ∈ (V ∪ T) thì 
thay các kí hiệu kết thúc, chẳng hạn xk = a, bằng các biến đại diện 
mới Ba, tạo thành các luật sinh trung gian A → C1C2...Cn. 
 3.Ứng với mỗi biến đại diện Ba đặt vào P1 các luật sinh Ba → a. 
 4.Sau khi thực hiện bước 2, ứng với mỗi luật sinh A → C1C2 ...Cn 
mà n = 2 đặt nó vào P1. Ngược lại ứng với n > 2 ta giới thiệu các 
biến mới D1, D2, ... và đưa vào các luật sinh sau: 
 A → C1D1 
 D1 → D1D2 
 ...... 
 Dn-2 → Cn-1Cn 
E.x. 
S → a | ABa 
A → aab 
B → b | Ac 
S → a 
B → b 
S → ABXa 
A → XaXaXb 
B → AXc 
Xa → a 
Xb → b 
Xc → c 
S → AD1 
D1 → BXa 
A → XaD2 
D2 → XaXb 
S → a | AD1 
D1 → BXa 
A → XaD2 
D2 → XaXb 
B → b | AXc 
Xa → a 
Xb → b 
Xc → c