やはり俺はプログラミングで食っていけないことが明らかに!

これやってみた。論理論理うるさいので論理型プログラミング言語LiLFeSを使ってみました。辻井研究室が開発した言語で、浅く使う分にはPrologとほぼ同じです。東京大学理学部情報科学科の3年の演習で使います。触れるのは2年ぶりですね、なつかしい。

しっかし汚ねえソースコードだなあ。

:- module("mahjong").

%% select(X, Ys, Zs) : リスト Ys から X を取り除いたリストが Zs
%% この述語だけ講義資料からCopy & Pasteした。ただしカットを追加してある。
select <- [pred].
select(X, [X|Xs], Xs):-
 !.
select(X, [Y|Ys], [Y|Zs]) :-
 select(X, Ys, Zs).

%% 眠い。あとでコメントつけます
seq <- [pred].
seq(N, List, Rest, [N, N1, N2]):-
 select(N, List, List1),
 N1 is N + 1,
 select(N1, List1, List2),
 N2 is N + 2,
 select(N2, List2, Rest).

same <- [pred].
same(N, List, Rest, [N,N,N]):-
 select(N, List, List1),
 select(N, List1, List2),
 select(N, List2, Rest).

get_tuple <- [pred].
%%get_tuple(N, List, Flag, Rest, Tuple, NewFlag,  NewN)
get_tuple(N, List, 0, Rest, T, 0, N):-
 seq(N, List, Rest, T).
get_tuple(N, List, 0, Rest, T, 1, N):-
 same(N, List, Rest, T).
get_tuple(N, List, 1, Rest, T, 1, N):-
 same(N, List, Rest, T).
get_tuple(N, List, _, Rest, T, RvF, N2):-
 N < 9,
 N1 is N + 1,
 get_tuple(N1, List, 0, Rest, T, RvF, N2).

fuga <- [pred].
fuga(X,Y):-
 Y is X + 1.
fuga(X,Y):-
 Y is X + 2.

hoge3 <- [pred].
hoge3([X,X,X,Y],[X,X],[X,Y]):- fuga(X,Y).
hoge3([X,X,X,Y],[X,Y],[X,X]):- fuga(X,Y).
hoge3([X,Y,Y,Y],[Y,Y],[X,Y]):- fuga(X,Y).
hoge3([X,Y,Y,Y],[X,Y],[Y,Y]):- fuga(X,Y).

hoge <- [pred].
hoge(L,A,B):-
 hoge3(L,A,B), !.
hoge([X,X,Y,Y],[X,X],[Y,Y]).
hoge([X,X,Y,Y],[Y,Y],[X,X]).
hoge([X,X,Y,Z],[X,X],[Y,Z]):- fuga(Y,Z).
hoge([X,Y,Y,Z],[Y,Y],[X,Z]):- fuga(X,Z).
hoge([X,Y,Z,Z],[Z,Z],[X,Y]):- fuga(X,Y).

generate <- [pred].

generate(N, List, [T1, T2, T3, T4], Rest):-
 get_tuple(N,  List,  0,  Rest1, T1, F1, N1),
 get_tuple(N1, Rest1, F1, Rest2, T2, F2, N2),
 get_tuple(N2, Rest2, F2, Rest3, T3, F3, N3),
 get_tuple(N3, Rest3, F3, Rest,  T4, _, _).

generate(N, List, [T1, T2, T3, T4], Rest):-
 get_tuple(N,  List,  0,  Rest1, T1, F1, N1),
 get_tuple(N1, Rest1, F1, Rest2, T2, F2, N2),
 get_tuple(N2, Rest2, F2, Rest3, T3, F3, N3),
 hoge(Rest3,T4,Rest).

test <- [pred].
test(List, T, R) :- generate(1, List, T, R).

述語hogeとか問題をきちんとモデル化できてないことの現れですね!

実行結果:

