เครื่องทัวริงสองสถานะสำหรับการจับคู่วงเล็บ


9

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

ฉันกำลังมองหาตัวอย่างของเครื่องจักรทัวริงที่แตกต่างกันและตัวอย่างที่นำเสนอโดยทั่วไปคือเครื่องมือจับคู่วงเล็บ / ตัวตรวจสอบ โดยพื้นฐานแล้วมันจะตรวจสอบว่าสตริงของวงเล็บเช่น(()()()))()()()สมดุลหรือไม่ (ตัวอย่างก่อนหน้านี้จะคืนค่า 0 สำหรับการไม่สมดุล)

ลองเป็นฉันฉันจะได้รับสิ่งนี้เป็นเครื่องสามรัฐ ฉันชอบที่จะรู้ว่าถ้าใครสามารถลดสิ่งนี้ลงให้เหลือน้อยที่สุดในทางทฤษฎีของ 2 และสิ่งที่วิธี / รัฐ / สัญลักษณ์ของพวกเขาเป็นอย่างไร

เพียงเพื่อชี้แจงวงเล็บคือ "แซนวิช" ระหว่างเทปเปล่าดังนั้นในตัวอย่างข้างต้น - - - - - - - (()()()))()()() - - - - - - -จะเป็นอินพุตบนเทป ตัวอักษรจะรวมถึง(, ), 1, 0, -และ*halt*รัฐไม่นับเป็นของรัฐ

