คำถามติดแท็ก regular-expressions

คำถามเกี่ยวกับนิพจน์ทั่วไปพิธีการในการอธิบายภาษาปกติ

3
วิธีสร้าง DFA จากนิพจน์ทั่วไปโดยไม่ใช้ NFA
วัตถุประสงค์คือการสร้าง DFA จากนิพจน์ทั่วไปและการใช้ "การแปลงประสบการณ์ปกติ> NFA> การแปลง DFA" ไม่ใช่ตัวเลือก เราจะทำเช่นนั้นได้อย่างไร? ฉันถามคำถามนี้กับอาจารย์ของเรา แต่เขาบอกฉันว่าเราสามารถใช้สัญชาตญาณและปฏิเสธที่จะให้คำอธิบายใด ๆ ดังนั้นฉันอยากถามคุณ "exp ปกติ> NFA> การแปลง DFA" ไม่ใช่ตัวเลือกเนื่องจากการแปลงดังกล่าวใช้เวลานานในการแปลงนิพจน์ทั่วไปที่ค่อนข้างซับซ้อน ตัวอย่างเช่นสำหรับ regex "regex> NFA> DFA" ที่แน่นอนใช้เวลา 1 ชั่วโมงสำหรับมนุษย์ ฉันต้องแปลง regex เป็น DFA ในเวลาน้อยกว่า 30 นาที

2
ภาษาของนิพจน์ทั่วไปต้องการการกดออโต้ลงเพื่อแยกวิเคราะห์หรือไม่
ฉันต้องการแปลงผู้ใช้ที่ป้อนนิพจน์ทั่วไปให้เป็น NFA เพื่อที่ฉันจะสามารถเรียกใช้ NFA กับสตริงสำหรับวัตถุประสงค์ในการจับคู่ เครื่องจักรขั้นต่ำที่สามารถใช้ในการแยกวิเคราะห์นิพจน์ปกติคืออะไร ฉันคิดว่ามันจะต้องเป็นแบบกดลงอัตโนมัติเพราะ presense ของวงเล็บหมายถึงความจำเป็นในการนับและ DFA / NFA ไม่สามารถทำการนับโดยพล สมมติฐานนี้ถูกต้องหรือไม่ ตัวอย่างเช่นนิพจน์ a (bc *) d อาจต้องการ PDA เพื่อให้การจัดการนิพจน์ย่อยในวงเล็บถูกต้อง

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

3
เหตุใดนิพจน์ทั่วไปที่นิยามไว้ด้วยการรวมกันเป็นสหภาพการต่อเรียงและการติดดาว?
expresssion ปกติจะถูกกำหนดเป็นซ้ำ aaaสำหรับบางคนคือการแสดงออกปกติa∈Σa∈Σa \in \Sigma εε\varepsilonเป็นนิพจน์ทั่วไป ∅∅\emptysetเป็นนิพจน์ทั่วไป (R1∪R2)(R1∪R2)(R_1 \cup R_2)โดยที่และเป็นนิพจน์ทั่วไปเป็นนิพจน์ปกติR1R1R_1R2R2R_2 (R1∘R2)(R1∘R2)(R_1 \circ R_2)โดยที่และเป็นนิพจน์ทั่วไปคือนิพจน์ทั่วไปR1R1R_1R2R2R_2 (R1)∗(R1)∗(R_1)^*โดยที่เป็นนิพจน์ทั่วไปคือนิพจน์ทั่วไปR1R1R_1 คำจำกัดความนี้นำมาจากหน้า 64 ของ Sipser, Michael ทฤษฎีการคำนวณเบื้องต้นรุ่นที่ 3 เรียนรู้ Cengage, 2012 ตอนนี้ฉันมีคำถามต่อไปนี้ ทำไมคุณไม่นิยามมีintersection, complementหรือreverseการดำเนินงาน? หากเราเปลี่ยนรายการที่ 4 เป็นเราจะได้คำจำกัดความที่เทียบเท่ากันเช่นสำหรับภาษาปกติแต่ละภาษาจะมีนิพจน์ทั่วไปที่ปรับเปลี่ยนและในทางกลับกันR1∩R2R1∩R2R_1 \cap R_2 ฉันรู้ว่าคำจำกัดความนี้สมบูรณ์และกำหนดชัดเจน แต่ทำไมถึงต้องการคำนิยามอื่น ๆ ที่เทียบเท่านิยามที่ชัดเจนและสมบูรณ์

