不動点コンビネータって何ぞ #TechLunch

不動点コンビネータって何ぞ #TechLunch

2012/02/15(水) @ Livesense TechLunch
発表者:春日 太志

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.

April 23, 2014
Tweet

Transcript

  1. @bar_̲row  2012年年02⽉月15⽇日 不不動点コンビネータ って何ぞ? Livesense  Inc. 1

  2. ⽬目次 Livesense  Inc. 2 1.  解説ブログ記事の紹介 2.  呼び⽅方⼀一覧 3.  不不動点とは

    4.  不不動点コンビネータとは 5.  Y-‐‑‒Combinator  とは 6.  Y-‐‑‒Combinator  を  Common  Lisp  で
  3. 1-‐‑‒1.  解説ブログ記事の紹介 Livesense  Inc. 3 Y  コンビネータって何?  -‐‑‒IT戦記-‐‑‒ id:amachang http://d.hatena.ne.jp/amachang/20080124/1201199469

    TuringとChurchの狭間で  -‐‑‒404  Blog  Not  Found-‐‑‒ @dankogai http://blog.livedoor.jp/dankogai/archives/50458503.html
  4. 1-‐‑‒2.  解説ブログの紹介 Livesense  Inc. 4 ラムダ計算とチューリングマシンの違い  –きしだのはてな-‐‑‒ id:nowokay http://d.hatena.ne.jp/nowokay/20090413

  5. 2.  呼び⽅方⼀一覧 Livesense  Inc. 5 ・不不動点コンビネータ ・不不動点結合⼦子(fixed  point  combinator) ・不不動点演算⼦子(fixed

     point  operator) ・パラドキシカル結合⼦子(paradoxical  combinator)
  6. 3.  不不動点とは Livesense  Inc. 6 0と1は  f(x)  =  x^2  の不不動点

    f(x)  =  x  を満たす  x ⼀一階関数の不不動点は第⼀一級値 first-‐‑‒order  function first-‐‑‒class  value ⾼高階関数の不不動点は関数
  7. 4.  不不動点コンビネータとは Livesense  Inc. 7 関数の不不動点を求める⾼高階関数 任意の関数fの不不動点pを返す関数g p = g(f)

    f(p) = p f(g(f)) = g(f)
  8. 5-‐‑‒1.  Y-‐‑‒Combinator  とは Livesense  Inc. 8 型なしラムダ計算の不不動点コンビネータの⼀一つ Haskell  Brooks  Curry

    1900/09/12  –  1982/09/01 Y  Combinator  LLC ある関数を与えるとそれを再帰する関数を返す関数
  9. 5-‐‑‒2.  Y-‐‑‒Combinator  とは Livesense  Inc. 9 Y g = (λf.(λx.f(x

    x))(λx.f(x x))) g = (λx.g(x x))(λx.g(x x)) = (λy.g(y y))(λx.g(x x)) = g((λx.g(x x))(λx.g(x x))) = g(Y g) Y = λf.(λx.f(x x))(λx.f(x x))
  10. 6-‐‑‒1.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 10 //

    ֊৐Λฦ͢ Javascript ؔ਺ྫʢ෭࡞༻͋Γʣ var hoge = function (n) { return (n == 1) ? 1 : n * arguments.callee(n - 1); }; hoge(3); // => 6 var fuga = function f(n) { return (n == 1) ? 1 : n * f(n - 1); }; fuga(3); // => 6
  11. 6-‐‑‒2.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 11 //

    Javascript Ͱ࣮૷ͨ͠ Y Combinator var Y = function (f) { return (function (g) { return function (m) { return f(g(g))(m); }; })(function (g) { return function (m) { return f(g(g))(m); }; }); };
  12. 6-‐‑‒3.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 12 //

    ֊৐ܭࢉͰ Y Combinator Λ࢖͏ Y(function (fact) { return function (n) { return (n == 1) ? 1 : n * fact(n - 1); }; })(3); // => 6 // Y-Combinator ؔ਺ΛҾ਺Ͱ౉ͤΔΑ͏ʹϥοϓ͢Ε͹ɺ // ແ໊ؔ਺͚ͩͰಈ͘͜ͱʹͳΓ·͢ɻ
  13. 6-‐‑‒4.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 13 ;

    ֊৐Λฦ͢ (defun fact (n) (if (= n 1) 1 (* n (fact (- n 1))))) これを無名再帰まで持っていく...
  14. 6-‐‑‒5.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 14 ;

    ֊৐Λฦ͢ (funcall ((lambda (f) ((lambda (g) (lambda (m) (funcall (funcall f (funcall g g)) m))) (lambda (g) (lambda (m) (funcall (funcall f (funcall g g)) m))))) (lambda (fact) (lambda (n) (if (= n 1) 1 (* n (funcall fact (- n 1))))))) 3)