2010-08-10 [長年日記]
λ. ICFPC2010のゲートの関数を他のソルバで求める
今年の The ICFP Programming Contest 2010 に参加したとき には、ゲートの関数を求めるのに Alloy Analyzer を使った。 Alloy を使った本質的な理由はあまりなくて、たまたま使い慣れていていたことで、解を列挙する機能があったことが大きい。 なので、正直どのソルバーを使っても似たようなものだろうと思っていた。
そこで、どうせなので他のソルバーでも試してみることに。 まず、SMTソルバーのYices(1.0.28)とCVC3(2010-07-11)に以下をそれぞれ食わせてみたところ……結果はいずれもunknownだった。 関係・関数も量化も有限領域上に対してしか使っていないので、最悪でも全部を基礎化(grounding)して、bit blasting すれば解けるはずなのに……これはかなりガッカリ。
(追加するかも)
2010-08-14 [長年日記]
λ. Real World Haskell読書会 2010-08
私は前回おやすみしてしまったので久しぶり。 今回は14章「モナド」のあたり。
(>>=)
は左結合なんだ、知らなかった。
というか、考えて見れば引数の型が違うので、m >>= f >>= g
は (m >>= f) >>= g
でなくてはならなくて、m >>= (f >>= g)
としたら型が合わなくなってしまうので、当たり前といえば当たり前。
でも、(>>)
も左結合なので、Nothing >> m1 >> m2
は Nothing >> (m1 >> m2)
ではなく、(Nothing >> m1) >> m2
と解釈される。そのため、この場合 m1
, m2
は評価されないけど、二つの (>>)
は短絡されずに評価されてしまう。
まあ、こんな明らかな場合には最適化できてしまうと思うけれど。
MonadがFunctorのサブクラスでなくなったのがいつかという話になったが、Haskell 1.3 report で型構築クラスが導入されMonadクラスも導入されたときには、すでに今の形だったようだ。 ということは、MonadがFunctorのサブクラスであったことがあるのはGoferの方だけであって、HaskellではMonadがFunctorのサブクラスであったことはないのか。