当前位置: 首页 > 知识库问答 >
问题:

Lambda演算Haskell的Beta转换

陶树
2023-03-14
data Expr = App Expr Expr | Abs Int Expr | Var Int deriving (Show,Eq)
eval1cbv :: Expr -> Expr
eval1cbv (Var x) = (Var x)
eval1cbv (Abs x e) = (Abs x e)
eval1cbv (App (Abs x e1) e@(Abs y e2)) = eval1cbv (subst e1 x e)
eval1cbv (App e@(Abs x e1) e2) =  eval1cbv (subst e2 x e)  
eval1cbv (App e1 e2) = (App (eval1cbv e1) e2)

其中subst是用于定义替换的函数。

然而,当我试图使用beta约简来约简表达式时,我得到了一个非穷举模式错误,我不明白为什么。我能做的修复它是在底部添加一个额外的大小写,如下所示:

eval :: Expr -> Expr
eval (Abs x e) = (Abs x e)
eval (App (Abs x e1) e@(Abs y e2)) = subst e1 x e
eval (App e@(Abs x e1) e2) = App e (eval e2)
eval (App e1 e2) = App (eval e1) e2
eval (Var x) = Var x

但是,如果我这样做了,那么lambda表达式根本不会被缩减,这意味着函数的输入和输出是相同的。

  1. 如果使用第一个函数而不添加最后一个大小写,则为非穷尽模式
  2. 或完全相同的表达式App(ABS1(ABS2(VAR1)))(VAR3),如果添加最后一个例子
  3. ,它显然不会减少

谁能帮我弄清楚这件事吗?:)

共有1个答案

祁驰
2023-03-14

但是当我为一个更大的测试用例运行它时,比如:

eval (App (Abs 1 (Abs 2 (Var 1))) (Var 3)) 

当您尝试将ABS x E形式应用到VAR Y时,您就在这个分支中,

eval (App e@(Abs x e1) e2) = App e (eval e2)

所以你有,

  App (Abs x e) (Var y)
= App (Abs x e) (eval (Var y))
= App (Abs x e) (Var y)
eval (App e1 e2) = App (eval e1) e2
eval (App (Abs x e1) e@(Abs y e2)) = subst e1 x e

如果替换的结果是一个应用术语,会发生什么?会对结果进行评估吗?

编辑

关于您的更改,给定Lamapp e1 e2,您之前遵循的是按值调用的评估策略(即在替换之前评估e2)。那就没了,

eval1cbv (LamApp (LamAbs x e1) e@(LamAbs y e2)) = eval1cbv (subst e1 x e)
eval1cbv (LamApp e@(LamAbs x e1) e2) =  eval1cbv (subst e2 x e)  
eval1cbv (LamApp e1 e2) = (LamApp (eval1cbv e1) e2)
 类似资料:
  • 我在Haskell编程中的冒险并不都是史诗般的。我正在实现简单的Lambda演算,我很高兴完成了、以及,希望它们是正确的。剩下的是,就像红色框中定义的那样(在下图中),我正在为此寻找指导。 如果我说错了请指正, (1)但是我发现返回给定变量的类型。Haskell中的什么构造返回?我知道在中是,但我正在寻找一个在下工作的。 (3)对于(T-APP)和(T-ABS),我假设我分别对和应用程序应用了替换

  • 我发现优先级和关联性是一个很大的障碍,让我理解语法在haskell代码中试图表达的内容。 例如, 通过实验,我终于明白了, 你们谁能提供一些参考,让语法更容易掌握吗?

  • Proceed to site to know how to use the AWS Lambda Haskell Runtime.

  • 我现在被困在实现“alpha-同余”(在一些教科书中也被称为“alpha-等价”或“alpha-相等”)上。我希望能够检查两个λ表达式是否相等。例如,如果我在解释器中输入以下表达式,它应该得到True(用于指示lambda符号): 问题在于理解下列λ表达式是否被认为是alpha等价的: 在的情况下,我猜答案是。这是因为和,两者的右侧是相等的(其中符号用于表示alpha缩减)。 简而言之,如何实现函

  • 部分答案可能来自领域理论。如果我理解正确的话,的元素并不全是集合论函数(根据康托定理,这些函数比大),而只是连续函数。如果是,定义这种连续性的拓扑是什么?为什么类型的Haskell术语对它是连续的?