作者:zuoxiaolong8810(左瀟龍),轉載請注明出處,特別說明:本博文來自博主原博客,為保證新博客中博文的完整性,特復制到此留存,如需轉載請注明新博客地址即可。
最近閑暇之余看看編譯原理,娛樂一下,碰到一道小小證明題,於是心血來潮證明一下。
LZ也是數學專業畢業的,當初上大學時每天做的最多的就是多達N個黑板的證明題,可惜啊,時光是殘酷的,現在已不復往日了。
不過看到證明題,尤其是簡單的證明題,LZ積蓄了多年的數學細胞又被激發起來了,這就是青春啊,神馬《致青春》的都弱爆了,總拿愛情說事,其實大學里還是有很多值得回憶的事的,比如證明題,LZ說這話會不會勾起了很多人的痛苦回憶。
不過小證怡情,大證傷身,太長的證明題我們就不鳥咯(其實是LZ證明不出來,囧)。
編譯原理-->題目原型:
1,證明:用下面文法生成的所有二進制串的值都能被3整除(提示:對語法分析樹的節點使用數學歸納法)。
num -> 11 | 1001 | num 0 | num num
2,上面文法是否能生成所有能被3整除的二進制串?
1、分析:該文法的終止符集為{11,1001,0},非終止符集為{num},起始符號為num,規則集{num->11,num->1001,num->num 0,num->num num},由以上文法得到的二進制串,轉換成抽象語法樹之后,其葉子節點一定是11或者1001,而如果向樹的根節點按照規則生成二進制串,則產生的方式有以下兩種。
1)num 0
2)num num。
因而,我們只需要證明num 0 和num num的組合可以被3整除即可。
因為假設前者可以被證明,則語法樹的任何一個節點都可以被3整除,並且在此基礎上,所有組合方式都可以被3整除,故可得到此文法所得到的所有二進制串都可以被3整除。
有了以上分析,那么證明過程非常簡單。
證明:step 1:11和1001都可以被3整除(不解釋)。
step 2:若組合形式為num 0 ,因為 num 0 = 2 * num,故在step 1的前提下,num 0 的組合可以被3整除。
step 3:若組合形式為num num,設num num為num1 num2 ,且num2為n位二進制串,則num num = num1 num2 = (2的n次方) * num1 + num2 ,故在step 1的前提下,num num的組合可以被3整除。
step 4:綜合step 1 、step 2 、step 3,由上述文法生成的所有二進制串都可以被3整除。
2、答案:非也,最顯然的,0就無法由文法導出,另外非顯然的,比如21=10101,也無法由文法導出,再比如給21乘個2,即42 = 101010,也無法導出,and so on。
歐了,怡完情上床睡覺,各位晚安。