離散数学「数え上げ理論」

面白そうだったので買ってみたら、面白かった。

ProductName 離散数学「数え上げ理論」 (ブルーバックス)
野崎 昭弘
講談社 / ¥ 1,029 ()
通常24時間以内に発送

予備知識のいらないやさしい問題で分割数、フィボナッチ数、カタラン数に触れたあとには、数え上げ理論の三種の神器である包除原理、差分方程式、母関数の理論を紹介。その奥深い魅力が、充分に味わえる。

最初のほうはコンビネーションとかのクイズっぽくはじまる。で、確率とか計算して、賭博の仕組みを解説しつつ、上の包除原理とかやって、最後群論のさわりまで。結構テンポよく進む。

奇数の和は正方形(平方数)になる話とか、子供が大きくなったら偉そうに語るネタとしてストックされた。

AI::Prolog

perlの実装でAI::Prologというのがあるが、インストールするとaiprologというコマンドがついてくる。

階乗を計算してみる。

fact(0, 1).
fact(X, Sum) :-
    X > 0, X1 is X - 1, fact(X1, Sum1), Sum is X * Sum1.

aiprologを起動

$ aiprolog fact.swi

Welcome to AI::Prolog v 0.740
Copyright (c) 2005-2006, Curtis "Ovid" Poe.
AI::Prolog comes with ABSOLUTELY NO WARRANTY.  This library is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.

Type 'help.' for for a list of built-ins or 'help("$builtin").' for help on a specific built-in.

?-fact(10,X).

fact(10, 3628800)

Yes

prologをいじってると宣言的ってのが「あーこういうことなのね」ってのがわかって楽しい。On LispでCommon Lispで実装するPrologとか読んである(継続とパターンマッチング)と内部でこういうことしてんのかなとか推測できるし。

ProductName On Lisp
ポール グレアム
オーム社 / 3990円 ( 2007-03 )


あとでHOPの9章の宣言的プログラミングのとこも読み返そう。Prologを知ってると面白く読めるのかも。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


HOP 9.4.1は連立方程式を制約システムで

久しぶりというか、ちょこちょこ読んでいるのだけどなかなか進まない。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5976円 ( 2005-03-28 )


写経してみたけど、また戻ってきそうな予感。

制約システムで連立方程式を解く。

macbookにswi-prologをインストール

初Prolog

sudo port install swi-prolog

linuxだとplなんだけどmacだとswiplというコマンド。

parent(kzfm,yuki).
parent(uko,yuki).
parent(ako,uko).
parent(yum,kzfm).
parent(chiyo,yum).
parent(kzfm,hana).
parent(uko,hana).

上のファイルをtest.swiという名前で保存しておいて、

swipl -f test.swi

で起動

?- parent(A,yuki).
A = kzfm ;
A = uko . 

?- parent(A,B),parent(B,yuki).
A = ako,
B = uko ;
A = yum,
B = kzfm ;
false.

parentのparentつまり祖父母だ。もちろん再帰もできる。On Lispの言葉を借りるならPrologは規則を追加したデータベースだ。

ということは、ミニ言語としてperlとかに組み込んであっても良さそうなものだと思って探してみたら、ズバリな記事を見つけた。

Logic Programming with Perl and Prolog

あとで読む。

今のところ入門的な内容しかやってないのでアレなんだけど、ファクトが固いというか、True,Falseからしかルールを導いてないので、もうちょっと確率的なものを扱いたい。8割くらい正しいのでTrueとかそんな感じの緩いルール。

これも気になるが、なか見検索できないので躊躇している。

追記

これ見たら、この本よりも、Prolog Programming for Artificial Intelligenceを買うべきな気がしてきた。

ProductName Prolog Programming for Artificial Intelligence (International Computer Science Series)
Ivan Bratko
Longman Group United Kingdom / ¥ 7,091 ()
通常11~13日以内に発送

「京都型ビジネス」を読んだ

持続可能性とかそっちに通じるのかな。フェアトレードとかじゃなくて、文化、伝統の継承としての持続可能性みたいな。

ProductName 京都型ビジネス―独創と継続の経営術 (NHKブックス)
村山 裕三
日本放送出版協会 / ¥ 966 ()
通常24時間以内に発送

菊乃井の話がよく出てくる。露庵また行きたいなぁ。

  • 文化の芯
  • テクノロジーの中に伝統の技を入れ込む
  • 文化が競争力
  • 京都は人に尽きる

macbookでaserveを動かす(失敗)

macbook+sbcl+aserve(asdfで入れた)で起動するとSB-THREADがないというエラー。

* (net.aserve:start :port 8888)

debugger invoked on a SIMPLE-ERROR:
PROCESS-PRESET: Calling a multiprocessing function on a single-threaded sbcl build

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

SB-THREAD付きでコンパイルしろということらしい。ソースのINSTALLに書いてある通りに customize-target-features.lispってファイルを作って、中に以下のように書いておく

(lambda (features)
  (flet ((enable (x)
           (pushnew x features))
         (disable (x)
           (setf features (remove x features))))
    ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
    ;; and x86 Mac OS X (experimental).
    (enable :sb-thread)))

で、インストール。これでOK。

さて、Common Lisp と AllegroServe(Aserve) で作る Web アプリケーションのサンプルを実行してみた。

* (net.aserve:start :port 8888)

