プログラムの数理

takoがレポートについてがんばっている記録。

harajuneの覚書

特定の人たちへ。

証明の仕方:

正直よくわかんないけど縮約(reduction)した結果が等しいよねってことを言えばいい気がする。 たぶん。

421

以下のように定義すると後の説明が楽な気がします。

absint :: VInt -> Int
absint xs = mulplus nall xs
         where mulplus :: Int -> VInt -> Int
               mulplus n xs | n < 0 = 0
                             | otherwise =  b^n * head(xs) + (mulplus (n-1)  (tail xs))
               nall = length(xs) - 1

説明としてはこんな感じ。縮約できるから~

absint([0] ++ xs) = mulplus (nall+1) ([0] ++ xs)
                   = mulplus nall (xs)
                   = absint xs

423

これもたぶん関数の定義使って変形すればOK

negate xs = norm・map neg xs
          = norm [-x0, -x1, -x2, .... , -xn]
vsub [0] xs = norm (zipwith (-) (align [0], xs))
            = norm (zipwith (-) [0,0,0,0,....,0] xs)
            = norm [-x0, -x1, ....., -xn]

425の意味

digitは文字列から数字のリストを与えます。

"12345"→['1', '2','3','4','5']→(たぶんここがmapの意味)→[1,2,3,4,5]

後はpackでb進数に直します。VIntは[Int]という定義なのでb=2なら

[1,2,3,4,5]→[1,1,0,0,0,0,0,0,1,1,1,0,0,1]

427

たぶん可能?

vmul xs ys = foldl (+) [] (psums xs ys)
           = ((...( [] (+) ps1) (+) ps2 (+)...) (+) psn)
           = ((....( vadd []++[0] ps1) (+) ps2 ....) (+) psn)
           = (((....(ps1 (+) ps2 ) (+) ps3) .....) (+) psn)
           = foldl1 (+) (psums xs ys)

428の後半

flipとreverseを使えばできます。演算子を全て入れ替えればなんでもできます。

知らんかった・・・・つまりこういうことか

vmuls xs ys = foldr1 (flip (+)) (reverse psums xs ys)

normがバグバグです。 先生に日本語が通じません。 先生、normがまだバグバグです。

foldl1とfoldlの違い

知ってる人にはあたりまえなんだろうけど、一応
foldlは最初に二項演算子と「種」とリストを受け取ります
foldl1には種はありません。リストに対してそのまま演算を行ないます。 つまり、

\mathrm{foldl}\ (\oplus)\ a\ [x_1,x_2,x_3] = ((a \oplus x_1) \oplus x_2) \oplus x_3
\mathrm{foldl1}\ (\oplus)\ [x_1,x_2,x_3] = (x_1 \oplus x_2) \oplus x_3

型で書くと、

\mathrm{foldl}\ ::\ (\beta -> \alpha -> \beta) -> \beta -> [\alpha] -> \beta
\mathrm{foldl1}\ ::\ (\alpha -> \alpha -> \alpha) -> [\alpha] -> \alpha

ただ一つの型変数しかでてこない。

yambiがレポートについてがんばっている記録


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS