Я компилирую термины лямбда-исчисления в сети взаимодействия, чтобы их оценить, используя абстрактный алгоритм ламинга. Чтобы проверить мою реализацию, я использовал эту функцию разделения числа церквей:
div = (λ a b c d . (b (λ e . (e d)) (a (b (λ e f g . (e (λ h . (f h g)))) (λ e . e) (λ e f . (f (c e)))) (b (λ e f . e) (λ e . e) (λ e . e)))))
Разделение 4 на 4 (т.е. (λ k . (div k k)) (λ f x . (f (f (f (f x)))))
), я получаю эту сеть:
(Извините за ужасный рендеринг. λ
- лямбда, R
- корень, D
- вентилятор, e
- ластик.)
Читая этот термин, я получаю номер церкви 1, как и ожидалось. Но эта сеть очень завышена: у нее много поклонников и ластиков, которые не имеют очевидной цели. Разделение большего числа еще хуже. Здесь div 32 32
:
Это снова читается как one
, но здесь мы видим еще более длинный хвост избыточных узлов вентилятора. Мой вопрос: - это ожидаемое поведение потребностей взаимодействия при сокращении этого конкретного термина или это возможная ошибка в моей реализации? Если это не ошибка, существует ли какой-либо способ этого?