Функция Unlambda d - PullRequest
       6

Функция Unlambda d

2 голосов
/ 28 ноября 2010

Я думаю, мне нужно немного проработать, как работает функция D в unlambda. Прямо сейчас я пытаюсь создать функцию (факториал) с помощью комбинатора Y, но это всегда приводит к некоторому бесконечному циклу. Или segfault, в зависимости от переводчика. Я уверен, что D - это то, что я хочу использовать здесь. Я попробовал это:

``d```sii``sii`.xi

и у него был тот же бесконечный цикл. Кто-нибудь думает, что они могут помочь мне понять D в unlambda?

...

В unlambda нотации моя функция

```s``s``s`ks``s`kki``s``s`ks`ki`ki``s``s`ks``s`kki``s``s`ks`ki`ki``s`k`s``s``s``s``si`k`ki`k``s``si`k`ki`kk`k`ki`k`s`sk``s`k`s``s`ksk``s``s`ksk`k``s``si`k``s``s``s``si`ki`k`ki`k`ki`s``s`ksk`k`k`kk

Y= ``s``s``s`ks``s`kki``s``s`ks`ki`ki``s``s`ks``s`kki``s``s`ks`ki`ki

Factorial = Y(\xy.0y1(My(x(Sy))))

0 = ``s``s``si`k`ki`k``s``si`k`ki`kk`k`ki (Returns K if it's 0 in church numerals, Returns KI if it's something else.)

M = ``s`ksk (Prefix multiplier of church numerals)

S = ``s``si`k``s``s``s``si`ki`k`ki`k`ki`s``s`ksk`k`k`kk (Decrements a church integer)

Я почти уверен, что, если бы он оценивался нормально, сначала слева, он бы работал, но я не уверен.

Заранее спасибо.

1 Ответ

1 голос
/ 15 сентября 2011

Я действительно не понимаю, как d может помочь факторной функции, но иллюстрация того, что делает d, проста:

 `.1` .2i => 21
``.1`d.2i => 12

В первом случае оценивается .2до .1, на основании правила нетерпеливой оценки.
Во втором случае .2 пропускается через .1 «защищен», только для оценки извне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...