Functional programming 对于定点组合子Y,什么是\x.f(xx)
对于Y组合定理Functional programming 对于定点组合子Y,什么是\x.f(xx),functional-programming,computer-science,theory,lambda-calculus,combinators,Functional Programming,Computer Science,Theory,Lambda Calculus,Combinators,对于Y组合定理 For every function F there exists an X such that FX=X 这里的F是什么意思?F(x)=x+1的固定点是什么?我的理解是,x+1=x没有解决方案 以下证明: For any function F, let W be the function λx.F(xx) and let X = WW. We claim that X is a fixed point of F. Demonstrated as follows
For every function F there exists an X such that FX=X
这里的F
是什么意思?F(x)=x+1的固定点是什么?我的理解是,x+1=x
没有解决方案
以下证明:
For any function F, let W be the function λx.F(xx) and let X = WW.
We claim that X is a fixed point of F. Demonstrated as follows
X = WW
X = λx.F(xx) W
X = F(WW)
X = FX
λx.F(xx)
是如何定义的?再次以F(x)=x+1
为例,什么是F(xx)
的意思 你是对的,当x
是一个数字时,方程x+1=x
没有解。这里发生的事情是,x
不局限于一个数字;它可以是函数的函数
关于xx
:通常在lambda演算中fx
是一个函数应用程序,因此xx
是“x应用于x”,或x(x)
。请注意,x是如何应用的函数和传递给它的值
因此,如果F(x)=x+1
,你有F(xx)=x(x)+1
,W=λx.(x(x)+1)
,并且x=W(W)
将是函数:
X = W(W) = (λx.(x(x)+1)) (λy.(y(y)+1))
这可能看起来非常抽象,因为如果你尝试在任何具体的值上展开X,你会发现这个过程永远不会结束。但不要让这件事困扰你;尽管如此,X
是F
的一个固定点,因为
F(X) = F(W(W)) by definition of X = W(W)
= (λx.F(x(x))) W using the fact that (λt.f(t))x is f(x)
= W(W) by definition of W = λx.F(x(x))
= X by definition of X = W(W).
函数的不动点是什么以及lambda演算符号似乎有点混淆 首先,
λx.F(xx)
是一个函数,它取一个参数x,“应用”x到x,然后“应用”F到结果,所以更像是函数(x){返回F(x(x));}
,但不要从字面上理解它,因为在lambda演算中,它是关于参数的替换,并且没有进行替换的顺序(我用来简化的是应用顺序)
因此,用简单的文本重写语义重写为类似C的语法(实际上是JavaScript,因为它有第一类函数)的证明如下所示:
var W = function (x) { return F(x(x)); }
var X = W(W);
W(W) => (function (x) { return F(x(x)); }(W))
=> return F(W(W))
=> return F(X)
=> F(X)
现在回到定点。你给出一个不存在定点的代数例子……对于函数来说,它更像是“找到一个ADD1(x)=x+1
”的定点
我希望熟悉的语法能让它更容易理解,而不是更容易:)这里的
X
可以进一步简化为F(X)=X+1
?你不能真正简化X
,你只能把它扩展得越来越多。例如,仅使用(λt.f(t))x
是f(x)
这一基本事实,就可以将x=(λx.(x(x)+1))(λy.(y(y)+1)扩展到(λy)(y(y)+1)((λy.(y(y)+1))+1
,并且可以进一步扩展得到x=(λx.(x(x)+1))((λx(x)+1))+n
对于任何正整数n
。这当然只是重申一个事实,即X是F(X)=X+1的不动点意味着X=X+1=…=X+n。不动点X=function(X){while(true)++X;return(X);}
?一个无限循环?只有在急切地求值时才是无限循环。。。但是lambda演算并没有告诉你们,你们需要做所有的替换,也没有告诉你们,替换的顺序。它只是给你一些身份。此外,固定点定义X=FX=FFX=FFFX。。。在同样的意义上是无限的……我发现@jJ关于评估策略的评论非常重要。在学习通过惰性函数语言(同名)配置的时首次遇到此问题,在该语言中,函数的固定点用于覆盖包定义;显示如何与不会导致无限循环的惰性语言一起使用。(刚刚了解到,这里定义的fix
对闭包进行操作。)
var F = function (x) { return x + 1; }
var W = function (x) { return F(x(x)); }
= function (x) { return function (x) { return x + 1; }(x(x)); }
var X = W(W);
W(W) => function (x) { return function (x) { return x + 1; }(x(x)); }(W)
=> return function (x) { return x + 1; }(W(W))
=> return W(W) + 1
=> W(W) + 1
=> X + 1
=> F(X)