Questions tagged «lambda-calculus»

λ演算是用于函数定义,函数应用和递归的形式系统,它构成函数编程的数学基础。

3
和之间有区别吗?
我目前正在学习Lambda演算,并且想知道以下两种不同的书写Lambda术语的方法。 λ X ÿ。X ÿλXÿ。Xÿ\lambda xy.xy λ X 。λ ÿ。X ÿλX。λÿ。Xÿ\lambda x.\lambda y.xy 意思或应用beta减少的方式是否存在任何差异,或者仅是表达同一件事的两种方式? 尤其是对创建的定义让我感到奇怪: 对 =λ X ÿ。λ p 。p X ÿλXÿ。λp。pXÿ\lambda xy.\lambda p.pxy

2
通用/现有量化?
我正在努力理解类型的通用和存在量化的目的。我正在玩玩根据结构演算编写玩具语言的游戏。我一直在阅读有关Morte和Henk的信息,以帮助我更好地理解。 我不明白为什么CoC同时具有lambda和forall抽象。 (∀ X :甲。乙)(λ X :甲。乙)(λx:A.B)(\lambda x:A . B) (∀ X :甲。乙)(∀x:A.B)(\forall x:A . B) 在我看来,lambda包含了手动传递类型的系统中的所有功能。换句话说,以下 (∀ X :* 。λ 一个:X 。一)(∀x:∗.λa:x.a)(\forall x : *. \lambda a : x. a) 可以替换为 (λ X :* 。λ 一个:X 。一)(λx:∗.λa:x.a)(\lambda x : *. \lambda a : x. a) 如果是第一次将其应用于所使用的类型。 我想念什么?有哪些可以阅读的论文,博客或文章对我有帮助? 谢谢。

1
ML类型推断的指数成本的简洁示例
引起我注意的是,像OCaml这样的功能语言中类型推断的成本可能很高。该主张是有一系列表达式,使得对于每个表达式,相应类型的长度在表达式的长度上是指数的。 我设计了以下顺序。我的问题是:您是否知道一个具有更简洁表达式的序列,可以实现相同的类型? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

2
SK2演算是否是完整的基础,其中K2是翻转的K组合器?
具体地,如果我定义了一个新的ķ2ķ2K_2作为 ķ2= λ X 。(λÿ。ÿ)ķ2=λX。(λÿ。ÿ)K_2 = \lambda x. (\lambda y. y) 代替 ķ= λ X 。(λ ÿ。X )ķ=λX。(λÿ。X)K = \lambda x. (\lambda y. x) 将在{S,K2,I}{S,K2,I}\{S, K_2,I\}演算是竞争基础? 我的猜测是“不”,只是因为我似乎无法从SSS,III和K2K2K_2组合器构造常规K 组合器,但是我没有可遵循的算法,也没有很好的算法用这些组合器制作事物的直觉。 好像你可以定义 K2=KIK2=KIK_2 = K I 与正规{S,K,(I)}{S,K,(I)}\{S, K, (I)\}演算,但我不能从真正的工作向后获得的推导KķK来讲K2K2K_2,其余。 我试图证明它在功能上不完整的尝试实质上是试图穷举构造可从这些组合器获得的每个功能,以表明无论使用哪种组合器,您都将达到死胡同(您之前已经看过的功能)。我意识到,对于功能上不完整的组合器集(例如,KKK组合器自身使用时,永远不会死胡同),这不一定是正确的,但这是我的最佳想法。我总是能够使用SSS组合器来偷偷摸摸地走出我认为最终是死路一条,因此我不再对这种方法的可行性感到不确定。 我在StackOverflow上问了这个问题,但被鼓励在这里发布。我收到了关于该帖子的一些评论,但不确定我是否正确理解它们。 奖励:如果不是一个完整的基础,那么生成的语言是否仍是图灵完整的?

