形式語言
正規語言
自動機理論
形式語言
\(L=\{"cat","doge","monkey"\}\)
\(L\)由下列字母構成
\(\Sigma=\{a,b,c,\cdots z\}\)
\(s=a_1a_2a_3\cdots a_n\)
\(t=b_1b_2b_3\cdots b_m\)
\(st=a_1a_2a_3\cdots a_nb_1b_2b_3\cdots b_m\)
\(abcd\)
\(wxyz\)
\(abcdwxyz\)
\(s=a_1a_2a_3\cdots a_n\)
\(s^R=a_n\cdots a_3a_2a_1\)
\(abcd\)
\(dcba\)
\(s=a_1a_2a_3\cdots a_n\)
\(|s|=n\)
\(|st|=|s|+|t|\)
\(abcd\)
\(xyz\)
\(|abcd|=4\)
\(|xyz|=3\)
\(|abcdxyz|=7\)
\(s=\lambda\)
\(|\lambda|=0\)
\(\lambda t=t\lambda=t\)
沒有包含任何字母的字串
一個字串中連續的一個序列
String
\(\underline{abc}de\)
\(qw\underline{e}rt\)
Substring
\(abc\)
\(e\)
若\(w=st\)
s就是w的前綴
t就是w的後綴
\(w =abcd\)
Prefixes | Suffixes |
---|---|
λ | abcd |
a | bcd |
ad | cd |
adc | d |
abcd | λ |
\(w^n=ww\cdots w\) (n個w)
\(w^0=\lambda\)
\(w=abcd\)
\(w^2=abcdabcd\)
\(w^0=\lambda\)
若\(\sum=\{a,b\}\)
\(\sum^*\)表示\(\sum\)可以組合出的所有字串
\(\sum^+=\sum^*-\lambda\)
\(\sum=\{a,b\}\)
\(\sum^*=\{\lambda,a,b,aa,ab,ba,bb,aaa,\cdots\}\)
\(\sum^+=\{a,b,aa,ab,ba,bb,aaa,\cdots\}\)
\(L=\{a^nb^n : n\geq0\}\)
這些是L語言的字串
\(\lambda\)
\(ab\)
\(aaaaaaaabbbbbbbb\)
這些不是L語言的字串
ac
abb
bbab
語言的運算與字串運算差不多
稍微說明操作方法
\(\overline{L}=\sum^*-L\)
\(L^R=\{w^R:w\in L\}\)
\(L=\{ab,b\}\)
\(\overline{L}={\lambda,b,aa,\cdots}\)
\(L^R=\{a,ba\}\)
\(L_1L_2=\{xy:x\in L_1,y \in L_2\}\)
\(L^n=LL\cdots L\)
\(L^0=\{\lambda\}\)
\(L=\{ab,b\}\)
\(G=\{a,bb\}\)
\(LG=\{aba,abbb,ba,bbb\}\)
\(L^2=\{abab,bb\}\)
\(L^*=L^0\bigcup L^1 \bigcup L^2 \cdots\)
\(L^+=L^*-\{\lambda\}\)
\(L=\{a,ab\}\)
\(L*=\{\)
\(\lambda,\)
\(a,ab\)
\(aa,aab,aba,abab,\)
\(aaa,aaab,\cdots \}\)
句子
=名詞片語+動詞片語
=名詞+動詞片語
=Sylveon + 動詞 + 名詞片語
=Sylveon + solve + 修飾詞 + 名詞
=Sylveon + solve + the + problems
\(L=\{a,bb,abc\}\) 列舉法
\(L=\{ba^n:n>0\}\) 數學描述
\(L=\{\{a,ab\}^*\bigcup \{bb\}^*\}\) 集合描述
\(L(r_1+r_2)=L(r_1)\cup L(r_2)\)
\(L(a+b) = L(a)\cup L(b)\)
\(=\{a,b\}\)
\(L(r_1\cdot r_2)=L(r_1) L(r_2)\)
\(L(a\cdot b) = L(a)L(b)\)
\(=\{ab\}\)
\(L((a+b)\cdot c)=(L(a)\cup L(b))L(c)\)
\(=\{a,b\}\{c\}\)
\(=\{ac,bc\}\)
\(L({r}^*)=L(r)^*\)
\(L(a^*) = L(a)^*\)
\(=\{a\}^*=\{\lambda,a,aa,\cdots\}\)
\(L((a+b)^*)=(L(a)\cup L(b))^*\)
\(=\{a,b\}^*\)
\(=\{\lambda,a,b,aa,ab,ba,aaa,\cdots\}\)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str,rule="(a|b)*(a|bb)";
regex reg(rule);
while( getline(cin,str) )
{
if( regex_match(str,reg) )
cout<<str<<" in Language "<<rule<<endl;
else
cout<<str<<" not in Language "<<rule<<endl;
}
}
a
b
abaa
abb
a in Language (ab)*(a|bb)
b not in Language (ab)*(a|bb)
abaa not in Language (ab)*(a|bb)
abb in Language (a|b)*(a|bb)
\(L\in Regular Language \Leftrightarrow \exists r:L(r)=L\)
有限狀態自動機
輸入Input
自動機Automata
輸出Output
儲存空間
Storage
String
Yes/No
Input : abba
Input : abba
a
Input : abba
b
Input : abaa
b
Input : abba
a
Input : abba
a
AC!
\(L(M)=\{w:w \text{ is accepted by } M\}\)
\(\Sigma=\{a,b\}\)
KMP/AC自動機
$$L=L(M)$$
$$L=L(M)$$
\(L=L(r)\)
正規表達式
有限狀態自動機
Stephen Cole Kleene 1909-1994
$$L=\{a^nb^n:n\geq 0\}$$
for regular languages
M一般而言=自動機狀態數
M一般而言=自動機狀態數
M一般而言=自動機狀態數
路徑一定有環!
(鴿籠原理)
M一般而言=自動機狀態數
X
Z
Y
M一般而言=自動機狀態數
X
Z
Y
邪惡的字串\(w=a^Mb^M\in L\)
邪惡的字串\(w=a^Mb^M\in L\)
$$x=a^{M-i},y=a^{i},z=b^M$$
邪惡的字串\(w=a^Mb^M\in L\)
$$x=a^i,y=a^{M-i},z=b^M$$
$$|xy|=i+(M-i)=M\leq M$$
邪惡的字串\(w=a^Mb^M\in L\)
$$x=a^{M-i},y=a^{i},z=b^M(i>0)$$
$$|xy|=(M-i)+i=M\leq M$$
$$|y|=i>0$$
使\(xy^iz\in L\)
邪惡的字串\(w=a^Mb^M\in L\)
$$x=a^{M-i},y=a^{i},z=b^M(i>0)$$
$$|xy|=(M-i)+i=M\leq M$$
$$|y|=i>0$$
使\(xy^iz\in L\)
但是\(w=xy^0z=a^{M-i}b^M \notin L\)
$$L=\{ww^R:w=\Sigma^*\}$$
演算法=圖靈機
如果一個問題是可以被某種演算法解決的
就存在一個圖靈機可以解決該問題