Lambda演算算子的优先级与约简策略

Lambda演算算子的优先级与约简策略,lambda,calculus,reduction,Lambda,Calculus,Reduction,一,。 在lambda演算中,应用程序比抽象具有更高的先例。现在,在示例中,作者展示了正常顺序和应用顺序的两种简化。第一个是: (λx.x^2 (λx.(x+1) 2))) → (λx.x^2 (2+1)) → (λx.x^2 (3)) → 3^2 → 9 我的问题在于第一步和第三步。为什么他可以这样减少 (λx.x^2 (3)) → 3^2 应用程序的优先级是否高于抽象?这难道不是真的吗: λx.x^2 (3) = λx.(x^2 (3)) 因此不可能减少?他解释这个词的方式是 λx.x

一,。 在lambda演算中,应用程序比抽象具有更高的先例。现在,在示例中,作者展示了正常顺序和应用顺序的两种简化。第一个是:

(λx.x^2 (λx.(x+1) 2))) → (λx.x^2 (2+1)) → (λx.x^2 (3)) → 3^2 → 9
我的问题在于第一步和第三步。为什么他可以这样减少

(λx.x^2 (3)) → 3^2
应用程序的优先级是否高于抽象?这难道不是真的吗:

λx.x^2 (3) = λx.(x^2 (3))
因此不可能减少?他解释这个词的方式是

λx.x^2 (3) = (λx.x^2) (3)
这是不正确的

二,

下面是4种减排策略的定义

Normal Order:       Leftmost outermost redex reduced first
Applicative Order:  Leftmost innermost redex reduced first
Call by value:      Only outermost redex reduced                Reduction only if right-hand side has been reduced to a value (= variable or abstraction)
Call by name:       Leftmost outermost redex reduced first      No reductions inside abstractions
根据最里面和最外面的说法,它们只指抽象。最左侧和最右侧是否仅类似地引用应用程序

三,

那么,这是一个正确的递归算法,可以在伪代码中应用降阶吗

evaluate(t : Term) {
    if (t is Abstraction) {
        evaluate(t.inside)
    } else if (t is Application) {
        evaluate(t.first)
        if (t.first is Abstraction) {
            t.first.apply(t.second)
        }
    } else if (t is Variable) {
        do nothing
    }
}
抽象、应用和变量都是术语的子类。函数apply将给定的术语应用于抽象。数据结构如下所示。请忽略缺少的指针语法:

class Abstraction {
    var : Variable
    inside : Term
}
class Variable {
    name : String
}
class Application {
    first : Term
    second : Term
}
四,。 在1中的链接中。作者给出了一个例子,关于一个术语,它可以用正规序简化为正规形式,但不能用应用序,因为在后一种情况下,简化不会终止。是否有一个术语,其中减少终止,但两种策略产生不同的结果?如果是的话,举个什么例子


很抱歉回答了这么长的问题,我不想为此创建4个不同的线程。

您好,欢迎使用StackOverflow!你实际上问了四个问题。把他们分成四个问题,分别发帖,这样他们就可以独立回答了。这只会让我每90分钟发帖一个问题。。。