реализация церковных цифр и функции преемника - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь реализовать церковные цифры с помощью javascript (я довольно новичок в лямбда-исчислении и функциональном программировании в js)
это мой код для определения C0 (C0 = λs.λz.z):

c0 = s => z => z

и это для C1 (C1 = λs.λz.sz):

c1 = s => z => s(z)

и для функции-преемника (succ = λn.λs.λz.s (nsz))):

n => s => z => s(n(s)(z))

однако при применении к этой функции C0 и C1 происходит один и тот же результат (и оба неверны):

succ(c1)
-> s => z => s(n(s)(z))
succ(c0)
-> s => z => s(n(s)(z))

что я делаю не так?

1 Ответ

0 голосов
/ 29 ноября 2018

Ваши церковные цифры кодируются лямбдами.Чтобы увидеть их эффект, вы должны предоставить функцию и вход.inc и 0 используются ниже.В противном случае церковная цифра является не оцененной функцией.В JavaScript, когда вы console.log функция, исходный код функции печатается.

const succ =
  n => s => z => s(n(s)(z))

const inc = x =>
  x + 1

const c0 =
  s => z => z

const c1 =
  succ (c0)
  
const c2 =
  succ (c1)

console .log
  ( c0 (inc) (0)        // 0
  , c1 (inc) (0)        // 1
  , c2 (inc) (0)        // 2
  , succ (c2) (inc) (0) // 3
  )

Выше c2 равно succ(succ(c0)), что является церковной цифрой 2. Применение нашей церковной цифры к функции inc и входному значению 0, функция вызывается два (2) раза.c2 (inc) (0) дает тот же результат, что и inc(inc(0))

...