Normal ifadeler değil


36

Bilgisayar biliminde geçmişi olan birine bile düzenli bir ifadenin ne olduğunu sorun ve cevabın sonlu durumlu bir otomatın erişme sınırının ötesine geçmesi muhtemel.

Örneğin, “normal ifade”

/^1?$|^(11+?)\1+$/

belirtilen Perl kişiliği Abigail tarafından yaratıldı (ve 2002'den beri Perl'in test grubunun bir parçası ), yalnızca bileşik olan tek sayıları kabul eden bir makineyi açıklıyor, ancak Peter Linz'in üçüncü sürümünde 4.5 (b) egzersizi Biçimsel Dillere ve Otomatların Okuyucu kullanımı pompalama lemma kanıtlamak için

L={an:n is not a prime number}

normal bir dil değil.

Ayrımın önemli olduğu bağlamlarda, kesinlikle daha güçlü ifadelere ne demeliyiz?

Yanıtlar:


46

Larry Wall, Kleene'in önerdiği formalizm için "düzenli ifade" ve yaygın olarak kullanılan uzantılar için ifadeler için "regex" kullanmamızı önerdi. Oldukça geniş bir şekilde takip edilen bir kongre. Resmi diller anlamındaki normal ifadelerden bahsettiğinizi açıkça belirtmek istiyorsanız, normal dillerden bahsetmek genellikle zor değildir.

Regex'lerin gücü geri izlemeden geliyor ve geri izlemeli normal diller için otomatlar üzerinde çalışmalar yapıldı. Özellikle, bkz. Becchi & Crowley, 2008, Perl-Uyumlu Düzenli İfadeleri Etkili Eşlemek İçin Sonlu Otomatları Genişletme .


5
Kabul ediyorum, "Perl regex" ("POSIX regex", vb.) Vs. "normal dil" gibi bir şeylerin yanlış yorumlanma ihtimalini önleyecek kadar açık olması gerekir.
Jukka Suomela

Perl regexes sadece geri izleme daha çok ek özelliklere sahiptir.
reinierpost

@reinierpost Doğru, ama bence geri izleme, resmi diller açısından en önemli olanı. Perl regex'leri keyfi Perl kodunu çalıştırmak gibi özelliklere sahiptir, ancak regex'lerin PCRE'leri kapsayan olarak gevşek bir şekilde yorumlanması gerektiğini düşünüyorum. PCRE'ler özyinelemeli kalıplar gibi tuhaflıklar içerir, ancak bunlar sizi normal diller diyarının dışına çıkaran karanlık sanatlardır. Ancak bunları kapsayacak şekilde cevabımı güncelleyebilirim.
Charles Stewart

18

Bu ifadeler Aho (Teorik Bilgisayar Bilimi El Kitabı, Cilt A, Bölüm 5) ve Campeanu, Salomaa, Yu ("Pratik düzenli ifadelerin resmi bir çalışması", Uluslararası Bilgisayar Bilimleri Temelleri Dergisi, 14: 1007) tarafından incelenmiştir. –1018, 2003) ve bazı takip belgeleri.

Aho, daha güçlü ifadelere "geri dönüş" (backreferences ile düzenli ifade) diyor, Campeanu ve ark. "genişletilmiş düzenli ifade" yanı sıra "pratik düzenli ifade" kullanın. Görüldüğü gibi, "genişletilmiş düzenli anlatım" son literatürde en sık kullanılan terimdir.

Fransız okulundan "rasyonel ifade" terimini temel alarak ve bu ifadelerin gerçek dünyada kullanıldığı gerçeğini göz önünde bulundurarak kendim de "gerçek ifadeyi" seviyorum.

