關燈 巨大 直達底部
親,雙擊螢幕即可自動滾動
第1章 上一章註釋[001]

加法器add,add(x,y)=x+y,怎麼用那三種基本函式組合?

也很簡單,從具體輸入入手:

add(3,2)=succ(add(3,1))=succ(succ(add(3,0)))=succ(succ(3))

似乎只需要組合多個後繼函式就可以了呢。

當然,這裡面有一個毛病,在於我們在沒有定義好add的前提下,先入為主地認為add(3,0)=3.

所以我們不能認為自己就這麼簡單地構造了add,只能退而求其次地得到以下關係:

add(x,y+1)=succ(add(x,y)),這個式子是十分嚴謹的。

更具體地,要想算出add(x,y+1),就要知道add(x,0)=x,我們稱add(x,0)=x為基準條件;add(x,y+1)=succ(add(x,y))為遞迴條件。

看起來就差臨門一腳了,只要我們能用三種基本函式構造出add(x,0)=x,就能得到add(x,y+1),也就能構造出我們想要的加法器。

也很顯然,add(x,0)=x=proj11

於是,我們的加法器有了。

這種看起來很像左腳踩右腳登天的構造方式叫做“原始遞迴”,它的定義是這樣的:

基準函式f:Nn—N

遞迴函式g:Nn+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:

add:N2→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))=succ(add(x,y)),g=succ·[proj33]

add=p1(proj11,succ·[proj33])

完美無瑕。

類似地,乘法器mult=p1(zero,add·[proj13,proj33])

前繼函式,減法器等等基本運算都可以據此定義,只需要proj,zero,succ三種原始函式和組合·,原始遞迴p這兩種基本操作。所有完全函式都可以據此構造。

那麼“偏函式”呢?

構造偏函式還需要額外的一個操作:最小化。

如果我們有一個函式f:N^n+1—N (這裡^代表上標,雖然不好看,但實在是敲得太麻煩沒有耐心了),具體的f(a1,...an,x),其中a1,...an是固定引數,x是可變引數。

那麼最小化操作為:μ^nf:N^n—N它會找到給它輸入的n個引數裡,最小的一個,並輸出

比如f(5,4,3,2,1,0)=0

如果遇到重複引數,那麼就輸出第一個最小的。

比如f(5,4,3,2,1,1)=1

假設我們有一個投影函式長這樣:

proj21:N2—N (proj21中的2是上標,1是下標,下同,寫不動擺爛了)

那麼μ^1proj21:N—N

舉個栗子:

假如我們給proj21弄一個最小化操作:

為您推薦