LINUX.ORG.RU
ФорумTalks

Помогите осилить Church encoding

 church encoding, ,


1

3

сабж: http://en.wikipedia.org/wiki/Church_encoding

код на scheme (это вообще задача из сикп, но мне теория показалась занимательной):

(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
   (lambda (f) (lambda (x) (f ((n f) x)))))

Непонятно, что есть zero, а также непонятно, как использовать обе процедуры. Ясно, что это какая-то композиция, но чувствую необходимость спросить помощи.

★★★★★

(define one (lambda (f) (f (lambda (x) x))))
(define two (lambda (f) (f (f (lambda (x) x)))))
johnson102
()

Такие вещи лучше понимаются на статически-типизированных языках. forall a. (a -> a) -> (a -> a).

Собственно говоря, если n — число, закодированное по Чёрчу, то n f x = f (f (f (f... (f x)...))), где f повторяется n раз. Отсюда: ноль кодируется тождественной функцией, 0 f x = x, а чтобы к n прибавить единичку, нужно добавить одно f.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Почему 0 - тождественная ф-я? Помоги развернуть inc - (+ n 1) в таком сочетании: ((zero inc) 0). В смысле переписывать по шагам, а потом редукция. У меня останетсаги скоро не останется марать.

cdshines ★★★★★
() автор топика

Непонятно, что есть zero

Кажется, вы не до конца понимаете, что такое математика. Вот вам не пофиг? Сказано, что это — ноль, так оно и есть.

Вот пример: есть на лоре некоторый эталонный тролль. Сопоставим ему число 0. Кроме того, известно, что для каждого тролля на лоре существует другой тролль, в два раза толще того, первого. Вот вам операция «+1».

Здесь все вообще элементарно. Число Черча — это функция, принимающая функцию f и возвращающая функцию y(x) = (f^:N)(x), где за (f^:N) обозначено N последовательных применений f. Соответственно

0 = \f -> [\x->x]
+1 = \n -> [\f -> [\x f((n f) x)]]

Вычислим, например, 0+1

0+1 = \f -> [\x -> f((0 f) x)] = \f -> [\x f ((\x->x) x)] = \f -> [\x->f(x)]

Вычислим 1+1

1+1 = \f -> [\x -> f((1 f) x)] = \f -> [\x f ((\x->f(x) x)] = \f -> [\x->f(f(x))]

buddhist ★★★★★
()
Ответ на: комментарий от cdshines

((zero inc) 0)

Зачем вы пытаетесь применить 0 к операции «+1» а потом еще и применить это к десятичному числу?

Почему 0 - тождественная ф-я?

Можете хоть так определить натуральные числа:

0 = \f -> [\x->sin x]
+1 = \n -> [\f -> [\x sin ((n f) x)]]
И назовите их числами cdshines. А id — самый простой комбинатор.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от cdshines

Почему 0 - тождественная ф-я?

Я неверно выразился. Не ноль — тождественная функция, а 0 f — тождественная функция, для любой f. Ну, напиши f (f (... f(x)...)), только f ни одного раза. Будет x.

((zero inc) 0)

В обозначениях со скобочками, получается ((zero inc) 0) = (((lambda (f) (lambda (x) x)) inc) 0) = ((lambda (x) x) 0) = 0.

Miguel ★★★★★
()
Ответ на: комментарий от buddhist

Я понял, что это ноль. Я не понял, как это работает в любых, примитивнейших комбинациях с другими сущностями. Теперь яснее, но запись такую мне еще надо осилить для беглого понимания. а ((zero inc) 0) работает. Попробуй сам. И вместо нуля другие числа. Miguel ниже написал, я наконец-то понял.

Спасибо вам всем:)

cdshines ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Ну демонстрация вроде как. Ноль-функция принимает аргументом функцию, выполняет ее 0 раз и в итоге инкрементация не происходит. Я так понял?

cdshines ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Ага, обычный. Я надеюсь, в сикпе немного таких задач будет - я хочу сберечь свою церебральную девственность для чего-то другого.

cdshines ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.