トップ «前の日(04-28) 最新 次の日(04-30)» 追記

日々の流転


2002-04-29 昭和節

λ. メディア・センタで連休中に読む本を借りようかと学校に行ったら、メディア・センタが閉ってた。

λ. ソース読み会

ゴールデンウィーク特別イベント。NetBSDのUSBドライバを読んだ……のだけど付いてけなかった…… → 加藤さんによるまとめ

ところで、grepとlessでソースを読むというのは初めて聞いたよ。

それから、とーやまさんが頭を剃っててビックリした。

Tags: tom

λ. Haskellのパターンマッチと単一化 (ゆ〜あいの日記 4/17)

「1が((+) x 1)に単一化できるとするとx=0になるはずですね。これは(+)の逆関数が必要になりますが、処理系が逆関数を生成するは困難ですね。」とあるけど、制約論理プログラミングについて調べてみると良いと思う。

Tags: haskell

λ. ヘルシング TV版

をビデオで見た。ひっじょーに素晴らしいね、アンデルセンの扱いを除けば。つうか、こんなの作ってアンデルセン・ファンに殺されたりしないのでしょうか?

λ. :=<

「:>=」はオッケーなのに「:=<」はパースエラーになるのか。

Tags: ruby

λ. 圏論&オントロジー

昨日、「圏論 オントロジー」というキーワードで検索されてるけど、圏論とオントロジーって何か関係あるんでしょうか?

Tags: 検索
本日のツッコミ(全2件) [ツッコミを入れる]

ψ あおき [それなら「:<=」でないと公平な比較にならないと思はれ。]

