ทำไมไม่มีการเปลี่ยนแปลงใน Regexes? (แม้ว่าภาษาปกติจะสามารถทำได้)


13

ปัญหา

ไม่มีวิธีง่ายๆในการรับการเปลี่ยนแปลงด้วย regex

  • การเปลี่ยนแปลง:การเดินทางคำ ( "aabc") ในการสั่งซื้ออื่นโดยไม่มีการเปลี่ยนแปลงจำนวนหรือชนิดของตัวอักษร
    W=x1...xn
  • Regex:การแสดงออกปกติ

สำหรับการตรวจสอบ:

วิธีการแก้ปัญหาที่ฉันค้นหา

ควรมีแบบฟอร์ม:

  • » aabc « (หรืออะไรก็ได้ที่คุณสามารถใช้วงเล็บเปิดและปิด)
  • (aabc)! (คล้ายกับ (abc)? แต่มีสัญลักษณ์อื่นในตอนท้าย)
  • [aabc]! (คล้ายกับ [abc] + แต่มีสัญลักษณ์อื่นในตอนท้าย)

ข้อดีของการแก้ปัญหาเหล่านี้

พวกเขาคือ:

  • ง่าย
  • ปรับตัวได้
  • นำมาใช้ใหม่

ทำไมสิ่งนี้ควรมีอยู่

  • Regexes เป็นวิธีการอธิบายไวยากรณ์ของภาษาปกติ พวกเขามีพลังเต็มที่ในการเป็นภาษาประจำชนิดใด ๆ
  • สมมติว่าภาษาปกติมีพลังเพียงพอสำหรับการเรียงสับเปลี่ยน (พิสูจน์ด้านล่าง) - ทำไมไม่มีวิธีง่าย ๆ ในการถ่ายทอดสิ่งนี้

ดังนั้นคำถามของฉันคือ:

  • (ทำไม) หลักฐานของฉันผิด
  • ถ้าถูกต้อง: ทำไมไม่มีวิธีง่าย ๆ ในการแสดงการเรียงสับเปลี่ยน?

การพิสูจน์

  • นิพจน์ทั่วไปเป็นวิธีหนึ่งในการบันทึกไวยากรณ์ของภาษาปกติ พวกเขาสามารถอธิบายไวยากรณ์ภาษาใด ๆ ปกติ
  • อีกวิธีในการอธิบายภาษาปกติใด ๆ (ที่มีจำนวนตัวอักษรที่ จำกัด ภายในตัวอักษรของพวกเขา) ไวยากรณ์เป็น Automatons ที่ไม่ได้กำหนดไว้ (ด้วยจำนวน จำกัด ของรัฐ)

มีจำนวนตัวอักษรที่ จำกัด ฉันสามารถสร้างหุ่นยนต์นี้: (ตัวอย่างเป็นทางการ: ดูด้านล่าง)

ไวยากรณ์ที่ยอมรับการเรียงสับเปลี่ยนของ "abbc":

(เพราะตัวเลขด้านบนอาจมีบางคนรู้วิธีที่จะทำให้ส่วนนี้ดูดีขึ้น)

