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个不同的主题。