data Term = L Int Term
| A Term Term
| I Int
deriving (Eq, Show)
sub (L var body) bvar rep = L var (sub body bvar rep)
sub (A fn arg) bvar rep = A (sub fn bvar rep) (sub arg bvar rep)
sub x bvar rep = if x == I bvar then rep else x
red (L var body) = L var (red body)
red (A fn arg) = case rfn of (L var body) -> red (sub body var arg)
_ -> A rfn (red arg)
where rfn = red fn
red x = x