Tải bản đầy đủ (.pdf) (27 trang)

Tin học lý thuyết - Chương 5 ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (656.72 KB, 27 trang )

1
Văn phạm phi ngữ cảnh
(Context Free Grammar)
Nội dung:
• Văn phạm phi ngữ cảnh (CFG)
• Giản lược văn phạm phi ngữ cảnh
• Chuẩn hóa văn phạm phi ngữ cảnh
• Các tính chất của văn phạm phi ngữ cảnh
Chương 5:
2
Văn phạm phi ngữ cảnh
Định nghĩa: là hệ thống gồm 4 thành phần G(V, T, P, S)
• V : tập hữu hạn các biến (ký tự chưa kết thúc)
• T : tập hữu hạn các ký tự kết thúc (V  T = Ø)
• P : tập hữu hạn các luật sinh dạng A ((VT)*)
• S : ký hiệu bắt đầu của văn phạm
S  AB
A  aA
A  a
B  bB
B  b
S  AB
A  aAa
B  bBb
hay
Quy ước:
• V: chữ in hoa (A, B, C, ); T: chữ in thường (a, b, c, , w, x, y )
• , , , biểu diễn chuỗi ký hiệu kết thúc và biến
Ví dụ: G=({S, A, B}, {a, b}, P, S) với P gồm các luật
sinh:
3


Dẫn xuất và ngôn ngữ
Dẫn xuất:
• Nếu A  là luật sinh trong văn phạm G và ,  là 2 chuỗi bất kỳ,
thì khi áp dụng luật sinh A  vào chuỗi A ta sẽ thu được
chuỗi  :
A
G

• Giả sử: 
1

G

2
, 
2

G

3
, , 
m-1

G

m
, ta có:

1
*

G

m
• Ta có: *
G
 với mọi chuỗi 
• Thông thường, ta sẽ dùng  và * thay cho 
G
và *
G
Ngôn ngữ sinh bởi CFG: cho CFG G(V, T, P, S)
L(G) = { ww  T* và S *
G
w }
(chuỗi w gồm toàn ký hiệu kết thúc và được dẫn ra từ S)
4
Cây dẫn xuất
Định nghĩa: cây dẫn xuất (hay cây phân tích cú pháp) của một văn
phạm G(V, T, P, S) có đặc điểm
(1) Mỗi nút có một nhãn, là một ký hiệu  (V T {ε} )
(2) Nút gốc có nhãn là S (ký hiệu bắt đầu)
(3) Nếu nút trung gian có nhãn A thì A  V
(4) Nếu nút n có nhãn A và các đỉnh n
1
, n
2
, , n
k
là con của n
theo thứ tự từ trái sang phải có nhãn lần lượt là X

1
, X
2
, , X
k
thì A
 X
1
X
2
X
k
là một luật sinh trong P
(5) Nếu nút n có nhãn là ε thì n phải là nút lá và là nút con duy
nhất của nút cha của nó
6
Dẫn xuất trái nhất - Dẫn xuất phải nhất
Dẫn xuất trái nhất (phải nhất): nếu tại mỗi bước dẫn xuất, luật
sinh được áp dụng vào biến bên trái nhất (phải nhất)
Ví dụ: xét văn phạm G với luật sinh:
S  AB
A  aAa
B  bBb
• Các dẫn xuất khác nhau cho từ aaabb:
(a) S  AB aAB  aaAB  aaaB  aaabB  aaabb
(b) S  AB AbB  Abb  aAbb  aaAbb  aaabb
(c) S  AB aAB  aAbB  aAbb  aaAbb  aaabb
(d) S  AB aAB  aaAB  aaAbB  aaabB  aaabb
• Dẫn xuất (a) là dẫn xuất trái nhất, (b) là dẫn xuất phải nhất

