5.2 ISWIM 约化
由于ISWIM的函数只接收值参数,我们必须首先定义 值 集。 值集 V (或 U 及 W)是表达式集合的子集。
特别是,一个应用表达式永远不是一个值,而抽象(例如函数)则永远是一个值,不管它的body的格式如何。
ISWIM 最核心的约化关系为 βv ,类似于 β,但是它的参数必须从属 V 而不是 M:
将参数限制为 V 的成员,再一定程度上强行规定了赋值的顺序。例如, ((λx.1) (sub1
λy.y)) 无法用 βv 约化为 1,由于 (sub1
λy.y) 并非 V 的成员。类似的,((λx.1) (sub1
1)) 必须先被约化为 ((λx.1) 0) 然后才是 1 。
ISWIM没有类似于 η 的关系。这反映了编程语言的实现一般不会提取应用于另一个程序语言主体中的函数。此外,从现在开始,我们在比较表达式时一般会使用 α-等价(=α),而非将 α 看作一种约化。
除了函数应用之外,ISWIM约化规则还需要考虑到基元的操作。与 b 和 on 在原则上抽象(即使我们定义了具体的集合)一样,与基元操作相关的约化由抽象的 δ 表示。 δ 关系将每个 on 加 n 个基本常数映射成一个值。为了具体而言,我们选择下述 δ :
通过结合 β 和 δ ,我们得到了完整的约化关系 v :
一如既往的,→v 是 v 的兼并闭合,→→v 是自反-传递式闭合,=v 为对称闭合。
练习 5.1
用 →**v **证明 (λw.(− (w ⌈1⌉) ⌈5⌉)) ((λx.x ⌈10⌉) λyz.(+ z y)) 可约化为值。
题解:
(λw.(− (w ⌈1⌉) ⌈5⌉)) ((λx.x ⌈10⌉) λyz.(+ z y))
→**v ** (λw.(− (w ⌈1⌉) ⌈5⌉)) (λyz.(+ z y) ⌈10⌉)
→**v ** (λw.(− (w ⌈1⌉) ⌈5⌉)) (λz.(+ z ⌈10⌉))
→**v ** (− ((λz.(+ z ⌈10⌉)) ⌈1⌉) ⌈5⌉)
→**v ** (− (+ ⌈1⌉ ⌈10⌉) ⌈5⌉)
→**v ** (− ⌈11⌉ ⌈5⌉)
→**v ** ⌈6⌉