ฉันมีปัญหาง่ายๆในการทำ DFA ซึ่งรับอินพุตทั้งหมดที่เริ่มต้นด้วยตัวอักษรคู่ (aa, bb) หรือลงท้ายด้วยตัวอักษรคู่ (aa, bb), ให้เป็นชุดตัวอักษรของ ภาษาที่กำหนด
ฉันพยายามที่จะแก้ปัญหาในทางอ้อมโดย:
- การสร้างการแสดงออกปกติ
- ทำให้ NFA ที่สอดคล้องกัน
- ใช้การสร้าง powerset เพื่ออนุมาน DFA
- การลดจำนวนสถานะใน DFA ให้น้อยที่สุด
ขั้นตอนที่ 1: การแสดงออกปกติสำหรับปัญหาที่กำหนดคือ (ท่ามกลางผู้อื่นนับไม่ถ้วน):
((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))
ขั้นตอนที่ 2: NFAสำหรับการแสดงออกที่กำหนดคือ:
(ที่มา: livefilestore.com )
ในรูปแบบตาราง NFA คือ:
State Input:a Input:b
->1 2,5 3,5
2 4 -
3 - 4
(4) 4 4
5 5,7 5,6
6 - 8
7 8 -
(8) - -
ขั้นตอนที่ 3:แปลงเป็น DFA โดยใช้การสร้าง powerset:
Symbol, State + Symbol, State (Input:a) + Symbol, State (Input:b)
->A, {1} | B, {2,5} | C, {3,5}
B, {2,5} | D, {4,5,7} | E, {5,6}
C, {3,5} | F, {5,7} | G, {4,5,6}
(D), {4,5,7} | H, {4,5,7,8} | G, {4,5,6}
E, {5,6} | F, {5,7} | I, {5,6,8}
F, {5,7} | J, {5,7,8} | E, {5,6}
(G), {4,5,6} | D, {4,5,7} | K, {4,5,6,8}
(H), {4,5,7,8} | H, {4,5,7,8} | G, {4,5,6}
(I), {5,6,8} | F, {5,7} | I, {5,6,8}
(J), {5,7,8} | J, {5,7,8} | E, {5,6}
(K), {4,5,6,8} + D, {4,5,7} + K, {4,5,6,8}
ขั้นตอนที่ 4:ย่อเล็กสุด DFA:
ฉันเปลี่ยน K-> G, J-> F, I-> E ก่อน ในการทำซ้ำครั้งถัดไป H-> D และ E-> F ดังนั้นตารางสุดท้ายคือ:
State + Input:a + Input:b
->A | B | C
B | D | E
C | E | D
(D) | D | D
(E) | E | E
และตามแผนภาพดูเหมือนว่า:
(ที่มา: livefilestore.com )
... ซึ่งไม่ใช่ DFA ที่ต้องการ! ฉันตรวจสอบผลลัพธ์ของฉันแล้วสามครั้ง ดังนั้นฉันไปผิดที่ไหน
บันทึก:
- -> = สถานะเริ่มต้น
- () = สถานะสุดท้าย