递归 lambda 演算函数
Recursive lambda calculus function
我想创建一个 lambda 演算函数 P,使得 (P x y z)
给出 ((x y)(x P)(P z))
。我尝试使用 Y-combinator/Turing 组合子的变体,即 λg.(g g)
形式的函数,因为我需要重现函数本身,但我看不到任何前进的方向。任何帮助将不胜感激。
U-combinator 应该可以帮助您创建一个自引用的 lambda 抽象。
这是 Ω,它是最小的非终止程序,很好地展示了 U 组合器。
((λf. (f f))
(λf. (f f)))
如果你能给它起个名字
Ω := λf.(f f)
这是你的抽象可能看起来的样子
((λP. (P P x y z))
(λP. λx. λy. λz. ((x y) (x P) (P z))))
或使用Ω
λx. λy. λz. Ω (λP. λx. λy. λz. ((x y) (x P) (P z))) x y z
基本上你想解“β方程”P x y z = (x y) (x P) (P z)
。
有一种求解形式为 M = ... M ...
的方程的通用方法。
您只需将右侧包裹在 lambda 中,形成一个术语 L
,其中所有出现的 M
都将替换为 m
:
L = λm. ... m ...
然后使用定点组合器得到你的解决方案。让我用你的例子来说明。
L = λp. (λxyz. (x y) (x p) (p z)),
where λxyz. is a shorthand for λx. λy. λz.
然后,P = Y L
,展开Y
和L
我们得到:
P = (λf. (λg. f (g g)) (λg. f (g g))) (λp. (λxyz. (x y) (x p) (p z)))
->β
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))
// the previous line is our "unfolded" P
让我们检查一下 P
是否符合我们的要求:
P x y z
= // unfolding definition of P
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) x y z
->β
((λp. (λxyz. (x y) (x p) (p z))) ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) x y z
->β
(λxyz. (x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)) x y z
->β
(x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 1st occurrence of P
(x y) (x P) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 2nd occurrence of P
(x y) (x P) (P z)
Q.E.D.
我想创建一个 lambda 演算函数 P,使得 (P x y z)
给出 ((x y)(x P)(P z))
。我尝试使用 Y-combinator/Turing 组合子的变体,即 λg.(g g)
形式的函数,因为我需要重现函数本身,但我看不到任何前进的方向。任何帮助将不胜感激。
U-combinator 应该可以帮助您创建一个自引用的 lambda 抽象。
这是 Ω,它是最小的非终止程序,很好地展示了 U 组合器。
((λf. (f f))
(λf. (f f)))
如果你能给它起个名字
Ω := λf.(f f)
这是你的抽象可能看起来的样子
((λP. (P P x y z))
(λP. λx. λy. λz. ((x y) (x P) (P z))))
或使用Ω
λx. λy. λz. Ω (λP. λx. λy. λz. ((x y) (x P) (P z))) x y z
基本上你想解“β方程”P x y z = (x y) (x P) (P z)
。
有一种求解形式为 M = ... M ...
的方程的通用方法。
您只需将右侧包裹在 lambda 中,形成一个术语 L
,其中所有出现的 M
都将替换为 m
:
L = λm. ... m ...
然后使用定点组合器得到你的解决方案。让我用你的例子来说明。
L = λp. (λxyz. (x y) (x p) (p z)),
where λxyz. is a shorthand for λx. λy. λz.
然后,P = Y L
,展开Y
和L
我们得到:
P = (λf. (λg. f (g g)) (λg. f (g g))) (λp. (λxyz. (x y) (x p) (p z)))
->β
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))
// the previous line is our "unfolded" P
让我们检查一下 P
是否符合我们的要求:
P x y z
= // unfolding definition of P
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) x y z
->β
((λp. (λxyz. (x y) (x p) (p z))) ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) x y z
->β
(λxyz. (x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)) x y z
->β
(x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 1st occurrence of P
(x y) (x P) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 2nd occurrence of P
(x y) (x P) (P z)
Q.E.D.