Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Задача про регулярные грамматики   Найти похожие ветки 

 
Ozone ©   (2004-09-28 08:03) [0]

Есть такое задание:

Написать программу, которая по заданной КС-грамматике будет генерировать цепочки языка (исп. только левосторонний или правосторонний вывод). Диапозон длин генерируемых цепочек должен задаваться пользователем.

ЗЫ: пользователь вводит состояния и правила для них

Я использовал в своей программе след. упрощенную структуру


{ Правило }
TCross = record
 data: string;   // символы
 indx: integer;  // куда указывает
end;

{ Состояние }
TState = record
 Name : string[1]; // Имя A..Z
 Cross: array of TCross; // массив правил
 CCount: integer; // кол-во правил
end;

States : array of TState;


Собственно генератор я ужо написал... остается одна проблема.

К примеру, есть такая грамматика:
E = {0,1}; N = {S,A}
P:
 S -> 1A
 A -> 0A | 1111

Пользователь ввел кол-во цепочек = 5 и длину от 3 до 4 => ни одной такой цепочки не найдется... Как решить проблему?

У меня поиск (подбор) идет обычным рандомом, т.е. начанию с начального состояния (S) и двигаюсь дальше (рандомом) пока не дойду до терминального символа => как только дошел, проверяю попадает ли получившаяся цепочка в заданный диапазон.

Думаю смысл вопроса понятен... Есть идеи?


 
Ozone ©   (2004-09-28 09:34) [1]

UP


 
Defunct ©   (2004-09-28 09:50) [2]

> Думаю смысл вопроса понятен...

3 раза перечитал - не понял.

E = {0, 1}, что такое E? как трактовать {} - коментарий или множество? что такое 0, 1?

Что такое N, S и A?
Что такое 0A | 1111?
Что такое 1A, почему, например, не 1И?
Что у вас обозначает знак "->" - "эквивалентно" или просто от фонаря поставили?

Вы думаете тут собрались телепаты, которые спят и видят вашу проблему?

> У меня поиск (подбор) идет обычным рандомом,

поиск(подбор) чего?

"обычным рандомом" - т.е. начанию с начального состояния (S) и двигаюсь дальше (рандомом) пока не дойду до терминального символа

что-то тут рандомом и не пахнет. рандомом выбирается индекс или дельта индекса?

> Пользователь ввел кол-во цепочек = 5 и длину от 3 до 4 => ни одной такой цепочки не найдется... Как решить проблему?

Кто его знает, с таким пояснением как вы привели (одно предложение) к дововольно сложной задаче, наврятли здесь кто-то скажет как решить проблему.

Хотите получить нормальный ответ, задайте нормальный (читать понятный всем) вопрос.


 
Ozone ©   (2004-09-28 09:58) [3]

Defunct ©   (28.09.04 09:50) [2]

Ok. Поясняю.

//E = {0, 1}, что такое E? как трактовать {} - коментарий или
//множество? что такое 0, 1?

E - множество символов грамматики
0,1 - символы

// Что такое N, S и A?

N - множество состояний

// Что такое 0A | 1111?

Правила.

// Что такое 1A, почему, например, не 1И?

Потому что состояние "И" не задано.

Что у вас обозначает знак "->" - "эквивалентно" или просто от фонаря поставили?

Символ "->" означает что дальше идут правила для данного состояния.

// что-то тут рандомом и не пахнет. рандомом выбирается индекс
// или дельта индекса?

Так и есть - рандомом выбирается индекс правила для текущего состояния.


 
Defunct ©   (2004-09-28 10:18) [4]

[3] И это называется пояснение?

http://ln.com.ua/~openxs/articles/smart-questions-ru.html


 
Ozone ©   (2004-09-28 10:41) [5]

Хммм... Попробую еще раз....

Есть произвольная регулярная грамматика G = {E, N, P, S}, где
E - множество символов алфавита грамматики
N - множество состояний
P - множество правил
S - начальное состояние.

Саму грамматику пользователь задает в форме Бекуса-Наура (т.е. не метасимволами и не графически, а набором правил для каждого состояния).

