Chương 8. Ôtômat hữu hạn và biểu thức chính quy Chương 9 ôtômatpushdownvàvănphạmphingữcảnh I. vănphạmphingữcảnh Như ta đã biết một ngôn ngữ có thể được sinh bởi nhiều vănphạm khác nhau, trong đó có những vănphạm chứa những kí hiệu thừa, hoặc các qui tắc không giúp gì cho việc sinh ngôn ngữ. Hiển nhiên các qui tắc như vậy sẽ làm mất thời gian cho quá trình sinh, do vậy ta cần loại các kí hiệu và qui tắc thừa đó ra khỏi văn phạm. Tức cần giản lược vănphạm đến mức gọn nhất có thể. 1. Giản lược vănphạmphingữcảnh Định nghĩa 1 : − Kí hiệu A ∈ ∆ được gọi là kí hiệu vô sinh nếu không tồn tại ω ∈ Σ* để A |- ω, ngược lại là kí hiệu hữu sinh. − Kí hiệu A ∈ ∆ được gọi là không đến được nếu từ I không dẫn được đến nó, tức không xảy ra I |- α, trong đó α chứa A, ngược lại ta gọi A là đến được. − Kí hiệu A ∈ ∆ được gọi là kí hiệu thừa nếu nó là kí hiệu vô sinh hoặc không đến được − Một qui tắc A → λ được gọi là λ-qui tắc. − Một qui tắc A → B được gọi là qui tắc đơn. VÝ dô 1 : Cho tập R = {I → aA | B, A → aAb | λ, B → cC, D → aB }, khi đó B, C là kí hiệu vô sinh, D là kí hiệu vô sinh và không đến được còn A → λ là một λ-qui tắc. §Þnh lý 1 Đối với một ngôn ngữphingữcảnh L ≠ ∅ bất kỳ, ta luôn luôn xây dựng được một vănphạmphingữcảnh G không chứa kí hiệu thừa sao cho L(G) = L. Chøng minh : Để chứng minh ta lần lượt trình bày cách thức loại kí hiệu vô sinh và không đến được mà ngôn ngữ được sinh bởi vănphạmvẫn không thay đổi. Giả thiết ngôn ngữ L được sinh bởi vănphạmphingữcảnh G = <Σ, ∆, I, R>, ta xây dựng G’ = <Σ’, ∆’, I’, R’> mà trong nó không chứa kí hiệu thừa. i. Loại kí hiệu vô sinh : Nhiệm vụ ở đây thay vì tìm kí hiệu vô sinh trong ∆ để loại, ta sẽ xây dựng lại từng bước tập ∆’ chỉ gồm toàn các kí hiệu hữu sinh, tức ∆’ ⊆ ∆, và A ∈ ∆’ nếu ∃ω ∈ Σ* : A |- ω. Thuật toán được bắt đầu từ ∆’ = ∅, bổ sung dần từng bước các kí hiệu hữu sinh của ∆ vào ∆’ bằng cách khảo sát từng luật dẫn trong R. Thuật toán dừng khi tất cả các luật trong R đã được xét hết. 1 Chương 8. Ôtômat hữu hạn và biểu thức chính quy Thuật toán tìm kí hiệu hữu sinh (xem thuật toán sau) : Proc. Tạo_∆’ { ∆’ = ∅; loop = true; while (R ≠ ∅ and loop) { loop = false; for (r = A → α ∈ R) // A ∈ ∆, α ∈ (Σ ∪ ∆)* if α ∈ (Σ ∪ ∆’)* { // α hoặc là λ hoặc mỗi kí hiệu của nó là ∆’ = ∆’ ∪ { A } ; // kí hiệu kết thúc hoặc kí hiệu thuộc ∆’ R = R \ { r } ; loop = true; break; } } } Sau đó trên tập ∆’ đã xây dựng ta xây dựng tiếp R’. ∆’ = ∅; Repeat lấy r ∈ R có dạng A → X 1 X 2 … Xm với Xi ∈ Σ ∪ ∆’, ∀i. nếu có : R = R \ {r}; ∆’ = ∆ ∪ {A} Until không có; VÝ dô 2 : R = I → IA | a A → bB B → aA ⇒ ∆’ = {I} và R’ = {I → a} VÝ dô 3 : R = I → AB | CA B → BC | AB A → a C → aB | b ⇒ ∆’ = {I, A, C} và R’ = {I → CA, A → a, C → b} ii. Loại kí hiệu không đến được : Tương tự trên ta sẽ xây dựng dần tập ∆’ và Σ’ chứa các kí hiệu đến được như sau : ∆’ = {I}, Σ’ = ∅. Lặp : Xét tất cả các luật dạng A → α, với A ∈ ∆’ (ví dụ đầu tiên A là I). Bổ sung các kí hiệu phụ trong α vào ∆’ và kí hiệu kết thúc vào Σ’. Dừng khi hết luật trong R. Tiếp theo xây dựng lại R’. 2 Chương 8. Ôtômat hữu hạn và biểu thức chính quy ∆’ = {I}; Repeat lấy r ∈ R có dạng A → X 1 X 2 … Xm với A ∈ ∆’. nếu có : R = R \ {r}; ∆’ = ∆ ∪ {Xi | Xi ∈ ∆} ; Until không có; Xây dựng lại Σ’ và R’ trên cơ sở ∆’. VÝ dô 4 : R = { I → AB | a, A → B, C → D} ∆’ = {I} I → AB ⇒ ∆’ = {I, A, B} R’ = {I → AB | a, A → B} §Þnh lý 2 Đối với một ngôn ngữphingữcảnh L ≠ ∅ bất kỳ, ta luôn luôn xây dựng được một vănphạmphingữcảnh G không chứa λ-qui tắc sao cho : L(G) = L\ {λ}. Chøng minh : Để chứng minh ta trình bày cách thức loại λ-qui tắc mà ngôn ngữ được sinh bởi vănphạmvẫn không thay đổi. Giả thiết ngôn ngữ L được sinh bởi vănphạmphingữcảnh G = <Σ, ∆, I, R>, ta xây dựng G’ = <Σ’, ∆’, I’, R’> mà trong nó không chứa kí hiệu thừa. Duyệt từng qui tắc dạng A → λ, loại qui tắc khỏi R và thay bằng qui tắc mới bằng cách : thay A bởi λ (loại A) trong mọi qui tắc có chứa A ở vế phải. Mỗi vị trí của A sẽ sinh ra một qui tắc mới. Qui tắc gốc vẫn giữ lại. Repeat lấy r ∈ R có dạng A → λ ; nếu có : { R = R \ {r}; while (r’ ∈ R có dạng α → βAβ’) R = R ∪ { α → ββ’} ; Until không có; VÝ dô 5 : R = { I → AB, A → aA, B → bB, A → λ, B → λ} I → AB I → AB | I → A * I → AB | I → A | B | λ I → AB | I → A | B A → aA A → aA A → aA | a A → aA | a B → bB B → bB | B → b B → bB | B → b B → bB | B → b A → λ * A → λ * B → λ 3 Chương 8. Ôtômat hữu hạn và biểu thức chính quy §Þnh lý 3 Đối với một ngôn ngữphingữcảnh L ≠ ∅ bất kỳ, ta luôn luôn xây dựng được một vănphạmphingữcảnh G không chứa kí hiệu qui tắc đơn sao cho L(G) = L. Chøng minh : Không mất tính tổng quát ta giả thiết ngôn ngữ L được sinh bởi vănphạmphingữcảnh G = <Σ, ∆, I, R> không có kí hiệu thừa, ta xây dựng G’ = <Σ’, ∆’, I’, R’> mà trong nó không chứa qui tắc đơn sao cho L(G’) = L. repeat lấy r ∈ R có dạng A → B ; nếu có : { R = R \ {r}; while (r’ ∈ R có dạng B → β 1 | β 2 | … | β k ) R = R ∪ { A → β 1 | β 2 | … | β k } ; Until không có; VÝ dô 6 : R = I → IA | AB I → IA | AB A → B A → a | AIB B → a | AIB B → a | AIB VÝ dô 7 : R = I → IA | A I → IA | A I → IA | AB | a A → AB | B A → AB | a A → AB | a B → a B → a B → a §Þnh lý 4 Đối với một ngôn ngữphingữcảnh L ≠ ∅ bất kỳ, ta luôn luôn xây dựng được một vănphạmphingữcảnh G không chứa kí hiệu thừa, λ-qui tắc và qui tắc đơn sao cho L(G) = L. I. vănphạm chuẩn chomsky 4