ψ さかい [おぉー、あおきさんだぁ。 確かにそうですね。 ついPrologの感覚で書いてしまったのだ。(^^;]


2004-04-29

λ. ゲロゲロ。無様な醜態を晒してしまった。

λ. kbmj の人とお会いして色々と話を聞いてくる。悩む。それから、ご馳走様でした。

λ. Froogle

メモ。

λ. 東方永夜抄体験版スペルカード

Lunaticの残り4枚がなかなか回収できない。「高天原」以外は取れそうで取れないのが悔しい。ちなみに、「高天原」に至ってはまだ見たことすらなかったり。あぅー

  • 隠蟲「永夜蟄居」
  • 夜雀「真夜中のコーラスマスター」
  • 野符「GHQクライシス」
  • 未来「高天原」
Tags: 東方

λ. テレビ

めずらしくWWEなど見てみる。

λ. SISTER OF SCARLET

東方紅魔郷ExtraのFlash。完成版。

Tags: 東方

λ. Workshop "Types for Verification"

例によって池上さんに紹介してもらったワークショップ。内容にはかなり興味があるのだけど、諸事情により行くかどうか悩み中。


2005-04-29

λ. 第三次国共合作?

台湾の国民党と中国共産党が接近していることが某所で「第三次国共合作」と書かかれていた。面白い。

Tags: 時事

λ. GCC 4.0.0リリース

いつの間にか出てた。すっかり見落とすところだった。

λ. ソードフィッシュ

を視た。技術的なとこはノーコメント。終わり方はなんとも言えないが、安っぽい結末でなくて良かったと思う。

Tags: 映画

2006-04-29 昭和節

λ. javascriptでRDFをパース

やっぱし、やっている人はいるもんだな。 何かに使えそうな気がするのでメモ。

Tags: javascript

λ. (forall x. ((x->r)->r)->x) -> Either a (a->r)

今日ちょっと混乱したことを元にクイズにしてみた。多分その手の人にはピンとくる問題。表記はHaskellのものを使ったが、実際には多相ラムダ計算の問題と考えていい。

問題

  1. 「(forall x. ((x->r)->r)->x) -> Either a (a->r)」という型を持つ関数を定義せよ。(ただし⊥が途中で現れたりする定義は禁止)
  2. この関数は何を表しているのだろうか?

解答編

問題の関数はこんな感じで定義できる。

notNotEM :: ((Either a (a->r)) -> r) -> r
notNotEM k = k (Right (\a -> k (Left a)))

dn2EM :: (forall x. ((x->r)->r)->x) -> Either a (a->r)
dn2EM dn = dn notNotEM

で、これが表しているのは何かだが……二重否定除去規則から排中律(The Law of excluded middle)を導く証明の計算的な表現だったりする。型はちょっと一般化してあるので、以下のようにより具体的な型にすると分かり易いかも*1

data Absurd
type Not p = p -> Absurd
type Or = Either

notNotEM :: Not (Not (p `Or` Not p))  
dn2EM :: (forall x. Not (Not x) -> x) -> p `Or` Not p

で、面倒なので詳しい説明は省略するが、例えばNK(自然演繹の体系NJに二重否定除去規則を追加した体系)で排中律を証明すると、この関数の構造を反映した証明図が得られる*2

[1: P]
------------- (∨I左)
  P ∨ ¬P              [2: ¬(P ∨ ¬P)]
------------------------------------------- (¬E)
  ⊥
------------- (¬I{1})
  ¬P
------------- (∨I右)
  P ∨ ¬ P             [2: ¬(P ∨ ¬P)]
------------------------------------------- (¬E)
  ⊥
------------------ (¬I{2})
  ¬¬(P ∨ ¬P)
------------------ (¬¬E)
  P ∨ ¬P

他の体系での証明は誰かにまかせた。あろはさんはこの証明をCoqで表現してみると良い勉強になるかも。ついでに古典論理のうさんくささをもっと感じられるかもw

余談

ちなみに、色々と細かいことを抜きにすれば、否定は継続に対応し、二重否定除去規則に対応するものはcall/ccで実現できる。Haskellにはそれらは存在しないので多少回りくどい表現になっているが、一級継続とcall/ccが存在する言語では直接それらを使って排中律に相当するものを表現することが出来る。例えばSchemeだと以下のような感じだろうか*3

(define (left x)  (list #t x))
(define (right x) (list #f x))

(call-with-current-continuation
  (lambda (k) (k (right (lambda (a) (k (left a)))))))

しかし、それにしても奇妙な定義と振る舞いである。これに関係して、Philip Wadler, Call-by-value is dual to call-by-name. Proc. ICFP 2003, pp. 189-201. <URL:http://homepages.inf.ed.ac.uk/wadler/topics/dual.html> に載っていたお伽噺が面白かったので、引用する。

Once upon a time, the devil approached a man and made an offer: “Either (a) I will give you one billion dollars, or (b) I will grant you any wish if you pay me one billion dollars. Of course, I get to choose whether I offer (a) or (b).”

The man was wary. Did he need to sign over his soul? No, said the devil, all the man need do is accept the offer.

The man pondered. If he was offered (b) it was unlikely that he would ever be able to buy the wish, but what was the harm in having the opportunity available?

“I accept,” said the man at last. “Do I get (a) or (b)?”

The devil paused. “I choose (b).”

The man was disappointed but not surprised. That was that, he thought. But the offer gnawed at him. Imagine what he could do with his wish! Many years passed, and the man began to accumulate money. To get the money he sometimes did bad things, and dimly he realized that this must be what the devil had in mind. Eventually he had his billion dollars, and the devil appeared again.

“Here is a billion dollars,” said the man, handing over a valise containing the money. “Grant me my wish!”

The devil took possession of the valise. Then he said,“Oh, did I say (b) before? I’m so sorry. I meant (a). It is my great pleasure to give you one billion dollars.” And the devil handed back to the man the same valise that the man had just handed to him.

関連リンク

*1 データ構築子を持たない型はGHCの拡張機能なので注意。拡張機能を使わない場合は「newtype Absurd = Absurd Absurd」とすればいい。

*2 ちなみに、一番上の仮定が左により過ぎているのはRD形式の制約ゆえ。何とかする方法はないものか。

*3 Schemeで値にタグを付けたいときはどうするのが良いんだろう? Schemeエキスパートのアドバイスを請う

本日のツッコミ(全5件) [ツッコミを入れる]

ψ mput [さっぱりわからないので、そろそろ答えを発表していただけるとうれしいです。。。]

ψ さかい [りょーかい。じゃ発表します。]

ψ mput [同僚というか先輩が以下のを発見したのですが。 (ここインデント大丈夫かな) f xrrx = case (f xrr..]

ψ koyama41 [はじめまして、mputさんの同僚(or先輩?)です。 くだんの回答は、 「型理論も証明の世界もなーんも知らん人間」が..]

ψ さかい [koyama41さん、はじめまして。 この定義だとfの再帰呼び出しが停止せず⊥になる点がまずいです。ただ、期待した答..]


2007-04-29 昭和の日

λ. Messenger が落ちる

最近、Windows Live Messenger が頻繁に落ちる。 メインウィンドウで表示されているFlashが原因のようで、Flashプラグインの内部で落ちているようだが……困った。


2008-04-29 昭和の日

λ. ACミラングッズ プレゼントキャンペーン

住信SBIネット銀行が「ACミラングッズ プレゼントキャンペーン」なるものをやっていたので、定期で5万円預けてみた。

λ. 黄泉比良坂(よもつひらさか)の岩戸

ディスコミュニケーションの第9話「まなつのよるのゆめ」に「千年ぶりに黄泉への岩戸が開く瞬間を……」というセリフがあったのだけど、古事記の舞台は千年前よりもずっと昔の話だし、ここで千年前に岩戸が開いたと言っているのは何を指しているのだろう?

ディスコミュニケーション (2) (アフタヌーンKC (1032))(植芝 理一)

Tags:

λ. A Bisimulation for Type Abstraction and Recursion by Eijiro Sumii and Benjamin C. Pierce

住井さんが第7回船井情報科学奨励賞という賞を受賞した*1とのことで、よい機会なので、記事で関連論文としてあがっていた A Bisimulation for Type Abstraction and Recursion のPOP2006のときのスライドを眺めてみる。 以前に少し伺ったこともあったけど、これは想像以上に面白そう。

*1 おめでとうございます

本日のツッコミ(全2件) [ツッコミを入れる]

ψ wisteria [「千年」にはとても長い時間という意味があるので、あんまり時代は関係ないんじゃないだろうかとか思った。]

ψ さかい [んー、別の人にも指摘されたのだけど、やっぱし? ひょっとして何か私の知らない伝承とかがあるのかと気になったけど、そう..]


2010-04-29

λ. 第4回FormalMethods勉強会

に途中から参加。

ken.coba さんの Alloy の話。

komagatime さんによる CEGAR の話。

tmiyaさんによる Certified Programming with Dependent Types の解説。

関連

Tags: Alloy coq

2012-04-29

λ. MPSファイルのフォーマットは酷すぎる

線形計画(LP)や混合整数計画(MIP)の問題の記述に標準的に使われているMPSというファイル形式があるのだけど、そのフォーマットが酷すぎて呆れた話。

経緯

MIPLIB2010の簡単な問題ということで、enlight13 を色々なソルバに食わせて遊んでいたら、GurobiとSCIPは解を見つけるのに、自作ソルバは解がないと言ってきて、どんなバグを埋め込んでしまったかとかなり焦った。 焦ってしばらくバグ探しをした後に、ふとGLPKでも解いてみると、GLPKも解がないと言ってくる。それで、自作ソルバに食わせるためにGLPKでファイルをMPSファイルからLPファイルに変換していたのを思い出し、GLPKのMPSファイルの解釈がGurobiやSCIPと違うのではないかと疑った。 GLPKで変換したファイルをGurobiやSCIPに解かせて解がないという結果になるのを確認。さらに色々見ていると、GLPKのログメッセージでは変数は全部binaryなことになっているけれど、Gurobiの出力した解をみてみると2とかになっているのがある。これだ!

分かったこと

それで、「GLPK MPS bug」で検索してみると、 Re: [Bug-glpk] GLPK 4.46 fails to find solution with enlight13.mps というメールを発見し、原因箇所が判明。件のファイルのBOUNDSの指定に問題があるらしい。

ただ、それだけだと、GurobiやSCIPと解釈が違う理由は分からなかったので、MPSファイルについてさらに調べてみる。 すると、CPLEX では Special Records in MPS Files: ILOG CPLEX Extensions によれば、「MARKERで整数変数を指定する場合、その変数の範囲指定がBOUNDSセクションに存在しない場合には、範囲は[0,1]になる」ということらしいが、その辺りが解釈が違っているのが分かった。

問題のMPSファイルではBOUNDSセクションで変数の下限のみしか指定していなかった。GLPKの実装は、範囲をまず[0,1]で初期化した上で、BOUNDSセクションに記述された上下限でそれらを上書きするという実装になっていたため、上限は1のままになってしまっていた。 それに対して、GurobiやSCIPはどうも下限だけとはいえ範囲が指定されているので[0,1]というデフォルトはそもそも用いないようだ。 ついでに、lp_solve の MPS file format によると、lp_solveはBOUNDSセクションで下限だけでも指定されていればデフォルトは用いないようだが、ただしデフォルトは[0,1]ではなく[0,∞)だとか……

感想

歴史的経緯はあるのだろうけど、元のフォーマットをアドホックに拡張し続けて結果、歪な仕様になった上に、各ツールの解釈が全く違うというひどい状態。こんな腐ったフォーマットが現役で使われているとは酷すぎる……

参考