Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Offline
"neobsahuje slovo abba" je ekvivalentní podmínce, že mezi dvěma znaky "a" nesmí být právě dva znaky "b", může tam být 0, 1 nebo 3 a více. Takže bych nejprve rozmístila potřebný počet "a" a pak mezi každá dvě umožnila dát buď nic nebo jedno "b" nebo 3 "b" s možností přidání dalších "b". Na začátku a na konci slova (před prvním a za posledním "a") může být libovolný počet znaků "b".
Offline
↑ claudia:
Zkusil jsem to dát dohromady podle toho popisu, snad to bude sedět.
Dole je celkový výsledek. To L2 jsem také přepsal.
L1 : S1-> a|A|B|AaAaA
A-> epsilon|b|bAbAb
B-> bb
L2: S2 -> epsilon|S2a| S2bS2bS2
L: S->S1S2
S1-> a|A|B|AaAaA
A-> epsilon|b|bAbAb
B-> bb
S2 -> epsilon|S2a|S2bS2bS2
Offline
Tak to si nejsem jistá. Jak bys vygeneroval třeba "bbbbb"?
Offline
↑ claudia:
Podle mě takto :
Z počátečního neterminálu S1 odvodím neterminál A, z A odvodím bAbAb a z neterminálů A co jsou mezi třemi terminály "b" odvodím dva terminály "b".
Offline
OK, omlouvám se, špatně jsem si to přečetla. Jak bys vygeneroval "aaaaa"? :-)
Offline
↑ claudia:
Tak teďka jsi mě dostala zase ty :-) To jsem přehlédl zase já.
Musím upravit ten L1.
Níže je výsledek. Z toho už by to mělo být jasné.
L1 : S1-> A|B|AaAaA
A-> epsilona|a|b|bAbAb
B-> bb
Offline
Zrovna jasné mi to není ani trochu. Nevidím v tom žádnou logiku. Pokud tam nějaká je, můžeš klidně přidat slovní komentář :-) Co slovo "bba"? :-)
Offline
↑ claudia:
No vidím, že dostávám pořádně na zadek :-)
Ale lepší tady než u zkoušky.
Takže zase uprava L1
L1 : S1-> A|B|Abb|bbA|AaBaA
A-> epsilon|a|b|AaA
B-> bAbAb
To "aaaaa" dostanu takto:
Z S1 vygeneruji A z něho AaA dosadím za pravé A podslovo AaA dostanu AaAaA a pak za A doplním terminály "a"
"bba" dostanu následujícím postupem:
Z S1 vygeneruji bbA pak A nahradím terminálem "a"
Nějak se v tom zamotávám :-)
Offline
↑ silapo.72:
To je přesně ten problém. Lehčí jazyky jdou generovat metodou pokus-omyl, ale u složitějších je to ... složitější. Zvláště, kdybych teď pravila "dokaž, že to generuje právě to, co má".
Je asi lepší přístup mít nějakou počáteční myšlenku, která se dá do těch pravidel převést snadno, přitom je snadné nahlédnout, že je správná. Třeba to, co jsem psala výše - nejdříve vygenerovat všechna a, pak na začátek a na konec povolit libovoný počet b, doprostřed jen 0, 1 nebo 3+.
Není v mých silách vyřešit všechny tvé příklady, ale jednou to tedy zkusím ukázat:
Rozhodně to není nejstručnější způsob, jak to zapsat, ale chtěla jsem, aby k tomu nebyl třeba další komentář :-) Až si to promyslíš, můžeš sjednotit začátek, okraj a b*, protože mají zjevně stejný význam.
Offline
↑ claudia:
Díky moc za ochotu a čas, který tím ztrácíš.
Jde mě hlavně o to najít nějaký systém při generování složitějších jazyků abych to nezkoušel stylem pokus omyl, jak píšeš.
Sestavil jsem to podle toho návodu a snažil se srozumitelně popsat postup.
A-začátek
B-konec
C-okraj
D-střed
E-b*
S-> AB
A-> C
B->DaB|C
C->E
D->epsilon|b|bbbE
E->epsilon|bE
Pak jsem sjednotil začátek , okraj a b* tj. (A,C,E) do A.
Poté jsem přejmenoval D na C.
A vyšlo mi pro L1:
S->AB
A->epsilon|bA
B->CaB|A
C->epsilon|b|bbbA
Offline
Ve skutečnosti to nejspíše z toho "mého tvaru" přepisovat nemusíš, tak se naopak bezkontextové gramatiky tradičně zapisují:
http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
Systém sama žádný nemám. Možná existuje nějaký univerzální algoritmus. Ale pravděpodobně nebude dávat elegantní výsledky. Nejspíše to patří mezi úlohy, kde je třeba zapojit fantazii :-)
Offline
↑ claudia:
Ještě jednou díky za pomoc a za zajímavý odkaz ;)
Offline
Stránky: 1