s -> ah¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (ไม่มีการพิมพ์ผิด!

h² -> bh²²

h² -> ch²³

h³ -> ah¹²

h³ -> bh²³

h¹¹ -> bc

h¹¹ -> cb

h¹² -> bb

h²² -> ac

h²² -> แคลิฟอร์เนีย

h²³ -> ab

h²³ -> ba

เป็นทางการมากขึ้น: (ใช้ finite-state-automaton แต่สามารถทำได้ด้วยไวยากรณ์เช่นกัน)

  • คำ q (ที่มีความยาว จำกัด ) ซึ่งการเรียงสับเปลี่ยนใด ๆ ควรถึงสถานะที่ยอมรับได้
  • X คือตัวอักษรที่ จำกัด
  • Set of states S ประกอบด้วยลำดับของตัวอักษรใด ๆ ที่ยาวถึง q (ดังนั้นขนาดของ S จึงมี จำกัด ) บวกหนึ่งสถานะของ "คำที่ยาวกว่า"
  • ฟังก์ชั่นการเปลี่ยนสถานะ d ซึ่งใช้ตัวอักษรและย้ายไปยังสถานะที่สอดคล้องกับส่วนที่อ่านในขณะนี้ของคำ
  • F คือชุดของสถานะที่เป็นพีชคณิตที่แน่นอนของ q

ดังนั้นจึงเป็นไปได้ที่จะสร้างออโตเมติกอัน จำกัด สำหรับการยอมรับการเรียงสับเปลี่ยนของคำที่กำหนด

ย้ายไปพร้อมกับหลักฐาน

ดังนั้นฉันได้พิสูจน์แล้วว่าภาษาปกติมีอำนาจในการตรวจสอบวิธีการเรียงสับเปลี่ยนใช่ไหม?

เหตุใดจึงไม่มีวิธีเข้าถึงสิ่งนี้ด้วย Regexes มันเป็นฟังก์ชั่นที่มีประโยชน์


10
คุณสามารถแสดงรายการเรียงสับเปลี่ยนทั้งหมดของคำของคุณด้วยการแสดงออกปกติ การแสดงออกที่เกิดขึ้นจะมีขนาดใหญ่มาก แต่จะเป็นการแสดงออกปกติ
Yuval Filmus

7
ฉันขอแนะนำให้ละเว้นคำตอบทั้งหมดเกี่ยวกับทฤษฎีการคำนวณใน stackoverflow นี่ไม่ใช่ความพิเศษของเว็บไซต์
Yuval Filmus

คำตอบในหน้าที่เชื่อมโยงของคุณที่นี่ - stackoverflow.com/a/3102205/6936386 - ดูเหมือนจะปรับตัวได้ง่ายและไม่ซับซ้อนเกินไป: ^(a()|a()|b()|c()){4}\2\3\4\5$ดูเหมือนว่าจะใช้งานได้ (ดูregex101.com/r/9URPpg/4/tests )
boboquack

7
@boboquack นั่นไม่ใช่การแสดงออกปกติในแง่ที่คำนี้ใช้ในวิทยาการคอมพิวเตอร์ (เรื่องแบบนี้เป็นเหตุผลที่ Yuval ไม่แนะนำให้เชื่อใจคำตอบ Stack Overflow เกี่ยวกับทฤษฎี CS)
David Richerby

คำตอบ:


37

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

สมมติว่าเราเพิ่มกฎใหม่สำหรับการสร้างการแสดงออกปกติ: ถ้าR  คือการแสดงออกปกติแล้วπ(R)คือการแสดงออกปกติและมันตรงกับการเปลี่ยนแปลงของสตริงทุกทุกการจับคู่โดย  RRดังนั้นสำหรับตัวอย่างเช่นL(π(abc))={abc,acb,bac,bca,cab,cba}. ปัญหาคือว่าสิ่งนี้ทำลายความเท่าเทียมขั้นพื้นฐานที่อธิบายข้างต้น L(π((ab))))เป็นภาษาของสตริงที่มีจำนวนเท่ากับของและและนี้ไม่ได้เป็นภาษาปกติ เปรียบเทียบสิ่งนี้กับการเพิ่มโอเปอเรเตอร์การปฏิเสธหรือการกลับรายการในนิพจน์ทั่วไปซึ่งจะไม่เปลี่ยนคลาสของภาษาที่ยอมรับa

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


แต่ L ((ab) *) ไม่ใช่ภาษาปกติดังนั้น L (Perm ((ab) *)) จึงไม่สามารถเป็นหนึ่งได้ ((ab) * ไม่ใช่ภาษาปกติเนื่องจากไม่มีหน่วยความจำที่จำได้ว่ามีการเปิด "a" อยู่กี่ครั้งดังนั้นด้วยจำนวน จำกัด ของสถานะที่คุณไม่สามารถใส่ "b" s จำนวนเดียวกัน)
Asqiir

9
L((a)* * * *){ε,a,aa,aaa,aaaa,...}{ε,a,aa,aaa,aaaa,...}

4
a

2
คุณพูดถูก ฉันพลาดจุดที่ "ใส่นิพจน์ทั่วไปเข้าด้วยกัน" ฉันแค่คิดถึง "การเปลี่ยนคำศัพท์ที่คงที่" ไม่ใช่ "การเปลี่ยนตำแหน่ง regex อื่น" ซึ่งแน่นอนว่าเป็นไปไม่ได้
Asqiir

