2010-11-28 21 views
2

Je pense que j'ai besoin de précisions sur la façon dont la fonction D fonctionne dans unlambda. En ce moment j'essaie de faire une fonction (factorielle) avec le combinateur Y, mais il en résulte toujours une sorte de boucle infinie. Ou segfault, en fonction de l'interprète. Je suis sûr que D est ce que je veux utiliser ici. J'ai essayé ceci:unlambda d fonction

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

et il avait la même boucle infinie. Est-ce que quelqu'un pense qu'ils pourraient m'aider à comprendre D in unlambda?

...

Dans la notation unlambda, ma fonction est

```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) 

Je suis sûr que si elle était évalué normalement, à la gauche d'abord, cela fonctionnerait, mais je suis pas certain.

Merci d'avance.

+2

Il est comme si cette langue a été spécialement conçu pour jouer avec Markdown ... – MPelletier

Répondre

1

Je ne vois pas vraiment comment d pourrait aider la fonction factoriel, mais une illustration de ce que d fait est facile:

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

Dans le premier cas, .2 est évaluée avant .1, en raison de la règle d'évaluation enthousiaste.
Dans le second cas, .2 est passé à travers .1 « protégée », ne doit être évaluée à partir de l'extérieur.