2011-10-17 4 views
5

Je commence à apprendre le lambda-calcul et j'ai besoin de mettre en œuvre des combinateurs I, S, K dans Erlang. Bien sûr, S, K, I signifie:S combinateur dans Erlang

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

Je n'ai pas mal à comprendre la transformation I = SKK sur le papier (comme présenté ici: To prove SKK and II are beta equivalent, lambda calculus), mais il semble que je ne comprends pas quand il vient aux langages fonctionnels et des fonctions d'ordre supérieur ...

je réussi à faire I et K (dans le module permet de dire test):

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

Je sais aussi comment exécuter K x (K x) (SKK x = K x (K x))

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

Mais je ne peux pas l'obtenir pour écrire S combinator. J'ai essayé:

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

Mais encore, je ne suis pas capable de transformer SKK x en x

je tente de l'exécuter comme ceci:

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

Toute aide serait appréciée, comme Je suis complètement perdu.

+0

En effet, votre problème est purement notationnelle. Si vous comprenez comment la réduction de la bêta fonctionne, vous comprendrez sûrement l'idée. Le reste n'est qu'une notation. –

Répondre

6

À partir du shell 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 

Ou comme fonctions dans un module:

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

ok, je semble encore avoir quelques problèmes:/ Dans mon module j'ai: je (X) -> X. k (X) -> amusant (Y) -> X fin. s (X) -> fun (Y) -> fun (Z) -> (X (Z)) (Y (Z)) l'extrémité. skk (X) -> ((s (k)) (k)) (X). Quand je lance (TPPR est le nom du module): 'TPPR: SKK (x) .' je reçois: ' ** erreur d'exception: mauvaise fonction k en fonction TPPR: '- s/1-fun-0 - '/ 3' Qu'est-ce qui me manque? – Krodak

+0

Dans votre définition de skk (X) -> ((s (k)) (k)) (X) vous avez écrit k minuscule - c'est l'atome 'k', pas la fonction k/1. Si vous écrivez plutôt skk (X) -> ((s (fun k/1)) (fun k/1)) (X), ça devrait marcher. – RichardC

+0

Merci, oui, c'était le cas, tout à fait stupide, je dois admettre;) – Krodak