Чому в Regexes немає перестановки? (Навіть якщо звичайні мови, здається, можуть це зробити)


13

Проблема

Немає простого способу отримати перестановку за допомогою регексу.

  • Перестановка: отримання слова
    w=x1xn
    ("aabc") в інший порядок, не змінюючи числа чи виду літер.
  • Регекс: регулярне вираження.

Для перевірки:

Рішення, яке я шукаю

Він повинен мати форму:

  • "Aabc" (або будь-що інше, що ви можете використовувати дужки, що відкриваються і закриваються)
  • (aabc)! (схоже на (abc)? але з іншим символом в кінці)
  • [aabc]! (подібно до [abc] +, але в кінці іншого символу)

Переваги цих рішень

Вони є:

  • легко
  • пристосований
  • багаторазове використання

Чому це повинно існувати

  • Регекси - це спосіб описати граматику звичайної мови. Вони мають повну силу бути будь-яким регулярним мовою.
  • Скажімо, звичайні мови досить потужні для перестановок (доказ нижче) - чому не існує простого способу висловити це?

Отже, моє питання:

  • (Чому) Мій доказ помиляється?
  • Якщо це правильно: Чому не існує простого способу вираження перестановок?

Доказ

  • Регулярні вирази - це один із способів відзначити граматику звичайної мови. Вони можуть описати будь-які звичайні граматики мов.
  • Іншим способом опису будь-яких регулярних мов (у яких є обмежена кількість літер в алфавіті) є недетерміновані Автомати (з обмеженою кількістю станів).

Маючи обмежену кількість літер, я можу створити цей автомат: (Приклад. Формально: див. Нижче)

Граматика, яка приймає перестановки "abbc":

(Вибачте цифри зверху, можливо, хтось знає, як зробити цю деталь кращою)

s -> ах¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (немає друкарської еквівалентності)

h² -> bh²²

h² -> ch²³

h³ -> ах¹²

h³ -> bh²³

h¹¹ -> bc

h¹¹ -> cb

h¹² -> bb

h²² -> змінна

h²² -> ca

h²³ -> ab

h²³ -> ба

Більш офіційне: (використовуючи автоматику з кінцевим станом, але це може бути зроблено і з граматикою)

  • Слово q (з кінцевою довжиною), до якого будь-яка перестановка повинна досягати приймаючого стану.
  • X - кінцевий алфавіт.
  • Набір станів S містить будь-який порядок літер до довжини q. (Отже, розмір S кінцевий.) Плюс один стан "будь-якого більше слова".
  • функція переходу стану d, яка приймає літеру і переходить на стан, що відповідає прочитаній частині слова.
  • F - це набір тих станів, які є точними перестановками q.

Таким чином, можна створити автоматику з кінцевим станом для прийому перестановок даного слова.

Переходимо з доказом

Тож я довів, що звичайні мови мають право перевіряти перестановки, чи не так?

То чому не існує підходу, щоб досягти цього за допомогою Regexes? Це корисна функціональність.


10
Ви можете перелічити всі перестановки свого слова регулярним виразом. Отриманий вираз буде досить великим, але, безумовно, буде регулярним виразом.
Yuval Filmus

7
Пропоную проігнорувати всі відповіді про Теорію обчислень у потоковому потоці. Це не спеціальність сайту.
Yuval Filmus

Відповідь на вашій пов’язаній сторінці тут - stackoverflow.com/a/3102205/6936386 - здається, легко адаптується і не надто складна: ^(a()|a()|b()|c()){4}\2\3\4\5$здається, працює (див. Regex101.com/r/9URPpg/4/tests ).
бобокак

7
@boboquack Це не регулярний вираз у тому значенні, в якому цей термін використовується в інформатиці. (Саме така річ саме тому Ювал пропонує не довіряти відповідям Stack Overflow про теоретичний КС.)
Девід Річербі

Відповіді:


37

