等价性证明
模型之间的等价性证明是通过相互模拟实现的,即如果两个模型之间可以相互模拟,那么说明这两个模型所定义的“可计算”问题类是相同的。这里先给出模拟的简单思路。
- 图灵机是最符合人类计算模式的计算模型,根据部分递归函数与Lambda演算的定义和运算规则,我们可以模拟其递归调用过程或归约过程,正如我们手动进行函数计算和归约一样。
- Lambda演算天然地用来表示函数计算,所以我们可以用Lambda演算模拟部分递归函数的调用过程。
- 将图灵机的格局采用一定的编码方式编码为自然数,可以使用函数来模拟图灵机的运算,所以可采用递归函数模拟图灵机的计算过程。
模拟某一计算模型时的关键点如下:
- 模拟图灵机:需要对其格局编码,需要模拟读纸带,状态改变,写纸带,即模拟格局的合法迁移
- 模拟部分递归函数:模拟基本函数+运算规则(广义合成、原始递归以及无界 μ \mu μ运算),还要注意处理递归调用的问题。
- 模拟Lambda演算:模拟 β \beta β归约,检查是否等价
不妨假设:
- 图灵机仅使用三种带符号,即 Γ = { 0 , 1 , λ } \Gamma = \{ 0, 1, \lambda\} Γ={0,1,λ},其中 λ \lambda λ 为空符号。
- 当图灵机到达接受态时,将读头置于最左侧。
部分递归函数 ⟹ \Longrightarrow ⟹图灵机
证明给定的部分递归函数 f : N → N f: \mathbb{N} \to \mathbb{N} f:N→N可以由图灵机计算,只需要用图灵机模拟基本函数+运算规则,注意利用归纳条件。
模拟常函数 C m ( n ) : N n → N C_{m}^{(n)}: \mathbb{N}^{n} \rightarrow \mathbb{N} Cm(n):Nn→N
设 M C M_C MC为 n + 1 n+1 n+1带图灵机,其中 n n n带为输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn, 1 1 1带为工作带,满足:
不管前 n n n带输入,直接在第 n + 1 n+1 n+1带上打印常数 C C C。
模拟后继函数 S : N → N S: \mathbb{N} \rightarrow \mathbb{N} S:N→N
设 M S M_S MS为 2 2 2带图灵机,输入带写有输入 n n n,满足:
在工作带上打印 n + 1 n+1 n+1(二进制加法可由图灵机模拟)
模拟投影函数 P n : N n → N P^{n}:\mathbb{N}^{n} \rarr \mathbb{N} Pn:Nn→N
设 M P i n M_{P^n_i} MPin 为 n + 1 n+1 n+1 带图灵机,其中 n n n带为输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn, 1 1 1带为工作带,满足:
将第 i i i条带的内容复制到工作带上。
模拟广义合成 f = h ∘ ( g 1 , g 2 , … , g m ) f=h \circ\left(g_{1},g_{2}, \ldots, g_{m})\right. f=h∘(g1,g2,…,gm)
设 M h M_h Mh 模拟函数 h h h的计算, M g 1 , M g 2 , ⋯ , M g m M_{g_1}, M_{g_2},~\cdots~,M_{g_m} Mg1,Mg2, ⋯ ,Mgm模拟函数 g 1 , g 2 , … , g m g_{1},g_{2}, \ldots, g_{m} g1,g2,…,gm的计算,构造图灵机 M f M_{f} Mf如下:
- 对于输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn,运行机器 M g 1 , M g 2 , ⋯ , M g m M_{g_1}, M_{g_2},~\cdots~,M_{g_m} Mg1,Mg2, ⋯ ,Mgm
- 将1的输出 y 1 , y 2 , … , y m y_{1}, y_{2}, \ldots, y_{m} y1,y2,…,ym作为 M h M_h Mh的输入,运行 M h M_h Mh
- 输出 M h M_h Mh的运行结果
模拟原始递归
{ f ( x 1 , x 2 , … , x n , 0 ) = g ( x 1 , x 2 , … , x n ) f ( x 1 , x 2 , … , x n , y + ) = h ( x 1 , x 2 , … , x n , y , f ( x 1 , x 2 , … , x n , y ) ) \begin{aligned} \begin{cases} f\left(x_{1}, x_{2}, \ldots, x_{n}, 0\right) &= g\left(x_{1}, x_{2}, \ldots, x_{n}\right) \\ f\left(x_{1}, x_{2}, \ldots, x_{n}, y^{+}\right)&= h(x_{1}, x_{2}, \ldots, x_{n}, y,\left.f\left(x_{1}, x_{2}, \ldots, x_{n}, y\right)\right) \end{cases} \end{aligned} {f(x1,x2,…,xn,0)f(x1,x2,…,xn,y+)=g(x1,x2,…,xn)=h(x1,x2,…,xn,y,f(x1,x2,…,xn,y))
设 M g M_g Mg, M h M_h Mh分别模拟 g g g和 h h h的计算,构造图灵机 M f M_{f} Mf如下:
-
M
f
M_f
Mf共有
n
+
4
n+4
n+4条纸带
- n + 1 n+1 n+1条用于输入 x 1 , x 2 , … , x n , y x_{1}, x_{2}, \ldots, x_{n},y x1,x2,…,xn,y
- 第 n + 2 n+2 n+2 条用于计数cnt
- 第 n + 3 n+3 n+3 条用于记录中间结果
- 第 n + 4 n+4 n+4 条用于工作/输出
- 如果 y = 0 y=0 y=0,在输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn上运行 M g M_g Mg,输出在第 n + 4 n+4 n+4条纸带上
- 如果 y ≠ 0 y\neq 0 y=0,则在第 n + 2 n+2 n+2 条带上写下0,在第 n + 3 n+3 n+3 条带上写下在输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn上运行的输出;
- 以 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn 第 n + 2 n+2 n+2 和 n + 3 n+3 n+3 带为输入,运行 M h M_h Mh,将输出写到第 n + 3 n+3 n+3 条纸带上。
- 如果 c n t = y − 1 cnt = y - 1 cnt=y−1,则将第3条纸带的内容复制到第 4 4 4条纸带,作为输出;
- 否则,将 c n t 加 1 cnt加1 cnt加1,并跳转到 3 执行。
模拟 μ \mu μ 运算
设 M g M_g Mg模拟了函数 g g g的运算,构造图灵机 M f M_{f} Mf如下:
- 输入 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn后,将 0 0 0 写到第 n + 1 n+1 n+1 带,记为 y y y
- 以 x 1 , x 2 , … , x n , y x_{1}, x_{2}, \ldots, x_{n},y x1,x2,…,xn,y 为输入,运行 M g M_g Mg
- 如果之前的执行停止并输出0,则停止并输出
y
y
y。
否则,将 y y y 改写为 y + 1 y+1 y+1,并执行步骤2。
因此,可以使用图灵机模拟基本函数+所有运算规则。因此,可以使用图灵机模拟任何部分递归函数。
图灵机 ⟹ \Longrightarrow ⟹ 部分递归函数
在这里插入图片描述
任意给定图灵机 M = ( Q , Σ , Γ , δ , q 0 , q a c c e p t , q r e j e c t ) M = \left(Q, \Sigma, \Gamma, \delta, q_{0}, q_{\mathrm{accept}}, q_{\mathrm{reject}}\right) M=(Q,Σ,Γ,δ,q0,qaccept,qreject),构造递归函数 f : N → N f: \mathbb{N} \rightarrow \mathbb{N} f:N→N,使 f f f 能够模拟图灵机的计算。
由于部分递归函数是自然数集 N \mathbb{N} N上的函数,而图灵机的格局是(字符串,状态号和读头下标)构成的3元组,需要将字符串唯一且有效地编码为自然数。
字符串编码
使用哥德尔编码思想,对于给定字符集大小 ∣ Γ ∣ = K |\Gamma| = K ∣Γ∣=K,建立字符到自然数的双射 h : Γ → K h: \Gamma \rightarrow \mathbf{K} h:Γ→K ,对于字符串 w = s 1 s 2 s 3 … s n w = s_{1} s_{2} s_{3} \ldots s_{n} w=s1s2s3…sn,其编码为:
h ( s 1 ) × K 0 + h ( s 2 ) × K 1 + ⋯ + h ( s n − 1 ) × K ( n − 2 ) + h ( s n ) × K ( n − 1 ) h\left(s_{1}\right) \times K^{0}+ h\left(s_{2}\right) \times K^{1}+\cdots+ h\left(s_{n-1}\right) \times K^{(n-2)}+ h\left(s_{n}\right) \times K^{(n-1)} h(s1)×K0+h(s2)×K1+⋯+h(sn−1)×K(n−2)+h(sn)×K(n−1)
我们假设图灵机仅使用 3 3 3 种带符号,则 K = 3 K=3 K=3
图灵机计算格局编码
使用 ⟨ w , q , p ⟩ \langle w, q, p\rangle ⟨w,q,p⟩ 表示 M M M 的计算格局,即当前带上串为 w w w, M M M 状态为 q q q,读头位于 p p p。
- 带上串使用哥德尔数编码 w w w
- 机器状态编码: q 0 → 0 , q 1 → 1 , ⋯ , q ( r − 1 ) → r − 1 q_0 \rightarrow 0, q_1 \rightarrow 1, \cdots, q_{(r-1)} \rightarrow r-1 q0→0,q1→1,⋯,q(r−1)→r−1,共有 r r r 种不同的状态。
- 读头位置 p p p
利用原始的哥德尔编码,有:
config
(
w
,
q
,
p
)
=
2
w
⋅
3
q
⋅
5
p
\operatorname{config}(w,q,p) = 2^{w} \cdot 3^{q} \cdot 5^{p}
config(w,q,p)=2w⋅3q⋅5p
对于合法的格局迁移:
⟨
w
,
q
,
p
⟩
→
⟨
w
′
,
q
′
,
p
′
⟩
\langle w, q, p\rangle \rightarrow \langle w', q', p'\rangle
⟨w,q,p⟩→⟨w′,q′,p′⟩,我们需要用递归函数编码并计算其对应的
w
′
,
q
′
,
p
′
w', q', p'
w′,q′,p′,利用状态转移函数
δ
:
Q
×
Γ
→
Q
×
Γ
×
{
L
,
R
}
\delta: Q \times \Gamma \rightarrow Q \times \Gamma \times\{\mathrm{L}, \mathrm{R}\}
δ:Q×Γ→Q×Γ×{L,R}。
读头移动方向
action
(
q
,
s
)
=
{
0
,
δ
(
q
,
s
)
=
(
q
′
,
c
,
L
)
1
,
δ
(
q
,
s
)
=
(
q
′
,
c
,
R
)
2
,
otherwise
\operatorname{action}(q, s)= \left\{ \begin{array}{l} 0, \quad & \delta (q, s) = (q', c, \textbf{L}) \\ 1, \quad & \delta (q, s) = (q', c, \textbf{R})\\ 2, \quad & \textbf{otherwise} \end{array} \right.
action(q,s)=⎩
⎨
⎧0,1,2,δ(q,s)=(q′,c,L)δ(q,s)=(q′,c,R)otherwise
要写下的符号
next-symbol
(
q
,
s
)
=
{
s
′
,
δ
(
q
,
s
)
=
(
q
′
,
s
′
,
L
/
R
)
s
,
otherwise
\operatorname{next-symbol}(q, s) = \left\{ \begin{array}{l} s', \quad &\delta (q, s) = (q', \textbf{s}', L/R) \\ s, \quad &\textbf{otherwise} \end{array} \right.
next-symbol(q,s)={s′,s,δ(q,s)=(q′,s′,L/R)otherwise
下一状态
next-state
(
q
,
s
)
=
{
q
′
,
δ
(
q
,
s
)
=
(
q
′
,
s
′
,
L
/
R
)
r
,
otherwise
\operatorname{next-state}(q, s) = \left\{ \begin{array}{l} q',& \quad \delta (q, s) = (q', s', L/R) \\ r, & \quad \textbf{otherwise} \end{array} \right.
next-state(q,s)={q′,r,δ(q,s)=(q′,s′,L/R)otherwise
这三个函数是通过条件判断定义的函数,也是原始递归的,因为使用条件对应的原始递归谓词构造的分段函数也为原始递归函数。
当前读头读入符号
cur-symbol
(
w
,
p
)
=
(
w
/
3
p
−
˙
1
)
m
o
d
3
\operatorname{cur-symbol}(w, p) = \left(w / 3^{p \dot{-} 1}\right) \bmod 3
cur-symbol(w,p)=(w/3p−˙1)mod3
读头下一位置
next-position
(
w
,
q
,
p
)
=
p
−
˙
(
action
(
q
,
s
)
=
0
)
+
(
action
(
q
,
s
)
=
1
)
\operatorname{next-position}(w,q,p) = p \dot{-}(\operatorname{action}(q, s)=0)+(\operatorname{action}(q, s)=1)
next-position(w,q,p)=p−˙(action(q,s)=0)+(action(q,s)=1)
纸带下一内容
next-tape
(
w
,
q
,
p
)
=
w
−
˙
(
s
⋅
3
p
−
˙
1
)
+
(
next-symbol
(
q
,
s
)
⋅
3
p
−
˙
1
)
\operatorname{next-tape}(w, q, p) = w \dot{-}\left(s \cdot 3^{p \dot{-}1}\right)+\left(\right. \operatorname{next-symbol} \left.(q, s) \cdot 3^{p \dot{-}1}\right)
next-tape(w,q,p)=w−˙(s⋅3p−˙1)+(next-symbol(q,s)⋅3p−˙1)
图灵机下一计算格局
next-config
(
w
,
q
,
p
)
=
config
(
w
′
,
q
′
,
p
′
)
\operatorname{next-config}(w, q, p) = \operatorname{config}(w', q', p')
next-config(w,q,p)=config(w′,q′,p′)
其中:
- w ′ = next-tape ( w , q , p ) w' = \operatorname{next-tape}(w, q, p) w′=next-tape(w,q,p)
- q ′ = next-state ( q , cur-symbol ( w , p ) ) q' = \operatorname{next-state}(q, \operatorname{cur-symbol}(w, p)) q′=next-state(q,cur-symbol(w,p))
- p ′ = next-position ( w , q , p ) p' = \operatorname{next-position}(w,q,p) p′=next-position(w,q,p)
从起始状态执行
t
+
1
t+1
t+1步后获得的格局,由如下原始递归形式给出:
execute
(
w
,
0
)
=
2
w
3
0
5
1
\operatorname{execute}(w, 0)=2^{w} 3^{0} 5^{1}
execute(w,0)=2w3051
execute
(
w
,
t
+
1
)
=
next-config
(
[
execute
(
w
,
t
)
]
0
,
[
execute
(
w
,
t
)
]
1
,
[
execute
(
w
,
t
)
]
2
)
\begin{aligned} \operatorname{execute}(w, t+1)=\operatorname{next-config}( &[\operatorname{execute}(w, t)]_0,\\ &[\operatorname{execute}(w, t)]_1,\\ &[\operatorname{execute}(w, t)]_2) \end{aligned}
execute(w,t+1)=next-config([execute(w,t)]0,[execute(w,t)]1,[execute(w,t)]2)
为完整表述图灵机在输入串w上的运行结果,我们定义图灵机执行的最大步数num-steps:
num-steps
(
w
)
=
μ
t
[
[
E
]
2
=
1
and
E
n
c
(
[
E
]
0
)
and
next-state
(
[
E
]
1
,
cur-symbol
(
[
E
]
0
,
[
E
]
2
)
)
=
r
]
\begin{aligned} \operatorname{num-steps}(w) = \mu t [ & ~[E]_2 = 1 \quad \text{and} \\ & ~Enc([E]_0) \quad \text{and} \\ & ~\operatorname{next-state}([E]_1, \operatorname{cur-symbol}([E]_0, [E]_2)) = r] \end{aligned}
num-steps(w)=μt[ [E]2=1and Enc([E]0)and next-state([E]1,cur-symbol([E]0,[E]2))=r]
其中
E
n
c
(
∗
)
Enc(*)
Enc(∗)判断给定的输入是否为合法字符串编码。若
M
M
M 停机,则
num-steps
(
w
)
\operatorname{num-steps}(w)
num-steps(w)返回执行的最大步数;若
M
M
M 不停机,则
num-steps
(
∗
)
\operatorname{num-steps}(*)
num-steps(∗) 在
w
w
w 上无定义。
则给出完整的递归函数形式:
f ( n ) = { 0 , if [ e x e c u t e ( N , num-steps ( N ) ) ] 0 = 1 j , if 1 ≤ j and μ j ( [ execute ( N , num-steps ( N ) ) ] 0 = 3 j − 1 ) ↑ , if num-steps ( N ) ↑ f(n) = \left\{ \begin{array}{l} 0, \quad \textbf{if} \quad [\operatorname{execute(N, \operatorname{num-steps}(N))}]_0 = 1 \\\\ j, \quad \textbf{if} \quad 1 \leq j ~\textbf{and}~ \mu j ([\operatorname{execute}(N, \operatorname{num-steps}(N))]_0 = 3^j - 1) \\\\ \uparrow, \quad \textbf{if} \quad \operatorname{num-steps}(N) \uparrow \end{array} \right. f(n)=⎩ ⎨ ⎧0,if[execute(N,num-steps(N))]0=1j,if1≤j and μj([execute(N,num-steps(N))]0=3j−1)↑,ifnum-steps(N)↑
其中, N N N是自然数 n n n的哥德尔编码。
- 如果 M M M 在 w w w 上停机且接收,则 f ( n ) = 0 f(n) = 0 f(n)=0。
- 如果 M M M 在 w w w 上停机拒绝,则 f ( n ) = j f(n) = j f(n)=j。
- 如果 M M M 在 w w w 上不停机,则 num-steps ( w ) \operatorname{num-steps}(w) num-steps(w) 没有定义, f ( n ) f(n) f(n)没有定义。
部分递归函数 ⟹ \Longrightarrow ⟹ λ \lambda λ演算
常函数
L
C
≜
λ
x
.
c
0
L_C \triangleq \lambda x. c_0
LC≜λx.c0
L
C
c
n
=
(
λ
x
.
c
0
)
c
x
=
β
c
x
L_C~c_n = (\lambda x.c_0)c_x = _\beta c_x
LC cn=(λx.c0)cx=βcx
后继函数
L
S
≜
λ
c
n
.
λ
f
.
λ
x
.
f
(
c
n
(
f
x
)
)
L_S \triangleq \lambda c_n.\lambda f.\lambda x . f(c_n(f ~ x))
LS≜λcn.λf.λx.f(cn(f x))
L
S
c
n
=
(
λ
c
n
.
λ
f
.
λ
x
.
f
(
c
n
(
f
x
)
)
)
c
n
=
β
λ
f
.
λ
x
.
f
(
c
n
(
f
x
)
)
=
λ
f
.
λ
x
.
f
(
f
n
(
x
)
)
=
λ
f
.
λ
x
.
f
n
+
1
(
x
)
)
=
c
n
+
1
\begin{aligned} L_S~c_n &= (\lambda c_n.\lambda f.\lambda x . f(c_n(f ~ x))) ~c_n \\ & =_\beta \lambda f.\lambda x.f(c_n(f ~ x)) \\ & = \lambda f.\lambda x.f(f^n(x)) \\ & = \lambda f.\lambda x.f^{n+1}(x)) \\ & = c_{n+1} \end{aligned}
LS cn=(λcn.λf.λx.f(cn(f x))) cn=βλf.λx.f(cn(f x))=λf.λx.f(fn(x))=λf.λx.fn+1(x))=cn+1
投影函数
L
P
i
k
≜
λ
x
1
…
x
m
.
x
i
L_{P_{i}^{k}} \triangleq \lambda x_{1} \ldots x_{m} . x_{i}
LPik≜λx1…xm.xi
L
P
i
k
(
c
n
1
,
…
c
n
m
)
=
(
λ
x
1
…
x
m
.
x
i
)
c
n
1
,
…
c
n
m
=
β
c
n
i
\begin{aligned} L_{P_{i}^{k}} (c_{n_1}, \ldots c_{n_m}) &= (\lambda x_{1} \ldots x_{m} . x_{i}) \quad c_{n_1}, \ldots c_{n_m} \\& =_\beta c_{n_i} \end{aligned}
LPik(cn1,…cnm)=(λx1…xm.xi)cn1,…cnm=βcni
广义合成
假设:
- g : N l → N g: \mathbb{N}^{l} \rightarrow \mathbb{N} g:Nl→N是 Lambda可定义的,且 G ∈ Λ G\in \Lambda G∈Λ是对应的Lambda项;
- h 1 , … , h l : N m → N h_{1}, \ldots, h_{l}: \mathbb{N}^{m} \rightarrow \mathbb{N} h1,…,hl:Nm→N是 Lambda可定义的,且 H 1 , … , H l ∈ Λ H_1, \ldots,H_l\in \Lambda H1,…,Hl∈Λ分别是对应的Lambda项;
函数 f : N m → N f: \mathbb{N}^m \rightarrow \mathbb{N} f:Nm→N定义如下:
f ( n 1 , … , n m ) = g ( h 1 ( n 1 , … , n m ) , … , h l ( n 1 , … , n m ) ) f\left(n_{1}, \ldots, n_{m}\right)=g\left(h_{1}\left(n_{1}, \ldots, n_{m}\right), \ldots, h_{l}\left(n_{1}, \ldots, n_{m}\right)\right) f(n1,…,nm)=g(h1(n1,…,nm),…,hl(n1,…,nm))
f f f是Lambda可定义的, 其Lambda项为 F F F:
F ≜ λ x 1 … x m . ( G ( H 1 x 1 … x m ) … ( H l x 1 … x m ) ) F \triangleq \lambda x_{1} \ldots x_{m} .\left(G~\left(H_{1} ~x_{1} \ldots x_{m}\right) \ldots\left(H_{l} ~x_{1} \ldots x_{m}\right)\right.) F≜λx1…xm.(G (H1 x1…xm)…(Hl x1…xm))
F ( c n 1 , … c n m ) = λ x 1 … x m . ( G ( H 1 x 1 … x m ) , … , ( H l x 1 … x m ) ) c n 1 , … c n m = β G H 1 ( c n 1 , … c n m ) , … , H l ( c n 1 , … c n m ) = β G c h 1 ( n 1 , … n m ) , … , c h l ( n 1 , … n m ) = β c g ( h 1 ( n 1 , … , n m ) , … , h l ( n 1 , … , n m ) ) = β c f ( n 1 , … , n m ) \begin{aligned} F(c_{n_1}, \ldots c_{n_m}) &= \lambda x_{1} \ldots x_{m} .\left(G~\left(H_{1} ~x_{1} \ldots x_{m}\right),~ \ldots,~\left(H_{l} ~x_{1} \ldots x_{m}\right)\right.) \quad c_{n_1}, \ldots c_{n_m} \\&=_\beta G ~ H_1(c_{n_1}, \ldots c_{n_m}), \ldots, ~H_l(c_{n_1}, \ldots c_{n_m}) \\&=_\beta G ~c_{h_1(n_1, \ldots n_m)},\ldots, ~c_{h_l(n_1, \ldots n_m)} \\&=_\beta c_{g(h_1(n_1, \ldots ,n_m), \ldots,h_l(n_1, \ldots ,n_m))} \\&=_\beta c_{f(n_1, \ldots ,n_m)} \end{aligned} F(cn1,…cnm)=λx1…xm.(G (H1 x1…xm), …, (Hl x1…xm))cn1,…cnm=βG H1(cn1,…cnm),…, Hl(cn1,…cnm)=βG ch1(n1,…nm),…, chl(n1,…nm)=βcg(h1(n1,…,nm),…,hl(n1,…,nm))=βcf(n1,…,nm)
原始递归
定义元组对 ⟨ P , Q ⟩ ≜ λ f . f ( P , Q ) \langle P, Q\rangle \triangleq \lambda f.f(P,~Q) ⟨P,Q⟩≜λf.f(P, Q)
解包函数:
- π 1 ≜ λ x . λ y ⋅ x \pi_{1} \triangleq \lambda x . \lambda y \cdot x π1≜λx.λy⋅x,有 ⟨ P , Q ⟩ π 1 = P \langle P,Q \rangle ~ \pi_1 = P ⟨P,Q⟩ π1=P
- π 2 ≜ λ x . λ y ⋅ y \pi_{2} \triangleq \lambda x . \lambda y \cdot y π2≜λx.λy⋅y,有 ⟨ P , Q ⟩ π 2 = Q \langle P,Q \rangle ~ \pi_2 = Q ⟨P,Q⟩ π2=Q
其实解包函数就是我们之前提到过的bool变量true和false。下面给出对原始递归的Lambda定义。
假设:
- g : N l → N g: \mathbb{N}^{l} \rightarrow \mathbb{N} g:Nl→N是 Lambda可定义的,且 G ∈ Λ G\in \Lambda G∈Λ是对应的Lambda项;
- h : N m + 2 → N h: \mathbb{N}^{m+2} \rightarrow \mathbb{N} h:Nm+2→N是 Lambda可定义的,且 H ∈ Λ H\in \Lambda H∈Λ是对应的Lambda项;
函数 f : N m → N f: \mathbb{N}^m \rightarrow \mathbb{N} f:Nm→N定义如下:
{ f ( n 1 , n 2 , … , n m , 0 ) = g ( n 1 , n 2 , … , n m ) f ( n 1 , n 2 , … , n m , y + ) = h ( n 1 , n 2 , … , n m , y , f ( n 1 , n 2 , … , n m , y ) ) \begin{aligned} \begin{cases} f\left(n_{1}, n_{2}, \ldots, n_{m}, 0\right) &= g\left(n_{1}, n_{2}, \ldots, n_{m}\right) \\ \\ f\left(n_{1}, n_{2}, \ldots, n_{m}, y^{+}\right)&= h(n_{1}, n_{2}, \ldots, n_{m}, y,\left.f\left(n_{1}, n_{2}, \ldots, n_{m}, y\right)\right) \end{cases} \end{aligned} ⎩ ⎨ ⎧f(n1,n2,…,nm,0)f(n1,n2,…,nm,y+)=g(n1,n2,…,nm)=h(n1,n2,…,nm,y,f(n1,n2,…,nm,y))
f f f是 Lambda 可定义的, 其 Lambda 项 F F F 为:
F = λ x . λ x 1 … λ x m . ( x T ( ⟨ c 0 , G x 1 , … , x m ⟩ ) π 2 ) \begin{array}{l}F=\lambda x . \lambda x_{1} \ldots \lambda x_{m} . (x~~ T(\left\langle c_{0}, ~G~ x_{1}, \ldots, x_{m}\right\rangle) ~~\pi_{2}) \end{array} F=λx.λx1…λxm.(x T(⟨c0, G x1,…,xm⟩) π2)
其中
T = λ p . ⟨ S + ( p π 1 ) , H ( p π 2 ) , ( p π 1 ) , x 1 , … , x m ⟩ T=\lambda p .\left\langle\mathbf{S}^{+}\left(p ~\pi_{1}\right), H\left(p ~\pi_{2}\right),\left(p ~\pi_{1}\right), x_{1}, \ldots ,x_{m}\right\rangle T=λp.⟨S+(p π1),H(p π2),(p π1),x1,…,xm⟩
首先对于 k k k做归纳:
T 0 ⟨ c 0 , G c n 1 … c n m ⟩ = β ⟨ c 0 , G c n 1 , … , c n m ⟩ = β ⟨ c 0 , c g ( n 1 , … , n m ) ⟩ = β ⟨ c 0 , c f ( 0 , n 1 , … , n m ) ⟩ \begin{aligned} T^{0}\left\langle c_{0}, G~ c_{n_{1}} \ldots c_{n_{m}}\right\rangle & =_{\beta} \left\langle c_{0},~ G ~c_{n_{1}}, \ldots ,c_{n_{m}}\right\rangle \\ &=_{\beta}\left\langle c_{0}, ~c_{g\left(n_{1}, \ldots, n_{m}\right)}\right\rangle \\& =_{\beta}\left\langle c_{0},~ c_{f\left(0, n_{1}, \ldots, n_{m}\right)}\right\rangle \end{aligned} T0⟨c0,G cn1…cnm⟩=β⟨c0, G cn1,…,cnm⟩=β⟨c0, cg(n1,…,nm)⟩=β⟨c0, cf(0,n1,…,nm)⟩
T
k
+
1
⟨
c
0
,
G
c
n
1
…
c
n
m
⟩
=
β
T
(
T
k
⟨
c
0
,
G
c
n
1
…
c
n
m
⟩
)
=
β
T
⟨
c
k
,
c
f
(
k
,
n
1
,
…
,
n
m
)
⟩
=
β
⟨
S
+
c
k
,
H
c
f
(
k
,
n
1
,
…
,
n
m
)
,
c
k
,
c
n
1
,
…
,
c
n
m
⟩
=
β
⟨
c
k
+
1
,
c
h
(
f
(
k
,
n
1
,
…
,
n
m
)
,
k
,
n
1
,
…
,
n
m
)
⟩
=
β
⟨
c
k
+
1
,
c
f
(
k
+
1
,
n
1
,
…
,
n
m
)
⟩
\begin{aligned} T^{k+1}\left\langle c_{0}, G ~c_{n_{1}} \ldots c_{n_{m}}\right\rangle &=_{\beta} T\left(T^{k}\left\langle c_{0}, G ~c_{n_{1}} \ldots c_{n_{m}}\right\rangle\right) \\ & =_{\beta} T\left\langle c_{k}, c_{f\left(k, n_{1}, \ldots, n_{m}\right)}\right\rangle \\ & =_{\beta} \left\langle\mathbf{S}^{+} c_{k}, H~ c_{f\left(k, n_{1}, \ldots, n_{m}\right)}, c_{k}, c_{n_{1}}, \ldots ,c_{n_{m}}\right\rangle \\ & =_\beta \left\langle c_{k+1}, c_{h\left(f\left(k, n_{1}, \ldots, n_{m}\right), k, n_{1}, \ldots, n_{m}\right)}\right\rangle \\ & =_\beta \left\langle c_{k+1}, c_{f\left(k+1, n_{1}, \ldots, n_{m}\right)}\right\rangle \end{aligned}
Tk+1⟨c0,G cn1…cnm⟩=βT(Tk⟨c0,G cn1…cnm⟩)=βT⟨ck,cf(k,n1,…,nm)⟩=β⟨S+ck,H cf(k,n1,…,nm),ck,cn1,…,cnm⟩=β⟨ck+1,ch(f(k,n1,…,nm),k,n1,…,nm)⟩=β⟨ck+1,cf(k+1,n1,…,nm)⟩
则:
F
(
c
k
+
1
,
c
n
1
,
…
,
c
n
m
)
=
β
(
c
k
+
1
T
(
⟨
c
0
,
G
n
1
,
…
,
n
m
⟩
)
π
2
)
=
β
T
k
+
1
(
⟨
c
0
,
G
n
1
,
…
,
n
m
⟩
)
π
2
=
β
⟨
c
k
+
1
,
c
f
(
k
+
1
,
n
1
,
…
,
n
m
)
⟩
π
2
=
β
c
f
(
k
+
1
,
n
1
,
…
,
n
m
)
\begin{aligned} F(c_{k+1}, c_{n_1},\ldots,c_{n_m}) & =_\beta (c_{k+1}~~ T(\left\langle c_{0}, ~G~ n_{1}, \ldots, n_{m}\right\rangle) ~~\pi_{2}) \\& =_\beta T^{k+1}(\left\langle c_{0}, ~G~ n_{1}, \ldots, n_{m}\right\rangle) ~~\pi_{2} \\&=_\beta \left\langle c_{k+1}, c_{f\left(k+1, n_{1}, \ldots, n_{m}\right)}\right\rangle ~\pi_2 \\&=_\beta c_{f\left(k+1, n_{1}, \ldots, n_{m}\right)} \end{aligned}
F(ck+1,cn1,…,cnm)=β(ck+1 T(⟨c0, G n1,…,nm⟩) π2)=βTk+1(⟨c0, G n1,…,nm⟩) π2=β⟨ck+1,cf(k+1,n1,…,nm)⟩ π2=βcf(k+1,n1,…,nm)
μ \mu μ 运算
假设 g : N m + 1 → N g: \mathbb{N}^{m+1} \rightarrow \mathbb{N} g:Nm+1→N是 Lambda可定义的,且 G ∈ Λ G\in \Lambda G∈Λ是对应的Lambda项,定义 f : N m → N f:\mathbb{N}^{m} \rightarrow \mathbb{N} f:Nm→N如下:
f ( n 1 , … , n m ) = μ n [ g ( n , n 1 , … , n m ) = 0 ] f\left(n_{1}, \ldots, n_{m}\right)=\mu n\left[g\left(n, n_{1}, \ldots, n_{m}\right)=0\right] f(n1,…,nm)=μn[g(n,n1,…,nm)=0]
是Lambda可定义的,其Lambda项如下:
F = λ x 1 … x m . H c 0 F = \lambda x_1\ldots x_m. H~ c_0 F=λx1…xm.H c0
其中 H H H实现了 n n n从 0 0 0开始检测 g ( n , n 1 , … , n m ) = 0 g\left(n, n_{1}, \ldots, n_{m}\right)=0 g(n,n1,…,nm)=0是否成立:
H = Y ( λ f . λ y . if ( is-zeo ( G y , x 1 , … , x m ) ) then y else f ( S + y ) ) H=\mathbf{Y}\left(\lambda f . \lambda y\right..\textbf{if} \left(\right. \operatorname{is-zeo} \left.\left(G ~y, x_{1}, \ldots ,x_{m}\right)\right) \textbf{then} ~y~~ \textbf{else}~ \left.f\left(\mathbf{S}^{+} y\right)\right) H=Y(λf.λy.if(is-zeo(G y,x1,…,xm))then y else f(S+y))
其中 Y \mathbf{Y} Y为不动点运算子,有:
H = β λ y . if ( is-zeo ( G y , x 1 , … , x m ) ) then y else H ( S + y ) H=_{\beta} \lambda y.\textbf{if} (\operatorname{is-zeo} \left.\left(G ~y, x_{1}, \ldots, x_{m}\right)\right) \textbf{then}~ y~~ \textbf{else} ~H\left(\mathbf{S}^{+} y\right) H=βλy.if(is-zeo(G y,x1,…,xm))then y else H(S+y)
综上,我们给出了所有基本函数和运算法则的Lambda定义式,则所有的部分递归函数都是 λ λ λ-可定义的。
λ \lambda λ演算 ⟹ \Longrightarrow ⟹图灵机
需要模拟 λ \lambda λ 演算的规则,如:判定是否 α \alpha α 等价,判定是否为 β \beta β 范式,模拟 β \beta β 归约。
为此我们需要:
- 获取所有变量 M V M_{V} MV
- 模拟上下文填充 Context Filling M C F M_{CF} MCF
- 模拟改变约束变量 M C B V M_{CBV} MCBV
- 检查是否 α \alpha α 等价 M A C M_{AC} MAC
- 检查是否为 β \beta β 范式 M B N F M_{BNF} MBNF
- 模拟 β \beta β 归约
获取所有变量 M V M_{V} MV
对于给定的Lambda项 M ∈ Λ M\in \Lambda M∈Λ,定义 M V M_V MV:
- 从最左边的字符开始读取 M M M。如果字符 c ∈ { λ , ( , ) , . } c \in\{ \lambda, ~(, ~), ~.\} c∈{λ, (, ), .},则跳过,否则将字符复制到带子2上并打印出一个 # \# #。
- 在带2上删除所有和 # \# #不同的重复字符,得到所有的变量。
模拟上下文填充 Context Filling M C F M_{CF} MCF
假设字母表包括一个特殊字符,称之为洞字符。令 C F CF CF为多带图灵机,满足以下条件:
- 输入:
- 纸带1:上下文Context;纸带2:待填充串;
- 纸带3:结果带。
- 开始将纸带1的字符从最左侧复制到纸带3上。
- 复制字符直到找到一个空洞字符,跳过该字符并执行第3步。
- 将纸带2的所有内容附加到纸带3中。然后,返回到第2步的复制过程中。
上述过程模拟了将纸带2上的串填充到了纸带1 Context的“空洞”之中。
模拟改变约束变量 M C B V M_{CBV} MCBV: C [ λ x . N ] ⇒ C [ λ y . ( N [ x → y ] ) ] C[\lambda x.N] \Rightarrow C[\lambda y.(N[x\rightarrow y])] C[λx.N]⇒C[λy.(N[x→y])]
M C B V M_{CBV} MCBV:输入 x , y , C , N x,y,C,N x,y,C,N分别写在纸带1、2、3和4上,
- 在第4个纸带中将所有变量 x x x的出现替换为 y y y。
- 在第三个纸带的开头追加
λy.(
,并在末尾追加一个)
字符。 - 使用带有输入纸带3和4的 M C F M_{CF} MCF运行。
- 将 M C F M_{CF} MCF的结果复制到纸带5中。
检查是否 α \alpha α 等价 M A C M_{AC} MAC: M ? = α N M ~?=_\alpha N M ?=αN
- 两个输入带分别为M和N
- 在N上运行机器 M V M_{V} MV;
- 结果带上打印 0;
- 在从绑定变量更改中获得的树上运行DFS搜索,在每次抽象发生时,将绑定变量与 V ( N ) V(N) V(N)元素的每个变量进行替换。在搜索的每个节点上,检查是否等于 N N N,如果是,则在结果带上打印1。
M A C M_{AC} MAC是否 α \alpha α等价。由于 M ∈ Λ M \in \Lambda M∈Λ 是一个有限的符号序列, V ( N ) V(N) V(N) 是一个有限集合,那么搜索过程是有限的,并且会停止。
检查是否为 β \beta β 范式 M B N F M_{BNF} MBNF
- 给定输入
T = (λx.M)
在第一条带上。
- 在输入带上寻找
(λx.
的出现,并匹配括号以找到项 M。如果没有找到(λx.
的出现,则转到第3步; - 如果
(λx.M)
的右边没有更多的字符,转到步骤3。否则,在结果带上打印0; - 在结果带上打印1。
模拟 β \beta β 归约 → β \rightarrow_\beta →β
- 起始状态下,纸带1为输入
T=(λx.M)N
;
- 使用
M
N
F
M_{NF}
MNF 来检查
T=(λx.M)N
是否处于 β \beta β范式。如果是,则停止; - 搜索
(λx.
的出现并匹配括号以找到项 M M M; - 括号匹配找到项 N N N;
- 将 M M M中的所有 x x x替换为空字符;
- 以输入 M M M和 N N N运行 C F CF CF,结果写入带1;
- 回到第1步。
由Church-Rosser 定理可知, M N F M_{NF} MNF的输出为唯一的满足 β \beta β范式的Lambda项。
综上,利用上述图灵机,对于给定的函数 f : N k → N f: \mathbb{N}^{k} \rightarrow \mathbb{N} f:Nk→N的Lambda表示 F,可以将 F ( c n 1 , … , c n k ) F(c_{n_1}, \ldots, c_{n_k}) F(cn1,…,cnk),归约得到唯一的满足 β \beta β范式 c m = c f ( n 1 , … , n k ) c_{m} = c_{f(n_1,\ldots, n_k)} cm=cf(n1,…,nk),即:
F ( c n 1 , … , c n k ) ↠ β c f ( n 1 , … , n k ) F(c_{n_1}, \ldots, c_{n_k}) \twoheadrightarrow _\beta c_{f(n_1, \ldots,n_k)} F(cn1,…,cnk)↠βcf(n1,…,nk)
也就是使用图灵机模拟了Lambda可定义函数的计算。
结语
我们通过相互模拟证明了三种计算模型的等价性。三种模型虽然等价,但各自却有不同的特点。
图灵不仅引入了“图灵机”,还介绍了能模拟任何图灵机的“通用图灵机”。通用图灵机是所有现代数字计算机的基本逻辑模型。丘奇和哥德尔都认为图灵的可计算性分析更直观、更具有吸引力和说服力,哥德尔起初认为丘奇的Lambda可定义性“完全不令人满意”,而在看到图灵的分析后评价道“…最令人满意的”,“正确的…毫无意义问的”。
丘奇的Lambda演算在程序设计语言理论的发展中发挥了重要的作用,是函数式编程的基础理论,得到了广泛的应用。尽管python主要支持面向对象和过程式的编程范式,我们仍然可以使用python lambda函数来实现一下前文提到的Lambda式与可定义函数。如:
# bool variable
T = lambda x, y: x
F = lambda x, y: y
AND = lambda x, y: x(y, F)
OR = lambda x, y: x(T, y)
NOT = lambda x: x(F, T)
# test AND
assert T == AND(T, T)
assert F == AND(T, F)
assert F == AND(F, T)
assert F == AND(F, F)
# Natural Number
n0 = lambda f, x: x
n1 = lambda f, x: f(x)
n2 = lambda f, x: f(f(x))
n3 = lambda f, x: f(f(f(x)))
INC = lambda N, f, x: f(N(f, x))
INC_beta = lambda N: (lambda f, x: f(N(f, x)))
# Pair
PAIR = lambda M, N: lambda x: x(M, N)
a = 1
b = 2
a_b = PAIR(a, b)
后续可能的工作:
- 有类型Lambda演算
- 函数式编程,函数式编程语言
- 程序设计语言理论
- 从计算模型实现的难易程度,相互模拟的复杂度继续研究三种计算模型之间的关系
- 进一步研究计算复杂性理论中的问题和结论在递归函数论和Lambda演算理论中的对等概念,如递归定理与不动点算子间的对应关系
参考文献
- Michael Sipser, “Introduction to the Theory of Computation”
- Wanwei Liu “NUDT-ICT-slide-9.Lambda-演算.pdf”
- Lopez, Ciro Ivan Garcia. “Three computational models and its equivalence.” arXiv preprint arXiv:2010.15600 (2020).
- Matthias Felleisen Matthew Flatt. “Programming Languages and Lambda Calculi”
- 神奇的λ演算 - 简书 (jianshu.com)
- The Church-Turing Thesis (Stanford Encyclopedia of Philosophy)
- The Lambda Calculus (Stanford Encyclopedia of Philosophy)
- Recursive Functions (Stanford Encyclopedia of Philosophy)