Recall the definition of plus:
plus = [i:nat][j:nat] nat_rec i ([k:nat] suc) j
Also recall the rules for evaluating nat_rec:
nat_rec m f zero => m
nat_rec m f (suc i) => f i (nat_rec m f i)
Let us calculate plus five two. The names for numbers are abbreviations, so that two = suc (suc zero).
plus five two = ([i:nat][j:nat] nat_rec i ([k:nat] suc) j) five twoFirst, we beta-reduce, substituting five for i:
= ([j:nat] nat_rec five ([k:nat] suc) j) twoThen we beta-reduce again, substituting two for j (and eliminating the outermost set of parentheses):
= nat_rec five ([k:nat] suc) twoNow let us expand the definition of two (not a computation step, just for clarity). We will not need to expand the definition of five.
= nat_rec five ([k:nat] suc) (suc (suc zero))Now we look at the rules for nat_rec. The last argument is not zero, so the second rule applies. The three arguments are
m = five f = ([k:nat] suc) (suc i) = (suc (suc zero))Hence i = (suc zero). Applying the rule, we have
= ([k:nat] suc) (suc zero) (nat_rec five ([k:nat] suc) (suc zero))We reduce the application
([k:nat] suc) (suc zero)
by substituting suc zero
for k in suc. Since
k does not appear in suc, we are left with
suc, giving the whole term as:
= suc (nat_rec five ([k:nat] suc) (suc zero))Again we look at the rules for nat_rec. The last argument to
nat_rec
is still not zero, so the second
rule applies again. The three arguments
this time are
m = five f = ([k:nat] suc) (suc i) = (suc zero)Hence i = zero. Applying the rule, we have
= suc (([k:nat] suc) zero (nat_rec five ([k:nat] suc) zero))Again, reducing
([k:nat] suc) zero
leaves only
suc:
= suc (suc (nat_rec five ([k:nat] suc) zero))Looking at the rules for
nat_rec
, we see that the
first rule applies - the arguments to nat_rec
are:
m = five f = ([k:nat] suc) zeroThus we apply the first rule, replacing
nat_rec five ([k:nat] suc) zero)
with five:
= suc (suc five)So,
plus five two
is suc (suc five)
, or
7.
Here are the steps again:
plus five two = ([i:nat][j:nat] nat_rec i ([k:nat] suc) j) five two = ([j:nat] nat_rec five ([k:nat] suc) j) two = nat_rec five ([k:nat] suc) two = nat_rec five ([k:nat] suc) (suc (suc zero)) = ([k:nat] suc) (suc zero) (nat_rec five ([k:nat] suc) (suc zero)) = suc (nat_rec five ([k:nat] suc) (suc zero)) = suc (([k:nat] suc) zero (nat_rec five ([k:nat] suc) zero)) = suc (suc (nat_rec five ([k:nat] suc) zero)) = suc (suc five)
Judith Underwood