Введенные им (user"ом) правила я храю в массиве States описанном выше. Для генерации цепочек языка данной грамматики использую следующий алгоритм:
 1. User задает нужное кол-во цепочек CHCount и диапазон длин цепочек
 2. Count = 0 { кол-во найденых цепочек }
 3. IF Count = CHCount THEN EXIT;
 4. tmp := ""; // цепочка
 5. Начинаю с начального состояния S => I := 0;
 6. IF I < 0 THEN GOTO 11 {нашли терминал}
 7. indx = random(States[i].CCount) {random"ом выбираем правило}
 8. tmp := tmp + States[i].Cross[indx].data;
 9. i := States[i].Cross[indx].indx;
 10. GOTO 6
 11. Проверяем "нужна" ли нам получившаяся цепочка
 12. IF Нужна THEN inc(Count), GOTO 3 ELSE Goto 5

Вот... Можно наверно конкретизировать вопросы:
 1. Можно ли улучшить алгоритм поиска
 2. Как узнать min длину цепочки.


 
Defunct ©   (2004-09-28 11:12) [6]

> 9. i := States[i].Cross[indx].indx;

у последнего правила индекс - (-1) я верно понял?

> 1. Можно ли улучшить алгоритм поиска.
а нужно ли? ну раз пользователь ввел недостаточно правил для формирования цепочки, то это его проблема. Причем тут ваш алгоритм.

> 2. Как узнать min длину цепочки.
мин длинна цепочки = min(legths( Data 0,j)), где j от 1 до CrossesCount в состоянии States[0]. (грубо говоря наименьшая по длине одна единица данных первого состояния и есть ваша возможная min цепочка по вашему алгоритму)

Можно начальное состояние задавать случайно.


 
Ozone ©   (2004-09-28 11:25) [7]

// у последнего правила индекс - (-1) я верно понял?

У терминального. Т.е. оно никуда не указывает.
Например, правило S -> aaaA, говорит что нужно записать "aaa" и перейти в состояние "A" => в массиве Cross состояния S будет такой элемент (data:="aaa"; indx:={индекс состояния A в массиве States}). А indx = -1 когда правило имеет вид, например S -> aaa или S->bb.

// а нужно ли? ну раз пользователь ввел недостаточно правил для // формирования цепочки, то это его проблема. Причем тут ваш
// алгоритм.

В том то и проблема:
 1. Если min длина цепочки превышает заданный дианазон, то цикл будет бесконечным :(
 2. Если задано кол-во, например 100, на диапазоне от 1 до 10 => не для всякой граматики такое кол-во цепочек возможно для этих критериев.

Так вот, как отследить все эти возможные варианты?

// Можно начальное состояние задавать случайно.

Нельзя. Оно всегда S по определению.


 
Ozone ©   (2004-09-28 12:59) [8]

UP


 
Суслик ©   (2004-09-28 13:05) [9]


>  [4] Defunct ©   (28.09.04 10:18)

Ну ты даешь - зачем лезть туда, где ни в зуб ногой.


>  [8] Ozone ©   (28.09.04 12:59)

Нашел, где спрашивать :))))

-------
Я немного в этом разбирался. Но возможный ответ явно не для форума.
Тебе нужно вот, что
http://www.books.ru/shop/search?search_type=+&query=%EA%EE%EC%EF%E8%EB%FF%F2%EE%F0%FB

Там есть все алгоритмы.


 
Ozone ©   (2004-09-28 13:13) [10]

Суслик ©   (28.09.04 13:05) [9]

Хм.. дороговато, млин. Спасибо.
Пока вопрос открыт.


 
Суслик ©   (2004-09-28 13:18) [11]


>  [10] Ozone ©   (28.09.04 13:13)

На такое дело не дорого.
Поверь книга охренительная. Она разбирает до фига методов посроения автоматов. Я вообще остановился на переводе недетерминированные автоматы в детерминированные, т.е. на полкниги. Она разбирает способов. В этом и есть сложность ее чтения - нужно прочесть все методы, чтобы выбрать один.


 
Игорь Шевченко ©   (2004-09-28 13:55) [12]

Дык можно BISON изучать. Или YACC


 
Суслик ©   (2004-09-28 13:56) [13]

Лексы и яксы полный отстой.

Я много пересмотрел. Тот код, который они генерят просто ужасен.


 
Ozone ©   (2004-09-28 14:06) [14]

И все-таки, пока нет этой книги и нет возможности сравнивать алгоритмы - есть какие-нить идеи по решению моей задачи?


 
Игорь Шевченко ©   (2004-09-28 14:32) [15]

Суслик ©   (28.09.04 13:56) [13]


> Лексы и яксы полный отстой.


Подпись мою сам поставь, плз.


 
Суслик ©   (2004-09-28 14:49) [16]


>  [14] Ozone ©   (28.09.04 14:06)

За все мое время тут я общался с одним человеком свободно владеющим КС-грамматиками. Так, что жди :)))


>  [15] Игорь Шевченко ©   (28.09.04 14:32)

