什么是可計算理論


什么是可計算理論

 

這個學期剛好上這門課,此課絕對是CS課程中的神課,需要一定的決心和耐心才能啃下來。這篇文章可以說是一篇科普文,爭求通俗易懂。

 
可計算理論是計算理論的一個分支,還有兩個分支分別是自動機和計算復雜性。
 
這些名詞都顧名思義,自動機講的是計算的模型,比如圖靈機,它是由無限長磁帶,讀寫磁頭和一些狀態轉移序列組成;可計算理論,研究的是一個函數(或程序)是不是能被計算,但是什么叫能被計算呢,比如說給定x,你給我計算出2x,這個函數就是可計算的,那又有什么函數是不可計算的呢?稍后你會看到著名的停機問題,這個程序就是不可計算的;計算復雜性研究的是如何有效地解決問題。
 
這剛好是計算的三個方面:計算的模型,計算的界限,計算的代價。
 
現在讓我們關注可計算性這個方面。
 

什么是可計算函數?

如果存在一段程序來計算一個函數,那么這個函數就是可計算的。通俗來講,你能用編程語言寫出來並運行的都是可計算函數,更通俗來講,你寫完程序,在windows下會生成一個exe執行文件,假設打開后會提示你給一個程序的輸入,這個程序根據這個輸入能計算出相應的結果,可以把這個程序看為一個函數,給定x,輸出f(x)。以后你每次想計算f(x),只要運行相同的程序就可以了。處理一類問題有相同的算法,這樣的函數叫可計算函數。比如給x,輸出x^2+6,就是可計算的。
 
這里需要把程序P和函數f的概念說清楚。如果一個程序P的效果可以和一個函數f的效果一樣,也就是說給定x,P(x)=f(x),我們就說P能夠計算f。但是他們不是一一對應的關系,即多個程序可以對應同一個f。比如說給定x,輸出2x,函數f是唯一確定的,即f(x)=2x,但程序不是確定的,比如我可以給每個程序最后加個不相關賦值語句,程序的輸出是不變的,但每個程序都是不一樣的。
 

什么是不可計算函數?

考慮這樣一個問題:是否存在一個程序,它能夠計算任何程序在給定輸入下是否會運行結束?
答案是不存在。這就是著名的停機問題。
現在讓我們來證明一下,證明思想相當精妙和精簡。
假設這樣的函數存在,設為halt(char* program, char* input),那么這個函數編寫出來就是這樣的:
bool halt(char* program, char* input)
{
	if(<program> halts on <input>)
		return true;
	else
		return false;
}
然后我們考慮這樣一個函數,這個函數就像它的程序名一樣那么邪惡:
void Evil(char *p)
{
	if(halt(p,p))
		while(1);	//forever loop
	else
		return;
}
然后我們考慮Evil(Evil)是否會停機(即Evil這個程序的輸入是它本身)。
 
如果Evil(Evil)會停機,那么必然執行的是else語句里的return,那么if的判定條件為false,那么halt(Evil,Evil)必返回false,即Evil程序不會在Evil輸入上停機,而假設是會停機,矛盾。
 
如果Evil(Evil)不會停機,那么必然執行的if語句里的死循環,所以if的判定條件為true,那么halt(Evil,Evil)必返回true,即Evil程序會在Evil輸入上停機, 而假設是不會停機,矛盾。
 
所以它停也矛盾,不停也矛盾,於是得出halt(char* program, char* input)這個函數是不存在的。
 
實際上還有很多函數都是不可計算的。比如,
不存在一個程序,它能夠判斷任何程序是否是0函數。(0函數就是說對於所有輸入輸出都是0)。
不存在一個程序,它能夠判斷任意兩個程序是否計算同樣的f。
 
那么是否有一個比較系統的方法來判斷哪些函數是不可計算的呢?答案是有的,這就是著名的Rice's Theorem。這個定理說的是,有一個函數集合B(即這個集合B是函數f的集合),並且B不是空集,也不是全部函數f,那么程序P是否屬於B是不可計算的。
 
什么意思呢,舉個形象的例子。比如說你是程序設計這門課的助教。你布置了一個作業,要求學生寫一個程序,任意給定x,輸出2x。學生馬上寫完交給你了,你驚奇地發現這門課竟然有200名學生,然后一個偷懶的想法在你腦中誕生了:我是不是能寫一個程序,來自動判斷學生上交的程序是否滿足要求呢?Rice‘s theorem打破了你的幻想,這樣的程序是不存在的。
 
這個例子中,令B包含f(x)=2x這個函數,助教想做的是判斷一個程序是否屬於這個集合B,Rice‘s theorem告訴我們這樣的程序不存在。
 

除了研究函數的可計算性,可計算理論還關注什么?

實際上,這門課包含的內容遠遠不止上文這些東西。還有一些很重要的概念,比如:
1. 康托提出的對角線方法;
2. 哥德爾不完備定理也可以通過這門課的后續內容推導出來;
3. 歸約的思想,問題難度的划分。
4. 第一和第二遞歸定理。
這些都是相當美妙,計算理論里相當關注的問題。
 
本文不可能全部介紹這些概念,如果你有興趣,請參考Nigel Gutland寫的《An introduction to recursive function theory》,寫得算比較詳細了。
 
至此,你應該懂了什么是停機問題,什么是可計算函數,什么是不可計算的,作為科普,這些就夠了。計算理論本身就是需要鑽研才能明白的學科。
 
這門課可能對找工作的人沒有太大幫助,但是它讓人體會到了美和偉大。
 

參考資料:
[1] 《An introduction to recursive function theory》. Nigel Gutland
[3] 《暗時間》 劉未鵬

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM