Regexes'te neden permütasyon yok? (Normal diller bunu yapabiliyor olsa bile)


13

Sorun

Normal ifade ile permütasyon almanın kolay bir yolu yoktur.

  • Permütasyonu: Bir alınıyor kelime
    w=x1xn
    başka bir siparişe ( "aabc"), sayı değiştirmeden veya tür mektupların.
  • Normal ifade : Düzenli ifade.

Doğrulama için:

Aradığım çözüm türü

Şu şekilde olmalıdır:

  • »Aabc« (veya açılış ve kapanış parantezlerini kullanabileceğiniz herhangi bir şey)
  • (Aabc)! ((abc)? ye benzer ancak sonunda başka bir sembolle birlikte)
  • [Aabc]! ([abc] + 'ya benzer ancak sonunda başka bir sembol bulunur)

Bu çözümlerin avantajları

Onlar:

  • kolay
  • uyarlanabilir
  • yeniden kullanılabilir

Bu neden var olmalı

  • Normal ifadeler, normal bir dilin gramerini tanımlamanın bir yoludur. Her türlü normal dil olma gücüne sahiptirler.
  • Diyelim ki normal diller permütasyonlar için yeterince güçlü (aşağıda kanıt) - bunu ifade etmenin neden kolay bir yolu yok?

Benim sorum şu:

  • (Neden) Kanıtım yanlış mı?
  • Eğer doğruysa: Neden permütasyonları ifade etmenin kolay bir yolu yok?

Kanıt

  • Düzenli ifadeler, normal bir dilin gramerini not etmenin bir yoludur. Normal dil gramerini tanımlayabilirler.
  • Herhangi bir normal dili (alfabe içinde sonlu sayıda harf içeren) dilbilgisini tanımlamanın başka bir yolu da belirleyici olmayan Otomatondur (sınırlı sayıda durumla).

Sonlu sayıda harfle bu otomatı oluşturabilirim: (Örnek. Resmi: aşağıya bakınız)

"Abbc" nin permütasyonlarını kabul eden dilbilgisi:

(üstte sayılar için sry, belki birisi bu parçanın nasıl daha iyi görüneceğini bilir)

s -> ah¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (yazım hatası! denklik yok)

h² -> bh²²

h² -> ch²³

h³ -> ah¹²

h³ -> bh²³

h¹¹ -> m.ö.

h¹¹ -> cb

h¹² -> bb

h²² -> ac

h²² -> ca

h²³ -> ab

h²³ -> ba

Daha resmi: (sonlu durum otomatı kullanarak, ancak bu dilbilgisi ile de yapılabilir)

  • Herhangi bir permütasyonun kabul eden bir duruma ulaşması gereken q kelimesi (sonlu uzunlukta).
  • X, sonlu alfabe.
  • Durum kümesi S, q uzunluğuna kadar herhangi bir harf sırası içerir. (Yani S'nin boyutu sonludur.) Artı bir "artık kelime" durumu.
  • bir harf alıp sözcüğün şimdi okunan kısmına karşılık gelen durum üzerinde hareket eden durum geçiş fonksiyonu d.
  • F, q'nun kesin permütasyonları olan bir dizi durumdur.

Böylece, belirli bir kelimenin permütasyonlarını kabul etmek için sonlu durumlu bir otomat oluşturmak mümkündür.

Kanıtla devam etmek

Bu yüzden normal dillerin permütasyonları kontrol etme gücüne sahip olduğunu kanıtladım, değil mi?

Peki neden Regexes ile buna ulaşmak için bir yaklaşım yok? Yararlı bir işlevsellik.


10
Kelimenizin tüm permütasyonlarını düzenli bir ifadeyle listeleyebilirsiniz. Ortaya çıkan ifade oldukça büyük olacak, ancak kesinlikle düzenli bir ifade olacaktır.
Yuval Filmus

7
Yığın akışı üzerinde Hesaplama Teorisi hakkındaki tüm cevapları göz ardı etmenizi öneririm. Bu sitenin uzmanlığı değil.
Yuval Filmus

Bağlantı verilen sayfanızdaki cevap - stackoverflow.com/a/3102205/6936386 - kolayca uyarlanabilir ve çok karmaşık değil ^(a()|a()|b()|c()){4}\2\3\4\5$gibi görünüyor : işe yarıyor gibi görünüyor (bkz. Regex101.com/r/9URPpg/4/tests ).
18:13 de boboquack

7
@boboquack Bu terimin bilgisayar biliminde kullanıldığı anlamda düzenli bir ifade değildir. (Bu tür bir şey tam olarak
Yuval'ın

Yanıtlar:


37

Biçimsel dil teorisinin temel teoremleri, düzenli ifadelerin, düzenli gramerlerin, deterministik sonlu otomataların (DFA'lar) ve belirsiz olmayan sonlu otomataların (NFA'ların) aynı tür dilleri tanımlamasıdır: normal diller. Bu dilleri çok farklı şekillerde tanımlayabilmemiz, bu diller hakkında Turing makinelerinin, lambda hesabının ve diğer her türlü şeyin eşdeğer olduğu gibi doğal ve önemli bir şey olduğunu düşündürmektedir. doğal ve önemlidir. Onlar sadece orijinal keşfinin verdiği rastgele kararların bir ürünü değildir.

Rπ(R)RL(π(abc))={abc,acb,bac,bca,cab,cba}L(π((ab))))ab

Yani, başlık soruyu cevaplamak için, düzenli ifadeler olamaz permütasyon yapmak ve daha sonra düzenli ifadeler düzenli dille aynı olmaz çünkü biz bu yeteneğini eklemeyin. Bunu söyledikten sonra, "permütasyonlu düzenli ifadeler" in birçok farklı karakterizasyona sahip ilginç bir dil sınıfı olması da mümkündür.


Ancak L ((ab) *) da normal bir dil değildir - bu yüzden L (perm ((ab) *)) bir dil olamaz. ((ab) * normal bir dil değildir, çünkü kaç tane "a" nın açıldığını hatırlayacak bir tür bellek olmadığından, sınırlı sayıda
durumla

9
L((ab)){ε,ab,abab,ababab,abababab,}{ε,ab,aabb,aaabbb,aaaabbbb,}

4
ab

2
Tamamen haklısın. "Düzenli ifadeleri birbirine koyma" noktasını kaçırdım, sadece "sabit bir kelimeye izin vermek" değil, tabii ki mümkün olmayan başka bir regex'e izin vermek diye düşündüm.
Asqiir

1
Belki de permütasyonlu düzenli ifadeler ilginç özelliklere sahip bir dil sınıfını tanımlar, ancak !pratikte operatöre hiç ihtiyaç duymadım ve sanırım çok az insanın uygulaması kolay olduğu ve genişletilmiş düzenli ifadelerin uygulanması yok. gördüm bunu destekliyor.
reinierpost

16

Benim sorum şu:

  • (Neden) Kanıtım yanlış mı?
  • Eğer doğruysa: Neden permütasyonları ifade etmenin kolay bir yolu yok?

"Kanıt" ınız yalnızca sonlu diller olan tek kelimelerin permütasyonlarına baktı.

Her sonlu dil düzenlidir (örneğin, yalnızca aralarında tüm üyeleri listeleyerek |), ancak sonsuz düzenli diller vardır (ve bunlar genellikle daha ilginç olanlardır).

Sonsuz bir dili (yani *operatörle ifade veya döngü içeren bir otomat) kabul eden normal bir ifade (veya dilbilgisi / otomat) alır almaz yapınız artık çalışmaz (sonsuz bir dilbilgisi / otomat alırsınız) ).

David Richerby'nin cevabı, permütasyon dili artık düzenli olmayan normal bir dil örneği sağladı - bu tür örneklerin tümü sonsuz dillerdir.


8

ΣnΣmO(m)

Yani bir anlamda, bir kelimenin tüm permütasyonlarını belirtmek için kısa ve öz bir yol yoktur.


Ω~(2n)ΣnmO(m)

L(xi,yi)1iN

  • xiyiL
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

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


Bu demek oluyor ki 1) teorik olarak »abc« 'nin tümünü {abc, acb, bac, bca, cab, cba} ile eşleştirmesine izin vermek mümkün olabilir, ancak bu verimli değildir ve onları »çok yavaş hale getirecektir çünkü» abc « (abc | acb | bac | bca | taksi | cba)? veya 2) İhtiyacım olan otomat türü, belirli bir kelime için tüm permütasyonları belirleyemiyor mu?
Asqiir

1
İşte tüm permütasyon eşleşen bir düzenli ifadedir : . Bunu kolayca durumlu bir DFA'ya dönüştürebilirsiniz . Aynı şey . 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
Yuval Filmus

1
Anladıklarım: Teoride, normal diller permütasyonları kabul edebilir (normal ifadeler de öyle). "Abc" gibi "abc« "yazmanın" basit bir yolu "yoktur. (Her ne sebeple olursa olsun.)
Asqiir

1
Evet, bu iyi bir özet. Normal ifadeler için daha basit bir argüman bulup bulamayacağımı göreceğim.
Yuval Filmus

2
Gelecekteki okuyucular için: bu doğru cevap değil! (Yanlışsam beni düzeltin.) Kabul edileni arayın.
Asqiir

0

Neden Regexes içinde "permütasyon" yazmanın bir yolu yok

Düzenli, sonsuz bir dilin (sonsuz miktarda kelime) permütasyonu zorunlu değildir. Böylece normal ifade olarak yazılamaz.

Kanıt

Dili düşünün (ab)*. (Örnek David Richerby'den esinlenmiştir .) Onun permütasyonlarından biri a*b*. Bu normal bir dil değil. qed.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.