Warum gibt es in Regexes keine Permutation? (Auch wenn reguläre Sprachen dazu in der Lage zu sein scheinen)


13

Das Problem

Es gibt keine einfache Möglichkeit, eine Permutation mit einem regulären Ausdruck zu erhalten.

  • Permutation: Ein Wort ("aabc") in eine andere Reihenfolge bringen, ohne die Anzahl oder Art der Buchstaben zu ändern.
    w=x1xn
  • Regex: Regulärer Ausdruck.

Zur Überprüfung:

Die Art von Lösung, nach der ich suche

Es sollte die Form haben:

  • »Aabc« (oder irgendetwas anderes, das Sie in Klammern öffnen und schließen könnten)
  • (aabc)! (ähnlich wie (abc)? aber mit einem anderen Symbol am Ende)
  • [aabc]! (ähnlich wie [abc] +, jedoch mit einem anderen Symbol am Ende)

Vorteile dieser Lösungen

Sie sind:

  • einfach
  • anpassungsfähig
  • wiederverwendbar

Warum sollte das existieren

  • Regexe sind eine Möglichkeit, eine Grammatik einer regulären Sprache zu beschreiben. Sie haben die volle Macht, jede Art von regulärer Sprache zu sein.
  • Nehmen wir an, reguläre Sprachen sind leistungsfähig genug für Permutationen (Beweis unten) - warum gibt es keine einfache Möglichkeit, dies auszudrücken?

Meine Frage lautet also:

  • (Warum) Ist mein Beweis falsch?
  • Wenn es richtig ist: Warum gibt es keine einfache Möglichkeit, Permutationen auszudrücken?

Der Beweis

  • Reguläre Ausdrücke sind eine Möglichkeit, die Grammatik einer regulären Sprache zu notieren. Sie können jede reguläre Sprachgrammatik beschreiben.
  • Eine andere Möglichkeit, reguläre Sprachen (deren Alphabet eine endliche Anzahl von Buchstaben enthält) zu beschreiben, sind nicht deterministische Automaten (mit einer endlichen Anzahl von Zuständen).

Mit einer endlichen Anzahl von Buchstaben kann ich diesen Automaten erstellen: (Beispiel. Formal: siehe unten)

Grammatik, die Permutationen von "abbc" akzeptiert:

(sry für Zahlen oben, vielleicht weiß jemand, wie man diesen Teil besser aussehen lässt)

s -> ah¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (kein Tippfehler! Äquivalenz)

h² -> bh²²

h² -> ch²³

h³ -> ah¹²

h³ -> bh²³

h¹¹ -> bc

h¹¹ -> cb

h² -> bb

h²² -> ac

h²² -> ca.

h²³ -> ab

h²³ -> ba

Formaler: (mit einem Finite-State-Automaten, aber dies könnte auch mit Grammatik gemacht werden)

  • Ein Wort q (mit endlicher Länge), zu dem jede Permutation einen akzeptierenden Zustand erreichen soll.
  • X ist das endliche Alphabet.
  • Die Menge der Zustände S enthält eine beliebige Reihenfolge von Buchstaben bis zur Länge von q. (Die Größe von S ist also endlich.) Plus ein Zustand "jedes längere Wortes".
  • Zustandsübergangsfunktion d, die einen Buchstaben nimmt und sich auf den Zustand bewegt, der dem jetzt gelesenen Teil des Wortes entspricht.
  • F ist eine Menge dieser Zustände, die exakte Permutationen von q sind.

So ist es möglich, einen endlichen Automaten zum Akzeptieren von Permutationen eines gegebenen Wortes zu erstellen.

Fahren Sie mit dem Beweis fort

Ich habe also bewiesen, dass reguläre Sprachen die Möglichkeit haben, nach Permutationen zu suchen, oder?

Warum gibt es keinen Ansatz, um dies mit Regexes zu erreichen? Es ist eine nützliche Funktionalität.


10
Sie können alle Permutationen Ihres Wortes mit einem regulären Ausdruck auflisten. Der resultierende Ausdruck ist ziemlich groß, aber definitiv ein regulärer Ausdruck.
Yuval Filmus

7
Ich schlage vor, alle Antworten zur Berechnungstheorie beim Stapelüberlauf zu ignorieren. Dies ist nicht die Spezialität dieser Site.
Yuval Filmus

Die Antwort auf Ihrer verlinkten Seite hier - stackoverflow.com/a/3102205/6936386 - scheint leicht anpassbar und nicht zu kompliziert zu sein: ^(a()|a()|b()|c()){4}\2\3\4\5$scheint zu funktionieren (siehe regex101.com/r/9URPpg/4/tests ).
Boboquack

7
@boboquack Das ist kein regulärer Ausdruck in dem Sinne, wie der Begriff in der Informatik verwendet wird. (Genau aus diesem Grund schlägt Yuval vor, den Antworten von Stack Overflow über theoretische CS nicht zu vertrauen.)
David Richerby

Antworten:


37

