Lambda演算算子的优先级与约简策略
一,。 在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
(λ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分钟发帖一个问题。。。