flatlineの日記跡地

プロフィール

flappphys

flappphys

大学(院)生だった頃に書いていたweb日記です.

カレンダー
2004 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 |
2010 | 07 |

2008-05-03 (Sat)

[] Church Numeralsのベキ乗が分からない

pow = λm n. n m とか謎過ぎる... λm n. n (λl s. m (l s)) (λs z. s z) なら分かるんだけど.つまり times mone に対し n 回適用するの.

分からないので pow two three を手計算*1してみた:

Applicative:

three two = (λs z. s (s (s z))) (λs z. s (s z))
= λz. (λs w. s (s w)) ((λs w. s (s w)) ((λs w. s (s w)) z))
= λz. (λs w. s (s w)) ((λs w. s (s w)) (λw. z (z w)))
= λz. (λs w. s (s w)) (λw. (λx. z (z x)) ((λx. z (z x)) w))
= λz. (λs w. s (s w)) (λw. (λx. z (z x)) (z (z w)))
= λz. (λs w. s (s w)) (λw. z (z (z (z w))))
= λz w. (λx. z (z (z (z x)))) ((λx. z (z (z (z x)))) w)
= λz w. (λx. z (z (z (z x)))) (z (z (z (z w))))
= λz w. z (z (z (z (z (z (z (z w)))))))

WHNF:

three two = (λs z. s (s (s z))) (λs z. s (s z))
= λz. (λs w. s (s w)) ((λs w. s (s w)) ((λs w. s (s w)) z))

Normal:

three two = (λs z. s (s (s z))) (λs z. s (s z))
= λz. (λs w. s (s w)) ((λs w. s (s w)) ((λs w. s (s w)) z))
= λz w. ((λs x. s (s x)) ((λs x. s (s x)) z)) (((λs x. s (s x)) ((λs x. s (s x)) z)) w)
= λz w. (λx. ((λs y. s (s y)) z) (((λs y. s (s y)) z) x)) (((λs x. s (s x)) ((λs x. s (s x)) z)) w)
= λz w. ((λs y. s (s y)) z) (((λs y. s (s y)) z) (((λt u. t (t u)) ((λt u. t (t u)) z)) w))
= λz w. (λy. z (z y)) (((λs y. s (s y)) z) (((λt u. t (t u)) ((λt u. t (t u)) z)) w))
= λz w. z (z (((λs y. s (s y)) z) (((λt u. t (t u)) ((λt u. t (t u)) z)) w)))
= λz w. z (z ((λy. z (z y)) (((λt u. t (t u)) ((λt u. t (t u)) z)) w)))
= λz w. z (z (z (z (((λt u. t (t u)) ((λt u. t (t u)) z)) w))))
= λz w. z (z (z (z ((λu. ((λt v. t (t v)) z) (((λt v. t (t v)) z) u)) w))))
= λz w. z (z (z (z (((λt v. t (t v)) z) (((λt v. t (t v)) z) w)))))
= λz w. z (z (z (z ((λv. z (z v)) (((λt v. t (t v)) z) w)))))
= λz w. z (z (z (z (z (z (((λt v. t (t v)) z) w))))))
= λz w. z (z (z (z (z (z ((λv. z (z v)) w))))))
= λz w. z (z (z (z (z (z (z (z w)))))))

何ら直感的なものが見えてこないんですが.

*1:ここでサクッとevaluatorが書けない/書いたこともない辺りが私の限界を示している.

nucnuc 2008/05/03 16:39 |n| = ¥f -> ¥x -> f^n x
を . (関数結合)で表記すると
|n| = ¥f -> (f . f . f ... n times) で
|m| = ¥g -> (g . g . g ... m times) だから
|n| |m| h = (¥g -> (g . g . g ... m times) . ¥g -> (g . g . g ... m times) . ¥g -> (g . g . g ... m times) ... n times) h で、(x . y) z = x ( y z) にしたがって Haskell の $ (f$x = f x, 右結合) を 使うと
¥g -> (g . g . g ... m times) $ ¥g -> (g . g . g ... m times) $ ¥g -> (g . g . g ... m times) ... n times $ h
で . の結合則を使うと ¥h -> h . h . h ... m^n times になるよ。
これじゃあ直感的じゃないかな。

flappphysflappphys 2008/05/04 00:06 あー,関数合成で書くときれいですね.メタな記法は避けては通れないか.てかWHNFにした時点で一般化に必要な構造は見えていたんですね...

関係ないけど引数にSuccessorだのZeroだのを匂わせる名前を付けていたんだけど,それがずれてしまう(powの結果ではzがsuccessorを受け取る役になる)のがなんか気持ち悪い.まぁ高階関数だから仕方ないんですが.α変換すればいいとかde Bruijn記法なら気にもならないとか色々あるだろうけど...