LiLFeS 1.3.8    [PROFILE] [ZLIB] [REGEX]
Copyright (c) 1997-2006, Takaki Makino and Tsujii lab., Tokyo Univ.
Warning: [F3, N3] - singleton variables in mahjong:'generate/4' at ./mahjong3.lil:70
> ?- test([1,1,1,2,2,2,4,5,8,8,8,9,9], T,R).
T: < < [$1] 1, [$1] ..., [$1] ... >, < [$2] 2, [$2] ..., [$2] ... >, < [$3] 8, [$3] ..., [$3] ... >, < [$4] 9, [$4] ... > >
R: < 4, 5 >
Enter ';' for more choices, otherwise press ENTER --> ;
no
> ?- test([1,1,2,2,3,3,5,5,5,6,7,9,9], T,R).
T: < < [$1] 1, 2, 3 >, < [$1] ..., 2, 3 >, < 5, 6, 7 >, < [$2] 5, [$2] ... > >
R: < [$3] 9, [$3] ... >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, 2, 3 >, < [$1] ..., 2, 3 >, < 5, 6, 7 >, < [$2] 9, [$2] ... > >
R: < [$3] 5, [$3] ... >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, 2, 3 >, < [$1] ..., 2, 3 >, < [$2] 5, [$2] ..., [$2] ... >, < [$3] 9, [$3] ... > >
R: < 6, 7 >
Enter ';' for more choices, otherwise press ENTER --> ;
no
> ?- test([1,1,1,2,2,2,3,3,3,5,5,5,9], T,R).
T: < < [$1] 1, 2, 3 >, < [$1] ..., 2, 3 >, < [$1] ..., 2, 3 >, < [$2] 5, [$2] ..., [$2] ... > >
R: < 9 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < [$2] 2, [$2] ..., [$2] ... >, < [$3] 3, [$3] ..., [$3] ... >, < [$4] 5, [$4] ..., [$4] ... > >
R: < 9 >
Enter ';' for more choices, otherwise press ENTER --> ;
no
> ?- test([1,2,2,3,3,4,4,8,8,8,9,9,9], T,R).
T: < < 1, 2, 3 >, < 2, 3, 4 >, < [$1] 8, [$1] ..., [$1] ... >, < [$2] 9, [$2] ..., [$2] ... > >
R: < 4 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 2, 3, 4 >, < [$1] ..., 3, 4 >, < [$2] 8, [$2] ..., [$2] ... >, < [$3] 9, [$3] ..., [$3] ... > >
R: < 1 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 1, 2, 3 >, < [$1] 8, [$1] ..., [$1] ... >, < [$2] 9, [$2] ..., [$2] ... >, < [$3] 4, [$3] ... > >
R: < 2, 3 >
Enter ';' for more choices, otherwise press ENTER --> ;
no
> ?- test([1,1,1,2,3,4,5,6,7,8,9,9,9], T,R).
T: < < [$1] 1, [$1] ..., [$1] ... >, < 2, 3, 4 >, < 5, 6, 7 >, < [$2] 9, [$2] ..., [$2] ... > >
R: < 8 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < 2, 3, 4 >, < 6, 7, 8 >, < [$2] 9, [$2] ..., [$2] ... > >
R: < 5 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < 3, 4, 5 >, < 6, 7, 8 >, < [$2] 9, [$2] ..., [$2] ... > >
R: < 2 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 1, 2, 3 >, < 4, 5, 6 >, < 7, 8, 9 >, < [$1] 1, [$1] ... > >
R: < [$2] 9, [$2] ... >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 1, 2, 3 >, < 4, 5, 6 >, < 7, 8, 9 >, < [$1] 9, [$1] ... > >
R: < [$2] 1, [$2] ... >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 1, 2, 3 >, < 4, 5, 6 >, < [$1] 9, [$1] ..., [$1] ... >, < [$2] 1, [$2] ... > >
R: < 7, 8 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 1, 2, 3 >, < 6, 7, 8 >, < [$1] 9, [$1] ..., [$1] ... >, < [$2] 1, [$2] ... > >
R: < 4, 5 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < 2, 3, 4 >, < 5, 6, 7 >, < [$2] 9, [$2] ... > >
R: < 8, [$2] ... >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < 2, 3, 4 >, < 7, 8, 9 >, < [$2] 9, [$2] ... > >
R: < 5, 6 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < [$1] 1, [$1] ..., [$1] ... >, < 4, 5, 6 >, < 7, 8, 9 >, < [$2] 9, [$2] ... > >
R: < 2, 3 >
Enter ';' for more choices, otherwise press ENTER --> ;
T: < < 3, 4, 5 >, < 6, 7, 8 >, < [$1] 9, [$1] ..., [$1] ... >, < [$2] 1, [$2] ... > >
R: < [$2] ..., 2 >
Enter ';' for more choices, otherwise press ENTER --> ;
no
>  

LiLFeSのprint文関連はわけわかめなんで出力の整形は勘弁してください。

最初の2時間半は何も考えずに制約条件だけを書き殴る(!)という乱暴なことをして失敗しました(ああ、いつか来た道)。Totalで5時間かかるというISerにあるまじき事態です。やっぱり一度考えてから書き始めないとダメ。

こんな惨状だし、研究にも身が入らないので、やっぱ足を洗ったほうがいいんですかねー。

疲れたので寝ます。間違ってたら指摘してください。

3Dプリンタが欲しい

http://japanese.engadget.com/2007/05/10/desktop-factory-3d-printer/

http://japanese.engadget.com/2010/01/22/hp-stratasys-3d/

最近頭を占めているのが,3Dプリンタで「印刷」した部品を組み合わせて,競技用の紙飛行機のようなプラスチック製飛行機を作りたいなーということ.ついでに,図面をクリエイティブ・コモンズで公開する.

6万なら買う.

もうちょっと妄想を煮詰められそうな気もするが,面倒になったしこの辺で.

Twitter API Wikiからコードを生成する試み(3)

一応の成果を上げた。home_timelineの取得とtweetの投稿に成功したのを確認。

このコードをベースに、手作業で多少の修正を加えてQweenにマージした。やっとQTwitLibへの依存がなくなったので、OAuthに対応する作業を始められる。

学校で暮らす知恵(1)

あいにく研究室のある建物の近くに銭湯がないので(最近根津にあることを知ったが行くのが面倒だ)、汚れ具合が微妙な時は深夜の学校の便所で頭を洗うことになる。
タオルとシャンプーは生協かコンビニで調達可能だが、洗面器はさすがにない。こんなとき便利なのがCD-R(50枚組以上のもの)の容器。洗面器ほど大きくないが、貯められる水の量はぴったり頭を洗うのに適した絶妙な大きさだからだ。

また、変な知恵が身についてしまった。

Twitter API Wikiからコードを生成する試み

Twitter API Documentationからスクレイピングしたデータをつかって、Twitterに対応するコードをある程度自動で生成できないかなと思って、いろいろ試している。

WikiのHTMLのソースコードがあまりにも汚いので、DOMやらSelectors APIで頑張るよりも、Lynxを lynx -dump “url” > hoge みたいに使って、その出力を利用した方が早かった。

パラメータのあたりでちょっとおかしな挙動をすることがあるけど、ざっと一覧する分にはもうこれで十分なくらいだ。

まあいつまで使えるか分からん代物なんだが。