練習問題 1.2.4

直前の問題の続き.この言語にもう1つ構文規則を追加する. (iii)e1およびe2が式なら,add (e1,e2)も式である. これに対応する簡約規則は以下のとおり.

add(zero,e2)     = e2 
add(succ(e1),e2) = succ(add(e1,e2))
add(pred(e1),e2) = pred(add(e1,e2))

式 add(succ(pred(zero)),zero) を単純化せよ.

この式に適用できる簡約の方法が何通りあるか数えよ. どの方法でも同じ結果になるか.


(1) 外側から
    add(succ(pred(zero)),zero)
=   { add(succ(e1),e2) = succ(add(e1,e2)) }
    succ(add(pred(zero),zero))
=   { add(pred(e1),e2) = pred(add(e1,e2)) }
    succ(pred(add(zero,zero)))
=   { succ(pred(e)) = e }
    add(zero,zero)
=   { add(zero,e2) = e2 }
    zero

(2) addの簡約から
    add(succ(pred(zero)),zero)
=   { add(succ(e1),e2) = succ(add(e1,e2)) }
    succ(add(pred(zero),zero))
=   { add(pred(e1),e2) = pred(add(e1,e2)) }
    succ(pred(add(zero,zero)))
=   { add(zero,e2) = e2 }
    succ(pred(zero))
=   { succ(pred(e)) = e }
    zero

(3) 内側から
    add(succ(pred(zero)),zero)
=   { succ(pred(e)) = e }
    add(zero,zero)
=   { add(zero,e2) = e2 }
    zero

簡約方法は3通り,どれも同じ結果になる.