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 2
Jazyk je nekonečný, právě když obsahuje takové slovo, že automat při výpočtu nad ním projde jedním stavem dvakrát. Toto je potřeba dokázat (není to těžké) a pak jen najít algoritmus, který hledá v grafu cykly a ověřuje, že alespoň pro jeden z cyklů platí alespoň jedna z podmínek:
a) cyklus obsahuje přijímající stav
b) cyklus lze někde opustit a dojít do přijímajícího stavu
EDITACE: ještě je potřeba, aby ten algoritmus ověřil, že jeden ze stavů v cyklu je dosažitelný
Všeobecně doporučuji přečíst
http://is.muni.cz/elportal/estud/fi/js0 … maty_I.pdf
Algoritmus lze jednoduše popsat také takto
* optimalizujeme vstupní automat
* ověříme, zda výsledný automat obsahuje "peklo" (tj. stav P, který není přijímající a z nějž se libovolným znakem dostaneme opět do P)
* zjistíme, zda automat obsahuje jiný cyklus než P->P. Pokud ano, je jazyk nekonečný, jinak je konečný.
Offline
Tak jsem nad tím dlouze bádal a narazil jsem na problém a to právě na ten polynomiální alogoritmus (možná to bude hloupý dotaz):
Mám automat, který má nekonečný jazyk (tj, obsahuje cyklus P->P a také další ne P->P cyklus), ale není mi jasné, jak z toho vyvořit polynomiální alg., protože tam nic polynomiálního nevidím. (Jedná se o jednoduchý automat s abecedou (a,b), kde počet "a" má být roven mod 3 = 1)
Díky za pomoc.
Offline
Máme najít algoritmus pro konečné automaty. Tzn. program, který na začátku dostane popis toho automatu (v tvém případě mu zadáme množinu stavů
0,1,2, počáteční stav 0, přijímající 1 a přechodovou funkci
f(0,a)=1
f(1,a)=2
f(2,a)=0
f(0,b)=1
f(1,b)=1
f(2,b)=2)
a náš program z tohoto vstupu vyrobí "ano" nebo "ne" na podle toho, jestli je jazyk konečný nebo ne.
Náš algoritmus tedy (jak jsem psal) víceméně hledá v grafu cykly. Např. procházením do šířky zjistí, jestli se do nějakého stavu dostane cyklem.
Procházením do šířky proti směru hran pak zjistí, jestli se z tohoto cyklu lze dostat do nějakého přijímajícího stavu. Složitost algoritmu je |Q|.|S|, kde Q je množina stavů a S abeceda. Tato složitost je polynomiální.
Offline
Lares napsal(a):
Po nalezení cyklu prostě stačí ověřit, zda se z něj nějak nelze dostat do přijímacího stavu.
To je ta myšlenka. Lze ji formulovat i naopak: ověřujeme, že se z přijímajícího stavu dostaneme do toho cyklu proti směru hran. (Kdyby hrany nebyly orientované, dostaneme se z cyklu do akceptujícíh stavu právě když se dostaneme z akceptujícího stavu do cyklu. Protože ale orientované jsou, ta formulace "proti směru hran" je důležitá.)
Offline
Ahoj chci se zeptat hledně konečných automatů, podle čeho poznám, kdy automat změní stav ??? Např. stav S0 ->1 S1 , S1 ->0 S2, zarazilo mě že automat může změnit stav i při hodnotě 0 ! Vůbec to nechápu :-((.
Offline
↑ xy3000:Co to je konečný automat se dočteš na http://bart.math.muni.cz/~brkos/files/d … %C5%AF.pdf . Je tam vysvětlené kdy a jak mění stavy.
Offline
Nevim proc by automat nemohl zmenit stav pri precteni nuly. To, kdy automat meni stav, zavisi na tom, jak je navrzeny, to znamena. odkud kam vedou sipky. Na konrketnich prectenych symbolech nezalezi.
Mozna jsem ale taky spatne pochopil, na co se ptas. Mels na mysli nejaky konkretni automat pro nejaky konkretni jazyk?
Offline
Třeba když bych měl konečný automat který přijímá regulární jazyk řetězců, které vyjadřují binární číslo dělitelné čtyřmi, tak budu mít stav S0, S1, S2,S3 - to je beze zbytku se zbytkem 1 se zbytkem 2 a se zbytkem 3. Podle čeho ale určím ty přechody a hodnoty kterou ponesou ???
Offline
↑ xy3000:V tomhle případě je potřeba si uvědomit, co dělá přidání binární cifry 0 nebo 1 na konec slova. Dělá to to, že původní číslo se vynásobí dvěma a ta cifra se přičte.
Konečný automat si o čísle pamatuje jen konečně mnoho informací. V našem případě zbytek po dělení třemi.
Ukážu teď, jak bude automat pracovat, když bude číst vstup 1110
Začínám ve stavu S0, takže to, co jsem načetl doteď, je tvaru 3k. Nyní načtu 1. Celé doteď načtené číslo je 2(3k)+1=3(2k)+1, což dává zbytek 1 po dělení 3. Musím se proto přesunout do S1. Načtu 1. Dosavadní číslo bylo 3n+1, nové je 2(3n+1)+1=3(2n+1), což je dělitelné 3, musím se přesunout do S0. Načtu zase 1. Už víme, že znakem 1 se z S0 dostaneme do S1. Jsme v S1 a načteme 0. Dosud načtené číslo bylo 3m+1, nyní se změnilo na 2(3m+1)+0=3(2m)+2, musím do S2.
Doufám, že je z tohoto příkladu jasné, jak automat funguje a jak doplnit zbylé hodnoty přechodové fce.
Offline
Kondr napsal(a):
↑ xy3000:V tomhle případě je potřeba si uvědomit, co dělá přidání binární cifry 0 nebo 1 na konec slova. Dělá to to, že původní číslo se vynásobí dvěma a ta cifra se přičte.
Konečný automat si o čísle pamatuje jen konečně mnoho informací. V našem případě zbytek po dělení třemi.
Ukážu teď, jak bude automat pracovat, když bude číst vstup 1110
Začínám ve stavu S0, takže to, co jsem načetl doteď, je tvaru 3k. Nyní načtu 1. Celé doteď načtené číslo je 2(3k)+1=3(2k)+1, což dává zbytek 1 po dělení 3. Musím se proto přesunout do S1. Načtu 1. Dosavadní číslo bylo 3n+1, nové je 2(3n+1)+1=3(2n+1), což je dělitelné 3, musím se přesunout do S0. Načtu zase 1. Už víme, že znakem 1 se z S0 dostaneme do S1. Jsme v S1 a načteme 0. Dosud načtené číslo bylo 3m+1, nyní se změnilo na 2(3m+1)+0=3(2m)+2, musím do S2.
Doufám, že je z tohoto příkladu jasné, jak automat funguje a jak doplnit zbylé hodnoty přechodové fce.
Díky za snahu to vysvětlit, je to teda automat na dělení třemi ??? Stále mi není jasné co je to 3k a co je konec slova.
Offline
↑ xy3000:Ty čísla k,m,n jsou přirozená čísla, o nichž víme, že existují, ale nezajímá nás jejich hodnota.
Z tvých reakcí mám ale pořád pocit, že nevíš, co to je automat. Hlavně neexistuje nic jako "automat na dělení třemi". Automat vždy rozpoznává nějaký jazyk. Např. jazyk všech slov, které obsahují jako svůj podřetězec "baba". Nebo jazyk všech slov liché délky. Nebo jazyk všech slov, která když přečteme jako binární číslo, bude to číslo dělitelné 3, což je náš případ. Automat má několik stavů. Tím, že je ve stavu S0 v našem případě říká "doteď jsem načetl číslo, které je tvaru 3k". Když je ve stavu S1, říká nám "doteď jsem načetl číslo, které je tvaru 3n+1". A konečně ve stavu S2 říká "načetl jsem 3m+2". O tom, jakou hodnotu mají k,n,m nic nevíme a vědět nepotřebujeme. Z toho, v jakém je stavu a jaký znak nově načetl, už umíme určit, do jakého stavu má přejít.
Pro to, jestli nakonec akceptuje nebo ne, je rozhodující stav, kdy se dostane na konec slova -- tzn. načte poslední znak a provede příslušnou změnu stavu.
Offline
Protože když zvolíš libovolné k, tak vidíš, že ho nejprve vynásobíš 2 a pak 3... Toto číslo by bylo zpětně dělitelné bezezbytku, protože ho získáš vynásobením 3. Jenže ty k tomu 3*(2*k) ještě přičítáš 1, čili když to pak zpětně dělíš 3 tak ta 1 bude vždy zbytek. Je to celkem jednoduché.
Když si zvolím k=2. Vynásobím ho 2 a mám 4. Tu když vynásobím 3 dostanu 12 (ale 12 je zpětně dělitelné bezezbytku, to je zřejmé). No a +1 =13. A 13/3=4+1 - tady vidíš, že podíl bude vždy 2k+1 právě proto, že to nejprve 3 násobíš a pak opět dělíš.
Přehodilo se to proto, že je to pak zřejmější. Přecijen z 2(3k)+1 není na první pohled vidět, že po dělení 3 to dá zbytek. Ale z 3(2k)+1 je to přímo vidět.
Pokud bys třeba chtěl vědět, jaký zbytek dá 2(3k)+1 po dělení 6, tak si napíšeš 2*3(k)+1=6k+1 - z toho je taky přímo vidět, že pro jakékoliv k bude výsledek dělitelný 6 (dokonce dostanem zpět k) se zbytkem 1.
Offline
Nic se neopisuje. Auomat ví pouze v jakém je stavu a jaký znak právě načetl.
Offline
Já vím že už s tím moc votravuju, docela už jsem to pochopil, akorát bych jeste prosil o podrobnější vysvětlení těch stavů, který automat právě načetl, stavy S0 , S1, S2. Jak jev tom příkladě číslo 1110 S0 - 3k, S1 3n+1, S2 3m +2 ??Třeba pro číslo 1001.
Offline
Začínáme ve stavu S0. Načteme 1, 3k+1 dává zbytek 1, jdeme do S1. Načteme 0. Pak 2(3n+1)+0=3(2n)+2, jdeme do S2. Načteme 0, 2(3m+2)=3(2m+1)+1, jdeme do S1. Načteme 1, 2(3k+1)+1=3(2k+1), jdeme do S0. Skončili jsme načítání, jsme v akceptujícím stavu, slovo patří do jazyka.
To platí -- slovo odpovídá číslu 9=3*3.
Offline
Kondr - moc díky už to chápu nebo si alespon myslím že to chápu. Poslední otázka pakuž dám pokoj :-). Pokusil jsem se zkonstruovat automat který bude přijímat binární čísla dělitelná čtyřmi. Měl jsem stavy S0,S1,S2,S3. Při výpočtech se mě ale stalo, že jsem přeskočil ze stavu S3 do stavu S1 prostě podle těch zbytků to tak vycházelo, je to dobře nebo blbě, asi blbě co ?
Offline
Ze stavu S3 po načtení 0 musíme skočit do S2, po načtení 1 zpátky do S3, protože 2(4t+3)+0=4(2t+1)+2 a 2(4t+3)+1=4(2t+1)+3.
Offline
Mám automat přijímající binární čísla dělitelná 4. Zkouším tam pustit číslo 7 - binárně 111 automat by měl skončit v S3. Stav S0 čtu 1 -> 2(4t) + 1 = 8t + 1 , zbytek podle tý jedničky je zbytek 1 tudíž stav S1. Dále stav S1 (8t + 1) = 2(8t+1) + 1 = 16t + 3 , 3:3, zbytek nula stav tedy S0, dále čtu 1 ze stavu S0 tudíž podle dřívějšího propočtu se dostanu z S0 doS1, ale měl bych být v S3, že?
Offline
Kondr napsal(a):
↑ xy3000:Ber zbytky po dělení čtyřmi (tj. ne "3:3", jak píšeš...).
no jo to jsem vůl takže teda stav S1 -> 16t + 3 , 3:4 bohužel nevím jak definovat zbytek když dělitel je větší jak dělenec :-((.
Poslední, poslední otázka do jakého stavu půjde tento automat po stavu S1 a proč ??????????
Offline
3:4 - celá část podílu je 0, zbytek 3.
Co se týče toho tvého automatu: nad slovem 111 z výchozího S0 půjde do S1, pak do S3 a nakonec znovu do S3. Když je ve stavu S1 a načte 1, tak se hodnota dosud načteného čísla změní z 4t+1 na 2(4t+1)+1=4(2t)+3.
Offline
Stránky: 1 2