• Các dẫn xuất tuy khác nhau, nhưng có cùng một cây dẫn xuất
8
Văn phạm mơ hồ
Khắc phục văn phạm mơ hồ:
• Quy định rằng các phép cộng và nhân luôn được thực hiện
theo thứ tự từ trái sang phải (trừ khi gặp ngoặc đơn)
E  E + T  E * T  T
T  (E)  a
• Quy định rằng khi không có dấu ngoặc đơn ngăn cách thì phép
nhân luôn được thực hiện ưu tiên hơn phép cộng
E  E + T  T
T  T * F  F
F  (E)  a
9
Giản lược văn phạm phi ngữ cảnh
Trong CFG có thể chứa các yếu tố thừa:
● Các ký hiệu không tham gia vào quá trình dẫn xuất ra chuỗi ký
hiệu kết thúc
● Luật sinh dạng A  B (làm kéo dài chuỗi dẫn xuất)
 giản lược văn phạm nhằm loại bỏ những yếu tố vô ích, nhưng
không được làm thay đổi khả năng sản sinh ngôn ngữ của văn
phạm
• Mỗi biến và mỗi ký hiệu kết thúc của văn phạm đều xuất
hiện trong dẫn xuất của một số chuỗi trong ngôn ngữ
• Không có luật sinh A  B (với A, B đều là biến)
● Nếu ngôn ngữ không chấp nhận chuỗi rỗng ε thì không cần
luật sinh A  ε .
10
Các ký hiệu vô ích

Khái niệm: một ký hiệu X được gọi là có ích nếu có một dẫn xuất
S * X* w
với ,  là các chuỗi bất kỳ và w  T*.
 có 2 đặc điểm cho ký hiệu có ích
• X phải dẫn ra chuỗi ký hiệu kết thúc
• X phải nằm trong dẫn xuất từ S
11
Các ký hiệu vô ích
Bổ đề 1: (loại bỏ các biến không dẫn ra chuỗi ký hiệu kết thúc)
Cho CFG G(V, T, P, S) với L(G) ≠ Ø, có một CFG G'(V', T', P', S)
tương đương sao cho mỗi A  V' tồn tại w  T* để A * w
Giải thuật tìm V':
Begin
(1) OldV' := ;
(2) NewV' := { A A  w với w  T* };
(3) While OldV'  NewV' do
begin
(4) OldV' := NewV';
(5) NewV' := OldV'  {A  A   với   (T  OldV')* }
end;
(6) V' := NewV';
End;
12
Các ký hiệu vô ích
Bổ đề 2: (loại bỏ các biến không được dẫn ra từ ký hiệu bắt đầu)
Cho CFG G(V, T, P, S), ta có thể tìm được CFG G'(V', T', P', S)
tương đương sao cho mỗi X  (V'  T') tồn tại ,   (V'  T')* để
S * X
Cách tìm:
• Đặt V' = {S}

• Nếu A  V' và A 
1

2

n
là các luật sinh trong P thì
➢ Thêm các biến của 
1
,
2
, 
n
vào V'
• Lặp lại cho đến khi không còn biến nào được thêm vào nữa
13
Các ký hiệu vô ích
Định lý 5.2: mỗi ngôn ngữ phi ngữ cảnh (CFL) không rỗng được
sinh ra từ một văn phạm phi ngữ cảnh (CFG) không có ký hiệu
vô ích
Ví dụ: xét văn phạm S → A
A → aBb | ε
B → A | cB | cC
C → AC | BCD
D → ab
• Áp dụng bổ đề 1:
V' = {S, A, B, D}
S → A
A → aBb | ε
B → A | cB

D → ab
• Áp dụng bổ đề 2:
V' = {S, A, B}
S → A
A → aBb | ε
B → A | cB
14
Luật sinh
ε
Định lý 5.3: (loại bỏ luật sinh A
 ε
)
Cho CFG G(V, T, P, S) và L là ngôn ngữ sinh ra bởi G. Khi đó L – {ε} là
ngôn ngữ sinh ra bởi CFG G'(V, T, P', S) không có ký hiệu vô ích và
không có luật sinh ε.
Cách tìm:
➢ Bước 1: xác định tập biến rỗng Nullable
i. A  ε  A  Nullable
ii.B  X
1
X
2
X
n
, X
i
 Nullable  B  Nullable