1
บางทีนิพจน์ทั่วไปที่มีพีชคณิตอธิบายคลาสของภาษาที่มีคุณสมบัติที่น่าสนใจ แต่ฉันไม่เคยต้องการ!โอเปอเรเตอร์ในทางปฏิบัติและฉันคิดว่ามีบางคนที่ทำได้ง่ายและไม่มีการใช้นิพจน์ทั่วไปที่ขยายออกไป ' เคยเห็นสนับสนุนมัน
reinierpost

16

ดังนั้นคำถามของฉันคือ:

  • (ทำไม) หลักฐานของฉันผิด
  • ถ้าถูกต้อง: ทำไมไม่มีวิธีง่าย ๆ ในการแสดงการเรียงสับเปลี่ยน?

"การพิสูจน์" ของคุณดูที่การเรียงสับเปลี่ยนของคำเดียวซึ่งเป็นภาษาที่ จำกัด

ทุกภาษาที่ จำกัด เป็นปกติ (เช่นเพียงแค่แสดงรายการสมาชิกทั้งหมดด้วย|inbetween) แต่มีภาษาปกติที่ไม่มีที่สิ้นสุด (และภาษาเหล่านี้มักเป็นภาษาที่น่าสนใจมากกว่า)

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

คำตอบของ David Richerby เป็นตัวอย่างของภาษาปกติที่ภาษาการเรียงสับเปลี่ยนไม่ได้เป็นแบบปกติอีกต่อไปตัวอย่างทั้งหมดเป็นภาษาไม่มีที่สิ้นสุด


8

ΣnΣmO(m)

ดังนั้นในบางแง่มุมไม่มีวิธีรวบรัดที่จะระบุการเรียงสับเปลี่ยนของคำทั้งหมด


Ω~(2n)ΣnmO(m)

L(xi,yi)1iN

  • xiyiL
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

Lnσ1,,σnnSσ1,,σnn/2xSSySSxSySLnSTxSyTLnLn(nn/2)=Ω(2n/n)


หมายความว่า 1) ในทางทฤษฎีแล้วมันจะเป็นไปได้ที่จะให้» abc «ตรงกับ {abc, acb, bac, bca, cab, cba} ทั้งหมด แต่มันไม่ได้มีประสิทธิภาพและจะทำให้มันช้าเกินไปเนื่องจาก abc «จะขยายแบบทวีคูณไป (ABC | ACB | BAC | BCA | รถแท็กซี่ | CBA)? หรือ 2) ชนิดของหุ่นยนต์ที่ฉันต้องการไม่สามารถระบุการเรียงสับเปลี่ยนทั้งหมดสำหรับคำที่กำหนดได้หรือไม่?
Asqiir

1
abcabc+acd+bac+bca+cab+cba1+3+6+6+1=17abcdefghij.
Yuval Filmus

1
สิ่งที่ฉันเข้าใจ: ในทางทฤษฎีภาษาทั่วไปสามารถยอมรับการเรียงสับเปลี่ยน (เช่นการแสดงออกปกติ) ไม่มี "วิธีง่ายๆ" ในการเขียน "การเรียงสับเปลี่ยนของ abc" เช่น» abc « (ด้วยเหตุผลอะไรก็ตาม)
Asqiir

1
ใช่นั่นเป็นบทสรุปที่ดี ฉันจะดูว่าฉันสามารถโต้เถียงง่ายขึ้นสำหรับการแสดงออกปกติ
Yuval Filmus

2
สำหรับผู้อ่านในอนาคต: นี่ไม่ใช่คำตอบที่ถูกต้อง! (แก้ไขฉันถ้าฉันผิด) มองหาที่ยอมรับ
Asqiir

0

เหตุใดจึงไม่มีวิธีเขียน "การเปลี่ยนแปลง" ใน Regexes

การเรียงสับเปลี่ยนของภาษาปกติและไม่มีที่สิ้นสุด (จำนวนคำที่ไม่ จำกัด ) ไม่จำเป็นต้องเป็นปกติ ดังนั้นจึงไม่สามารถเขียนเป็น regex

พิสูจน์

(ab)*คิดว่าของภาษา (ตัวอย่างแรงบันดาลใจจากเดวิด Richerby .) a*b*หนึ่งในพีชคณิตของมันคือ นี่ไม่ใช่ภาษาปกติ QED

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.