The Untyped
 Lambda-Calculus
     Types and Programming Languages
                                5 章
λ!
                             @rf0444
5.1
Basics
λ?


ラムダ計算 (lambda-calculus)

 関数定義 と 関数適用 だけ

 全て関数
Syntax

項 (term)

 t ::=

   x

   λx.t

   t t

           * x: 任意の変数、t: 任意の項
Syntax

項 (term)

 t ::=
                   変数
   x            (variable)
   λx.t

   t t

           * x: 任意の変数、t: 任意の項
Syntax

項 (term)

 t ::=

   x
                  ラムダ抽象
   λx.t         (abstraction)

   t t

           * x: 任意の変数、t: 任意の項
Syntax

項 (term)

 t ::=

   x

   λx.t            関数適用
                (application)
   t t

           * x: 任意の変数、t: 任意の項
Syntax
優先順位

 ラムダ抽象 - 右から

  例: λx.λy.t    =    λx.(λy.t)

 関数適用 - 左から

  例: λx.a b c       = λx.(a b) c
Scope


束縛変数 (bound variable)

 λx.t で t の中にある x のこと

 例: λx.x y での、x
Scope

自由変数 (free variable)

 項の中で、外側のラムダ抽象の変数部に現れな
 い変数のこと

 例: λx.x y での、y
Scope
閉項 (closed term)

 自由変数を含まない項のこと

 コンビネータ (combinator) ともいう

 例: λx.x

   恒等関数 (identity function)
Operational
      Semantics
関数適用

 (λx.a) b   !   [x!b]a

   a の中の x を b に置き換える

 例: (λx.x) y ! y
Operational
      Semantics
簡約基 (redex)

 (λx.a) b という形をした項のこと

β簡約 (beta-reduction)

 簡約基を、先のルールに従って書き換えること
Operational
      Semantics
簡約戦略

 full beta-reduction

 normal order strategy

 call-by-name strategy

 call-by-value strategy
Operational
       Semantics

full beta-reduction

  任意の簡約可能式を、任意のタイミングで簡
  約できる
Operational
       Semantics

normal order strategy

  最左最外簡約 (leftmost, outermost)

  左側、外側の項から順番に簡約していく
Operational
       Semantics
call-by-name strategy

  ラムダ抽象の中は簡約しない

  それ以外は normal order strategy

call-by-need strategy

  評価結果を保存して、再計算しない版
Operational
       Semantics

call-by-value strategy

  関数適用の前に、右側を先に簡約する

  それ以外は call-by-name strategy
Operational
       Semantics
call-by-value strategy

  正格 (strict)

    関数内で引数が使われなくでも、引数を評
    価する

    call-by-name/need は 遅延 (lazy)
5.2
Programming in the
 Lambda-Calculus
Multiple Arguments


2引数関数

 λ(a,b).t 的な

 λa.λb.t でできるよ!
Multiple Arguments
高階関数 (higher-order function)

 関数を引数に受け取ったり、関数を返したり
 する関数のこと

 例: λa.λb.t

   a をとって「b をとって t を返す関数」
   を返す関数
Multiple Arguments

カリー化 (currying)

 多引数の関数を、高階関数の形に変換するこ
 と

 例: λ(a,b).t   !   λa.λb.t
Church Booleans


tru = λt.λf.t



fls = λt.λf.f
Church Booleans


tru = λt.λf.t
                t: 真を表すもの


                f: 偽を表すもの
fls = λt.λf.f
Church Booleans

and = λb.λc.b c fls



or = λb.λc.b tru c

not = λb.b fls tru
Church Booleans

and = λb.λc.b c fls

                      b が真なら c
                      偽なら fls
or = λb.λc.b tru c

not = λb.b fls tru
Church Booleans

and = λb.λc.b c fls


                      b が真なら tru
or = λb.λc.b tru c
                        偽なら c
not = λb.b fls tru
Church Booleans

and = λb.λc.b c fls



or = λb.λc.b tru c

not = λb.b fls tru
                      b が真なら fls
                       偽なら tru
Church Booleans

例:

 and tru fls

     ! (λb.λc.b c fls) tru fls

     ! (λc.tru c fls) fls

     ! tru fls fls
Church Booleans
例:

 and tru fls

     ! tru fls fls

     ! (λt.λf.t) fls fls

     ! (λf.fls) fls

     ! fls
Pairs

pair = λf.λs.λb.b f s



fst = λp.p tru

snd = λp.p fls
Pairs

pair = λf.λs.λb.b f s



fst = λp.p tru          f が返る

snd = λp.p fls
                        s が返る
Pairs
例:

 fst (pair tru fls)

     ! fst ((λf.λs.λb.b f s) tru fls)

     ! fst ((λs.λb.b tru s) fls)

     ! fst (λb.b tru fls)

     ! (λp.p tru) (λb.b tru fls)
Pairs
例:

 fst (pair tru fls)

     ! (λp.p tru) (λb.b tru fls)

     ! (λb.b tru fls) tru

     ! tru tru fls

     ! (λt.λf.t) tru fls    !   tru
