計算理論
計算:以機械而有效的方式,獲取問題答案的過程。
計算理論的中心,逐漸從數學轉到計算機科學。
計算理論和計算機科學所關心的核心問題是
計算機的基本能力和限制是什麼?
包含兩個內容,分別對應計算理論的兩個重要研究方向。
一個是可計算性理論,一個是計算複雜性理論。
形式語言與自動機理論(本專欄)正是這兩個方向的理論基礎。
究竟哪些問題,可通過計算解決?—可計算性理論
計算作爲一種能力,它是否有邊界?是不是任何問題都可以通過計算來解決。
如果是,它會是什麼樣的?
如果不是,哪些問題可以,哪些問題不可以?爲什麼不可以?
爲了能夠嚴謹的研究機械而有效的計算過程,我們需要嚴格定義的概念去描述,需要嚴謹的計算模型去分析它。
這些模型,就是我們要學習的自動機理論。這些概念就是算法。
一個問題如果有了具體的算法之後,解決起來就不再需要太多的人的智慧,只需要根據算法的步驟,機械的計算就可以了。
比如,兩個整數的最大公約數,使用歐幾里得算法。
20世紀30年,數理邏輯學家在研究可計算的整數函數時,利用圖靈機和lambda演算等計算模型,首次將算法的概念形式化。
從那以後,人們才能利用數理邏輯的方法,研究計算的本質。並且發現,計算也不是萬能的。
確實存在一些問題,無法通過計算解決。或者說,這些問題是不存在算法的。(最後會給出這樣的問題並給出證明)
解決可計算問題,究竟需要多少資源?—計算複雜性理論
利用計算去解決可計算問題,需要多少資源???
計算一個問題需要消耗的計算時間和佔用的存儲空間會達到什麼樣的程度?
如果一個問題無論使用什麼算法,求解過程都需要相當多的資源,那其中的原因是什麼?究竟是什麼造成一些問題很難計算。而另一些卻很容易,雖然其中原因未知,但是在分析各種有效計算模型的過程中。人們發現一個按照難度,給問題的分類的完美體系,如果元素週期表。對化學元素性質分類一樣。
由這個體系,我們可以將未知的體系按照難易程度分類,再選擇使用什麼樣的對策來解決。
目前,計算複雜性理論的研究依然是計算機科學領域的研究熱點,但是已經超出了本課程的內容。我們不會涉及太多。希望本課程爲大家研究計算複雜性做出一點兒基礎積累。
因爲爲了研究可計算性和計算複雜性。需要使用和構造什麼樣的計算模型?恰恰就是形式語言與自動機理論的主要內容
這些模型都是高度抽象化的計算裝置。簡單明確但功能強大。
不但便於在理論分析中便於理論推導和證明,在需要實際問題中也有很多直接的應用
爲了研究計算,要使用哪些計算模型?-----形式語言與自動機理論
什麼是自動機理論?
以這些抽象的計算裝置爲研究對象,分析這些裝置,所能解決問題的理論。
最重要的圖靈機,具有現在所有實際的計算機的所有能力,是計算機的理論模型。
區分了那些問題是可以計算,那些問題是不能計算。
在多項式時間內,圖靈機以確定的方式和非確定的方式,所解決的問題的問題類是否相同,即p是否等於np,依然是計算機中懸而未決的問題。
而且其他的稍簡單的模型,比如說,有窮自動機。在數字電路,通信協議等實際問題中,有重要的應用。
文法,下推自動機 在計算機程序設計語言的設計,和編譯器的實現上,發揮了重要作用
什麼是形式語言?
如果自動機是研究計算的模型,那麼語言就是研究計算的問題或實例。
形式語言:經數學定義的語言。
以數學的方法,從解決問題的角度,研究計算,首先需要以數學的方法來描述問題。這種描述就是形式語言。
使用語言這個概念,似乎有些奇怪。但其實和我們的常識一致。
可以以這樣的觀點,理解語言的構成。
語言簡單的由字符,單詞,句子,語法。
如,自然語言中的英文和中文等。
而只要有嚴謹的數學定義,就可以稱爲形式語言。比如化學分子式,程序設計語言等。甚至是沒有任何含義的語言。
定義一個語言,首先要確定基本的字符有哪些。再確定構成單詞和句子的計算規則。單詞和句子在形式語言中,我們都認爲是字符串。最關鍵的是如果描述這個基本規則。在形式語言與自動機理論中,這種描述實際上就是自動機。
所有形式語言和自動機是密不可分的。
一方面自動機以語言爲處理對象,另一方面,語言是以自動機形式定義的。
基礎知識
基本概念
-
字母表:符號(字符)的非空有窮集
1 = {0, 1} 表示二進制數的字母表
2 = {a, b, c, d, … z} 英語字母組成的語言
3 = {x | x是一個漢字} 漢語所組成的一個語言 -
字符串:由某字母表中符號組成的有窮序列
若1 = {0, 1},那麼0,1,00,111001爲11上的字符串
若2 = {a, b,c,…z},那麼ab. xkcd爲2上的字符串 -
空串:記爲, 有0個字符的串。
字母表可以是任意的,但都有
-
字符串的長度:字符串中符號所佔位置的個數,記爲|U|
例如: = {0, 1} |0011| = 4
(這種定義是接近自然語言描述的定義,但是,形式語言與自動機理論,是建立在一個嚴格的定義基礎之上)
若字母表爲, 可遞歸定義爲:
(前面的長度+最後一個字符)(前面的長度+1)
遞歸定義
-
字符串x和y的連接:將首尾相接得到新字符串的運算,記爲x·y或xy。
同樣,可遞歸定義爲
對於連接運算,空串和字符串連接,從左邊連接或右邊連接都等於字符串本身,空串相當於連接運算的單元。
對於連接運算來說,點號一般省略。連接運算,滿足結合律。不滿足交換律
-
字符串x的n次冪(n>=0),遞歸定義爲
-
集合A和集合B的連接,記爲A·B或AB,定義爲
A = {0, 11} B = {ab, ba}
AB={0ab, 0ba, 11ab, 11ba}
BA={ab0, ab11, ba0, ba11} -
集合A的n次冪(n>=0), 遞歸定義爲
中0和1不再是字符了,而是長度爲1的字符串。
程序設計時要明確區分字符和字符串,形式語言與自動機中往往不需要明確區分字符和字符串。因爲在它的上下文中,很明顯。
長度爲2的字符串,時,長度爲3的字符串。 -
克林閉包(Kleene Closure)
把 的任意次冪(包括零次冪)放一起,就是的克林閉包。記爲
一般用來表示字母表,的意思就是由中的字符組成的任意長的字符串。
定義也可以寫爲
也可以換爲字符串集合
-
正閉包(Positive Closure)
克林閉包的零次冪去掉,從1次冪到無窮,就是正閉包
顯然
對於一般字符串集合
接下來定義爲了研究計算模型,一步一步構造出來的
語言
給定字母表克林閉包的任意子集。也就是由給定字母表構成的任意的字符串的集合。
對於語言的限制很少。只要求在某個字母表上構成,所有的構成的任何字符串集合,包含空集空串等等。
語言的描述也多種多樣。
語言的描述
空集不等於空串的集合
形式語言與自動機理論中有個典型問題
語言的成員性問題。
這個問題具有廣泛性,各種實際問題都可以通過編碼等轉換成這樣的問題。
語言和問題是相同的。
我們通過特定的語言問題去探索一般性問題通用的解法。
讓w是數字,L是具體的語言,比如是素數
即判斷某個數是否是素數
無論是肯定還是否定都可以明確的回答。這樣的問題稱爲可判定的問題。
讓語言以特定的規則的當時來描述,
例w是C語言的程序源碼,L是C語言的語法規則來描述。
w是否能被正確的編譯。
當滿足特定條件的語法規則時,問題才容易實現。如果語法規則過於自由,是無法實現編譯器的。
將w和L都看成可變的參數,
有些這樣的問題是無法回答的。
著名的圖靈停機問題。不可判定的問題
課程最後 會給詳細介紹
形式化證明:演繹法,歸納法和反證法
y的長度進行歸納法
y的結構進行歸納
後面會頻繁用歸納