วิธีแปลง NFA ด้วยการวนรอบที่ซ้ำซ้อนเป็นนิพจน์ทั่วไป


11

ถ้าฉันเข้าใจถูกต้อง NFA มีพลังการแสดงออกเช่นเดียวกับการแสดงออกปกติ บ่อยครั้งที่การอ่านการแสดงออกปกติเทียบเท่าจาก NFA นั้นเป็นเรื่องง่าย: คุณแปลวัฏจักรเป็นดวงดาวทางแยกเป็นทางเลือกและอื่น ๆ แต่จะทำอย่างไรในกรณีนี้:

ป้อนคำอธิบายรูปภาพที่นี่
[ แหล่งที่มา ]

รอบที่ทับซ้อนกันทำให้มองเห็นสิ่งที่หุ่นยนต์นี้ยอมรับได้ยาก (ในแง่ของนิพจน์ทั่วไป) มีเคล็ดลับหรือไม่?


2
มันจะดีถ้าคุณสามารถระบุในไดอะแกรมว่าสถานะเริ่มต้นและสุดท้ายคือ: ลูกศรขนาดเล็กไปยังสถานะเริ่มต้นและวงกลมสองวงเป็นสถานะสุดท้าย นอกจากนี้ยังเป็นการยากที่จะทราบว่าคุณกำลังทำผิดพลาดอะไรหากคุณไม่ได้ระบุสิ่งที่คุณได้ลอง
Dave Clarke

บางทีเอกสารนี้สามารถช่วยคุณได้: มันอธิบายวิธีแปลง NFA เป็น RE อย่างชัดเจน
Vor

1
ทำไมมันยาก คุณได้ลองอัลกอริทึมแบบบัญญัติหรือไม่? ansatz ที่ดีที่สุดที่คุณสามารถทำได้คืออะไร?
Raphael

3
ฉันแก้ไขเพื่อทำให้คำถาม (imho) น่าสนใจและดีสำหรับไซต์นี้ ดูประวัติการแก้ไขเพื่อแสดงความคิดเห็น
Raphael

1
ฉันมีคำตอบที่พร้อมที่จะเปลี่ยน NFA ของคุณให้เป็นนิพจน์ปกติ แต่ฉันลบมันออกไป: คำตอบของ Raphael ให้วิธีที่คุณต้องการด้วยตัวคุณเอง ต้องการ. หากคุณยังต้องการโซลูชันของฉันฉันจะยกเลิกการลบคำตอบของฉัน
อเล็กซ์สิบบริงค์

คำตอบ:


5

แทนที่จะ "อ่านออก" คุณควรใช้วิธีการหนึ่งในหลายวิธีในการทำเช่นนี้ จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันเคยเห็นคือสิ่งที่แสดงออกถึงหุ่นยนต์เป็นระบบสมการของภาษา (ปกติ) ซึ่งสามารถแก้ไขได้ โดยเฉพาะอย่างยิ่งมันเป็นสิ่งที่ดีเพราะดูเหมือนว่าจะให้การแสดงออกที่กระชับมากกว่าวิธีอื่น

ฉันเขียนเอกสารนี้เพื่ออธิบายวิธีการสำหรับฤดูร้อนที่ผ่านมา มันเกี่ยวข้องโดยตรงกับการบรรยายเฉพาะ การอ้างอิงที่กล่าวถึงเป็นคำจำกัดความทั่วไปของนิพจน์ทั่วไป หลักฐานของเล็มม่าของอาร์เดน (ผลที่ต้องการ) มีอยู่; หนึ่งสำหรับความถูกต้องของวิธีการที่ขาดหายไป ขณะที่ฉันเรียนรู้จากการบรรยายฉันไม่มีข้อมูลอ้างอิงน่าเศร้า

qi

Qi=qiaqjaQj{{ε}, qiF, else

Fqiaqjqiqja+

QiqiQ0q0

แอปพลิเคชันสำหรับหุ่นยนต์ที่ให้ไว้จะถูกทิ้งไว้เป็นแบบฝึกหัด ตัวอย่างที่สมบูรณ์จะรวมอยู่ในข้างต้นเชื่อมโยงเอกสาร

ดูที่นี่ที่ฉันโพสต์คำตอบที่คล้ายกัน


1
ดูคำถามอ้างอิงนี้สำหรับวิธีการทั่วไปอื่น ๆ
กราฟิลส์

3

หากมีเพียงอเมริกาที่ไม่มีห่วงคุณจะรู้ได้อย่างไรว่าจะต้องทำอย่างไร

หากมีการวนซ้ำง่าย ๆ โดยไม่มีการแยกย่อยที่ซ้อนกันนี้คุณจะรู้ได้อย่างไรว่าต้องทำอย่างไร

(หากคำตอบคือ "ไม่" ให้นึกถึงกรณีเหล่านี้ก่อน)

ตอนนี้ความคิดคือการเปลี่ยนออโตเมติกอย่างต่อเนื่องเพื่อวางไว้ในรูปแบบที่คุณสามารถมองเห็นรูปแบบเหล่านั้น: โซ่ลูปและเส้นทางที่แตกต่างที่เชื่อมโยงกันใหม่ในตอนท้าย ในทุกขั้นตอนของการเปลี่ยนแปลงระวังว่าหุ่นยนต์เปลี่ยนรูปยังคงจดจำภาษาเดียวกันได้

เก็บไว้ในใจว่านี่คือไม่ใช่หุ่นยนต์ -deterministic สิ่งที่คุณโพสต์นั้นเป็นสิ่งที่กำหนดได้ แต่ก็ไม่จำเป็นต้องทำอย่างนั้นเมื่อคุณเปลี่ยนมัน

q2q1fq2gq3q4q2q5q4jq5gq3

q3,q4,q5q3q3(hjg)

ใช้ความระมัดระวังในการตรวจสอบว่ารัฐใดเป็นที่สิ้นสุด มันสามารถช่วยให้ไม่ต้องกังวลเกี่ยวกับเรื่องนี้ในตอนแรกและทำให้วนรอบขนาดใหญ่หนึ่งชิ้นจากนั้นทำซ้ำชิ้นส่วนที่ยุติบางส่วนผ่านวง

นี่ไม่ใช่เทคนิคที่มีประสิทธิภาพมากที่สุดหรือเป็นเทคนิคที่สร้างนิพจน์ธรรมดาที่ง่ายที่สุด แต่ก็ง่าย


3

แยก q_1


และนี่ตอบคำถามได้อย่างไร
Raphael

1
หากคุณเขียนเครื่องรัฐด้วยวิธีนี้ตอนนี้มันเป็นเรื่องง่ายที่จะอ่านการแสดงออกปกติท
Jukka Suomela

1
บางทีคุณควรรวมสิ่งนี้ไว้ในข้อความคำตอบ ใช้งานได้หรือไม่
Raphael

@ ราฟาเอล: มันใช้งานได้ในกรณีนี้ :) ความคิดทั่วไปที่อยู่เบื้องหลังเคล็ดลับนี้คือ: เราทำวงจร "ซ้อนกันอย่างเหมาะสม" นั่นก็คือเราไม่ได้มีโครงสร้างวงจรแต่[(]) [()]
Jukka Suomela
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.