2011-10-17 13 views
5

Estoy empezando a aprender el cálculo lambda y necesito implementar los combinadores I, S, K en Erlang. Por supuesto, S, K, I significa:Combinador S en Erlang

S = λxyz.xz(yz) K = λxy.x I = λx.x

no tengo problemas para comprender la transformación I = SKK en papel (como se presenta aquí: To prove SKK and II are beta equivalent, lambda calculus) pero parece que no entiendo que cuando se trata de a los lenguajes funcionales y funciones de orden superior ...

que logró hacer I y K (que permite decir en el módulo test):

i(X) -> X. 
k(X) -> fun(Y) -> X end. 

también sé cómo ejecutar K x (K x) (SKK x = K x (K x))

kxk(X) -> (k(X))(k(X)). 

Pero no puedo entenderlo para escribir S combinator. Probé:

s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end. 

Pero aún así, no soy capaz de transformar SKK x en x

intento funcionar de esta manera:

skkx(X) -> s((k((k(X))))). 

se agradecería cualquier ayuda, como Estoy completamente perdido.

+0

De hecho, el problema es puramente de notación. Si entiendes cómo funciona la reducción beta, entonces seguramente entenderás la idea. El resto es solo notación. –

Respuesta

6

Desde el shell de Erlang:

1> I = fun (X) -> X end. 
#Fun<erl_eval.6.80247286> 
2> K = fun (X) -> fun (Y) -> X end end. 
#Fun<erl_eval.6.80247286> 
3> S = fun (X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end end. 
#Fun<erl_eval.6.80247286> 
4> ((S(K))(K))(42). 
42 

O como funciones en un módulo:

i(X) -> X. 
k(X) -> fun(Y) -> X end. 
s(X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end. 
+0

bien, todavía parece tener algunos problemas:/ En mi módulo tengo: i (X) -> X. k (X) -> diversión (Y) -> X fin. s (X) -> diversión (Y) -> diversión (Z) -> (X (Z)) (Y (Z)) extremo final. skk (X) -> ((s (k)) (k)) (X). Cuando corro (TPPR es el nombre del módulo): ' TPPR: SKK (x) .' me sale: ' ** error de excepción: la mala función de k en función TPPR: '- s/1-diversión-0 - '/ 3' ¿Qué me estoy perdiendo? – Krodak

+0

En su definición de skk (X) -> ((s (k)) (k)) (X) ha escrito minúsculas k - este es el átomo 'k', no la función k/1. Si, en cambio, escribe skk (X) -> ((s (diversión k/1)) (diversión k/1)) (X), debería funcionar. – RichardC

+0

Gracias, sí, ese fue el caso, bastante tonto, debo admitir;) – Krodak