Credits:
- Fausta
- Hocky
- 1A. Top 10 Proper Order
- 1B. Pembuktian
- 2A. Membuat DFSM
- 2B. Membuat NDFSM
- 3A. NDFSM -> DFSM
- 3B. Minimalisasi DFSM
- 3C. Kelas Ekivalen
- 4A. Membuat Regex
- 4B. Regex -> NDFSM
- 4C. FSM -> Regex
- 4D. Membuat DFSM dari gabungan beberapa mesin
- 5A. Pumping
- 6A. Regular Grammar
- 6B. CFG
- 6C. CFG -> Chomsky
Cara pakai:
- Ubah fungsi
bool isValid(const string &S);
biar sesuai dengan syarat, bisa pakai fungsi match kalau mau. - Ubah domain dan letakkan ke
vector <isi>
, bisa pakaivector <string> isi = kleene({"a", "b"}, STAR);
Untuk kleene star berapa string pun, bisa jugakleene({"hock", "yy"}, STAR)
.
Baca-baca materi ini, jangan lupa baca contoh pembuktian juga.
- https://scele.cs.ui.ac.id/pluginfile.php/101649/mod_resource/content/1/HW2101%20v5%20Solusi%20Bag%20B.pdf
- https://cs.lmu.edu/~ray/notes/languagetheory/
Cara pakai:
- Karakter domainnya ditahan agar jangan kebanyakan, 7-10 mestinya udah cukup
- Modif fungsi
ll cek(string s)
agar menerima string yang diinginkan. - Jangan lupa mengecek JFF menggunakan text editor, apakah matches nya ada banyak karakter * banyak state dan pastikan kalau dia DFSM. Jangan lupa menambahkan transisi dari dead state ke dead state juga.
Coba-coba aja sendiri, baca-baca latihan
Tinggal modif aja void makeEdge()
, terus dia bakal otomatis ngerubah. Ini cuma buat essay ya! Kalau mau JFF tinggal pake JFLAP langsung.
Tinggal modif aja void makeEdge()
, terus dia bakal otomatis ngerubah. Ini cuma buat essay ya! Kalau mau JFF tinggal pake JFLAP langsung.
Refer ke 2A, penggunaannya sama.
Pikirin dulu benar-benar langsung aja buat regexnya. Kalau udh stuck banget baru:
- Pake program 2A, terus bikin FSMnya, terus bisa convert
Sama aja pake JFLAP.
Use regex.cpp
. Modify:
void makeEdges();
Here is the sample interaction. You can enter each query as rip <Node>
or print
, don't rip the last nodes. Please make sure the automata you build at first is already prenormalized with:
- No-self loop Initial Node
- Only one accepting nodes
First input
rip D
Ripping D
Old Affected Transitions:
Self loop: ((D, a+b), D)
((B, a), D)
((D, b), C)
((D, ε), G)
New Transitions:
((B, a(a+b)*b), C)
((B, a(a+b)*), G)
Second input
print
((A, b), A)
((A, ε), B)
((A, ε), C)
((B, a), B)
((B, a(a+b)*b), C)
((B, a(a+b)*), G)
((C, b), C)
((C, a), E)
((E, ε), C)
((E, ε), G)
((F, ε), A)
- A - B = A ∩ Bc = (Ac ∪ B)c
- A ∩ B = (Ac ∪ Bc)c
Cara bikin A ∪ B:
- Pertama tambahin satu node Initial, terus dari dua mesin itu inisial yang baru dibikin dihubungin pake ε ke inisial mesin A, sama mesin B
Cara bikin Ac:
- Convert ke DFSM
- Minimalize DFSM
- PASTIKAN BENAR BENAR LENGKAP DFSM-NYA! Semua karakter harus ada, semua transisi harus ada untuk semua karakter.
- Swap final dan non-final
Cara bikin concat(A, B):
- Bikin initial B yang baru, bikin ending nodes satu yang baru dari A, gabungin A -> B, hapus tanda final nodes dari A.
Cara bikin AR:
- Convert ke DFSM
- PASTIKAN BENAR BENAR LENGKAP DFSM-NYA! Semua karakter harus ada, semua transisi harus ada untuk semua karakter.
- Accepting harus satu, kalau lebih dari satu finalnya bikin node baru.
- Initial jadi accepting, accepting jadi initial
- Reverse semua arah transisinya
- Hasilnya bisa jadi NDFSM
- Convert lagi ke DFSM bila perlu.
Cara bikin A*:
- Bikin satu initial state, untuk setiap accepting state bikin transisi ε ke initial.
Referensi:
Misalkan sebuah pumping length
Referensi:
Refer ke 2A, penggunaannya sama.
Baca latihan-latihan.
Pake JFLAP
Untuk tambahan silakan baca CFGtoNormalForm.
Ada beberapa steps selain yang utama:
- Nonproductive Removal, artinya semua terminal yang tidak bisa menuju non terminal bisa dibuang.
- Semua terminal yang tidak bisa diraih dari inital juga mesti dibuang.
- Unit removal, semua rule A -> B, bisa diganti dengan A -> C, dengan B -> C benar
- Epsilon Removal, semua rule A -> ε bisa dibuang dan semua B -> A