➢ Bước 2: xây dựng tập luật sinh P'
Với mỗi luật sinh A  X
1

X
2
X
n
trong P, ta xây dựng luật sinh
A 
1

2

n
với điều kiện:
i. Nếu X
i
 Nullable thì 
i
= X
i
ii. Nếu X
i
 Nullable thì 
i
= X
i
ε
iii. Không phải tất cả 
i
đều bằng ε
15
Luật sinh

ε
Ví dụ: loại bỏ luật sinh ε trong văn phạm sau:
S  AB
A  aA ε
B  bB ε
➢ Bước 1: xác định tập biến rỗng Nullable
i. A  ε  A  Nullable
ii. B  ε  B  Nullable
iii.S  AB  S  Nullable
➢ Bước 2: xây dựng tập luật sinh P'
S  AB Aε εB
A  aA aε
B  bB bε
Chú ý: văn phạm G' không chấp nhận chuỗi rỗng ε như văn phạm
G. Để G' tương đương G, ta cần thêm luật sinh S ε vào G'.
16
Luật sinh đơn vị
Định lý 5.4: (loại bỏ luật sinh A

B)
Mỗi CFL không chứa ε được sinh ra bởi CFG không có ký hiệu
vô ích, không có luật sinh ε hoặc luật sinh đơn vị.
Cách tìm: đặt L=L(G) là CFL không chứa ε và được sinh ra bởi văn
phạm G(V, T, P, S). Theo định lý 3, ta có thể loại bỏ tất cả luật
sinh ε trong G.
Để loại bỏ luật sinh đơn vị, ta xây dựng tập P' mới theo giải thuật:
For (mỗi biến A  V) do
Begin
Tính Δ
A

= { B  B  V và A * B } ;
For (mỗi biến B  Δ
A
) do
For (mỗi luật sinh B  thuộc P) do
If (B  không là luật sinh đơn vị) then
Thêm luật sinh A  vào P'
End ;
17
Luật sinh đơn vị
Ví dụ: loại bỏ luật sinh đơn vị trong văn phạm
E  E + T  T
T  T * F  F
F  (E)  a
Ta có: Δ
E
= {E, T, F}  thêm vào P' các luật sinh
E  E + T T * F  (E)  a
Tương tự:
Δ
T
= {T, F}  thêm vào P' : T  T * F (E)  a
Δ
F
= {F}  thêm vào P' : F  (E)  a
19
Dạng chuẩn Chomsky (CNF)
Ví dụ: tìm văn phạm có dạng CNF tương đương văn phạm sau:
S  A  ABA

A  aA  a  B
B  bB  b
Bước 1: Δ
s
= {S, A, B} , Δ
A
= {A, B} , Δ
B
= {B}
S  aA  a bB  b  ABA
A  aA  a  bB  b
B  bB  b
Bước 2: thay a bằng C
a
và b bằng C
b
trong các luật sinh có độ dài
vế phải > 1: S  C
a
A  a C
b
B  b  ABA
A  C
a
A  a  C
b
B  b
B  C
b
B  b

C
a
 a
C
b
 b
20
Dạng chuẩn Chomsky (CNF)
Bước 3: thay thế các luật sinh có độ dài vế phải > 2:
S  C
a
A  a C
b
B  b  AD
1
A  C
a
A  a  C
b
B  b
B  C
b
B  b
C
a
 a
C
b
 b
D

1
 BA
22
Dạng chuẩn Greibach (GNF)
Định lý 5.6: mỗi CFL bất kỳ không chứa ε được sinh ra bởi một
CFG mà mỗi luật sinh có dạng A a với A là biến, a là ký hiệu
kết thúc và là một chuỗi các biến (có thể rỗng)
Đặt G là CFG sinh ra CFL không chứa ε
Bước 1: xây dựng G' có dạng CNF tương đương G
Bước 2: đổi tên các biến trong G' thành A
1
, A
2
, , A
m
(m ≥1 ) với A
1
là ký hiệu bắt đầu. Đặt V = {A
1
, A
2
, , A
m
}
Bước 3: thay thế luật sinh sao cho nếu A
i
A
j
 thì j > i