#<NET.ASERVE:WSERVER port 8888 {12085CC9}>
* (net.aserve:publish
 :path "/"
 :content-type "text/html; charset=euc-jp"
 :function
 #'(lambda (req ent)
     (net.aserve:with-http-response
      (req ent)
      (net.aserve:with-http-body
       (req ent)
       (net.html.generator:html
        (:html
         (:head (:title "Hello World!"))
         (:body "Hello World!"
         :br "こんにちは!")))))))

#<NET.ASERVE:COMPUTED-ENTITY {12E5B679}>
* aserve-accept-6: 01/26/09 - 20:44:57 - accept: error 0 on accept invalid \
keyword argument: :AUTO-CLOSE (valid keys are
                          :INPUT, :OUTPUT, :ELEMENT-TYPE, :EXTERNAL-FORMAT,
                          :BUFFERING, :TIMEOUT).

なにがinvalid keyword argumentなのかわからん。linuxに入れたsbclだと快適に動いている(日本語は表示されないけど)。

これが動かないと実践Common Lispが先に進まないんだよなぁ。

slimeでwindowを二つにわけたい

Gaucheだとこんな感じに設定しておけば、C-cSでウィンドウを2つに分け、一方でgoshインタプリタを実行するコマンドを定義する。

これをSlimeでもやりたかったので調べてみたところ、

(global-set-key "\C-cs" 'slime-selector)

と.emacsに書いておけばC-cs[?cdeilt]でバッファを切り替えられるらしい。

?:  Selector help buffer.
c:  SLIME connections buffer.
d:  *sldb* buffer for the current connection.
e:  most recently visited emacs-lisp-mode buffer.
i:  *inferior-lisp* buffer.
l:  most recently visited lisp-mode buffer.
t:  SLIME threads buffer.
v:  *slime-events* buffer.

とりあえずこれでいいかな。

Common Lispで非決定性計算

On Lisp 22章

まずはschemeでの非決定性計算のコードを解説してから、マクロ使って実装していくという流れで、継続の時と同じ構成。schemeは継続をサポートしているのでコードが分かりやすくていい。

マクロの写経。継続マクロは前書いたヤツを使う。

(defparameter *paths* nil)
(defconstant failsym '@)

(defmacro choose (&rest choices)
  (if choices
      `(progn
     ,@(mapcar #'(lambda (c)
               `(push #'(lambda () ,c) *paths*))
           (reverse (cdr choices)))
     ,(car choices))
      '(fail)))

(defmacro choose-bind (var choices &body body)
  `(cb #'(lambda (,var) ,@body) ,choices ))

(defun cb (fn choices)
  (if choices
      (progn
    (if (cdr choices)
        (push #'(lambda () (cb fn (cdr choices)))
          *paths*))
    (funcall fn (car choices)))
      (fail)))

(defun fail ()
  (if *paths*
      (funcall (pop *paths*))
      failsym))

これを使って二つの数の和が与えられた数になるような組み合わせを見つける

(=defun two-nubers ()
  (choose-bind n1 '(0 1 2 3 4 5 6 7 8 9)
    (choose-bind n2 '(0 1 2 3 4 5 6 7 8 9)
      (=values n1 n2))))

(=defun parlor-trick (sum)
  (=bind (n1 n2) (two-nubers)
    (if (= (+ n1 n2) sum)
    `(the sum of ,n1 ,n2)
    (fail))))

実行

* (parlor-trick 5)

(THE SUM OF 0 5)
* (parlor-trick 15)

(THE SUM OF 6 9)

ちゃんと動いている。

尚、後半にカットの説明があった。要するにやらなくてもよい計算をカットする仕組みってことね。これも継続を使っている。

ProductName On Lisp
ポール グレアム,野田 開
オーム社 / ¥ 3,990 ()
通常24時間以内に発送

chooseはどのnならば引き続く計算処理が失敗しないかを、推定できるかのように機能しなければならない

週末読んだ本

金魚生活

ジャケ買いみたいなもん。

ProductName 金魚生活
楊 逸
文藝春秋 / ¥ 1,400 ()
通常24時間以内に発送

最後のオチがそう来たか、みたいな。芥川賞作家なんだと読み終わってから知った。

IT達人の仕事術

その当時の技術みたいな。

ProductName IT達人の仕事術

ブックマン社 / ¥ 1,400 ()
通常24時間以内に発送

一方で今読むと、ライフハックのコモディティ化もすごいなぁと。

バカな人事

あんま面白くなかった。

ProductName バカな人事 なぜ御社の人事は社員のやる気を失わせるのか?
中村 壽伸
あさ出版 / ¥ 1,470 ()
通常24時間以内に発送

働いた報酬とそのシステムっていう視点がね。自分の労働力を幾らで売るかっていう視点じゃないとこれからダメなんじゃないかなぁ。前者の視点であーだこーだとこねくり回しても難しいんじゃないかなぁとは思うんだけどなぁ。

lispでバイナリファイルのパース(実践Common Lisp 24-25章)

バイナリファイルのパースがあまり面白さを感じられないのでちょっと遠のいていたのだけど、週末でまとまった時間が取れたのでやってみた。バイナリファイルのパーサーを買いて、その流れでMP3のID3タグを読み書きしていくという。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

バイナリファイルの読み書きのあたりは面白かったのだけど、途中からついていけなくなってしまい、いい加減に読み進めてしまった。さらに後の章でこれを使ってMP3ストリーミングサーバーを実装するらしいので、また読みなおすことになりそうだ。