2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

数理論理学(数学基礎論) その14

7 :132人目の素数さん:2019/03/24(日) 21:34:57.51 ID:FOTRZJL+.net
>>5
> Yコンビネータ
・・・
> Y = (λf . (λx . f (x x)) (λx . f (x x)))
> 評価戦略が名前渡しの場合はこのまま使える。 ・・・

これは間違い。評価戦略が名前渡しであっても Y は使えない。それを示すために
君が書き下してくれたY gの式変形をどちら向きにも進める変換 “=” による等式でなく
簡約 “→” による評価として→で向き付けられた形に書き直してみよう。

(“≡” は構文的に同一の項であることを示す。なお、「α変換」は
束縛変数に対する名前の付け替えというメタ言語的な操作なので
ここではα変換の前後は構文的に同一の項として扱い“≡”で示した)

  Y g
≡ (λf . (λx . f (x x)) (λx . f (x x))) g (Yの定義より)
→ (λx . g (x x)) (λx . g (x x)) (λfのβ簡約、主関数をgに適用)
≡ (λy . g (y y)) (λx . g (x x)) (α変換、束縛変数の名前を変える)
→ g ((λx . g (x x)) (λx . g (x x))) (λyのβ簡約、左の関数を右の関数に適用)
← g (Y g) (第2式より)

最後のステップが逆向きの簡約 “←” であることに注意。
このステップは絶対に本来の簡約 “→” の向きには書き直せないので
Y コンビネータは名前呼びでも使えないことが分かる。

名前呼びの簡約戦略の場合に正しく動く不動点コンビネータで最も有名な例は
Turing のΘコンビネータで、λ項として書き下すと以下のようになる:

Θ ≡ (λx y, y(x x y))(λx y, y(x x y))

最後に、これを用いた Θg という項が簡約によって確かに g(Θg) になることを確かめておく:

  Θ g
≡ ((λx y, y(x x y))(λx y, y(x x y))) g
≡ ((λz w, w(z z w))(λx y, y(x x y))) g ・・・・・・・・・・・・ α変換
→ (λw. w((λx y, y(x x y))(λx y, y(x x y)) w)) g ・・・  β簡約
≡ (λw. w(Θ w)) g ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Θの定義で置き換え
→ g(Θ g)

なお、値呼びの簡約戦略で正しく動く不動点コンビネータも勿論ある。
具体的な定義は、例えば次にある:
Daniel P. Friedman & Matthias Felleisen “The Little Schemer” 4th ed., p. 172 (The MIT Press, 1996).

総レス数 604
177 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver.24052200