Не понял. Ты согласен, что лексы и яксы полный отстой?


 
Суслик ©   (2004-09-28 15:09) [17]

Автору.

Все зависит от твоей задачи.

Если нужно отмотаться от лабораторной работы, то найди в сети готовый алгоритм и в путь.

Если у тебя действительно  задание написать лексический и синтаксический анализатор (иными словами работа за бабло) , то тебе нужно одновременно делать два дела:
1) Читать указанную книгу.
2) Искаль форумы, где бы обсуждались интересующие тебя вопросы.

Иного пути я не вижу.

Это сложная тема, как с математической точки зрения, так и с точки зрения реализации. В указанной книге тебе нужна первая половина. По моим рассчетам на ее чтение и понимание уйдет 2-3 недели.


 
DiamondShark ©   (2004-09-28 15:15) [18]

При чём тут лексы и яксы? Лексы и яксы -- это генераторы распознавателей грамматик. А автору нужен генератор порождаемых грамматикой цепочек.
Задачи обратные.


 
Игорь Шевченко ©   (2004-09-28 15:35) [19]

DiamondShark ©   (28.09.04 15:15) [18]

Oops...Невнимательно прочитал, каюсь.


> А автору нужен генератор порождаемых грамматикой цепочек.


Это проще. Насколько я помню, такая задачка у Маккимана сотоварищи была.


 
Суслик ©   (2004-09-28 15:41) [20]

уууу.

Я тоже невнимательно прочел :)))

Прошу прощения.


 
Ozone ©   (2004-09-28 16:02) [21]

Задача, в принципе, ограниченна, т.е. нужно либо левую либо правую КС-грамматику...

2 вопроса: см. [7]


 
Defunct ©   (2004-09-29 05:22) [22]

Суслик ©   (28.09.04 13:05) [9]
>  [4] Defunct ©   (28.09.04 10:18)
> Ну ты даешь - зачем лезть туда, где ни в зуб ногой.

А откуда ты это взял?

PS: Ты меня уже достал своими коментариями

>Суслик ©   (28.09.04 15:41) [20]
>уууу.
>Я тоже невнимательно прочел :)))

Кто-то, конечно же это не ты, даже задачу понять не смог.

> 1. Если min длина цепочки превышает заданный дианазон, то цикл будет бесконечным :(

Сделайте так, определите количество попыток формирования цепочки.

Если найденая цепочка подходит - обновите число попыток.
Цепочка не подходит, тогда уменьшить число попыток, чило попыток = 0 - выход с сообщением "невозможно сформировать цепочку".

> 2. Если задано кол-во, например 100, на диапазоне от 1 до 10 => не для всякой граматики такое кол-во цепочек возможно для этих критериев.

Ну и хорошо с учетом ответа на 1 выведите найденные цепочки, остальное вас не должно волновать. Пусть дополняют правила.


 
Ozone ©   (2004-09-29 09:32) [23]

Defunct ©   (29.09.04 05:22) [22]

Тоже конечно вариант, но мне кажется он не универсален. Тем более как я могу узнать кол-во попыток которое мне необходимо сделать? У вдруг на n+1 попытке будет нужный результат...


 
Игорь Шевченко ©   (2004-09-29 10:05) [24]

Ozone ©   (28.09.04 16:02) [21]

А глупый совет такой - если начинать с терминальных символов и выводить из них нетерминалы, согласно правилам ?


 
Ozone ©   (2004-09-29 10:43) [25]

Игорь Шевченко ©   (29.09.04 10:05) [24]

Я тоже об этом думал. НО как это поможет решить проблему? Как избавлюсь от зацикливания?


 
Defunct ©   (2004-09-29 23:06) [26]

> Тем более как я могу узнать кол-во попыток которое мне необходимо сделать?

Из комбинаторики N! попыток, где N - количество правил. Но из той же комбинаторики, никто не требует точного решения NP-полной задачи, т.е. вы можете определить число попыток случайным числом, или N^2 или даже просто N.



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.041 c
1-1097052220
bobr12
2004-10-06 12:43
2004.10.17
Как отобразить число 0,1 в виде 1е-1


6-1091796139
galexis
2004-08-06 16:42
2004.10.17
требуется программка позволяющая вручную создавать IP пакеты


1-1096799916
vint45
2004-10-03 14:38
2004.10.17
Выделенные ячейки в Excel


14-1096496562
GHTN
2004-09-30 02:22
2004.10.17
Кадровый состав типовой фирмы.


8-1090483602
newbie
2004-07-22 12:06
2004.10.17
Нездоровый глюк с DelphiX