Non-strict monadic evaluation contexts Eb
Eb::=⋅∣(if0 Eb e e)∣(Eb e)∣(v Eb)∣(op v Eb e)
B-reductions
Eb[(let (x e1) e2)]→Eb[(if0 v e1 e2)]→Eb[(O v)]→let (x e1) Eb[e2]where Eb=⋅let (y (if0 v e1 e2))Eb[y]where Eb=⋅,fresh ylet (y (O v)) Eb[y]where Eb=⋅,fresh yB1B2B3
如果定義 B={B1,B2,B3},那麼這組規則會確保evaluation position上的non-value會被換成value。
Example 避免程式指數爆炸成長 [local-0]
相比起 A2 規則,B2 專門用來避免程式指數爆炸的轉換。我們再次回到失敗案例然後推導變換過程
let x := if0 (if0 (if0 0 0 1) 0 1) 0 1
in LARGE
我們改用 Eb[−] 來轉換,由於不抽取let-if,所以我們要直接處理rhs,於是
let x :=
let y := if0 (if0 0 0 1) 0 1
in if0 y 0 1
in LARGE
下一步
let x :=
let z := if0 0 0 1
in let y := if0 z 0 1
in if0 y 0 1
in LARGE
所以這確實不會導致大量的程式碼重複