रेगेक्स में कोई परमीशन क्यों नहीं है? (भले ही नियमित भाषाएं ऐसा करने में सक्षम हों)


13

समस्या

रेगेक्स के साथ एक क्रमचय प्राप्त करने का कोई आसान तरीका नहीं है।

  • क्रमपरिवर्तन: एक शब्द x_n (“aabc”) को दूसरे क्रम में, बिना संख्या या अक्षरों के परिवर्तन के।
    w=x1xn
  • रेगेक्स: नियमित अभिव्यक्ति।

सत्यापन के लिए:

मैं जिस तरह का समाधान खोज रहा हूं

इसका रूप होना चाहिए:

  • »Aabc« (या कुछ और आप एक उद्घाटन और समापन कोष्ठक का उपयोग कर सकते हैं)
  • (Aabc)! (इसी तरह) (एबीसी)? लेकिन अंत में एक और प्रतीक के साथ)
  • [Aabc]! (इसी तरह [एबीसी] + लेकिन अंत में एक और प्रतीक के साथ)

इन समाधानों के लाभ

वो हैं:

  • आसान
  • अनुकूलनीय
  • पुन: प्रयोज्य

ऐसा क्यों होना चाहिए

  • Regexes एक नियमित भाषा के व्याकरण का वर्णन करने का एक तरीका है। उनके पास किसी भी तरह की नियमित भाषा होने की पूरी शक्ति है।
  • मान लीजिए, नियमित भाषाएं क्रमपरिवर्तन के लिए पर्याप्त शक्तिशाली हैं (नीचे प्रमाण) - इसे व्यक्त करने का कोई आसान तरीका क्यों नहीं है?

तो मेरा सवाल है:

  • (क्यों) क्या मेरा प्रमाण गलत है?
  • यदि यह सही है: तो क्रमपरिवर्तन व्यक्त करने का कोई आसान तरीका क्यों नहीं है?

सबूत

  • नियमित भाव एक नियमित भाषा के व्याकरण को नोट करने का एक तरीका है। वे किसी भी नियमित भाषा व्याकरण का वर्णन कर सकते हैं।
  • किसी भी नियमित भाषाओं का वर्णन करने का एक अन्य तरीका (जिसमें उनकी वर्णमाला के भीतर अक्षरों की एक सीमित संख्या है) व्याकरण गैर-नियतात्मक ऑटोमैटोन (राज्यों की एक सीमित संख्या के साथ) हैं।

अक्षरों की एक सीमित संख्या होने से मैं यह ऑटोमेटन बना सकता हूं: (उदाहरण: औपचारिक: नीचे देखें)

व्याकरण जो "abbc" के क्रमपरिवर्तन को स्वीकार करता है:

(शीर्ष पर संख्याओं के लिए sry, शायद किसी को पता है कि इस भाग को बेहतर कैसे बनाना है)

s -> आह¹

s -> bh -

s -> ch³

h -> bh¹¹

h -> ch¹

h -> ah² (कोई टाइपो! समतुल्यता)

h -> bh²²

h -> ch²

h -> आह³

h -> bh²³

h -> ई.पू.

h -> सीबी

h -> बी.बी.

h -> एसी

h -> सीए

h -> अब

h -> बा

अधिक औपचारिक: (एक परिमित-राज्य-ऑटोमेटन का उपयोग करके लेकिन यह व्याकरण के साथ भी बनाया जा सकता है)

  • एक शब्द क्यू (परिमित लंबाई के साथ) जिसमें किसी भी क्रमपरिवर्तन को स्वीकार करने की स्थिति में पहुंचना चाहिए।
  • X परिमित वर्णमाला है।
  • राज्यों के सेट में क्ष की लंबाई तक अक्षरों का कोई भी क्रम होता है। (अतः S का आकार परिमित है।) "किसी भी लंबे शब्द" की एक अवस्था।
  • राज्य संक्रमण फ़ंक्शन d जो एक अक्षर लेता है और उस स्थिति पर चलता है जो शब्द के अब पढ़े गए भाग से मेल खाती है।
  • F उस अवस्था का एक सेट है जो q के सटीक क्रमपरिवर्तन है।

इसलिए किसी दिए गए शब्द के क्रमपरिवर्तन को स्वीकार करने के लिए एक परिमित राज्य ऑटोमेटन बनाना संभव है।

प्रमाण के साथ आगे बढ़ना

इसलिए मैंने साबित कर दिया है कि नियमित भाषाओं में क्रमपरिवर्तन के लिए जाँच करने की शक्ति है, है न?