2
Beta扩展的汇合
令→β→β\to_\beta是λ微积分中的ββ\beta约简。定义β -expansion ← β由牛逼“ ← β ŧλλ\lambdaββ\beta←β←β\leftarrow_\betat′←βt⟺t→βt′t′←βt⟺t→βt′t'\leftarrow_\beta t \iff t\to_\beta t'。 是←β←β\leftarrow_\beta融合?换句话说,我们有任何l,d,rl,d,rl,d,r,如果l→∗βd←∗βrl→β∗d←β∗rl \to_\beta^* d\leftarrow_\beta^* r,则存在uuu这样l←∗βu→∗βrl←β∗u→β∗rl\leftarrow_\beta^* u \to_\beta^* r? 关键字:向上汇合,倒置CR属性 我开始看弱属性:本地汇合(即,如果l→βd←βrl→βd←βrl \to_\beta d\leftarrow_\beta r,然后l←∗βu→∗βrl←β∗u→β∗rl\leftarrow_\beta^* u \to_\beta^* r)。即使这是正确的,但由于ββ\beta扩展是非终止的,所以这并不意味着融合,但是我认为这将有助于我理解障碍。 (顶部)的情况下都减少是在顶层,设定成为(λx1.b1)a1→b1[a1/x1]=b2[a2/x2]←(λx2.b2)a2(λx1.b1)a1→b1[a1/x1]=b2[a2/x2]←(λx2.b2)a2(\lambda x_1.b_1)a_1\rightarrow b_1[a_1/x_1]=b_2[a_2/x_2]\leftarrow (\lambda x_2.b_2)a_2。直到进行αα\alpha命名,我们可以假设x1≠x2x1≠x2x_1\not =x_2,那么x1x1x_1和x2x2x_2都不是免费的。 (掷)如果x1x1x_1不处于自由b1b1b_1,我们有b1=b2[a2/x2]b1=b2[a2/x2]b_1=b_2[a_2/x_2],因此具有(λx1.b1)a1=(λx1.b2[a2/x2])a1←(λx1.(λx2.b2)a2)a1→(λx2.b2)a2(λx1.b1)a1=(λx1.b2[a2/x2])a1←(λx1.(λx2.b2)a2)a1→(λx2.b2)a2(\lambda x_1.b_1)a_1=(\lambda x_1.b_2[a_2/x_2])a_1\leftarrow(\lambda x_1.(\lambda x_2.b_2)a_2)a_1\rightarrow (\lambda x_2.b_2)a_2。 对于情况(顶部)的归纳(在b1b1b_1和b2b2b_2)的幼稚证明将如下所示: 如果b1b1b_1是变量y1y1y_1, 如果y1=x1y1=x1y_1=x_1,设定成为(λx1.x1)a1→a1=b2[a2/x2]←(λx2.b2)a2(λx1.x1)a1→a1=b2[a2/x2]←(λx2.b2)a2(\lambda x_1.x_1)a_1\rightarrow a_1=b_2[a_2/x_2]\leftarrow (\lambda x_2.b_2)a_2,我们确实有(λx1.x1)a1=(λx1.x1)(b2[a2/x2])←(λx1.x1)((λx2.b2)a2)→(λx2.b2)a2(λx1.x1)a1=(λx1.x1)(b2[a2/x2])←(λx1.x1)((λx2.b2)a2)→(λx2.b2)a2(\lambda x_1.x_1)a_1=(\lambda x_1.x_1)(b_2[a_2/x_2])\leftarrow (\lambda x_1.x_1)((\lambda …

5
Lambda微积分发生器
我不知道在哪里可以问这个问题,我希望这是一个好地方。 我只是想知道是否有可能制造一个lambda演算生成器;本质上,在给定无限时间的情况下,一个循环会产生所有可能的lambda微积分函数。(如字符串形式)。 由于Lambda演算非常简单,因此只有少数几个元素可以表达(我认为不是很有用),但从最简单的组合开始就可以生成所有可能的Lambda表达式。微积分功能。 当然,我对lambda微积分几乎一无所知,所以我不知道这是否真的可能。 是吗?如果是这样,它是否像我所设想的那样简单明了,或者从技术上讲是可能的,但是如此困难以至于实际上是不可能的? PS。我不是在谈论减少beta的函数,而是在谈论每个lambda演算函数的每个有效符号。

1
函数式编程语言实现的算法复杂度分析
我今天了解到,算法分析基于计算模型而有所不同。这是我从未想过或从未听说过的事情。 @chi用户给我的示例进一步说明了这一点: 例如,考虑任务:给定 返回 。在RAM中,这可以在解决, 因为数组访问是固定时间的。使用TM,我们需要扫描整个输入,所以它是(i,x1,…,xn)(i,x1,…,xn)(i,x_1 ,…,x_n )xixix_iO(1)O(1)O(1)O(n)O(n)O(n) 这使我对功能语言感到疑惑。从我的理解,“函数式语言是密切相关的演算”(由尤瓦Filmus一个评论对这里)。因此,如果功能语言基于lambda演算,但它们在基于RAM的计算机上运行,​​那么对使用纯功能数据结构和语言实现的算法进行复杂度分析的正确方法是什么? 我没有机会阅读“ 纯粹的功能数据结构”,但是我浏览了Wikipedia页面上的主题,并且似乎某些数据结构确实用以下方法代替了传统的数组: “数组可以用映射或随机访问列表替换,这允许使用纯功能实现,但是访问和更新时间是对数的。” 在那种情况下,计算模型会有所不同,对吗?

1
自类型是否会使归纳构造的微积分过时?
自我类型是构造微积分[1]的扩展,允许语言表达通过Scott编码编码的代数数据类型。Scott编码提供了一种模式匹配功能O(1),这是在CC中包含归纳定义的主要动机之一。然而,“自我类型”却使基础理论变得更加简单和优雅,并且似乎同样强大。 从理论的角度来看,自我类型会否使CIC过时,或者在某些方面CIC相对于Self Tyes是有利的? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf

2
Lambda演算的组合解释
根据彼得·塞林格(Peter Selinger)的观点,拉姆达微积分是代数(PDF)。在本文的开头,他说: 众所周知,lambda演算的组合解释是不完善的,因为它不满足:在这种解释下,并不意味着\ lambda xM = \ lambda xN(Barendregt,1984)。ξξξM=NM=NM = Nλx.M=λx.Nλx.M=λx.N\lambda x.M = \lambda x.N 问题: 在这里意味着什么等价? 给定等效性的定义,隐含的反例是什么?

2
仅使用Hindley-Milner类型系统定义列表
我正在开发一个小型lambda演算编译器,该编译器具有运行正常的Hindley-Milner类型推断系统,并且现在还支持递归let(不在链接代码中),据我所知应该足以使Turing完成。 现在的问题是我不知道如何使它成为支持列表,或者它是否已经支持它们,我只需要找到一种编码它们的方法。我希望能够定义它们,而不必向类型系统中添加新规则。 我想到的一个列表的最简单方法x是将其作为null(或为空列表),或同时包含x和的列表对x。但是要做到这一点,我需要能够定义对和或,我相信它们是乘积和总和类型。 看来我可以这样定义对: pair = λabf.fab first = λp.p(λab.a) second = λp.p(λab.b) 因为pair将具有类型a -> (b -> ((a -> (b -> x)) -> x)),所以在传递一个int和一个后string,它会产生一个带有类型的东西(int -> (string -> x)) -> x,这将是一对intand 的表示string。这里令我困扰的是,如果那个代表一对,那为什么在逻辑上不等同于或暗示这个命题int and string呢?但是,等效于(((int and string) -> x) -> x),好像我只能将产品类型作为函数的参数一样。这个答案似乎解决了这个问题,但我不知道他使用的符号是什么意思。另外,如果这不能真正对产品类型进行编码,那么我对上面的对的定义无法做到的产品类型(考虑到我也可以用相同的方式定义n元组)做任何事情?如果不是,这是否与仅使用蕴涵就不能表达(AFAIK)连词的事实相矛盾? 另外,总和类型呢?我可以仅使用函数类型以某种方式对其进行编码吗?如果是这样,是否足以定义列表?否则,是否有其他方法可以定义列表而不必扩展我的类型系统?如果不是这样,如果我想使其尽可能简单,我需要进行哪些更改? 请记住,我是计算机程序员,但不是计算机科学家或数学家,并且在阅读数学符号方面相当不擅长。 编辑: 我不确定到目前为止实现的技术名称是什么,但是我所拥有的基本上只是上面链接的代码,这是一种约束生成算法,使用应用程序规则,抽象规则和变量先从Hinley-Milner算法开始,然后是获得主体类型的统一算法。例如,该表达式\a.a将产生type a -> a,并且该表达式\a.(a a)将引发一个发生检查错误。最重要的是,这里没有一个确切的let规则,但是一个函数似乎具有与您定义递归全局函数(如此伪代码)相同的作用: GetTypeOfGlobalFunction(term, globalScope, nameOfFunction) …

2
是什么让lambda演算与研究相关?
我将于明年秋天开始一个本科计算机科学课程,但是我不能真正理解函数式编程中的λ微积分。我可能会完全误解这一点,但是根据斯坦福哲学百科全书中的定义,它只是功能的另一种表示法。 如果仅仅是这样,为什么在常规函数符号上使用λ微积分来计算算法运行时间有什么好处?


1
涉及教堂数字的Lambda微积分评估
我知道教堂数字 看起来像(... n次...)。这意味着“将函数应用于函数次”。 λ 小号。λ ž 。小号小号cncnc_nλs.λz.sλs.λz.s\lambda s. \lambda z. s小号ñ žszszs\;zsssnnnzzz 函数的可能定义如下:。看着身体,我了解了功能背后的逻辑。但是,当我开始评估时,会陷入困境。我将用一个例子来说明:吨我米Ë 小号 = λ 米。λ ñ 。λ 小号。米timestimes\mathtt{times}Ť 我中号Ë 小号 =λ米。λñ。λ小号。米(ns )Ť一世米Ës=λ米。λñ。λs。米(ñs)\mathtt{times} = \lambda m. \lambda n. \lambda s. m \; (n\; s) (λ 米。λ Ñ 。λ 小号。米(ns))(λs.λz.ssz)(λs.λz.sssz)→∗→∗→∗λs.(λs.λz.ssz)((λs.λz.sssz)s))λs.(λs.λz.ssz)(λz.sssz)λs.λz.(λz.sssz)(λz.sssz)z(λm.λn.λs.m(ns))(λs.λz.ssz)(λs.λz.sssz)→∗λs.(λs.λz.ssz)((λs.λz.sssz)s))→∗λs.(λs.λz.ssz)(λz.sssz)→∗λs.λz.(λz.sssz)(λz.sssz)z\begin{align*} (\lambda m. \lambda n. \lambda s. m \; (n\; s))(\lambda …

1
λ-演算:在函数的内存表示中最有效的是什么?
我想比较函数编码(Church / Scott)与传统编码(汇编器/ C)数据结构的性能。 但是在我这样做之前,我需要知道函数在内存中的表示效率。该功能当然可以部分应用(也称为闭包)。 我对当前流行的功能性语言(Haskell,ML)使用的编码算法以及可以实现的最有效的一种语言都感兴趣。 奖金点:有这样的编码该地图函数编码整数天然整数(short,int等,在C)。可能吗 我根据效率来评估效率。换句话说,编码越有效,对功能数据结构的计算性能的影响就越小。

1
什么是超级宇宙?
我正在阅读这篇关于类型论中的宇宙的著名论文。起初,我期望与SetωAgda 类似,但事实证明,它甚至更通用。它似乎将Universe构造从普通的归纳-递归类型推广到粘合剂(类似于和)。我想问的主要问题是,它的目的是什么?ΠΠ\PiΣΣ\Sigma 以下是一些Idris代码,它们定义了通常的Tarski风格的Universe: mutual public export data U : (level : Nat) -> Type where GroundU : Ground -> U level BinderU : Binder -> (a : U level) -> (b : (x : T {level} a) -> U level) -> U level UnivU : U (S level) LiftU : …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.