1
การแยกประเภทการปรับแต่ง
ที่ทำงานฉันได้รับมอบหมายให้อนุมานข้อมูลบางประเภทเกี่ยวกับภาษาแบบไดนามิก ฉันเขียนลำดับของข้อความไปยังletนิพจน์ที่ซ้อนกันเช่น: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } เนื่องจากฉันเริ่มต้นจากข้อมูลประเภททั่วไปและพยายามอนุมานประเภทที่เฉพาะเจาะจงมากขึ้นตัวเลือกที่เป็นธรรมชาติคือประเภทการปรับแต่ง ตัวอย่างเช่นตัวดำเนินการตามเงื่อนไขส่งคืนการรวมของประเภทของสาขาที่เป็นจริงและเท็จ …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

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

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

3
การแสดงออกปกติสามารถไม่มีที่สิ้นสุด?
ฉันรู้ว่าภาษาที่สามารถกำหนดได้โดยใช้นิพจน์ทั่วไปและภาษาที่สามารถจดจำได้โดย DFA / NFA (finite automata) นั้นเทียบเท่า ยังไม่มี DFA สำหรับภาษานี้{0n1n| n≥0}{0n1n|n≥0}\{0^n1^n|n \ge 0\}. แต่ก็ยังสามารถเขียนได้โดยใช้การแสดงออกปกติ (สำหรับเรื่องที่ไม่ได้ภาษาปกติใด ๆ ) เป็น{ ε } ∪ { 01 } ∪ { 0011 } . . . . .{ϵ}∪{01}∪{0011}......\{ \epsilon \} \cup \{01\} \cup \{0011\}....... แต่เรารู้ว่าทุกภาษาที่มีการแสดงออกปกติมี DFA ที่ตระหนักถึงมัน (ขัดแย้งกับคำสั่งก่อนหน้าของฉัน) ฉันรู้ว่านี่เป็นเรื่องเล็กน้อย แต่คำจำกัดความของการแสดงออกปกติรวมถึงเงื่อนไขที่ควรจะมีขอบเขตหรือไม่?

3
DFA สำหรับการยอมรับสตริงไบนารีทั้งหมดของรูปแบบพลังงานของ (ไม่หารด้วย ) คือสำหรับกำหนด
เราสามารถสร้างการยอมรับ DFA เลขฐานสองหารด้วยnnnn ตัวอย่างเช่น DFA ที่ยอมรับเลขฐานสองหารด้วย 2 สามารถเกิดขึ้นได้ดังนี้: ในทำนองเดียวกัน DFA ที่รับเลขฐานสองหารด้วย 3 สามารถเกิดขึ้นได้ดังนี้: เราสามารถทำตามขั้นตอนที่กำหนดไว้อย่างดีเพื่อจัดทำ DFA ประเภทนี้ อย่างไรก็ตามสามารถมีขั้นตอนที่กำหนดไว้ได้ดีหรือดีกว่าที่จะบอกว่าตรรกะสำหรับการสร้าง DFAs ยอมรับจำนวนรูปแบบnknkn^k ? ยกตัวอย่างเช่นให้เราพิจารณา DFA ยอมรับตัวเลขทั้งหมดของรูปแบบ k ภาษานี้จะเป็นจึงมี regex * เราสามารถสร้าง DFA ได้ดังต่อไปนี้: 2k2k2^k{1,10,100,1000,...}{1,10,100,1000,...}\{1,10,100,1000,...\}10∗10∗10^* ฉันลองสร้าง DFA เป็นเวลาและสิ่งที่คล้ายกันใช่ไหม แต่ก็ไม่สามารถที่จะทำเช่นนั้น หรือจะเป็นเพียงว่ารูปแบบของเทียบเท่าไบนารีซึ่งทำให้มันเป็นไปได้ที่จะสร้าง DFA และเราไม่สามารถสร้างการยอมรับ DFA เลขฐานสองทุกรูปแบบสำหรับเฉพาะ ?3k3k3^k2n2n2^nnknkn^knnn

