也很簡單,從具體輸入入手:
add(3,2)=su(add(3,1))=su(su(add(3,0)))=su(su(3))
似乎只需要組合多個後繼函式就可以了呢。
當然,這裡面有一個毛病,在於我們在沒有定義好add的前提下,先入為主地認為add(3,0)=3.
所以我們不能認為自己就這麼簡單地構造了add,只能退而求其次地得到以下關係:
add(x,y+1)=su(add(x,y)),這個式子是十分嚴謹的。
更具體地,要想算出add(x,y+1),就要知道add(x,0)=x,我們稱add(x,0)=x為基準條件;add(x,y+1)=su(add(x,y))為遞迴條件。
看起來就差臨門一腳了,只要我們能用三種基本函式構造出add(x,0)=x,就能得到add(x,y+1),也就能構造出我們想要的加法器。
也很顯然,add(x,0)=x=proj11
於是,我們的加法器有了。
這種看起來很像左腳踩右腳登天的構造方式叫做“原始遞迴”,它的定義是這樣的:
本小章還未完,請點選下一頁繼續閱讀後面精彩內容!
基準函式fnn—n
遞迴函式gnn+2—n
使用f和g的原始遞迴h=pn(f,g)nn+1—n
對於h
基準條件:h(x1,...xn,0)=f(x1,...,xn)
遞迴條件 h(x1,...,xn,y+1)=g(x1,...,xn,y,h(x1,...,xn,y))
回到我們的加法器add:
addn2→n
add(x,y)=x+y=p1(f,g)
基準條件:add(x,0)=f(x)=proj11
遞迴條件:add(x,y+1)=g(x,y,add(x,y))=su(add(x,y)),g=su·[proj33]
add=p1(proj11,su·[proj33])<ut=p1(zero,add·[proj13,proj33])
前繼函式,減法器等等基本運算都可以據此定義,只需要proj,zero,su三種原始函式和組合·,原始遞迴p這兩種基本操作。所有完全函式都可以據此構造。
那麼“偏函式”呢?
構造偏函式還需要額外的一個操作:最小化。
如果我們有一個函式fnn+1—n (這裡代表上標,雖然不好看,但實在是敲得太麻煩沒有耐心了),具體的f(a1,...an,x),其中a1,...an是固定引數,x是可變引數。
那麼最小化操作為:μnfnn—n它會找到給它輸入的n個引數裡,最小的一個,並輸出
比如f(5,4,3,2,1,0)=0
如果遇到重複引數,那麼就輸出第一個最小的。