Основними теоремами теорії формальної мови є те, що регулярні вирази, регулярні граматики, детерміновані кінцеві автомати (DFA) та недетерміновані кінцеві автомати (NFA) описують однакові мови: саме звичайні мови. Той факт, що ми можемо описати ці мови настільки багато абсолютно різних способів, говорить про те, що в цих мовах є щось природне і важливе, так само, як еквівалентність машин Тьюрінга, обчислення лямбда та всілякі інші речі говорить про те, що обчислювані мови є природними та важливими. Вони не просто артефакт будь-яких випадкових рішень, які приймав оригінальний відкривач.

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

Отже, щоб відповісти на заголовкове запитання, регулярні вирази не можуть робити перестановки, і ми не додаємо цю здатність, оскільки тоді регулярні вирази не збігаються зі звичайними мовами. Сказавши це, можливо, що "регулярні вирази з перестановками" також будуть цікавим класом мов з безліччю різних характеристик.


Але L ((ab) *) теж не є звичайною мовою - тому L (perm ((ab) *)) не може бути такою. ((ab) * - це не звичайна мова, оскільки немає пам'яті, щоб пам'ятати, скільки відкриваються "a" s, тому з обмеженою кількістю станів ви не можете поставити однакову кількість "b" s.)
Asqiir

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

4
ab

2
Ви абсолютно праві. Я пропустив точку "введення регулярних виразів один в одного", думав лише про "перестановку фіксованого слова", а не про "перестановку чергового регулярного вираження", що, звичайно, неможливо.
Асквір

1
Можливо, регулярні вирази з перестановками описують клас мов із цікавими властивостями, але я ніколи не стикаюся з потребою в !операторі на практиці, і, мабуть, мало хто має, як це легко реалізувати, і жодна реалізація розширених регулярних виразів I ' Видно, це підтримує.
reinierpost

16

Отже, моє питання:

  • (Чому) Мій доказ помиляється?
  • Якщо це правильно: Чому не існує простого способу вираження перестановок?

Ваш "доказ" розглядав лише перестановки окремих слів, які є кінцевими мовами.

Кожна обмежена мова є регулярною (наприклад, лише перерахувавши всі члени, що мають |проміжку між ними), але існують нескінченні регулярні мови (а вони, як правило, цікавіші).

Як тільки ви отримуєте регулярний вираз (або граматику / автомат), який приймає нескінченну мову (тобто вираз з *оператором, або автомат з циклом), ваша конструкція більше не працює (ви отримуєте нескінченну граматику / автомат ).

Відповідь Девіда Ріхербі подала приклад звичайної мови, мова перестановки якої вже не є регулярною - всі такі приклади є нескінченними мовами.


8

ΣnΣmO(m)

Тож у певному сенсі немає чіткого способу конкретизувати всі перестановки слова.


Ω~(2n)ΣnmO(m)

L(xi,yi)1iN

  • xiyiL
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL

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


Чи означає це, що 1) теоретично можна було б дозволити "abc" відповідати всім {abc, acb, bac, bca, cab, cba}, але це просто неефективно і зробить їх занадто повільними, оскільки "abc" розшириться експоненціально до (abc | acb | bac | bca | кабіна | cba)? або 2) Тип автомати, який мені потрібен, не в змозі вказати всі перестановки для даного слова?
Asqiir

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

1
Що я зрозумів: теоретично регулярні мови здатні приймати перестановки (так це регулярні вирази). Просто немає "простого способу" написати "перестановку abc", наприклад, "abc". (З будь-яких причин.)
Асквір

1
Так, це хороший підсумок. Я побачу, чи можу я придумати простіший аргумент для регулярних виразів.
Yuval Filmus

2
Для майбутніх читачів: це не правильна відповідь! (Виправте мене, якщо я помиляюся.) Шукайте прийнятого.
Asqiir

0

Чому немає можливості написати "перестановку" в Regexes

Перестановка звичайної, нескінченної мови (нескінченна кількість слів) не обов'язково є регулярною. Таким чином, він не може бути записаний як регулярний вираз.

Доказ

Подумайте про мову (ab)*. (Приклад натхненний Девідом Ріхербі .) Однією з його перестановок є a*b*. Це не звичайна мова. qed.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.