1
regexp เมื่อใดที่ไม่ใช่นิพจน์ปกติ
ตั้งแต่ผมกำลังเรียนวิชาภาษาอย่างเป็นทางการที่วิทยาลัยของฉันฉัน stumbled เมื่อโพสต์ที่น่าสนใจเหล่านี้ ( หนึ่ง สอง ) ซึ่งอธิบายถึงวิธีการที่จะหาจำนวนที่สำคัญใช้regexp ขณะที่ผมกล่าวว่าregexpไม่แสดงออกปกติ เนื่องจากนิพจน์ทั่วไปสามารถจับคู่สตริงที่คำนวณโดย Automite State Automata และการค้นหาหมายเลขเฉพาะไม่สามารถทำได้โดย FSA, regexp ที่แสดงในบล็อกโพสต์ไม่ได้เป็นนิพจน์ปกติทั้งหมดเนื่องจากมันจะย้อนรอยเพื่อจับคู่สตริง เนื่องจากฉันไม่เคยใช้นิพจน์ทั่วไปจริงๆตอนนี้คำถามของฉัน: ฉันจะจำ regexp จากนิพจน์ปกติ "ของจริง" ได้ทันทีโดยดูจากอะไร? คำจำกัดความ: โดยการแสดงออกปกติฉันหมายถึงความคิดตามที่กำหนดไว้ในภาษาที่เป็นทางการ โดย regexp ฉันหมายถึงความคิดที่สนับสนุนโดยภาษาโปรแกรมสมัยใหม่ ไวยากรณ์ regexp มักจะมีคุณสมบัติเพิ่มเติมเช่น backreferences Regexps ตามที่เห็นในภาษาการเขียนโปรแกรมมีประสิทธิภาพมากกว่าการแสดงออกปกติของสไตล์ทางการ

3
คือปกติ?
ฉันใช้ทฤษฎีการคำนวณการสอบเมื่อไม่กี่สัปดาห์ที่ผ่านมาและนี่เป็นหนึ่งในคำถาม: สมมติภาษาL = { (anขม.)R∣ n , m , r ≥ 0 }L={(anbm)r∣n,m,r≥0}L=\{(a^nb^m)^r \mid n,m,r\ge 0\} L ปกติหรือไม่ ถ้าใช่ให้การแสดงออกปกติหรือหุ่นยนต์สำหรับมัน หลังจากฉันถามเขาตอบสั้น ๆ หลังจากการสอบดูเหมือนจะเป็นเรื่องปกติ (ฉันเชื่อว่าเขาบอกว่าการแสดงออกนั้นง่าย ) อย่างไรก็ตามฉันดูเหมือนจะไม่เข้าใจว่าทำไมถึงเป็นเช่นนั้น วิธีที่ฉันเห็นมันเชื่อมโยงมัน rครั้งเช่นนี้:(a* * * *ข* * * *)* * * *(a∗b∗)∗(a^*b^*)^*anขม.anbma^nb^m anขม.anขม.anขม.. . .anขม.anขม.anbmanbmanbm...anbmanbma^nb^ma^nb^ma^nb^m...a^nb^ma^nb^m , ซึ่งไม่ปกติเนื่องจากไม่มีวิธีสำหรับหุ่นยนต์ที่จะเรียกคืนnและmทุกครั้ง ฉันอยู่ตรงนี้ตรงไหน แก้ไข: ฉันคุยกับอาจารย์อีกครั้งเขายอมรับว่ามันเป็นความผิดพลาด ภาษานั้นไม่ปกติอย่างแน่นอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.