तो रेगेक्स के साथ इस तक पहुंचने के लिए कोई दृष्टिकोण क्यों नहीं है? यह एक उपयोगी कार्यक्षमता है।


10
आप अपने शब्द के सभी क्रमपरिवर्तन को एक नियमित अभिव्यक्ति के साथ सूचीबद्ध कर सकते हैं। परिणामी अभिव्यक्ति काफी बड़ी होगी, लेकिन निश्चित रूप से एक नियमित अभिव्यक्ति होगी।
युवल फिल्मस

7
मैं स्टैकओवरफ्लो पर संगणना के सिद्धांत के बारे में सभी उत्तरों को अनदेखा करने का सुझाव देता हूं। यह उस साइट की विशेषता नहीं है।
युवल फिल्मस

यहां आपके लिंक किए गए पृष्ठ पर जवाब - stackoverflow.com/a/3102205/6936386 - लगता है कि आसानी से अनुकूलनीय है और बहुत जटिल नहीं है: ^(a()|a()|b()|c()){4}\2\3\4\5$काम करने लगता है (देखें regex101.com/r/9URPpg/4/tests )।
बोबाकैक

7
@boboquack उस अर्थ में एक नियमित अभिव्यक्ति नहीं है जिसमें इस शब्द का उपयोग कंप्यूटर विज्ञान में किया जाता है। (इस तरह की बात ठीक है कि युवल ने सैद्धांतिक सीएस के बारे में स्टैक ओवरफ्लो के जवाबों पर भरोसा नहीं करने का सुझाव दिया है।)
डेविड रिचेर्बी

जवाबों:


37

औपचारिक भाषा सिद्धांत की मूलभूत प्रमेयता यह है कि नियमित अभिव्यक्ति, नियमित व्याकरण, नियतात्मक परिमित ऑटोमेटा (डीएफए) और नॉनडेर्मिनिस्टिक परिमित ऑटोमेटा (एनएफए) सभी एक ही प्रकार की भाषाओं का वर्णन करते हैं: अर्थात् नियमित भाषा। तथ्य यह है कि हम इन भाषाओं का इतने सारे अलग-अलग तरीकों से वर्णन कर सकते हैं कि इन भाषाओं के बारे में कुछ स्वाभाविक और महत्वपूर्ण है, उसी तरह से ट्यूरिंग मशीनों, लैम्ब्डा कैलकुलस और अन्य सभी प्रकार की चीजों के तुल्यता से पता चलता है कि गणना योग्य भाषाएं प्राकृतिक और महत्वपूर्ण हैं। वे मूल खोजकर्ता जो भी यादृच्छिक निर्णय लेते हैं, वे सिर्फ एक कलाकृति नहीं हैं।

मान लीजिए कि हम नियमित अभिव्यक्ति बनाने के लिए एक नया नियम जोड़ते हैं: यदि  एक नियमित अभिव्यक्ति है, तो एक नियमित अभिव्यक्ति है, और यह द्वारा मिलान किए गए प्रत्येक स्ट्रिंग के प्रत्येक क्रम से मेल खाता है  । इसलिए, उदाहरण के लिए, । समस्या यह है कि यह ऊपर वर्णित मूलभूत समकक्षों को तोड़ता है। तार कि की एक समान संख्या में होते हैं की भाषा है और और यह एक नियमित रूप से भाषा नहीं है। उदाहरण के लिए, एक नकारात्मक या उलट संचालक को नियमित अभिव्यक्तियों से जोड़कर इसकी तुलना करें, जो स्वीकार की जाने वाली भाषाओं के वर्ग को नहीं बदलता है।Rπ(R)RL(π(abc))={abc,acb,bac,bca,cab,cba}L(π((ab))))ab

इसलिए, शीर्षक प्रश्न का उत्तर देने के लिए, नियमित अभिव्यक्ति क्रमपरिवर्तन नहीं कर सकती हैं और हम उस क्षमता को नहीं जोड़ते हैं क्योंकि तब नियमित अभिव्यक्ति नियमित भाषाओं से मेल नहीं खाती। यह कहने के बाद, यह संभव है कि "क्रमपरिवर्तन के साथ नियमित अभिव्यक्ति" भी विभिन्न प्रकार की विशेषताओं के साथ भाषाओं का एक दिलचस्प वर्ग होगा।


लेकिन L ((ab) *) कोई नियमित भाषा नहीं है - इसलिए L (perm ((ab) *)) एक नहीं हो सकता। ((ab) * कोई नियमित भाषा नहीं है क्योंकि यह याद रखने के लिए किसी प्रकार की मेमोरी नहीं है कि कितने "" a हैं, इसलिए राज्यों की एक सीमित संख्या के साथ आप "b" s की समान संख्या नहीं डाल सकते।)
Asqiir

