2011-10-17 12 views
5

Zaczynam się uczyć rachunku lambda i muszę wdrożyć kombinatory I, S, K w Erlang. Oczywiście, S, K, I oznacza:S kombinator w Erlang

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

nie mam problemu ze zrozumieniem transformacji I = SKK na papierze (jak przedstawiony tutaj: To prove SKK and II are beta equivalent, lambda calculus), ale wydaje się, że nie rozumiem, jeśli chodzi języków funkcyjnych i funkcji high-order ...

udało mi się zrobić, i i K (powiedzmy w module test):

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

także wiem jak uruchomić K x (K x) (SKK x = K x (K x))

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

Ale nie mogę tego zrobić, żeby napisać kombinator S. Próbowałem:

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

Ale nadal nie jestem w stanie przekształcić SKK X do X

próbuję uruchomić go tak:

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

Każda pomoc będzie mile widziane, jak Jestem całkowicie zagubiony.

+0

Rzeczywiście, problem jest czysto Oznaczenia. Jeśli rozumiesz, jak działa beta-redukcja, to z pewnością rozumiesz ten pomysł. Reszta to po prostu notacja. –

Odpowiedz

6

z powłoki 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 

Albo jako funkcje w module:

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

ok, wciąż mam pewne problemy:/ W moim module mam: i (X) -> X. k (X) -> zabawa (Y) -> X koniec. s (X) -> zabawa (Y) -> zabawa (Z) -> (X (Z)) (Y (Z)) koniec. skk (X) -> ((s (k)) (k)) (X). Kiedy biegnę (tppr jest nazwa modułu): 'tppr: SKK (x) .' uzyskać: ' ** błąd wyjątek: złe funkcja k w funkcji tppr: "- s/1-fun-0 - '/ 3' Czego mi brakuje? – Krodak

+0

W swojej definicji skk (X) -> ((s (k)) (k)) (X) wpisałeś małą literę k - jest to atom "k", a nie funkcja k/1. Jeśli zamiast tego napiszesz skk (X) -> ((s (fun k/1)) (fun k/1)) (X), to powinno działać. – RichardC

+0

Dziękuję, tak, tak było, całkiem głupio, muszę przyznać;) – Krodak