Church Numerals

c0 = λs.λz.z

c1 = λs.λz.s z

c2 = λs.λz.s (s z)

c3 = λs.λz.s (s (s z))

...
Church Numerals
                          z: 0 を表すもの
c0 = λs.λz.z

c1 = λs.λz.s z           s: 次を取得するもの

c2 = λs.λz.s (s z)

c3 = λs.λz.s (s (s z))

...
Church Numerals



scc = λn.λs.λz.s (n s z)
Church Numerals

              n の



scc = λn.λs.λz.s (n s z)


                次
Church Numerals


plus = λm.λn.λs.λz.m s (n s z)
Church Numerals
                          n から始めて


plus = λm.λn.λs.λz.m s (n s z)

                  m 個
                  次
Church Numerals


plus = λm.λn.λs.λz.m s (n s z)



plus = λm.λn.m scc n
Church Numerals


plus = λm.λn.λs.λz.m s (n s z)



plus = λm.λn.m scc n

           m 回         n から始めて

           scc
Church Numerals



times = λm.λn.m (plus n) c0
Church Numerals

                     0 から始めて



times = λm.λn.m (plus n) c0


               m 回
             n を足す
Church Numerals



iszro = λm.m (λx.fls) tru
Church Numerals

                   tru から始めて



iszro = λm.m (λx.fls) tru


             次は常に fls
Church Numerals


prd = λm.fst (m ss zz)

  ss = λp.pair (snd p) (scc (snd p))

  zz = pair c0 c0
Church Numerals


prd = λm.fst (m ss zz)

  ss = λp.pair (snd p) (scc (snd p))

  zz = pair c0 c0

  (0, 0) から始めて
Church Numerals


prd = λm.fst (m ss zz)

  ss = λp.pair (snd p) (scc (snd p))

  zz = pair c0 c0
                     (_, x) ! (x, x + 1)
  (0, 0) から始めて
Church Numerals
            m 回やると、
                         m = 0 の時は
            (m - 1, m)     (0, 0)


prd = λm.fst (m ss zz)

  ss = λp.pair (snd p) (scc (snd p))

  zz = pair c0 c0
                     (_, x) ! (x, x + 1)
  (0, 0) から始めて
Enriching the
        Calculus
λNB

  NB (3章) に λ を加える

  NB (Real) と λ (Church) は、

  両方とも boolean と numeral を

  持っている
Enriching the
      Calculus
Church ! Real

  realbool = λb.b true false

  realnat = λm.m (λx.succ x) 0

Real ! Church

  churchbool =

    λb.if b then tru else fls
Enriching the
     Calculus
振る舞い同値 (behaviorally equivalent)

 どんな引数に対しても、2つの評価結果が同じ

 例: call-by-value での scc c1

   (λs.λz.s ((λs’.λz’.s’ z’) s z))

   (λs.λz.s (s z)) と “振る舞い同値”
Recursion
正規形 (normal form)

 これ以上評価できない項のこと

発散 (diverge)

 正規形にならない項のこと

 例: (λx.x x) (λx.x x)   - omega
Recursion

不動点 (fixed-point)

 fix = λf.

   (λx.f (λy.x x y))

   (λx.f (λy.x x y))

              Z-combinator / call-by-value Y-combinator
             Y-combinator: λf.(λx.f (x x)) (λx.f (x x))
Recursion

不動点 (fixed-point)

 例: factorial = fix (λf.λn.

       (iszro n) c1

       (times n (f (prd n))))
Recursion

Real ! Church

  churchnat = fix (λf.λn.

    if iszero n then c0

    else scc (f (pred n))
5.3
Formalities
Syntax


項集合

 V を変数の可算集合とする

 項集合は、次を満たす最小の集合 T
Syntax

項集合 T

 x ∈ V ! x ∈ T

 t ∈ T かつ x ∈ V ! λx.t ∈ T

 s ∈ T かつ t ∈ T ! s t ∈ T
Syntax

自由変数集合

 項 t の自由変数集合 FV(t)

  FV(x) = {x}

  FV(λx.t) = FV(t) - {x}

  FV(s t) = FV(s) ∪ FV(t)
Substitution


α変換 (alpha-conversion)

 束縛変数の名前を変えること

 例: λy.x y   !   λw.x w
Substitution

置き換え

 [x!s]x = s

 [x!s]y = y

 [x!s](λy.t) = λy.[x!s]t

 [x!s](t u) = ([x!s]t) ([x!s]u)
Operational
          Semantics
Syntax

   項 (term)     値 (value)

    t ::=        v ::=

         x         λx.t

         λx.t

         t t
Operational
      Semantics
評価 (evaluation)        (call-by-value)

       t1 ! t1’
                            E-APP1
    t1 t2 ! t1’ t2


        t ! t’
                            E-APP2
      v t ! v t’


   (λx.t) v ! [x!v]t       E-APPABS

Tapl 5