9
@Asqiir नियमित है क्योंकि यह दी गई नियमित अभिव्यक्ति द्वारा मेल की गई भाषा है। आपको गलतफहमी होने लगती है कि भाषा क्या है। यह , न कि । बाद की भाषा नियमित नहीं है, लेकिन यह वह भाषा नहीं है जिसके बारे में हम बात कर रहे हैं। L((ab)){ε,ab,abab,ababab,abababab,}{ε,ab,aabb,aaabbb,aaaabbbb,}
डेविड रिचेर्बी

4
@Asqiir यह वह भाषा है क्योंकि यह वह है जिसे आप किसी भी क्रमपरिवर्तन को लागू करके प्राप्त करते हैं, जिसे आप उस भाषा में चाहते हैं जिसमें प्रत्येक स्ट्रिंग में s और s की समान संख्या हो ; यह नियमित नहीं है क्योंकि आप यह साबित कर सकते हैं कि पंपिंग लेम्मा का उपयोग करना। ab
डेविड रिचीर्बी

2
आप पूरी तरह से सही हैं। मुझे "एक दूसरे में नियमित अभिव्यक्ति डालने" की बात याद आती है, मैंने केवल "एक निश्चित शब्द को क्रमबद्ध करने" के बारे में सोचा था "एक और रेगेक्स की अनुमति नहीं" जो निश्चित रूप से संभव नहीं है।
असकिर

1
शायद क्रमपरिवर्तन के साथ नियमित अभिव्यक्ति दिलचस्प गुणों वाली भाषाओं की एक श्रेणी का वर्णन करती है, लेकिन मुझे !अभ्यास में ऑपरेटर की आवश्यकता में कभी नहीं चला है , और मुझे लगता है कि कुछ लोगों के पास है, क्योंकि इसे लागू करना आसान है, और विस्तारित नियमित अभिव्यक्तियों का कोई कार्यान्वयन नहीं है ' देखा देखा समर्थन करता है।
रीइनियरियरपोस्ट

16

तो मेरा सवाल है:

  • (क्यों) क्या मेरा प्रमाण गलत है?
  • यदि यह सही है: तो क्रमपरिवर्तन व्यक्त करने का कोई आसान तरीका क्यों नहीं है?

आपके "प्रमाण" ने केवल एकल शब्दों के क्रमपरिवर्तन पर ध्यान दिया, जो परिमित भाषाएं हैं।

प्रत्येक परिमित भाषा नियमित होती है (जैसे कि सभी सदस्यों को एक |इनबेट्विन के साथ सूचीबद्ध करके ), लेकिन अनंत नियमित भाषाएं हैं (और वे आमतौर पर अधिक दिलचस्प हैं)।

जैसे ही आपको एक नियमित अभिव्यक्ति (या व्याकरण / ऑटोमेटोन) मिलती है, जो एक अनंत भाषा को स्वीकार करता है (यानी *ऑपरेटर के साथ एक अभिव्यक्ति , या एक पाश के साथ एक ऑटोमेटन), आपका निर्माण अब काम नहीं करता है (आपको एक अनंत व्याकरण / ऑटोमेटन मिलता है) )।

डेविड रिचेर्बी के जवाब ने एक नियमित भाषा का उदाहरण दिया, जिसकी क्रमपरिवर्तन भाषा अब नियमित नहीं है - ऐसे सभी उदाहरण अनंत भाषाएं हैं।


8

Let आकार की एक वर्णमाला हो । सभी क्रमपरिवर्तन का वर्णन करने वाली एक नियमित अभिव्यक्ति का घातीय आकार होना चाहिए। यह संदर्भ-मुक्त व्याकरण के लिए निचले सीमा में प्रमेय 9 से आता है , जो संदर्भ-मुक्त व्याकरण के बहुत मजबूत मॉडल पर एक घातीय निचली सीमा देता है (आकार की एक नियमित अभिव्यक्ति को आकार संदर्भ-मुक्त व्याकरण में परिवर्तित किया जा सकता है )।ΣnΣmO(m)

तो कुछ अर्थों में, एक शब्द के सभी क्रमपरिवर्तन को निर्दिष्ट करने का कोई सुसंगत तरीका नहीं है।


