Lambda演算运算符优先级和约简策略

时间:2014-12-02 20:17:54

标签: lambda calculus reduction

1
在lambda演算中,应用程序具有比抽象更高的优先级。现在在this示例中,作者显示了正常和应用顺序的两个减少。第一个是:

(λx.x^2 (λx.(x+1) 2))) → (λx.x^2 (2+1)) → (λx.x^2 (3)) → 3^2 → 9

我的问题在于第1步和第3步。他为什么能这样减少

(λx.x^2 (3)) → 3^2

如果应用程序具有比抽象更高的优先级?不应该这样:

λx.x^2 (3) = λx.(x^2 (3))

因此不应该减少?他解释这个词的方式是

λx.x^2 (3) = (λx.x^2) (3)

这是不正确的。

2

Afaik这些是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

根据this最内层和最外层仅指抽象。最左边(和最右边)同样只是指应用程序吗?

第3

这是一个正确的递归算法,用于减少应用顺序(在伪代码中)吗?

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
    }
}

抽象,应用程序和变量都是Term的子类。功能"适用"将给定的术语应用于抽象。数据结构看起来像这样(请忽略缺少的指针语法):

class Abstraction {
    var : Variable
    inside : Term
}
class Variable {
    name : String
}
class Application {
    first : Term
    second : Term
}

4 1。中的链接中,作者给出了一个关于一个术语的例子,该术语可以通过正常顺序缩减为正常形式,但不能与应用顺序一起使用,因为在后一种情况下,缩减不会终止。是否有一个术语表明减少会终止,但两种策略会产生不同的结果?如果是这样,那将是一个什么样的例子?

对于长时间的问题,我很抱歉,我不想为此创建4个不同的主题。

0 个答案:

没有答案