2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Упрощение регулярных выражений.
Сообщение08.04.2008, 22:42 
Аватара пользователя
Не подскажете, какую-нибудь прогу для упрощения регулярных выражений?
Я работаю с GAP, но там невозможно упростить выражение.
Например, GAP выдает (b((a + b)a)^*(a+b)b+a)^*(b((a+b)a)^*(a+b+\lambda)+\lambda), хотя это все лишь (a+b)^* :lol:

 
 
 
 
Сообщение09.04.2008, 01:52 
Аватара пользователя
Странные они у вас какие то, почему например круглые скобки вложенные?

 
 
 
 
Сообщение10.04.2008, 02:14 
Аватара пользователя
powerZ писал(а):
Странные они у вас какие то, почему например круглые скобки вложенные?


А что странного во вложенных скобках ?

 
 
 
 
Сообщение10.04.2008, 03:27 
Аватара пользователя
Так вроде круглые скобки означают адресацию в выражении, разве нет?

 
 
 
 
Сообщение10.04.2008, 11:56 
Аватара пользователя
powerZ писал(а):
Так вроде круглые скобки означают адресацию в выражении, разве нет?


Круглые скобки необходимы для того, чтобы поределит порядок выполнения операции. Например ((a+b)* с )* означает, что сначала получается язык состоящий из двух слов \{a,b\}, затем делаем его итрецию - получаем все слова в алфавите a,b, затем конкатинацию с буквой с. Получаем слова вида x_1 \dots x_s c, где x_j \in \{a,b\}. После чего итерация, получаем слова вида x_1 \dots x_s c \dots y_1 \dots  y_k c, где x_j,y_i \in \{a,b\}.

 
 
 
 
Сообщение10.04.2008, 13:34 
Аватара пользователя
А вы уверены, что это тоже называется регулярными выражениями? Потому что я бы сказал например что (a+b)*c означает, что ищется последовательность из двух или более символов "a", оканчивающаяся символом "b", далее может быть любое количество произвольных символов, заканчивающихся символом c. Круглые скобки - для возможности адресации к первому фрагменту. Так что похоже ничем вам помочь не смогу :roll:

 
 
 
 
Сообщение11.04.2008, 06:56 
Аватара пользователя
:evil:
Существует много разных регулярных выражений. Есть традиция Unix'а (и С, Linux…), есть традиции математики (например, теории автоматов и матлогики несколько различаются).

 
 
 
 
Сообщение11.04.2008, 12:09 
Аватара пользователя
незваный гость писал(а):
есть традиции математики (например, теории автоматов и матлогики несколько различаются).


У меня как раз все с теорией автоматов связано.

 
 
 
 
Сообщение11.04.2008, 16:16 
Аватара пользователя
:evil:
Заметно. :)

 
 
 
 
Сообщение11.04.2008, 22:21 
Аватара пользователя
:evil:
Я не встречал таких программ. Для конечных автоматов известно, что задача распознования эквивалентности разрешима. Также разрешима задача минимизации автомата (ib idem).

Преобразование конечного автомата в удобочитаемое регулярное выражение — процесс более творческий. Более того, нет никакой гарантии, что р.в., автоматически построенное по минимальному автомату, окажется проще чем исходное.

В принципе, можно было бы попробовать написать такую программу — дурное дело нехитрое. Если писать на Python, всё получается очень буквально — как написано в определении, так и делаем. Думаю, работы на день–два.

Легко решаемая задача — проверка эквивалентности р.в.

Добавлено спустя 3 минуты 59 секунд:

Смешно и грустно — но больше всего времени уйдёт (до построеня р.в.) на разбор (чтение) р.в.

 
 
 
 
Сообщение12.04.2008, 23:31 
Сомик,
есть такой проект — Forlan.

Скачайте минимальный набор инструментов и SMLNJ.
Установите SMLNJ и Forlan, как описано в инструкциях.

Запустив Forlan, Вы сможете иметь с ним диалоги наподобие следующего:
Код:
- Reg.toString(Reg.weakSimplify(Reg.fromString "b*(b+b%)+(%+%*)+(a+a)*a"));
val it = "% + aa* + bb*" : string
- Reg.toString(Reg.simplify Reg.weakSubset (Reg.fromString "b*(b+b%)+(%+%*)+(a+a)*a"));
val it = "a* + b*" : string
- fun Simplify s = Reg.toString(Reg.simplify Reg.weakSubset (Reg.fromString s));
val Simplify = fn : string -> string
- Simplify "% + aa* + bb*";
val it = "a* + b*" : string


К сожалению, перед Вашим (b((a + b)a)*(a+b)b+a)*(b((a+b)a)*(a+b+%)+%) Forlan бессилен :(.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group