Die grundlegenden Theoreme der formalen Sprachtheorie sind, dass reguläre Ausdrücke, reguläre Grammatiken, deterministische endliche Automaten (DFAs) und nichtdeterministische endliche Automaten (NFAs) alle die gleichen Arten von Sprachen beschreiben: nämlich die regulären Sprachen. Die Tatsache, dass wir diese Sprachen auf so viele völlig unterschiedliche Arten beschreiben können, legt nahe, dass diese Sprachen etwas Natürliches und Wichtiges haben, genauso wie die Äquivalenz von Turing-Maschinen, der Lambda-Rechnung und allen möglichen anderen Dingen darauf hindeutet, dass die berechenbaren Sprachen sind natürlich und wichtig. Sie sind nicht nur ein Artefakt der zufälligen Entscheidungen, die der ursprüngliche Entdecker getroffen hat.

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

Also, um die Titelfrage zu beantworten, reguläre Ausdrücke können nicht Permutationen tun , und wir fügen diese Fähigkeit nicht , denn dann würden reguläre Ausdrücke nicht reguläre Sprachen entsprechen. Allerdings ist es möglich, dass "reguläre Ausdrücke mit Permutationen" auch eine interessante Klasse von Sprachen mit vielen verschiedenen Charakterisierungen sind.


Aber L ((ab) *) ist auch keine reguläre Sprache - also kann L (perm ((ab) *)) keine sein. ((ab) * ist keine reguläre Sprache, da es keine Art von Speicher gibt, an die man sich erinnern kann, wie viele öffnende "a" es gibt. Bei einer endlichen Anzahl von Zuständen kann man also nicht die gleiche Anzahl von "b" setzen.)
Asqiir

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

4
ab

2
Du hast vollkommen recht. Ich habe den Punkt verpasst, "reguläre Ausdrücke ineinander zu setzen", ich habe nur darüber nachgedacht, "ein festes Wort zu permutieren" und nicht "einen anderen regulären Ausdruck zu permutieren", was natürlich nicht möglich ist.
Asqiir

1
Vielleicht beschreiben reguläre Ausdrücke mit Permutationen eine Klasse von Sprachen mit interessanten Eigenschaften, aber ich habe den !Operator in der Praxis nie gebraucht, und ich nehme an, dass nur wenige Leute dies getan haben, da es einfach zu implementieren ist und keine Implementierung von erweiterten regulären Ausdrücken I ' habe gesehen unterstützt es.
Reinierpost

16

Meine Frage lautet also:

  • (Warum) Ist mein Beweis falsch?
  • Wenn es richtig ist: Warum gibt es keine einfache Möglichkeit, Permutationen auszudrücken?

Ihr "Beweis" befasste sich nur mit Permutationen einzelner Wörter, die endliche Sprachen sind.

Jede endliche Sprache ist regulär (z. B. nur durch Auflisten aller Mitglieder mit einem |dazwischen liegenden), aber es gibt unendlich viele reguläre Sprachen (und diese sind im Allgemeinen die interessanteren).

Sobald Sie einen regulären Ausdruck (oder eine Grammatik / einen Automaten) erhalten, der eine unendliche Sprache akzeptiert (dh einen Ausdruck mit dem *Operator oder einen Automaten mit einer Schleife), funktioniert Ihre Konstruktion nicht mehr (Sie erhalten eine unendliche Grammatik / einen unendlichen Automaten) ).

Die Antwort von David Richerby lieferte ein Beispiel für eine reguläre Sprache, deren Permutationssprache nicht mehr regulär ist - alle diese Beispiele sind unendliche Sprachen.


8

ΣnΣmO(m)

In gewissem Sinne gibt es keine prägnante Möglichkeit, alle Permutationen eines Wortes anzugeben.


Ω~(2n)ΣnmO(m)

L(xi,yi)1iN

  • xiyiL
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

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


Bedeutet dies 1) theoretisch wäre es möglich, »abc« mit allen {abc, acb, bac, bca, cab, cba} übereinstimmen zu lassen, aber es ist einfach nicht effizient und würde sie zu langsam machen, da »abc« exponentiell expandieren würde (abc | acb | bac | bca | cab | cba)? oder 2) Die Art von Automat, die ich brauche, kann nicht alle Permutationen für ein bestimmtes Wort angeben?
Asqiir

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

1
Was ich verstanden habe: Theoretisch können reguläre Sprachen Permutationen akzeptieren (reguläre Ausdrücke auch). Es gibt einfach keinen "einfachen Weg", "Permutation von abc" wie "abc" zu schreiben. (Aus welchen Gründen auch immer.)
Asqiir

1
Ja, das ist eine gute Zusammenfassung. Ich werde sehen, ob ich ein einfacheres Argument für reguläre Ausdrücke finden kann.
Yuval Filmus

2
Für zukünftige Leser: Dies ist nicht die richtige Antwort! (Korrigieren Sie mich, wenn ich falsch liege.) Suchen Sie nach dem akzeptierten.
Asqiir

0

Warum es keine Möglichkeit gibt, "Permutation von" in Regexes zu schreiben

Eine Permutation einer regulären, unendlichen Sprache (unendlich viele Wörter) ist nicht unbedingt regelmäßig. Daher kann es nicht als Regex geschrieben werden.

Beweis

Denken Sie an die Sprache (ab)*. (Beispiel inspiriert von David Richerby .) Eine seiner Permutationen ist a*b*. Dies ist keine reguläre Sprache. qed.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.