• Nếu j<i : áp dụng bổ đề 3. Nếu i=j : áp dụng bổ đề 4 (giải thuật)
• Trong P chỉ chứa các luật sinh dạng: A
i
A
j
 (j > i), A
i
a
hoặc B
k
 với (V  {B
1
,B
2
, ,B
i-1
})*
Bước 4: thay thế các A
i
– luật sinh về đúng dạng (áp dụng bổ đề 3)
Bước 5: thay thế các B
k
– luật sinh về đúng dạng (bổ đề 3)
23
Dạng chuẩn Greibach (GNF)
Giải thuật : (thay thế sao cho A
i

A
i


thì j > i)
Begin
(1) for k := 1 to m do begin
(2) for j := 1 to k-1 do
(3) for Mỗi luật sinh dạng A
k
 A
j
 do
begin
(4) for Tất cả luật sinh A
j
  do
(5) Thêm luật sinh A
k
 ;
(6) Loại bỏ luật sinh A
k
 A
j

end;
(7) for Mỗi luật sinh dạng A
k
 A
k
 do
begin
(8) Thêm các luật sinh B

k
  và B
k
 B
k
;
(9) Loại bỏ luật sinh A
k
 A
k

end;
(10) for Mỗi luật sinh A
k
  trong đó  không bắt đầu bằng A
k
do
(11) Thêm luật sinh A
k
 B
k
end;
end;
24
Dạng chuẩn Greibach (GNF)
Ví dụ: tìm văn phạm có dạng GNF cho văn phạm G sau:
A
1
 A
2

A
1
 A
2
A
3
A
2
 A
3
A
1
 a
A
3
 A
2
A
2
 b
Bước 1: G thỏa CNF
Bước 2: ta có V = {A
1
, A
2
, A
3
}
Bước 3: ta cần sửa đổi luật sinh A
3

 A
2
A
2
• Áp dụng bổ đề 3: A
3
 A
3
A
1
A
2
 aA
2
A
3
 A
3
A
1
A
2
 aA
2
 b
• Áp dụng bổ đề 4, ta thu được tập luật sinh:
A
1
 A
2

A
1
 A
2
A
3
A
2
 A
3
A
1
 a
A
3
 aA
2
 b aA
2
B  bB
B  A
1
A
2
 A
1
A
2
B
25

Dạng chuẩn Greibach (GNF)
Bước 4: A
3
đã có dạng chuẩn. Thay thế A
3
vào A
2
:
B A
1
A
2
 A
1
A
2
B
A
3
aA
2
 b aA
2
B  bB
A
2
aA
2
A
1

 bA
1
aA
2
BA
1
 bBA
1
 a
A
1
aA
2
A
1
A
1
 bA
1
A
1
aA
2
BA
1
A
1
 bBA
1
A

1
 aA
1

aA
2
A
1
A
3
 bA
1
A
3
aA
2
BA
1
A
3
 bBA
1
A
3
 aA
3
Bước 5: thay thế các B
k
– luật sinh
B aA

2
A
1
A
1
A
2
 bA
1
A
1
A
2
aA
2
BA
1
A
1
A
2
 bBA
1
A
1
A
2
 aA
1
A

2

aA
2
A
1
A
3
A
2
 bA
1
A
3
A
2
aA
2
BA
1
A
3
A
2
 bBA
1
A
3
A
2

 aA
3
A
2

aA
2
A
1
A
1
A
2
B bA
1
A
1
A
2
B aA
2
BA
1
A
1
A
2
B  bBA
1
A

1
A
2
B  aA
1
A
2
B
aA
2
A
1
A
3
A
2
B  bA
1
A
3
A
2
B aA
2
BA
1
A
3
A
2

B  bBA
1
A
3
A
2
B 
aA
3
A
2
B

×