Z mojego czytania wynika, że większość gramatyk dotyczy generowania nieskończonej liczby łańcuchów. Co jeśli pracowałeś na odwrót?
Jeśli podano n łańcuchów o długości m, powinno być możliwe stworzenie gramatyki, która wygeneruje te łańcuchy i tylko te łańcuchy.
Czy istnieje znana metoda wykonania tego? Idealnie nazwa techniki, którą mogę badać. Alternatywnie, jak powinienem przeszukać literaturę, aby znaleźć taką metodę?
formal-languages
regular-languages
formal-grammars
finite-sets
Gustav Bertram
źródło
źródło
Odpowiedzi:
Jest to objęte ogólnym tematem „indukcji gramatycznej”; wyszukiwanie tego wyrażenia ujawni mnóstwo literatury. Zobacz np. Indukowanie gramatyki bezkontekstowej , https://en.wikipedia.org/wiki/Grammar_induction , https://cstheory.stackexchange.com/q/27347/5038 .
W przypadku zwykłych języków (zamiast kontekstowych) zobacz także Czy regex golf NP-Complete? , Najmniejszy DFA, który akceptuje podane ciągi i odrzuca inne podane ciągi , Czy istnieją ulepszenia algorytmu Dany Angluin do uczenia się regularnych zestawów oraz https://cstheory.stackexchange.com/q/1854/5038 .
źródło
Jeśli liczba ciągów jest skończona, powiedz setS.= {s1,s2). . . .sm} zawsze możesz wymyślić gramatykę bezkontekstową, która generuje wszystkie te łańcuchy, niech ZA być nie-terminalem, wtedy reguła może być A →s1|s2)| . . .sn . Dla skończonego zestawu ciągów możesz nawet wymyślić automaty skończone, które akceptują tylko te ciągi. Tak więc przypadek skończonego zestawu ciągów jest naprawdę trywialny.
źródło
Istnieje wiele sposobów, dlatego należy nałożyć dodatkowe kryteria na jakość wyników.
źródło
To, o co pytasz, przypomina indeks wyszukiwania. Rzeczywiście, można utworzyć Przetworniki Skończonego Stanu i wykorzystywać je do rozpoznawania podawanego tekstu. Na przykład Lucene używa tego algorytmu: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698
Aby uzyskać praktyczne zastosowanie, sprawdź ten post na blogu autorstwa Andrew Gallanta: Indeks 1 600 000 000 kluczy z automatami i rdzą
W poście opisuje metodę konstruowania FSA, biorąc pod uwagę zbiór tekstów, który rozpoznaje wszystkie słowa. Końcowym rezultatem jest zbudowanie w przybliżeniu minimalnego FST z wstępnie posortowanych kluczy w czasie liniowym i w stałej pamięci.
Implementacja jest dostępna w jego
fst
bibliotece: https://github.com/BurntSushi/fstźródło
Odpowiedź na pytanie postawione przez reinierpost, która odpowiada również na pierwotne pytanie:
Automat konstruujemy słownik w następujący sposób:
Maksymalny rozmiar automatu to całkowita długość ciągów wejściowych. Zakładając, że możesz symulować przejścia i tworzyć nowe w stałym czasie, również środowisko wykonawcze jest całkowitą długością ciągów wejściowych. Brak najlepszych lub najgorszych przypadków.
Ten automat jest minimalny. ponieważ w zwykłym przypadku automaty i gramatyki odpowiadają prawie jeden do jednego, to samo dotyczy gramatyki. Oczywiście nie jest możliwe skonstruowanie czegoś o rozmiarze n w czasie krótszym niż n czasu.
źródło