Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevok: 1 ] 
AutorSpráva
Offline

Čestný člen
Čestný člen
Efektivny vypocet slov generovanych frazovou gramatikou

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 13.01.2013 23:40

Ola :rolleyes: tak dam nejaku snad zaujimavu programatorsku challenge aj ja. Rad by som napisal program, ktory z neomezenej gramatiky dokaze v rozumnom case vypluvat slova, ktore gramatika generuje.
Zbastlil som si nejaky blud v Perli. Algoritmus je z toho snad celkom dobre vidiet, mam frontu (na zaciatku je v nej pociatocny neterminal), vyberiem z nej slovo, prejdem v cykle vsetky pravidla tvaru A -> α, nahradim v onom slove po jednom vsetky vyskyty A za α a nove slova narvem zase do fronty.
Pridal som k tomu nejaku kontrolu, nech sa do fronty necpu vetne formy, ktore tam uz boli, ale stale to bezi sakra pomaly. Mam tam gramatiku pre slova { a.b.a^2.b.a^3.b...a^n.b | n >= 1 } (pravidla su v hashmape %p), do par sekund mi to napocita slova po n=4, dalsiu minutu uz nic.
Moc sa v takychto veciach neorientujem, takze nemam sajnu, ci su nejake rozumne postupy na to, ako toto zrychlit. Co mam skusit? Teraz mi napada, ze by mozno pomohlo hadzat prioritne do fronty slova, ktore obsahuju uz iba malo neterminalov/lavych stran (co z toho?) pravidiel. Nejake dalsie napady?
Co gramatiky nizsie v Chomskeho hierarchii? Ide pisat efektivne skripty aspon pre nejake omezenejsie typy gramatik (-> pomahaju nejake normalne formy)?
Diky.
(Akceptujem rozumne riesenia v akomkolvek jazyku/pseudokode)
Kód:
#!/usr/bin/perl
use strict;

# pravidla gramatiky, vlavo lava strana, vpravo arrayref pravych stran
my %p = (
   S   => [ qw(ab ZSA) ],
   bA   => [ 'Aab' ],
   aA   => [ 'Aa' ],
   ZA   => [ 'ab' ],
);

# pociatocny neterminal
my @queue = qw(S);
my %dupls = ();
while (@queue) {
   my $word = shift @queue;
   if ($dupls{$word}) {
      next;
   }
   $dupls{$word} = 1;
   # neterminaly a terminaly su odlisene velkostou pismen
   if ($word eq lc $word) {
      print "$word\n";
   }
   else {
      while (my ($left, $right) = each %p) {
         push @queue, map { replace_seq($word, $left, $_) } @$right;
      }
   }
}

# pomocna subrutina, vrati vsetky nahradenia $_[1] za $_[2] v $_[0]
# pr.: replace_seq('ababa', 'a', 'x') ~> ('xbaba', 'abxba', 'ababx')
sub replace_seq {
   my ($haystack, $needle, $replacement) = @_;
   my @matches = $haystack =~ /$needle/g;
   my $needleqr = qr/$needle/;
   my @result = ();
   for my $i (0 .. $#matches) {
      my $before = join '.*?', map { $needleqr } (0 .. $i - 1);
      my $subst = $haystack;
      $subst =~ s/(.*?$before.*?)$needle(.*)/$1$replacement$2/;
      push @result, $subst;
   }   
   return @result;
}


Odpovedať na tému [ Príspevok: 1 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Tichy + efektivny PSU

v PC skrinky, zdroje a všetky druhy chladenia

3

284

08.06.2014 0:01

esso82 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. (PHP)ako na efektivny ban?...

v PHP, ASP

13

1000

28.07.2007 12:36

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Efektívny zdroj 800W+ do 7000Sk bez DPH (viac info v téme)

v PC skrinky, zdroje a všetky druhy chladenia

4

576

11.06.2008 22:48

Jaro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Databáza slovenských slov

v Databázy

10

9702

18.01.2018 5:25

tukusejssirs Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C# enkóder - generovanie slov

v Ostatné

14

628

03.08.2015 18:05

expresado Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vratenie penazi - Slov. posta

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Obchody, reklamácie a právo

42

4103

17.10.2009 12:18

Milan.H Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. OpenOffice Writer - delenie slov

v Ostatné programy

3

977

23.04.2009 23:05

SkyHiRider Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako obýsť filter slov

v Bezpečnosť a firewally

15

984

16.02.2011 16:34

exampler Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Program na databazu slov

v Ostatné

1

601

16.02.2009 20:07

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. MS word oprava slov

v Ostatné programy

0

306

29.09.2011 17:11

p4tooo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Smajlíky v cenzúre slov

v Redakčné systémy

6

1138

05.12.2006 16:28

altt Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Výpočet

v PHP, ASP

18

1173

30.06.2012 15:45

killer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vypocet

v Krčma

11

1011

02.11.2011 18:56

dixi Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vypocet

v JavaScript, VBScript, Ajax

1

299

03.01.2013 0:59

kace Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Štruktúra na uloženie klúčových slov

v Assembler, C, C++, Pascal, Java

2

398

07.05.2010 12:50

coldak Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C++ obratenie slov vo vete

v Assembler, C, C++, Pascal, Java

0

287

25.12.2014 16:51

dany2281995 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra