2007年 11月 28日

Ruby1.9 のラムダさん 2 (SKI とチャーチ数 256)

#!ruby1.9 -v

s = -> x {-> y {-> z { x.(z).(y.(z)) } } }
k = -> x {-> y { x } }
i = -> x { x }

t = k
f = s.(k)

car = -> list { list.(t) }
cdr = -> list { list.(f) }

car = s.(i).(k.(t))
cdr = s.(i).(k.(f))

# ((lambda (n) (n n)) ((lambda (n) (n n)) (lambda (f x) (f (f x)))))
cn256 = -> n { n.(n) }.(-> n { n.(n) }.(-> f {-> x { f.(f.(x))}}))
# SII(SII(S(S(KS)K)I))
cn256 = s.(i).(i).(s.(i).(i).(s.(s.(k.(s)).(k)).(i)))

inputlist = -> list {
	-> f { f.(list.first || cn256).(inputlist.(list.drop(1))) }
}


cn2num = -> cn { cn.(-> x { x + 1 }).(0) }
num2cn = ->  n { -> f {-> x { (1..n).reduce(x) {|r,_| f.(r) } } } }

il = inputlist.([72, 101, 108, 108, 111].map(&num2cn))
p cn2num.(cn256)
p cn2num.(car.(il))
p cn2num.(car.(cdr.(il)))

Ruby のコードに見えないすぎるw