यहाँ एक लिए एक सरल प्रमाण है जो आकार वर्णमाला के सभी क्रमपरिवर्तन की भाषा के लिए एक नियमित अभिव्यक्ति के आकार पर सीमित है । चूँकि आकार की एक नियमित अभिव्यक्ति राज्यों के साथ NFA में परिवर्तित की जा सकती है, यह FFA पर कम बाउंड देने के लिए पर्याप्त है।Ω~(2n)ΣnmO(m)

हम बेवकूफ बनाने की विधि का उपयोग करेंगे , जिसका वर्णन अब हम करते हैं। चलो एक भाषा हो, और शब्द के जोड़े का एक संग्रह होना ऐसा है कि:L(xi,yi)1iN

  • xiyiL
  • अगर तो या तो या ।ijxiyjLxjyiL

तब लिए प्रत्येक NFA में कम से कम अवस्थाएँ होती हैं। वास्तव में, लिए किसी भी एनएफए पर विचार करें । प्रत्येक के लिए , में से कुछ को स्वीकार गणना पर विचार , और राज्य हो कि NFA को पढ़ने के बाद है इस को स्वीकार गणना में। मेरा दावा है कि लिए । वास्तव में, अगर तो एक तर्क शो "कट और पेस्ट" है कि दोनों और में हैं , इस धारणा के विपरीत।LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

अब हम पर निचली सीमा को प्रतीकों के सभी क्रमपरिवर्तन की भाषा के लिए सिद्ध कर सकते हैं ; हम इस बात की सरलता के लिए मान लेते हैं कि सम है। प्रत्येक के लिए के आकार के , को में सभी प्रतीकों को कुछ मनमाने क्रम से मिलकर हैं , और को उन सभी प्रतीकों से मिलकर हैं जो कुछ मनमाने क्रम में में नहीं हैं । जाहिर है । इसके विपरीत, यदि तो । इससे पता चलता है कि लिए प्रत्येक एनएफएLnσ1,,σnnSσ1,,σnn/2xSSySSxSySLnSTxSyTLnLnकई राज्यों में कम से कम हैं।(nn/2)=Ω(2n/n)


क्या इसका मतलब 1) सिद्धांत रूप में यह संभव होगा कि एबीसी «मैच सभी {एबीसी, एसीबी, बेक, बीका, टैक्सी, सीबीए} से मेल खाता है लेकिन यह सिर्फ कुशल नहीं है और उन्हें बहुत धीमी गति से बना देगा क्योंकि एबीसी« तेजी से विस्तार करेगा। (एबीसी | एसीबी | बक | बीसीए | टैक्सी | CBA)? या 2) मुझे जिस तरह के ऑटोमेटन की आवश्यकता है, वह किसी दिए गए शब्द के लिए सभी क्रमपरिवर्तन निर्दिष्ट करने में सक्षम नहीं है?
असिकिर

1
यहाँ एक नियमित अभिव्यक्ति है जो सभी क्रमपरिवर्तन से मेल खाती है : । आप इसे आसानी से राज्यों वाले DFA में बदल सकते हैं । लिए भी यही काम करता है । a b c + a c d + b a c + b c a + c a b + c b a 1 + 3 + 6 + 6 + 1 = 17 a b c d e f g h i jabcabc+acd+bac+bca+cab+cba1+3+6+6+1=17abcdefghij
युवल फिल्मस

1
मुझे क्या समझ में आया: सिद्धांत रूप में, नियमित भाषाएं क्रमपरिवर्तन को स्वीकार करने में सक्षम हैं (इसलिए नियमित अभिव्यक्ति हैं)। "एबीसी" की तरह "एबीसी का क्रमचय" लिखने के लिए बस कोई "सरल तरीका" नहीं है। (जो भी कारणों के लिए।)
अस्किर

1
हाँ, यह एक अच्छा सारांश है। मैं देखूंगा कि क्या मैं नियमित अभिव्यक्ति के लिए एक सरल तर्क के साथ आ सकता हूं।
युवल फिल्मस

2
भविष्य के पाठकों के लिए: यह सही उत्तर नहीं है! (अगर मैं गलत हूं तो मुझे सुधारो।) स्वीकार किए गए को देखो।
असकिर

0

क्यों रेगेक्स में "क्रमचय" लिखने का कोई तरीका नहीं है

एक नियमित, अनंत भाषा (शब्दों की अनंत राशि) का एक क्रमांकन नियमित रूप से आवश्यक नहीं है। इस प्रकार, इसे रेगेक्स के रूप में नहीं लिखा जा सकता है।

सबूत

भाषा के बारे में सोचो (ab)*। (उदाहरण डेविड रिचेर्बी से प्रेरित है ।) इसके एक क्रमपरिवर्तन है a*b*। यह एक नियमित भाषा नहीं है। QED।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.