2011-10-17 26 views
5

Tôi bắt đầu học phép tính lambda và tôi cần triển khai các tổ hợp I, S, K ở Erlang. Tất nhiên, S, K, tôi là viết tắt của:S combinator in Erlang

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

Tôi không có vấn đề tìm hiểu sự biến đổi I = SKK trên giấy (như trình bày ở đây: To prove SKK and II are beta equivalent, lambda calculus) nhưng có vẻ như tôi không hiểu nó khi nói sang các ngôn ngữ chức năng và chức năng đặt hàng cao ...

tôi quản lý để làm I và K (cho phép nói trong mô-đun test):

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

Ngoài ra tôi biết làm thế nào để chạy K x (K x) (SKK x = K x (K x))

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

Nhưng tôi không thể có được nó xung quanh để viết S combinator. Tôi cố gắng:

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

Nhưng vẫn còn, tôi không thể chuyển đổi SKK x vào x

tôi cố gắng chạy nó như thế này:

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

Bất kỳ trợ giúp sẽ được đánh giá cao, như Tôi hoàn toàn lạc mất.

+0

Thật vậy, vấn đề của bạn là hoàn toàn ký hiệu. Nếu bạn hiểu cách thức hoạt động của beta-reduction thì chắc chắn bạn hiểu ý tưởng đó. Phần còn lại chỉ là ký hiệu. –

Trả lời

6

Từ vỏ 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 

Hoặc như các chức năng trong một mô-đun:

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

ok, tôi vẫn có vẻ có một số vấn đề:/ Trong mô-đun của tôi, tôi có: i (X) -> X. k (X) -> vui vẻ (Y) -> X kết thúc. s (X) -> vui vẻ (Y) -> vui vẻ (Z) -> (X (Z)) (Y (Z)) end end. skk (X) -> ((s (k)) (k)) (X). Khi tôi chạy (tppr là tên mô-đun): 'tppr: skk (x) .' Tôi nhận được: ' ** lỗi ngoại lệ: hàm xấu k trong hàm tppr: '- s/1-fun-0 - '/ 3' Tôi đang thiếu gì? – Krodak

+0

Trong định nghĩa của bạn về skk (X) -> ((s (k)) (k)) (X) bạn đã viết chữ thường k - đây là nguyên tử 'k', không phải là hàm k/1. Nếu bạn thay vì viết skk (X) -> ((s (fun k/1)) (fun k/1)) (X), nó sẽ hoạt động. – RichardC

+0

Cảm ơn bạn, vâng, đó là trường hợp, khá ngớ ngẩn, tôi phải thừa nhận;) – Krodak

Các vấn đề liên quan