Почему этот редуктор лямбда-исчисления не уменьшает succ с 0 до 1?

data Term = Var Integer
          | Apply Term Term
          | Lambda Term
          deriving (Eq, Show)

sub :: Term -> Integer -> Term -> Term
sub e v r = case e of
    Var x -> if x == v then r else e
    Apply m1 m2 -> Apply (sub m1 v r) (sub m2 v r)
    Lambda t -> Lambda (sub t (v + 1) r)

beta :: Term -> Term
beta t = case t of
    Apply (Lambda e) e' -> sub e 0 e'
    otherwise -> t

eta :: Term -> Term
eta t = case t of
    Lambda (Apply f (Var 0)) -> f
    otherwise -> t

reduce :: Term -> Term
reduce t = if t == t'
    then t
    else reduce t'
  where t' = beta . eta $ t

Я попытался:

let zero = Lambda $ Lambda $ Var 0
let succ = Lambda $ Lambda $ Lambda $ Apply (Var 1) $ (Apply (Apply (Var 2) (Var 1)) (Var 0))
reduce (Apply succ zero)

В GHCi, но, похоже, он не дал мне выражения для одного (Lambda (Lambda (Apply (Var 1) (Var 0)) того, что я ищу. Вместо этого он дает мне:

Lambda (Lambda (Apply (Var 1) (Apply (Apply (Lambda (Lambda (Var 0))) (Var 1)) (Var 0))))

Переменные кодируются не по имени, а по тому, сколько лямбд нужно пройти наружу, чтобы получить параметр.


person user3133295    schedule 05.01.2014    source источник
comment
Какую стратегию оценки вы хотите внедрить?   -  person Stephen Diehl    schedule 05.01.2014
comment
Самый простой в реализации. Поскольку моя система чисто функциональна, это не имеет значения.   -  person user3133295    schedule 06.01.2014
comment
В общем, разные стратегии вычисления дают разные нормальные формы даже в чисто функциональных языках.   -  person Stephen Diehl    schedule 06.01.2014


Ответы (1)


Ваш редуктор, как и способ, которым обычно оценивается лямбда-исчисление, не сокращает внутри терминов Lambda - он удаляет только редексы верхнего уровня. Результат должен быть эквивалентен one, в том смысле, что если вы примените оба к одним и тем же аргументам, вы получите один и тот же результат, но не идентичный синтаксически.

person GS - Apologise to Monica    schedule 05.01.2014
comment
Где должна происходить эта внутренняя редукция, в бета- или эта-редукции? - person user3133295; 05.01.2014
comment
Внутри бета-редукции наиболее важно - вам нужно будет повторить структуру термина до или после попытки верхнего уровня. Вам, вероятно, вообще не нужно сокращение эта. - person GS - Apologise to Monica; 05.01.2014