FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

11.13
Tue
つづき

掛け算です

掛け算ってようするに足し算で表現できそうですよね

例えば、

2*4

2がよっつということで2+2+2+2ですよね。

ってことでさっき定義したPLUSがつかえそうです。

つまり

(PLUS 2 (PLUS 2 (PLUS 2 (PLUS 2 0))))

です。

別の書き方なら

PLUS(2 , PLUS(2 , PLUS(2 , PLUS(2 , 0))))

です

なんでこんなキモイ使い方するのかというと今+(プラス)が作りたいのであって

PLUS(2,2) + PLUS(2,2)

みたいのはだめなんですよね.プラス演算子は使いたくない

そしたらあとは、上記のようにPLUS関数が入れ子になるようにラムダ式をいじってみればいいわけですね

そう考えると、そもそもチャーチ数は関数を何回適用するかで数を表現するので

PLUS関数をそのまま渡してやれば入れ子になってくれますよね。

ただPLUSは足し算する関数なので値を2つとりますよね

なのでここは関数の部分適用みたいな感じなんだと思います

つまり、上記の例ではかけられる数2が連続してますから

こいつをもうPLUSに渡してしまい部分適用してしまうみたいな感じです

ということで掛け算は

MULT := λn.λm.(m (PLUS n) 0)

になると思います

あと、自分が理解できた範囲のλ計算をPythonでちょこっと書いてみました

関数の呼び出しが奇妙なかんじがしますけど、λで考えると納得できますね

関数名が日本語なのはもう、ちょっとあれですけど...w


#!/usr/bin/env python
#coding:utf-8

import functools as ft


ZERO = (lambda f: (lambda x: x))
TRUE = (lambda x,y: x)
FALSE = (lambda x,y:y)


#特別!!
def toint(chn):
    return chn((lambda x: x+1))(0)

#これも特別
def tobool(chb):
    return chb(True , False)

#上の2つの関数でラムダ式の数とかboolをぱいそんのに変換


def succ(chn):
   return (lambda f: (lambda x: chn(f)(f(x))))

def plus(n , m):
    return (lambda f: (lambda x: n(f)(m(f)(x))))
    
def mult(n , m):
    tmp = ft.partial(plus , n)
    return m(tmp)(ZERO)

def katu(p , q):
    return p( q(TRUE , FALSE) , FALSE) 

def mataha(p , q):
    return p(TRUE , q(TRUE , FALSE))

def hitei(p):
    return p(FALSE , TRUE)

def moshi(p , body , els):
    return p(body , els) 

def main():
    print toint(ZERO)
    print toint(succ(succ(succ(succ(succ(ZERO))))))
    print toint(plus(succ(ZERO) , (lambda f:(lambda x: f(f(f(f(f(f(f(x)))))))))))
    print toint(mult(succ(succ(ZERO)) , plus(succ(ZERO) , (lambda f:(lambda x:f(f(x)))))))
    print tobool(katu(TRUE , TRUE))
    print toint(moshi(TRUE , succ(ZERO) , ZERO))


if __name__ == "__main__" : main()



λ計算でなんでもできちゃいそう!!すごい!!!
スポンサーサイト

comment 0 trackback 1
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/149-df2bb3f7
トラックバック
つづき 掛け算です 掛け算ってようするに足し算で表現できそうですよね 例えば、 2*4 2がよっつとい
まとめ【λ計算続き】 | まっとめBLOG速報 | 2012.11.19 00:23
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。