Zeyilname: Doktora tezimdeki bir bölüm bu biçimsel dil sınıfıyla ilgileniyor (ilgili yazının STACS 2011'de ortaya çıkması bekleniyor). Bu bölümü ve makaleyi yazarken, çeşitli terimlerle denedim. Son olarak, geri referansları olan model için genişletilmiş normal ifadeler ve güzel ve normal normal ifadeler için uygun normal ifadeler kullanmaya karar verdim . Zaten tamamen (veya çoğunlukla) yazılı bir makalede terminolojiyi değiştirmek oldukça can sıkıcı olduğundan, bazılarının benim seçimime yol açan deneyimlerle ilgilenebileceğini düşünüyorum:

İlk olarak, regex ve rewbr dili gerçekten yuvarlamıyor ve bir makalenin tamamında tekrar tekrar kullanmak, özellikle olası çoğul formlardan herhangi birini kullanırken, yazmak ve okumak için gerçekten yorucu oldu. PERL benzeri normal ifadeler de oldukça hantaldı. Tabii ki, ben anadili değilim, bu yüzden YMMV.

İkincisi, her iki modelden de bahsetmek istediğinde, normal ifadenin bir varyasyonu olan terimleri kullanmak uygundur, çünkü gerektiğinde benzerliği veya farklılıkları vurgulamayı sağlar (örneğin, normal bir ifade uygunsa, Genişletilmiş"). Ayrıca, farklı sınıfları karşılaştırmak yerine, tüm sınıftaki özel durumlar hakkında konuşurken, "geri dönüşsüz genişletilmiş düzenli ifadeler" özel durumunun kolayca vurgulanmasına olanak tanır.

Üçüncüsü, literatürde yeni yazılmış bir terimde zaten kullanılmış olan bir terimi kullanmayı tercih ettim, bu da genişletilmiş düzenli ifadeler ve pratik düzenli ifadeler arasındaki seçimi bıraktı . İkinci seçenek, (en azından dolaylı olarak) uygun normal ifadelerin bir şekilde pratik olmadığını, bunun da oldukça garip hissettirdiğini ima etti (özellikle Google'ın RE2'sinin backrefs kullanmadığı ve oldukça pratik göründüğü gibi).

Tabii ki, bu seçenek sadece benim "kişisel yerel maksimum" mudur ve ihtiyaçlara bağlı olarak diğer seçenekler daha uygun olabilir.


7
Ne yazık ki, genişletilmiş düzenli ifade terimi , her ikisi de tanımınıza göre düzenli ifadeler olarak genişletilen temel normal ifade (BRE) ve genişletilmiş normal ifade (ERE) arasında ayrım yapan POSIX tarafından zaten alınmıştır .
Jörg W Mittag

@ Jörg: Aslında göre bu ne genişletilmiş ne de temel POSIX düzenli ifadeler düzenli düzenli ifadeler daha güçlü. Ve saf (GNU dışı) BRE, normal ifadelerden (alternatif bir operatör eksik) aslında daha az güçlü görünüyor.
sepp2k

Bu "yeniden" hakkında daha yeni sonuçlar almak için Carle ve Narendran'ın (2009) "Uzatılmış Düzenli İfadeleri" başlığına bakınız: portal.acm.org/citation.cfm?id=1533235
Jakob

Bu dil sınıfına ilişkin son sonuçlar: "Campeanu ve Santean'dan (TCS 410, 2009)" Düzenli Dillerle Düzenli Dillerle Kesişme Üzerine "" "Reidenbach ve Schmid (CIAA 2010 tarafından" Büyük Normal Düzenli İfadeler Sınıfları İçin Polinom Zaman Eşleştirme Testi ") ) ve "Uzatılmış Düzenli İfadeler: Özlülük ve Karar Verebilirlik" (benim tarafımdan, STACS 2011'de görünmesi nedeniyle).
Dominik D. Freydenberger

6

Perl'in sözde regexp'in Turing'i tamamlayacak kadar güçlü olduğu bilinmektedir; olağan programdan pergexp'ye kadar bir derleyici bile var.

Bu nedenle, bu tür "regexps" için bir isim aramanın bir anlamı olduğunu sanmıyorum.

Örneğin, http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm adresini ziyaret edin.


İşaretçilerin var mı?
András Salamon

5
@ András: Bence Arthur, Perl'in ?{CODE}direktifinden bahsediyor , kalıp ifadelerin düzenli ifadelerde program kodunu araya sokmasını sağlıyor. PCRE'lerin genellikle dilin "bildirimsel" kısmı olarak tanımlandığını ve tüm dilin örüntü dili olarak tanımlandığını anlıyorum. WP’ye göre, Aho, 1990’da, “karakter dizileri bulma algoritmaları”, geriye dönüşü olan düzenli diller için üyelik probleminin NP’nin tamamlandığını gösteriyor. Bildiren PCRE'lerin başka zorlu özellikleri yoktur.
Charles Stewart,

Bağlantıyı ekledim; Kaynak koduna bakmadım, bu yüzden nasıl çalıştığını ve derlemenin gerçekten doğru olduğuna dair bir kanıt olup olmadığını gerçekten bilmiyorum.
Arthur MILCHIOR 24:10

1
Üzgünüz, ama sizin argümanınıza göre, lambda-calculus Turing-tamamlandı olduğundan, bunun için bir isim aramak mantıklı gelmiyordu. Diğer tüm Turing eksiksiz hesaplama formaliteleri ve dilleri için aynı. Dahası, Turing-eksiksizlik, bir dilin ne kadar etkileyici olduğunu tanımlamaz, bu nedenle, sadece Turing-tamamlandıkları için dilleri tanımlamanın bir anlamı yoktur. Lambda-calculus'la ilgili örneğim elbette aşırıydı.
Blaisorblade


1

Diğer cevaplar göz önüne alındığında, "normal diller" in güvenli olduğunu ve kısa bir süre sonra farklılığı belirttikten sonra, regex'ler için "pratik düzenli ifadeler" hakkında konuşmayı öneririm (geri izleme ile).

Ayrıca, düzenli ifadeler ve pratik ifadeler olarak aynı regexp'in farklı semantikalara sahip olabileceğine dikkat edin, çünkü ikinci durumda semantiksiler geri izleme anlamında farklı sonuçlarla tanımlanır. Ayrıntılar konu dışı olabilir, ancak bunun hakkında başka bir soru sorarsanız (belki burada SO yerine, dunno) ve bir yorum yoluyla bana bildirirseniz cevap veririm.


0

Onlara kalıp ifadeleri diyebiliriz . Bu, kalıp dillerle karışıklıklar doğurabilir, ancak en azından bunlar daha az yaygındır.


2
Prensip olarak, mantığınıza katılıyorum, ancak Campeanu, Santean ve Yu, "temiz" bir tanımla benzer bir dil sınıfını belirtmek için örüntü ifadeleri terimini zaten kullandı (bkz. "Kalıp ifadeleri ve kalıp otomatları", IPL 92 (2004). ).
Dominik D. Freydenberger,
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.