ラムダ計算
手で計算するのは面倒だなと思ってRambdaクラス*1を作ったら200行超えた….
行列の掛け算と同じで,機械的に操作すること自体は中学生にでも出来ると思うんだけど,計算の意味がまるで理解できない.論理回路でand,or,notを組み合わせて加算器を作るとかそういう感じ?
しかし,以前と比べると普通にlambdaだのmap,eachの類を使うようになった.少しはタメになっているのかも.
i = Rambda.new("(λx. x)") k = Rambda.new("(λx. (λ y. x))") s = Rambda.new("(λx. (λ y. (λ z. ((x z)(y z)))))") skk = s.apply(k).apply(k) p skk.to_s #=> "λz. ((λv. (λw. v) z) (λx. (λy. x) z))" p skk == i #=> true p skk.simplify.rename.to_s #=> "λx. x" one = Rambda.new("λf x.f x") two = Rambda.new("λf x. f(f x)") three = Rambda.new("λf x.f(f(f x))") plus = Rambda.new("λa b f x. a f ( b f x)") plus_1 = plus.apply(one).simplify p plus_1.to_s #=> "λb y z. (y (b y z))" p plus_1.apply(two).simplify.rename.to_s #=> "λx y. (x (x (x y)))" plus_2_1 = plus.apply(two).apply(one) p plus_2_1.to_s #=> "λy z. (λu v. (u (u v)) y (λf x. (f x) y z))" p plus_2_1.simplify.to_s #=> "λy z. (y (y (y z)))"
renameがα変換.simplifyがβ簡約に当たるはず.
*1:もちろんLambdaではない