สำหรับการอ้างอิงสามสถานะของฉันมีดังนี้: คำอธิบายของรัฐ:

 State s1: Looks for Closing parenthesis

 State s2: Looks for Open parenthesis

 State s3: Checks the tape to ensure everything is matched

 Symbols: ),(,X

การเปลี่ยนสถานะเป็น:

Action: State Symbol NewState WriteSymbol Motion
// Termination behavior
Action: s2 - *halt* 0  -
Action: s1 -  s3    -  r

//Transitions of TM
Action: s1 (  s1  (   l
Action: s1 )  s2  X  r
Action: s1 X  s1  X  l
Action: s2 ( s1 X  l
Action: s2 X  s2 X r
Action: s3 (  *halt* 0 -
Action: s3 X  s3     X r
Action: s3 -  *halt* 1 -

ยกโทษให้อย่างไม่เป็นทางการในการเขียนทั้งหมดนี้ลง ฉันยังคงเรียนรู้โครงสร้างทางทฤษฎีที่อยู่เบื้องหลังสิ่งนี้


เราอนุญาตให้ใช้ตัวอักษรที่ใหญ่กว่านี้ได้ไหม?
กราฟิลส์

@ ราฟาเอลตามผลทางทฤษฎีเราสามารถแลกเปลี่ยนสถานะสำหรับตัวอักษรและในทางกลับกัน ดังนั้นการลดสถานะให้เหลือสองหมายความว่าคุณจะต้องใช้ตัวอักษรที่ใหญ่กว่า ใช่คำตอบสั้น ๆ คือตัวอักษรอาจมีขนาดใหญ่เท่าที่ต้องการ
Four_FUN

ฉันคิดว่าในเทปสอง TM นี้สามารถทำได้โดยไม่มีสัญลักษณ์พิเศษและ
Karolis Juodelė

@Four_FUN คุณมาจาก MIT หรือเปล่า

คำตอบ:


8

เพียงบทสรุป "ซอร์สโค้ด" ของคำตอบของราฟาเอล: นี่เป็นรุ่นที่ใช้งานได้ซึ่งใช้กลอุบายเดียวกัน (ในสถานะ q1) และมีตัวอักษรเทป:
_ ( ) [ { / \ (โดยที่_ เป็นสัญลักษณ์ว่างเริ่มต้น)

q0:  _ -> accept  // accept on empty string and on balanced parenthesis
     ( -> {,R,q1  // mark the first open "(" with "{" and goto q1
     ) -> reject  // reject if found unbalanced ")"
     \ -> /,L,q0  // go left
     / -> \,R,q0  // go right

q1:  ( -> [,R,q1  // replace "(" with "[" and continue ...
     ) -> /,L,q1  // ... until first ")", replace it with "/" and goto left
     [ -> \,R,q1  // found matching "(" bracket, goto right and search for another ")"
     _ -> reject  // no ")" found for the first "{", reject
     { -> \,R,q0  // this must be the last match, goto q0 and check if it is true
     \ -> /,L,q1  // go left
     / -> \,R,q1  // go right

คุณสามารถดูได้ในที่ทำงานโดยใช้เครื่องจำลองทัวริงออนไลน์ ; ซอร์สโค้ดคือ:

0 _ Y r halt
0 ( { r 1
0 ) N r halt
0 \ / l 0
0 / \ r 0
1 ( [ r 1
1 ) / l 1
1 [ \ r 1
1 _ N r halt
1 { \ r 0
1 \ / l 1
1 / \ r 1

หมายเหตุสุดท้าย: หากคุณต้องการดูว่าเทคนิคนี้สามารถผลักให้ถึงขีด จำกัด ได้อย่างไรอ่าน (และพยายามเข้าใจ :-) การสร้างเครื่อง Universal Turing ด้วย 2 สถานะและ 18 สัญลักษณ์โดยY. Rogozhin ใน "Small universal Turing เครื่อง"


เราไม่ได้ตัดสินใจว่าคำตอบที่นำเสนอเฉพาะซอร์สโค้ดนั้นไม่ดีต่อวิทยาศาสตร์คอมพิวเตอร์หรือไม่? ;)
Raphael

1
@ ราฟาเอล: ฉันเห็นด้วยกับคุณ แต่ฉันสามารถดูได้เช่นเดียวกับภาคผนวกของคุณ (ดูเหมือนว่าดีแม้ว่าฉันไม่ได้ตรวจสอบรายละเอียด) ฉันจะเพิ่มบันทึกเกี่ยวกับสิ่งนี้
Vor

1
@ ราฟาเอล: ฉันเขียนมันเพื่อความสนุกในการพยายามลดสัญลักษณ์เทปและมันก็ดูเหมือนว่า "ดูเหมือน" :-) ดังนั้นฉันจึงตัดสินใจโพสต์
Vor

@Vor ขอบคุณมากสำหรับข้อมูลเพิ่มเติมในปัญหานี้ ทั้งหมดนี้บอกฉันว่าฉันต้องการฝึกฝนมากกว่านี้ ขอบคุณสำหรับการโพสต์ซอร์สโค้ดของคุณถึงกระนั้นทฤษฎีก็เป็นสิ่งที่ฉันทำ
Four_FUN

1
@Four_FUN: Rogozhin Universal TM (2,18) เป็นเครื่องทัวริงมาตรฐาน (นอกเหนือจากอินพุตเทปเริ่มต้นที่มีสัญลักษณ์ว่างเปล่าเท่านั้น) ที่จำลองระบบ 2 แท็กโดยพลการ (ซึ่งเป็นรูปแบบสากล) 2 สถานะ 3 สัญลักษณ์หนึ่งเป็นเครื่องทัวริงที่อ่อนแอ (เทปเริ่มต้นจะต้องเต็มไปด้วยลำดับอนันต์ของรูปแบบ) และความเป็นสากลคือ "ถึง" จำลองเซลล์ออโตมาตากฎ 110 (ซึ่งได้รับการพิสูจน์แล้วว่าทัวริงสมบูรณ์ ) มีหลักฐาน (อ้างว่า?) ว่ามาตรฐาน TM (2,3) ไม่สามารถทัวริงได้
Vor

7

คำตอบโง่: ผลลัพธ์ของคุณสัญญาว่าจะมีเครื่องจักรทัวริงสากลที่มีสองสถานะ สร้างใด ๆ TM สำหรับภาษา Dyck คำนวณดัชนีและ hardcode มันลงไปในเครื่องสากล

แต่แน่นอนว่าไม่น่าพอใจมาก วิธีการของคุณใช้งานได้จริงถ้าคุณ "หลอก" ความแตกต่างระหว่างการเลื่อนไปทางซ้ายและไปทางขวาในขณะที่จับคู่วงเล็บให้เป็นส่วนขยายของตัวอักษร พวกเราต้องการ{#,(,),x} และรุ่นที่ทำเครื่องหมายไว้ a^ ของสัญลักษณ์ทั้งหมด a.

  • สถานะเริ่มต้น q0 ทำงานดังนี้

    เมื่อค้นหาสัญลักษณ์ที่ไม่มีเครื่องหมายให้เลื่อนไปทางขวาจนกระทั่งสัญลักษณ์แรก )พบว่า ในขณะที่ทำเช่นนั้นให้เขียนทับสัญลักษณ์ทั้งหมดa กับ a^. เขียนทับการค้นพบ) กับ x^.
    หากไม่มี)คือเราไปถึงสัญลักษณ์ของช่องว่าง #เขียนทับด้วย x^ และเปลี่ยนเป็น q1.

    เมื่อค้นหาสัญลักษณ์ที่มีการทำเครื่องหมายให้เลื่อนไปทางซ้ายจนกระทั่งสัญลักษณ์แรก (^พบการเขียนทับสัญลักษณ์ที่ผ่าน (ทำเครื่องหมาย) ด้วยตัวแปรที่ไม่ได้ทำเครื่องหมายไว้ เขียนทับการค้นพบ(^ กับ x.
    ถ้าเราหา)^ หรือ # ก่อนวนซ้ำ / ปฏิเสธ¹

  • ใน q1เราตรวจสอบว่าทุกอย่างตรงกัน อาจยังคงมีคำนำหน้าของแบบฟอร์ม(^+บนเทป นั่นคือย้ายไปทางซ้ายตราบใดที่เราพบx^. หากเราพบ#ยอมรับ หากเราพบสัญลักษณ์อื่นใดนอกจาก x^ ก่อนวน / ปฏิเสธ


  1. สิ่งนี้ถูกต้องเนื่องจากเครื่องตรงกับด้านใน - ออก ในการป้อนข้อมูลทางกฎหมายมีเพียงx ระหว่างวงเล็บที่จับคู่อยู่ในปัจจุบัน

หากคุณไม่รังเกียจที่จะถามฉันโซลูชันของฉันจะสัญญากับ TM สากลที่มีสองสถานะได้อย่างไร (โซลูชันที่ชาญฉลาดมาก btw.
ขอร้อง

1
@Four_FUN: เพราะคุณกล่าวว่าในคำถามของคุณ: "... หนึ่งในผลทฤษฎีที่ดีคือว่าค่าใช้จ่ายของตัวอักษรขนาดใหญ่ที่อาจเกิดขึ้น (สัญลักษณ์) คุณสามารถลดจำนวนของรัฐลงไปเพียง 2 ..." .. ดังนั้นคุณยังสามารถเลือกเครื่อง Universal Turing ตามอำเภอใจและลดจำนวนสถานะลงเหลือเพียง 2 และถ้าคุณทำการทดลองบางอย่างคุณก็ตระหนักได้ว่ามันไม่ยากเลยที่จะสร้างโพรซีเดอร์อัตโนมัติที่แปลง TM โดยพลการให้เทียบเท่า 2 state TM (หากคุณไม่สนใจว่าจะลดจำนวนตัวอักษรให้เล็กที่สุด)
Vor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.