トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

研究日誌とうめき

Last-modified: 2011-03-26 (土) 17:22:15 (4780d)
Top / 研究日誌とうめき

TopPage


Contents

TODO

  • hyperlink関連コードにもっとコメント残す

研究日誌

2011-03-26

KI journal の英訳文

  • 申し訳程度のtexファイルがgoudaのhome/seiji/ki2011/にあります

2011-03-18

JSAI2011執筆時の実験結果

2011-02-19

論文の所属

  • 基本的に研究した所属を「所属」に書く
    • 論文発表時に別の所属になってる場合には、脚注に書く人もいる

2011-02-09

修論の漢字統一

  • 分かる
  • 思う
  • できる
  • とき
  • つながる
  • および
  • 組合せ
  • 一つ, 1個
  • みなす
  • こと
  • もの
  • 行う
  • 全て

2011-02-08

paragraphで改行

  • させたかったら
    \paragraph{タイトル \\}
  • のように{}の中に\\を書けばよい

2011-02-05

eclipseでtex

texの使い方

  • \documentstyle[report,12pt]{jsbook}は\documentclass[report,12pt]{jsbook}
  • \pagestyle{heading}は\pagestyle{lineheadings}
    • だとうまくいったけど、あってんのかな
  • documentclassからbegin{document}までがプリアンブル部

2011-02-04 発表終了!!

いただいたコメント

  • 膜はいらなくなっちゃったの?(中島先生)
    • いります。膜には階層を作って計算の局所化を行う役割があるので、それはハイパーリンクにはない機能です。
  • ハイパーリンクによって非効率的なマッチングが減ったのはわかった、それはモデルが単純に記述できるようになったからだよね?(中島先生)
    • それが一つの理由で、もう一つはハイパーリンクの接続関係を利用したマッチングがあります。(詳しめに説明)。CHRの最適化もこれと似たような考え方を使っています。
  • どういうときに膜、ハイパーリンクを使い分けるの?(中島先生)
    • ハイパーリンクには、接続先を計算量1で取得する機能があります、これは論理変数にも無い機能です。今までは集合は膜で囲って、中にアトムを入れるとかしていましたが、その個数を数えるためにはルールを繰り返し適用して数えるしかなかった。
      • だから局所化は膜、集合を扱う場合にはハイパーリンクだね。(上田先生)
  • マッチング最適化のスライドをもっとちゃんと用意しておけばよかった

用意していた回答

  • LMNtal内だけのことでしょ?
  • LMNtal以外に利用できる新規性は?
    • 論理変数+要素数の取得ができる点で、新規性がある(よね?)
    • (これが一番?)既存のUnion-Find algorithmを改良した点。特にUFにもともと無い要素削除処理を入れたり、集合全体の要素数を常に保持する処理(要素数を計算量1で取得するため)を追加している
    • CHRの実績を持ち上げ、それとLMNtalの関係性について述べる、LMNtalでも実アプリ記述できますよ的な
    • 非効率的マッチングの防止はLMNtalを含む多重集合書換え言語モデルにとって大事
  • 他の多重集合書き換え型言語って何?
    • う、きつい。マッチングの仕方まで詳しく調べたのはCHRだけなので、他のも話せるようにしましょう。
  • 今までもCHRをエンコードできていた、っていうのはどうやって示したの?
    • まずLMNtalはProlog, CHRに影響を受けている言語で、構文から見ればエンコードに問題は無い。言語仕様決定の段階で、論理プログラミング言語の一対一エンコードのし易さにも言及している。
    • ただし、CHRには3種類のルールがあり、この内2つはLMNtalでもサポートされているが、残りのPropagation ruleはLMNtalには無い概念であった。そこでuniq制約を入れた。これで全てのルールも一対一でエンコードできるようになった。
      • あたりが示し方かなぁ?

2011-02-02

現時点での処理系行数(アバウト)

  • 上2つはこの日にwcで計測、コメントアウトも入っている
    • Java処理系:38460+19010+2784=60254
    • SLIM:27708+29285=56993(ファイルの頭のコメントは計4600行くらい)
    • LaViT:30000くらい
    • UNYO:15000くらい

2011-01-28

文字数の差

  • 各例題の文字数を数えてみた
    exampleatom_cmpcycleleqfibonacciufuf_opt*ram_simul
    lmn2684241157357537766
    lmn-mem311846455496271112無理
    lmn-hl1860207348301483653
    chr2051144183266345612
    • memがすごいことに
    • *ルールはadd,sub,cjump0,cjumpN,haltのみ
    • *全部のルールを含めると順に2378, 無理, 2266, 2069.

ちなみに

  • (ハイパーでない)グラフ <=> 一般グラフ
  • ハイパーグラフ <=> 超グラフ
    • と呼ぶらしい

2011-01-27

  • 修論一旦提出
  • JSAI2011に申込み、発表はたぶん目黒パワーに期待することになりそう

2011-01-26

韓国に劇的勝利

texの表で破線を使えるように

  • &ref(): File not found: "arydshln.sty" at page "研究日誌とうめき";
    cc|ccc:rrr| とかそんな感じで":"いれたとこが破線に

2011-01-25

unary用比較演算子"\=="

  • を追加してみた
    a(X), b(Y) :- X \== Y | .
    ----------------------------
    --guard:L118:
      spec           [3, 7]
      derefatom   [3, 1, 0]
      isunary        [3]
      derefatom   [4, 2, 0]
      isunary        [4]
      getfunc     [5, 3]
      getfunc     [6, 4]
      neqfunc        [5, 6]
      jump           [L103, [0], [1, 2, 3, 4], []]

2011-01-24

論文で中間命令列の一覧を書きたいとき (修正版)

  • 幅が半分に設定されていたので直してみた、他にも色々修正
  • thesis.texに追加する方ね
    \newenvironment{instruction}[2]{%
    \vskip-0.5\baselineskip
    \vbox{\hbox to 1\textwidth{\hrulefill}}
    \nobreak
    \vskip-0.7\baselineskip\nobreak
    \begin{description}
    \item[\texttt{\hspace{10pt}#1 \rlap{[\textit{#2}]}}]\hfill\break
    \rightskip0zw}%
    {\end{description}\nobreak\vskip-1.0\baselineskip\nobreak
    \hbox to 1\textwidth{\hrulefill}}

論文で中間命令列の一覧を書きたいとき

  • jssst2007から掘り起こしてきた
  • メインとなるファイル(thesis.texとか)の\begin{document}よりも前に
    \newenvironment{instruction}[2]{%
    \vskip-0.2\baselineskip
    % \vskip-0.0\baselineskip
    \vbox{\hbox to0.48\textwidth{\hrulefill}}\nobreak
    \vskip-0.3\baselineskip\nobreak
    \begin{description}
    \item[\texttt{\hspace{-3pt}#1 \rlap{[\textit{#2}]}}]\hfill\break
    \rightskip0zw}%
    % {\end{description}\nobreak\vskip-0.7\baselineskip\nobreak
    {\end{description}\nobreak\vskip-0.5\baselineskip\nobreak
    \hbox to0.48\textwidth{\hrulefill}}
  • を入れる(コメントアウトとかいらなそうなのもそのままコピペしてる)
  • 中間命令を書きたいページで
    \begin{instruction}{spec}{formals, locals}
    % 命令列の実行中はアトムや膜は変数番号でアクセスするが,
    % 本命令は,
    [制御命令]
    仮引数の数 (本命令列に渡されるアトムや膜の数) を \textit{formals}, 
    本命令列で保持すべきアトムや膜の総数を \textit{locals} から受け取って,
    後者を保持できる大きさの変数ベクタを確保する.
    \end{instruction}
  • な感じで記述すればおk

2011-01-20

hyperlink : groundチェックでのバグ

  • 昨日直したと思ったけど、直っていなかった
    • 原因は大体把握したけど、どう直すかはしっかり考えないといけないかも
      • 修論後?

2011-01-19その2

  • memo for gocho
  • before
    /* groundはつながったグラフなので1つの根からだけたどればよい */
    {
      LinkObj l = (LinkObj)vec_get(srcvec, 0);
      vec_push(unsearched_link_stack, (LmnWord)LinkObj_make(l->ap, l->pos));
    }
  • after
    /* groundはつながったグラフなので1つの根からだけたどればよい */
    {
      LinkObj l = (LinkObj)vec_get(srcvec, 0);
      if (LMN_ATTR_IS_EX(l->pos)) {
        hashset_add(found_ground_symbol_atoms, l->ap);
        ++count_of_ground_atoms;
      }
      else vec_push(unsearched_link_stack, (LmnWord)LinkObj_make(l->ap, l->pos));
    }

2011-01-19

新仕様のハイパーリンク仕様まとめ(言語班ローカル)

  • まとめてみた

Java処理系公開の手続き

2011-01-16

hyperlink : commit!

  • してしまった。致命的なバグがないことをみんなで祈ろう。
  • 追加したもの
    • hyperlink
    • hyperlinkを利用したマッチング最適化機能(findproccxt命令ほか)
    • callback関数gettimeと、SLIMモジュールtime.lmn

slim419でedfs_t*.ilがsegmentation fault

  • gochoが直してるバグってこれかな?
    • 元々--delta-memで動かない例題だった

修論タイトル

  • 酔った勢いでかっこよさげなの考えてみる
    • 並行プログラミング言語LMNtalにおけるLMNtalグラフのハイパーグラフへの拡張
    • LMNtal連呼してる感じなので却下

2011-01-15

すっきりCHR

  • リニューアル。何気にサイト名で検索すると上位に。

2011-01-15

hyperlink : ハイパーリンクのIDをインクリメンタルな数値に

  • hyperlinkに値を代入する話ではない
  • hyperlink木からhyperlinkオブジェクトを削除する際、木の中で削除対象のオブジェクトを葉に向かってスワップしていき、葉に到達した時点で削除するような最適化(子をたくさん持ったまま削除すると色々処理がかかる)を入れたため、集合を代表する(rootの)IDが固定されなくなってしまっていた
  • これだとuniq制約で履歴を管理する際に苦しい
    • インクリメンタルな番号をふり、uniqの履歴および標準出力時にはそれをIDとする
    • hyperlinkのuniqへの対応+出力時のIDの短縮化が可能に
  • 出力before
tmp.
tmp :- new($x) | a($x), b($x).
*--->
a(!1ab5038). b(!1ab5068). @5. 
== HyperLink =============================================================
  [hl_ID]  [parent] [linked with] [num] [direct children ( inside info )]
  1ab5038      root             a     2  1ab5068.
  1ab5068         1             b     2  
================================================ 1 group,  2 elements ==== 
  • 出力after
tmp.
tmp :- new($x) | a($x), b($x).
*--->
a(!1). b(!2). @5.
== HyperLink =============================================================
  [hl_ID]  [parent] [linked with] [num] [direct children ( inside info )]
        1      root             a     2  2.
        2         1             b     2
================================================ 1 group,  2 elements ====
  • --show-hlオプションをつけない通常の出力
    a(!1). b(!1). @5.

2011-01-14

hyperlink : コミット作業中

  • callback関数をモジュールで呼び出せるtime.lmnも追加予定

2011-01-10 その2

hyperlink : 新々仕様での実験 ram_simul_many

N5k10k20k40k80kO
slim int1.593.166.3312.6535.71
slim hlink old0.150.280.551.10IDover
slim hlink new0.180.360.721.432.83
chr int opt0.210.511.263.618.51

hyperlink : 新々仕様での実験 fibonacci_topdown

N5k8k10k16k20k32k64k128kO
slim hlink old0.080.140.180.280.370.56IDoverN
slim hlink new0.080.130.160.260.320.511.022.06N
chr int opt0.030.040.080.100.170.200.461.11N

hyperlink:新々仕様での実験 atomcmp_x3

  • hlinkは全て--hl-optで測ることにする(./hltest_new/)
  • lmntal -O3 --slimcode --hl-opt atomcmp.lmn | slim --hl -
    N8k*316k*332k*364k*3128k*3256k*3O
    slim int38.94156.27631.03---------N^2
    slim mem0.030.060.120.240.480.95N
    slim hlink old0.020.030.060.12IDoverN
    slim hlink new0.060.110.220.440.881.79N
    chr opt0.110.210.470.961.843.67N

2011-01-10

hyperlink : 中間命令列の並び替え

  • コンパイラを若干変更
    • newhlink, makehlinkとuniqの並び替えがうまくいっていなかったのを修正、コミット
    • ついでにコードの整理もちょっとやった

2011-01-08

計算量が悪い件

  • 原因が把握できた
    • なぜ膜内の!アトムを全てさらうようにしていたのか、理解に苦しむ

--enable-gprof(と--disable-tcmalloc)でallocs/freesの数が合わない

lmntal --slimcode -e "a." | valgrind src/slim -
  • valgrindで見るとfreesが1足りない
    • 俺の環境だけかな?
      • 2つのデバッガを同時に使う俺が悪い 2011-01-14

2011-01-07

fibonacciとramを測定

  • オーダーが悪い...
    • --p3でチェック、ルールの適用/試行/バックトラック回数は旧実装より悪いルールは無い
    • 内部実装の問題、見直し中
  • fibonacci_topdown(unify)
    N4k8k16k32kO
    slim hlink new0.130.411.9014.60?
  • ram_simul
    N5k10k20kO
    slim hlink new0.663.8422.60?

2011-01-04

hyperlink : 所属膜へのポインタ

  • 持たせておけば、hyperlinkからのfindatomをもう少し効率化できる気がする

hyperlink : ユーザIDの追加検討

  • 機能としては用意しておきたい。がバグが取れてから...
    • CHRでは同じ値を束縛された論理変数が生成された場合は、生成された時点で同じ集合に属する
X is 1.
hoge <=> Y is 1, v(Y).
  • (必須ではないが)hyperlinkにもこういう機能がないと、プログラムが煩雑になる
    • 非効率なマッチングを生まないように書くために、色々と苦労しそう
イメージ:
hoge :- make($x, 123) | h($x). 
*---> h(!123). 
(ID123を持つ他のhyperlinkの集合と併合された状態で生成される)

2010-12-28

hyperlink : ハッシュ表による管理を廃止

  • 新しい属性LMN_HL_ATTRのバグがかなり取れてきた気がするので、ハッシュ表でatom pointer => hyperlink objectの参照関係を管理していたのを廃止
  • "!"アトムの第2引数にhyperlink objectへのポインタを直接埋め込む
    • 適当に測ってみた
N8k*316k*332k*364k*3128k*3256k*3O
slim hlink new(廃止前)0.060.120.270.571.162.35N
slim hlink new(廃止後)0.040.080.170.360.741.50N

2010-12-22

最短"経路"問題

  • 最短距離を求めるプログラムは色々あるけど、uniq使えばたいがい1,2ルールで書ける
  • ただ最短"経路"となると2行で書けるのかちょっと自信無かったけど、なんとか書けた
    • &ref(): File not found: "shortest.lmn" at page "研究日誌とうめき";

2010-12-21

hyperlink:新仕様での実験 cycle_backedge5

  • 3頂点からなる閉路を探索する(propagation, uniq無し)
    edge(X, Y), edge(Y, Z), edge(Z, X) <=> cycle(X, Y, Z).
    N10050010002kO
    slim int243.43
    slim mem0.020.341.43
    ( mem all)0.2224.65197.42
    slim hlink old0.040.732.635.90
    slim hlink new0.071.506.1513.95
    chr int opt1.252.545.05
    • 計測途中

2010-12-18

hyperlink:新仕様での実験 atomcmp_x3

  • hlinkは全て--hl-optで測ることにする(./hltest_new/)
  • lmntal -O3 --slimcode --hl-opt atomcmp.lmn | slim --hl -
    N8k*316k*332k*364k*3128k*3256k*3O
    slim int38.94156.27631.03---------N^2
    slim mem0.030.060.120.240.480.95N
    slim hlink old0.020.030.060.12IDoverIDoverN
    slim hlink new0.060.120.270.571.162.35N
    chr opt0.110.210.470.961.843.67N
    • hyperlink のIDの上限が無くなったのが大きい

カラー大辞典

2010-12-14

ubuntu9.10にopenoffice3.2

  • ここ
  • エラー
    ステータスデータベースエリアが別のプロセスによってロックされています
    • synapticが開いていると出る

2010-12-13

解放忘れ?

  • 公開版slimで以下のようにデータ型だけのground型比較をするとメモリリークがあると言われる、俺の環境のせい?
    a(1), a(1). a(X), a(Y) :- X = Y | ok.
    • eqground/neqgroundでのsrcvec, dstvecの解放がrev400以降無くなってる
    • 復活させるとちゃんと解放されてるみたいだけど、他の処理に作用してないだろうか
      • 2010-12-14 修正前/修正後で差異が無かった(benchmarksetの例題に対して--nd, --mem-enc実行で状態数を比較)のでコミット

2010-12-12

hyperlink 比較系memo

  • isground
  • eq/neqground
  • eq/neqfunc
  • samefunc
    • lmn_eq_func

memo

2010-12-10

hyperlink : 新仕様での実行時間

  • アトム生成&削除
    • 10000個のatom(hyperlink)をN回生成->削除
    • どちらもtime optimized slim
      N100200400800
      symbol atom1.913.727.4014.75
      hyperlink3.787.6515.3131.87
  • new_and_delete.lmn
    start(10000, 100).
    init   @@ start(M, I) :- int(M) | s(M, I, M).
    return @@ s(0, I, M) :- I > 0, I1 = I-1, int(M) | s(M, I1, M).
    /* atom */
    new    @@ s(I, J, M) :- I > 0, I1 = I-1 | s(I1, J, M), a(b).
    delete @@ a($a) :- unary($a) | .
    /* hyperlink */
    //new    @@ s(I, J, M) :- I > 0, I1 = I-1, new($a) | s(I1, J, M), a($a).
    //delete @@ a($a) :- hlink($a) | .
  • hlink制約
    • 10000*N回のhlink型検査を行う
      N100200400800
      old hyperlink1.172.364.749.52
      new hyperlink1.422.825.6211.42
    • 旧仕様:hlink型検査はファンクタIDの比較
    • 新仕様:hyperlink属性を利用して型検査、新仕様より楽だがオブジェクトの削除->生成が毎回行われるために旧仕様より遅いのかも
  • ishlink.lmn
    i(10000, 800).
    init   @@ i(I, J) :- uniq, int(I), new($x) | i(I, J, I), a($x).
    return @@ i(0, J, M) :- J > 0, J1 = J-1, int(M) | i(M, J1, M).
    hlink  @@ i(I, J, M), a($x) :- I > 0, I1 = I-1, hlink($x) | i(I1, J, M), a($x).

2010-12-07

リモート設定メモ

  • コンピュータ:localhost:13389
  • プロトコル:RDPv5
  • ユーザ名とパスワード
  • (マシンアドレス:00:22:15:7d:86:dc)

2010-12-06

LMN_ATTR_IS_DATA_WITHOUT_EX

  • exはextended。extra, expandedでもまぁ意味は通じる?

2010-12-03

ハイパーリンク属性

  • ハイパーリンクはファンクタ!/1のアトム
    • だけど属性としてはデータアトムの一種
    • だけどシンボルアトムとして、膜への登録、削除等々を行う
      • callback atomと同じような
      • メリットとしては型検査を最適化できる
      • デメリットとしては実装が面倒

2010-11-26

hyperlink : アトムポインタをIDとする

  • これまでのハイパーリンクアトム
    • ファンクタ:!1, !2, ...(実行中に新たなファンクタを生成していた)
    • 管理(hlink ID): 1, 2, ...
      • !1 <-> 1, !2 <-> 2, ...
    • 通常の(シンボル)アトム
  • 新しいハイパーリンクアトム
    • ファンクタ:予約語'!'で統一 (新たなファンクタ生成は無い)
    • 管理(hlink ID):'!'アトムのポインタ
      • atom pointer <-> hlink object, ...
    • データアトム扱い(hyperlink属性を追加、hlinkである/ないの判定が楽に)
      tmp.
      tmp :- new($x) | a($x).
      *--->
      a(!).  (出力は a(!0x1ab5038)か, 適当な値を付けてa(!1)とか)
  • INSTR_COPYATOM
    • これまでは同じIDを持つhlinkは複数個生成可能
      • ポインタにするとIDはユニーク
    • 複製したらオリジナルと併合する
      tmp.
      tmp :- new($x) | a($x), b($x).
      *--->
      a(!0x1ab5038). b(!0x1ab5068). @5. 
      == HyperLink =============================================
                [hl_ID]   [parent] [elem]  [rank (direct child)]
       Name ----------------------------------------------------
              0x1ab5038       root    ---   1(0x1ab5068)
              0x1ab5068  0x1ab5038    ---   0
      ==========================================================

2010-11-24

戸川先生のディジタル回路設計(ごてふより)

  • 回路の設計 × ハイパーリンク
    • 落ち着いたら調べてみる

hyperlink : 仕様変更

  • インクリメンタルなIDで管理するより、アトムのポインタでハイパーリンクを管理する方が何かと都合が良いため

2010-11-23

boolean.lmnのコンパイル

  • 修正版を一昨日コミットしたが、どうやらちゃんと動いているみたい
  • 俺がよく見ていたboolean.lmnのコンパイルエラーは、単にノーパソで間違ったパスをLMNTAL_HOMEに指定していたから出てきていたものだった、迂闊なんてレベルじゃない

2010-11-22

デフォルトセッションの変更

  • netbook editionを入れると、ログイン時にdesktop版も選択できるけど、デフォルトセッションを変更したければ、システム管理→ログイン画面の設定

日本語入力が出来ない

  • システム→設定→キーボード・インプットメソッドからAuthyを追加

2010-11-20

Xp - ubuntuデュアルブート関連

  • wubiでインストール失敗
    • permission denied となってlogを参照するように言われる
    • isoファイルのダウンロードで終了していたら、ここからisoをダウンロード
    • Deamon tools liteでisoをマウントして一旦ubuntuをアンインストール
    • 再びisoからインストール開始
  • 既定の起動OSを変更する
    • Xp -> コンパネ -> システム -> 詳細設定 -> 起動と回復 から変更

boolean.lmnがコンパイルできなかったバグ

  • 俺でした...修正版をコミットしましたが、チェックできてないのでちゃんと直ってるかどうか

2010-11-19

ubuntuでSLIMが動かなくなった件解決

  • iwatasoが解決法をなんとか思い出してくれたおかげで復活!
  • make install で /usr/local/share/に出来るslimが悪かった?
    • slimという名前を変更すれば正常に動くようになった
    • 原因は何なんだろう?

Windows XP:余計なスタートアッププログラムを解除

2010-11-18

ubuntuでSLIMが急に動かなくなった件

  • 以下を色々試した

wubi

  • 追加でubuntuをインストールすることは出来なそう、アンインストールが必要と言われる

もう一台のPCにubuntuをインストールして比較してみた

  • configureの内容を互いに比較してみた
    • mawkとgawkというソフトの違いがあり、その辺をそろえてみたけど結局変わらず

ubuntu : eclipse install memo

2010-11-17

kernelの再構築

$ sudo -s
 
/*** カーネル再構築に必要なパッケージをインストール ***/
# apt-get install build-essential
# apt-get install kernel-package libncurses5-dev libqt3-mt-dev

/*** カーネルソースをインストールして展開 ***/
# apt-get install linux-source-2.6.28
# cd /usr/src
# tar xvjf linux-source-2.6.28.tar.bz2

/*** .config ファイルの作成 ***/
# cd linux-source-2.6.28
# cp /boot/config-2.6.28-xx-generic .config
# make oldconfig

/*** CPU関連のパラメータを環境に合わせて修正 ***/
# make menuconfig

例えば...
  Processor type and features >
   Processor family => Core 2/newer Xeon
   Timer frequency => 1000 HZ

/*** カーネルのリビルド ***/
# make-kpkg clean
# make-kpkg --initrd --revision=20090618 kernel_image kernel_headers

/*** .deb ができるので dpkg でインストール ***/
# cd ..
# dpkg -i linux-image-2.6.28.xx_20090618_x86.deb

2010-11-17

  • memo
    • lmntal.cupにごみが入っていたのを修正、そのうちコミット

2010-11-09

  • 中間発表メモ
    • IDの使用数を測ってみる
    • グラフだけでなく、例題の内容、同実装したか、結果の考察は必要
    • インクリメンタルなIDではなく、アドレスをIDに
      • でも結局ファンクタのID数は決まっているのでよく考えたほうがよさそう
  • アンビエントを書いてみたい
    • ラムダ計算も
  • 今後の方向性、非決定実行の評価

2010-11-03

  • ハイパーリンクへの値の束縛の必要性?
    • 集合が持つ値をn(!1, 1).とかで表すと、例えば
      a($x), n($x,N1), b($y), n($y,N2) :- N=N1+N2 |...
    • のように値を足すルールで、N1,N2が同じ値である場合があるなら、その分nの個数を増やさなければならない、書くのがちょっと面倒かな

2010-10-29 その2

fibonacciのオーダーが悪かった原因(残りの半分)

  • addにて'+'からfindatomしていたのが原因、値を持っているvからfindatomすれば適用失敗がかなり抑えられる
unify @@ fib($n, N1, M1) \ fib2($n, N2, M2) :- hlink(M1), int(N2) | M1 >< M2.
fib1 @@ fib2(N,0,M) :- hlink(N) | v(M, 1).
fib2 @@ fib(N,1,M) :- hlink(N) | v(M, 1).
fib3 @@ 
fib($n, N, M) :-
  N > 1, N1 = N-1, N2 = N-2, 
  make(N, $a), make(N1, $b), new($x), new($y), hlink($n) |
  fib($a, N1, $x), fib2($b, N2, $y), M = $x + $y.
add @@ v($x, X), v($y, Y), H = $x + $y :- Z = X+Y  | v(H, Z) ,v($x, X).
N番目5000800010000160002000032000O
slim hlink opt0.080.140.180.280.370.56
chr int opt0.030.040.080.100.170.25

fibonacciのオーダーが悪かった原因(半分)

  • unifyするより前にfib3が適用されてしまい、余計な手間がかかっていた
  • 併合する側fibと併合される側fib2に分けることで、unify>fib3、という優先度で実行できる
    • だいぶ早くなったが、これでも計算量はN^2〜3、まだもう一段階原因があるのか
unify @@ fib($n, N1, M1) \ fib2($n, N2, M2) :- 
  hlink(M1), int(N2) | M1 >< M2.
fib1 @@ fib2(N,0,M) :- hlink(N) | v(M, 1).
fib2 @@ fib(N,1,M) :- hlink(N) | v(M, 1).
fib3 @@
fib($n, N, M) :-             /* hlinkidとN,N1は1ずつずらしている */
  N > 1, N1 = N-1, N2 = N-2, 
  make(N, $a), make(N1, $b), new($x), new($y), hlink($n) |
  fib($a, N1, $x), fib2($b, N2, $y), M = $x + $y.
add  @@
H = $x + $y, v($x, X), v($y, Y) :- Z = X+Y | v(H, Z), v($x, X), v($y, Y).
N番目100020004000800016000O
slim int hlink0.281.187.2338.30
  • memo
    16000 : 
     8000 : 23999
     4000 : 11999
     2000 :  5999
     1000 :  2999

2010-10-29

  • 班ゼミメモ
    • CHRで書くことに意味のある例題を選ぶ
    • fibonacci, leqの解析

2010-10-28

  • grub : ×グルーブ、○グラブまたはジーラブ

2010-10-27

fibonacci

  • 注)フィボナッチ数は、下記のbottomup, topdownのようなやり方をしなくても、リストを使えば数万番目くらいまでは一瞬で求めることができる
    fib(N,[X,Y|L]) :- N > 0, N1 = N-1, Z = X+Y | 
        fib(N1,[Z,X,Y|L]).
    • あくまで性能測定のための例題ということで...

fibonacci (bottomup)

  • hyperlinkを使う意味はあまり無いが、下のtopdownとの比較のために測ってみた
    N番目100200400800O
    slim int0.140.926.9252.85
    slim hlink opt
    chr int opt0.050.190.722.87

fibonacci (topdown)

  • 論理変数を効果的に使っている例題
    fibonacci(N,M1) # ID \ fibonacci(N,M2) <=>  M1 = M2 pragma passive(ID).
    N番目101520251002004001000020000O
    slim int0.010.032.00241.64
    slim mem0.0438.70over
    slim hlink opt0.5112.34267.82
    chr int20.64
    chr int opt0.000.080.15
    • 膜による擬似論理変数を使っても、結局同じ値を持つ集合を併合する操作のオーダが悪いために時間がかかっている
    • hyperlinkも変数が持つ値同士を加算するルールが余分にある分chr-optよりオーダーが悪い
    • 91番目7540113804746346429以降はslimでは正しく出力されない &ref(): File not found: "fib.png" at page "研究日誌とうめき";

2010-10-25

ram_simulator

  • memory num = 10, program_counter = N
    prog(L,L1,add(B),A), mem(B,Y) \ mem(A,X), prog_counter(L) <=> 
        Z is X+Y, mem(A,Z), prog_counter(L1).
    N5k10k20k40kO
    slim int0.170.330.641.27
    slim hlink
    slim hlink opt
    chr int
    chr int opt0.230.511.333.76
  • memory num = 30, program_counter = N
    N5k10k20k40kO
    slim int1.593.166.3312.65
    slim hlink
    slim hlink opt0.150.280.551.10
    chr int1.542.995.9612.35
    chr int opt0.210.511.263.61
    • (chrのオーダーが悪いのは、同じ値を持つ変数が多いために、dense_intが逆効果になっているからだろうか?)

2010-10-24

union-find

  • N100200400800160O3200O
    slim int0.030.130.714.8936.52290.04N^3
    slim hlink
    slim hlink opt0.030.110.411.546.2724.95N^2
    chr int
    chr int opt0.020.050.150.552.189.29N^2

union-find opt

  • pass compression for find, union-by-rank
    N100200400800160O3200O
    slim int0.030.413.2625.87206.28N^3
    slim hlink
    slim hlink opt0.030.050.210.733.1211.58N^2
    chr int
    chr int opt0.020.050.170.642.519.99N^2
  • slim内部に実装したunion-find
    N800016k32k64kO
    slim hyperlink0.010.020.040.08N

cycle

  • 3頂点からなる閉路を探索する(propagation, uniq無し)
    edge(X, Y), edge(Y, Z), edge(Z, X) <=> cycle(X, Y, Z).
    N8k16k32k64kO
    slim int
    slim hlink
    slim hlink opt0.330.671.342.69
    chr int
    chr int opt1.252.545.0510.18

lexicographic

  • 辞書順比較(5〜10の長さのリストをN回比較)
    l4 @ lex([X|L1],[Y|L2]) <=> X==Y | lex(L1,L2).
    N2500500010k20kO
    slim int0.180.753.1720.58
    slim hlink2.5313.88
    slim hlink opt0.452.008.8246.85
    chr int0.651.252.585.13
    chr int opt0.030.060.120.23
    • findatomではなくderefでhyperlinkに到達するようなルールの最適化は考慮していないため、オーダーが悪い
    • そもそもhlinkを使うメリットはあまりない

2010-10-22

leq

  • クエリ:leq(1,2), leq(2,3), ... leq(N, 1).
    reflexivity  @ leq(X,X) <=> true.
    antisymmetry @ leq(X,Y), leq(Y,X) <=> X = Y.
    idempotence  @ leq(X,Y) \ leq(X,Y) <=> true.
    transitivity @ leq(X,Y), leq(Y,Z) ==> leq(X,Z).
    N20406080O
    slim int0.3216.06929.34
    slim hlink
    slim hlink opt0.030.796.4228.79
    chr int
    chr int opt0.060.291.315.45
    • uniqはpropagationより時間がかかるため、こういう結果

2010-10-22

CHR bencnmark

2010-10-21

整数比較改めアトム比較の再々試

  • 条件をより同じにして再々試
  • slimhl395/101109/vartest.lmn
  • lmntal -O3 --slimcode --hl-opt atomcmp.lmn | slim --hl -
N8k16k32k64kO
slim int0.642.5210.0841.87N^2
slim hlink4.4927.58120.20607.76N^2
slim hlink opt0.020.030.060.12N
chr int3.4115.5070.15288.34N^2
chr int opt0.060.150.280.59N

コンパイラをコミット

  • hyperlinkをjava版コンパイラにコミットした

hyperlinkの出力

  • 併合されたhyperlinkを標準出力時にrootのファンクタで出力するようにした

2010-10-20

hyperlinkからのfindatom 改良版

  • 併合した異なる名前のhyperlink同士も比較できるように
  • 複数引数がある場合のバグを修正
    leq($x, $y), leq($y, $x).
  • 同一アトム内で分離が起こっている場合に対応
    leq($x, $x)
  • その他、いろいろ最適化


  • 整数比較を追試
    N10k20k40k
    hlink(追試)15.8778.59
    hlink opt(前回の)0.020.040.09
    hlink opt(今回の)0.030.050.10
    chr opt0.080.200.39
    • 探索にかかる操作や条件分岐が増えて遅くなるはずだったが、その分最適化もしたので、大きくスピードが落ちることはなかった

2010-10-12 その3

leq.pl(CHR)をhyperlinkで書いてみる

  • leq.pl
    ref @ leq(X,X) <=> true.
    ant @ leq(X,Y), leq(Y,X) <=> X = Y.
    ide @ leq(X,Y) \ leq(X,Y) <=> true.
    tra @ leq(X,Y), leq(Y,Z) ==> leq(X,Z).
  • leq_hl.lmn
    ref @@ leq($x, $x) :- .
    ant @@ leq($x, $y), leq($y, $x) :- hlink($x), $x \= $y | $x >< $y.
    ide @@ leq($x, $y), leq($x, $y) :- leq($x, $y).
    tra @@ leq($x, $y), leq($y, $z) :-
             uniq($x, $z) | leq($x, $y), leq($y, $z), leq($x, $z).
  • SLIMでの実行結果
    leq('!1', '!2'), leq('!2', '!1'), a('!1'), b('!2').
    *--ant@@-->
    '!1'(a). '!2'(b). @5
    == HyperLink ===============================================
             [func] [parent] [elem] [rank (direct child)]
     Name ----------------------------------------------------
                !1       !1      2      1 (2)
                !2       !1    ---      0
    ============================================================
    • a, bは変数名に相当、表から!1と!2が同じ集合に属していることが分かる

2010-10-12 その2

hyperlinkの使い方ページを少し整備

hyperlink SLIM側をbranchにコミット

2010-10-12

subversionでエラー

  • Let'sNoteの方からコミットしようとしたら、エラーが出て出来なかった。
    • 眠いから明日調べる
      commit -m "hyperlink branch (α-version)..." (19 paths specified)
         Failed to execute WebDAV PROPPATCH
      svn: Commit failed (details follow):
      svn: At least one property change failed; repository is unchanged
      RA layer request failed
      svn: Error setting property 'log': 
      Could not execute PROPPATCH.

2010-10-10

hyperlink compiler側をコミット

  • devel/sample/seiji/hyperlink_*.zip

2010-10-08

  • 班ゼミ
    • ファンクタの数が足りなくなるのはどうしよう→とりあえず棚上げ
    • コミットしなきゃ
      • slimのリーク取り→コンパイラのコミット→slimのコミットの順にやるか
  • hyperlink branch
    • "branches"を右クリ、フォルダ新規生成
    • "trunk"内の"slim"をコピー、"branch"内の"新規生成したフォルダ"を右クリ、貼り付け

2010-10-07

hyperlinkを利用したfindatomの最適化

  • 動くようになったので、一旦測ってみた
    • unaryアトム比較
      • hlink opt : 今回の実装
        N10k20k40k80k
        hlink10.10
        hlink opt0.090.170.36
        chr opt0.080.200.390.80
      • (※hyperlinkの数が足りない)
      • 微妙に勝ってる?いやどっこいどっこいか
      • もっとちゃんと実装すれば、もう少し早くできる気がする
  • 追試:ガードにhlink(unaryでも可)チェックを入れた場合
    N10k20k40k80k
    hlink opt0.020.040.09
    chr opt0.080.200.390.80
  • かなり早い
  • TODO:膜を貫くリンクに接続している場合のhyperlinkアトムの処理の整備

2010-10-04

findproccxt

  • 特定のアトム引数(型付きプロセス文脈)同士が同じ構造を持つことを示す中間命令
    • 生成時は適当に挿入、最後にcompile/Optimizer.javaにてfindatomよりも前に並び替えてる
a($x), a($x) :- ok.
-------------------------------------------------
    --memmatch:
       spec           [1, 3]
       findproccxt    [1, 0, 2, 0]
       findatom    [1, 0, 'a'_1]
       findatom    [2, 0, 'a'_1]
       neqatom        [2, 1]
       jump           [L118, [0], [1, 2], []]
  • ソースコード中に書いた説明書き
/** findproccxt [atom1, length1, arg1, atom2, length2, arg2]
 * アトム番号atom1(価数=lenght1)の第arg1引数の型付きプロセス文脈が、
 * アトム番号atom2(価数=lenght2)の第arg2引数の型付きプロセス文脈と同名であることを示す
 * 必ず(atom1,arg1)がオリジナル、(atom2,arg2)が新たに生成された名前になるよう配置されている
 */

2010-09-29

同名型付きプロセス文脈の分離

  • --hl系オプションでのみ使用できるように変更 (2010-10-10)
    • さらに--hl-optオプションを付けることで、ガードに自動的にhlink型チェックを挿入し、ground対groundの構造比較をファンクタ対ファンクタで済ますようしている
  • ヘッドに膜がある場合の操作が抜けていたので修正(2010-09-30)


  • これまでは一つのルール内で同名の型付きプロセス文脈は記述できなかったが、以下の様に変更した
a($p), a($p) :- ...  →  a($p), a($p0) :- $p = $p0 | ...
  • シンタックスシュガー的なもの
    • コンパイル時に自動的に右側に変換してくれる
  • 元の名前の後ろに数字をつけて新しい名前にしている
  • もちろん、以下の場合も考慮してある
a($p), a($p), a($p0) :- ...  →  a($p), a($p1), a($p0) :- $p = $p1 | ...

2010-09-25

hlinkのコピーと削除

  • アトム(hlinkアトム)を10000*N回ずつコピー&削除する
    • atom : a(b)
    • hlink : a('!1')
      N100200400800O
      atom1.1932.3374.6409.240O(N)
      hlink1.7573.4776.94713.803O(N)
      • オーダーは変わらない
      • hlinkアトムの生成・削除には要素数の増減処理が伴うため若干時間がかかる
      • 他にも原因があるかな?
  • copy_and_delete.lmn
    {
    i(10000, 800). a(b).
    
    
    //new   @@ i(I, M), a($x) :- I > 0, I1 = I-1, unary($x) | i(I1, M), a($x), a($x).
    //del   @@ a($x), a($y) :- unary($x), unary($y) | a($x).
    
    hlinit @@ a(b) :- new($x) | a($x).
    newhl @@ i(I, M), a($x) :- I > 0, I1 = I-1, hlink($x) | i(I1, M), a($x), a($x).
    delhl @@ a($x), a($y) :- hlink($x), hlink($y) | a($x).
    
    }.
    
    {i(0, I), $p, @p}/ :- I > 0, I1 = I-1 | {i(10000, I1), $p, @p}.

2010-09-24

集合の要素を数えるのにかかる時間

  • (10000個の要素を持つ)集合の要素数をN回数えた時間を計測[sec]
    • mem:膜を一つの集合、内部のアトムを集合に属する要素とみなす
    • hlink:hyperlinkによって集合を表す
      N1000200040008000160003200064000
      mem3.847.7415.5131.11
      hlink0.0030.010.020.030.050.100.21
      • hlinkは自身につながる要素数を常に保持しているので、まぁ当然の結果
  • num_mem.lmn
    {
    i(10000). num(0).
    i(I) :- I > 0, I1 = I-1 | i(I1), a(I).
    }.
    
    a2b{i(1000). num(N), a(X) :- N1 = N+1 | num(N1), b(X).}.
    b2a{i(1000). num(N), b(X) :- N1 = N+1 | num(N1), a(X).}. 
    
    {i(0), $p, @p}/, a2b{i(I), @q} :- I1 = I-1 | 
      count{$p, @q}, a2b{i(I1)}, '$callback'(gettime, start).
    
    count{num(N), $p, @p}/, a2b{$q}, b2a{i(I), @r} :- int(N), I > 0, I1 = I-1 |
      count{num(0), $p, @r}, a2b{$q, @p}, b2a{i(I1)}. 
    
    count{num(N), $p, @p}/, b2a{$q}, a2b{i(I), @r} :- int(N), I > 0, I1 = I-1 |
      count{num(0), $p, @r}, b2a{$q, @p}, a2b{i(I1)}.
    
    a2b{i(0), @p}, b2a{i(0)} :- '$callback'(gettime, end).
    
    end(E), start(S) :- R = E-.S | time(R).
  • num_hl.lmn
    {
    i(10000).
    i(I) :- I > 0, I1 = I-1, new($h) | i(I1), e($h), a($h).
    e($x), e($y) :- $x \= $y | e($x), $x >< $y.
    }.
    
    i(10000).
    
    {i(0), e($h), $p, @p}/ :- hlink($h) | count{$p}, '$callback'(gettime, start).
    
    count{a($x), $p}, i(I) :- I > 0, I1 = I-1, $n = num($x) | 
      count{a($x), $p}, i(I1), num($n).
    
    i(0) :- '$callback'(gettime, end).
    end(E), start(S) :- R = E-.S | time(R). 
    
    end(E), start(S) :- R = E-.S | time(R). 

--showhl

  • hyperlink詳細出力用オプションをこっそり追加
    • 出力フォーマットも一新

その他

  • conameは現状では要素数に含めるようにしている
  • hyperlinkと9/14の変更をローカルのslimにマージ

2010-09-22

  • 集合内の「要素数」の定義
    • !1〜!5までのname(各1個)からなる集合に、coname !-1を与えたとき、この集合の要素数はどうなるんだろうか
      • 5個なのか5+1個なのか
    • conameは要素として数えるべきかどうか、ちょっと考えた方がいいかも
  • memo
    • add
      • alloc.c/lmn_new_atom(lmn_copy_satomなども含)
    • sub
      • alloc.c/lmn_delete_atom

2010-09-18

  • 9/14の変更をコミットした
    • 状態数も正常みたいだし、多分大丈夫だろう

2010-09-17

--showrule

  • ruleset idの後ろに、ruleの中身を続けて出力するオプションを忍び込ませた
    • 一度も反応しなかったルールは何も表示されない(何らかのruleがあるということは分かる)
    • StateViewer?でもオプション指定すれば使える
      a(b(c)), a(d(e)).
      rule @@ a(X) :- uniq(X) | ok(X).
      ok(X) :- uniq(X) | .
      aaaa :- bbbb.
      --->
      @5/[rule"b(c,a):""d(e,a):"][_okXu"b(c,ok):""d(e,ok):"][]

2010-09-14

久しぶりにuniq

  • 膜のダンプでrulesetsのポインタではなく、ruleが持つ履歴の内容を全て突っ込む方式に変更
    • したつもり。チェックは明日以降。

2010-09-10

  • hyperlink等価性判定のバグを修正
    • 「conameを持つname」と「coname」との比較など
    • memo : hyperlink等価判定に関わる命令列
      • samefunc
      • eq/neqfunc
      • eq/neqground

2010-09-06

  • よくよく考えたら、rankはnameの子数であって、要素数とは違う
    • 任意の集合に属するhyperlinkの本数(非hyperlinkアトムへの接続箇所)を数えられるようにした
  • 予約語用のファンクタが20個くらいあるので、使用できるhlink idは65536個より若干少ない

2010-08-31

  • TODO:reverseを一時コメントアウトしておく

2010-08-30

  • lmn_eq_funcにLMN_FUNCTOR_ATTRの場合分けを追加
    • 他にも場合分け追加しなきゃいけない所がたくさんある
  • 初期化関数で全て初期化してしまっていたのを最適化した

2010-08-20

  • coname-coname, name-coname間の併合処理を実装
    • 比較演算の修正はまだ
  • そろそろhyperlink手動のfindatomと、parserを変更して同じプロセス文脈名が3回以上出現を許す、辺りの検討を

2010-08-19

  • coname管理方法を変更
  • st_get_entry関数を若干修正
    • レコードではなくキーを取得するようになっていた

2010-08-18

  • 細かな所でバグが...
    • ランクの再計算を修正
    • conameの管理方法の変更を検討中、配列よりハッシュ表の方がいいかも

2010-08-13

  • 反転処理:リンクの繋ぎ換えでおかしかったところを修正

2010-08-12

LMN_FUNCTOR_ATTRと型検査の兼ね合い

  • newとintなどを組み合わせるとおかしくなる
  • そのうちやる

2010-08-10

  • リファクタリング

2010-08-06

要素数の取得

  • 任意のhlinkが所属する集合の要素を取得する
    a($h) :- $n = num($h) | n($n).

new制約

  • 0入力制約関連のバグを自己解決

name-conameの反転

  • "-"をつけることでボディで反転できるように
    • nameからconameへの反転は、conameを持つ場合のみ可能
      a(!1). a($h) :- name($h) | a(-$h). 
      ---> a(!-1).

2010-08-05

hyperlink生成

  • ガードではシンボルアトムを生成しないというSLIMの作りに則っていたが、それだと次のようなガードが書けない
    ... :- new(X), Y = setconame(X) | ...
    • ガードでアトム生成できるようにするなり、ちょっと見直しが必要

2010-08-03

ボディで併合できるようにした

  • 演算子:"><"
    • name-name, coname-coname用
    • bow tieっぽく見える
      a($x), b($y) :- $x \= $y | a($x), b($y), $x >< $y.
      • name-coname用には">>","<<"あるいは"<-","->"かな

2010-07-30

論理変数の状態

  • 値や属性を持たない
    • これを初期状態とし、下のどちらかの状態に移行可能
  1. 値や属性を持つ
  2. 他の変数と併合される
    • 値や属性の代わりに相手変数への参照を持つ

Attribute variable

  • 属性の実装はどうやっているのか、ちょっと調べてみる

2010-07-29

conameのunify

  • 異なる値を持つ変数同士の併合は失敗
  • conameのみで存在することは無い、とするとconameの生成はnameありきの構文にしたほうがいいのか

2010-07-23

hyperlink

  • name<->name関連機能は大体実装した...か?
    • 木で集合を管理
    • rankやパス圧縮を用いて多少は効率良いようにしてみた
  • 次はco-name<->name関連をぼちぼちと

co-name

  • 必要そうな操作と、構文妄想
    • co-nameの生成
      • co-nameを生成する=対応するnameがすでに生成されているはず?
      1. (name型である&&co-nameを持たない)=>co-name生成?
      2. name型である=>co-name生成=>(co-name2つ以上持つ=>co-nameの併合)?
    • nameがco-nameを持つかどうかの検査
      • a($h) :- hasconame($h) | ...
      • $hがname(hlink)である=>$hがco-nameを持つかどうか
    • nameからco-nameを呼び出す
      • a($h) :- getconame($h) | ...
      • $hがname(hlink)である=>$hがco-nameを持つ=>$hにco-nameを結びつける
    • co-name型検査
      • a($h) :- coname($h) | ...
    • name->co-nameの併合 (=co-nameの無いnameにco-nameを結びつける)
      • a($x), b($y') :- $h = $x >> $y' | a($h), b($h). ('付きはco-name)

co-nameの属性を扱う構文

  • (!-1 > 3), (!-2 < 5)というco-name!-1,!-2を併合する
    • andとorの区別をつけられるようにする必要はあるか?


  • memo
    • before
       1: func  !1  200, parent   1, rank   7
       children >>  2  3  5
       2: func  !2  202, parent   1, rank   0
       3: func  !3  204, parent   1, rank   1
       children >>  4
       4: func  !4   23, parent   3, rank   0
       5: func  !5  207, parent   1, rank   3
       children >>  6  7
       6: func  !6  209, parent   5, rank   0
       7: func  !7  211, parent   5, rank   1
       children >>  8
       8: func  !8   25, parent   7, rank   0
       9: func  !9  214, parent   9, rank   1
       children >> 10
      10: func !10  216, parent   9, rank   0
    • after 4,8からrootを探索
       1: func  !1  200, parent   1, rank   7
       children >>  2  3  4  5  7  8
       2: func  !2  202, parent   1, rank   0
       3: func  !3  204, parent   1, rank   0
       4: func  !4   23, parent   1, rank   0
       5: func  !5  207, parent   1, rank   2
       children >>  6
       6: func  !6  209, parent   5, rank   0
       7: func  !7  211, parent   1, rank   0
       8: func  !8   25, parent   1, rank   0
       9: func  !9  214, parent   9, rank   1
       children >> 10
      10: func !10  216, parent   9, rank   0

2010-07-16

hyperlink仕様まとめ

2010-07-15

  • 班ゼミ用現状メモ
  • hlink用演算子が決まらない

name, coname

  • 名前の決め方
    • name : "!" + 0,1,2,...
    • coname : "!!" + (nameから求めたファンクタid)
  • 実装方法案
    • どちらも基本的に今までのファンクタ
      • 属性付き変数を導入するなら、
  • 対応関係
    • ハッシュテーブルで関係を保持(親-->子、子-->親)
  • 記法案
    • name-->coname取得
      a($h) :- coname($h) | a(

hlink生成

  • 本命:bodyで生成
    • コンパイラ読み+改造中
  • 次善策のnew制約
    hoge, hoge.
    hoge :- new($h) | a($h), b($h).
    *--> a('!0'), b('!0'), a('!1'), b('!1').

併合

  • merge用演算子
    a($x), b($y) :- $h = $x =$= $y | a($h), b($h).
    • #なのはいかがなものか

memo

  • hlinkの実装方法
    • SLIMではガードでsymbolアトムを生成出来るようになっていなかった
    • 通常の(symbol)アトムとして名前をつけるか
    • データアトムの一種とする(単なる数値)か
      • Attrにhlink用の属性を新たに用意するか

2010-07-09

JFlex.jarとjava_cup.jar

  • java_cup.jarの方はsrc/compiler/parser/に移動して実行しないと、parser.javaが正しいディレクトリに生成されないみたい

"=="演算子

  • '=='をunary型同士の比較演算子にしようという話(cf.先生wiki)
    • '=','\='はground、'=:=','=\='はint
    • unaryのnot equalに関して(src/compile/GuardCompiler?.java, l.363)
// .. :- unary(A),A\=B | ..
//の場合、Bがgroundで構わない。Aがunaryで、かつBが異なる構造の時に反応する。
//この点は、==とは違う。==の場合、そもそも同じ型でなければマッチしないため。
//Bがunaryの時に限定したければ、unary(B)を書き加えればよい。
//(何も考えずに実装したらそうなったのだが、結果的に一番柔軟で直感的な形だと思う。)
  • 実装変更後の中間命令列
    a($x), b($y) :- $x == $y | ...
    -------------------------------------------------------------
    --guard:L118:
    	spec           [3, 5]
    	derefatom   [3, 1, 0]
    	isunary        [3]
    	derefatom   [4, 2, 0]
    	isunary        [4]
    	samefunc       [3, 4]
    	jump           [L103, [0], [1, 2, 3, 4], []]

hlinkのmerge

  • 併合はどういう状況で使うだろうか
    • $x,$yが異なる集合に属していれば併合する、というルールは割と書きそう
  • merge版と'=='/3演算子版で書いてみる
  a($h1), b($h2) :- merge($h1, $h2) | a($h1), b($h2).
  a($x), b($y) :- $x \= $y, $h = $x == $y | a($h), b($h).
  • '=='版の方がLMNtalっぽい気はする
    • ただ、'=='版だとこういうルールも書けることになる
  a($x), b($y) :- $h = $x == $y | a($h), b($h).
  • この場合、$x,$yが既に併合されていようが構わず併合するルールになる
  • 既に同じ集合に属しているhlink同士を併合しようとした場合はどうなるのか?
  • merge制約は「既に併合されているhlink同士を引数に持つとFALSE」という、制約の様な役割を持たせるようにしてある
    • ただ、データ構造上はグラフの書換えが起こらないのに、併合操作で余計な状態遷移が生じるのはあまりうれしくないかも間違い、hlinkの併合前と併合後は別の状態だから1ステップかかってもいいのか、まぁそれがmerge制約を推す決め手にはならないが
  • 同じ集合に属するhlink同士の併合の意味を決めて'=='にした方がいいかもしれない

2010-07-08

hlink型

  • 基本的には(プログラム上は)unary型
    • ファンクタの最初の3文字が"$hl"である(かつ親ファンクタへのアドレスを持つ)
      • rootファンクタは親ファンクタ=自身のアドレス
      • 他の通常ファンクタは親ファンクタ=NULL
      • あるいは単純にroot(非hlink型含)ファンクタはNULLでもいいのかも
  • 他の型との関係はこんな感じ?
    hlink ⊂ unary ⊂ ground
    hlink ≠ data(int, double, ...)
  • ガード制約、一応作ってみた
    hlink(X) : hlink型検査
    newhl(X) : hlink atom生成、中間命令列は昨日のhlinkと一緒
               hlink型だと適用しない(not_hlink検査)の役割も持つ

併合

  • システムルールセットで行なう方法、演算子"=="
    • ルール適用のタイミングで、ユーザの思い通りにいかないことがある、却下
  • ボディで行なう方法、演算子は"=="にしようかな
    a($h1), b($h2) :- 
      hlink($h1), hlink($h2) | a($h1), b($h2), $h1==$h2.
    • unify("=")のように、中間命令列を変えるか、実装が少し面倒
    • 加えて、分子'=='($h1,$h2)が自動的に消去される、ちょっと不自然?
      • さらに問題、上のルールは無限ループする
  • ガードで行なう方法、例えばmerge制約とか
    a($h1), b($h2) :- merge($h1, $h2) | a($h1), b($h2).
    • 併合操作は、併合するファンクタの名前だけ取得できればよい
    • ボディで分子を不自然に消さなくて済む上に、実装も楽
      • 既に併合されている集合に属するhlink同士は結合できない、とかにすれば無限ループも防げる
    • ただガード制約が増え過ぎな気もする

等価判定(naive)

/* $h1, $h2どちらか一方にhlink(unary)チェックを施す */
a($h1), b($h2) :- 
  hlink($h1), $h1==$h2 | a($h1), b($h2).
  • 等価判定(optimize)は中間命令列を変更しないでSLIM側だけで可能かな?うーんよく考えないと

hyper link for nd

  • とりあえず放置したい、やるなら状態ごとにファンクタの親子関係管理をさせないといけないかな

2010-07-07 その2

  • hlink型制約は必要かな
    hlink atom生成  : newhl($h) に変更
    hlink型チェック : hlink($h)  とか?
    • unary型チェックの中で無理やりhlinkを識別することはできる
  • 現在、BODYでの"="と"=="は共にeqground
    • "=="をhlアトム専用にする?
      ... :- unary(X), unary(Y), X==Y | ...
      -------------------------------------
       derefatom   [5, 3, 0]
       isunary        [5]
       derefatom   [4, 2, 0]
       isunary        [4]
       samefunc       [5, 4]

2010-07-07

  • 以下、未コミット

hyper link atom 生成

  • コンパイラ側
    • hlink制約
      • hyper link atom (hlアトム) : アトム名($hl + ID)を持つ1引数アトム
        a($h) :- hlink($h) | b($h).
        ------------------------------------------
        if ($h == hlアトム) {
          ルール適用失敗
        } else {
          $hから求めたIDをもつhlアトムを生成
        }
      • hyperlink用中間命令
        /** hyperlink [atom, mem]
         * $memに所属する$atomをhyperlink atomに置き換える
         */
  • SLIM側
    • ゆくゆくはhlアトムをdataアトム(のspecialアトム?)にして処理を簡単にしたいところ
    • ファンクタをUnionFind?のように親子関係を持たせるようにした
      • 試しにsamefunc命令の中でhlアトムの比較だけ別の処理をさせるように変更
      • 親子関係を反映した等価判定ができた
        a(X), b(Y) :- unary(X), unary(Y), X==Y | .
  • memo
    • Instruction.java
    • GuardCompiler?.java

2010-07-05

  • memo
    • hylink atomはint型じゃないから==の両引数に指定しても大丈夫

2010-07-01 その2

班ゼミ

  • hylinkの生成はガードで
    • 一度考えて、おかしいと思ってたけど、確かに+や-をガードでしてるか

2010-07-01

hyper link

  • (再掲)
    1. hylinkを新規生成
    2. 2つのhylinkの等価性判定
    3. 指定したhylinkの出現の列挙
    4. 指定されたhylinkに繋がるアトムの(効率的)探索
    5. hylink同士の併合
  • 金曜から進んだところまで
    • 1、5をシステムルールセットで
  • 1. ハイパーリンクアトム(仮)の生成
    a(hL(abc)), b(hL(1)).  
    <==> a('$hL62'). b('$hL236').
    • 今のところcallback関数使用システムルールセットにて
    • 62, 233はhL(N)のNをlmn_internに投げて得られる値
  • 5. ハイパーリンクの併合
    // '$hL'(HYLINK1, HYLINK2) : HYLINK1と2が併合される
    a('$hL61'). b('$hL236'), '$hL'('$hL61', '$hL236').
    {b('$hL236')}.
    <==> a('$hL61'). b('$hL61'), {b('$hL61')}.
    • システムルールセット
      • hylink_unify : $hL_2に繋がったアトムのファンクタを記憶
      • hylink_unify2: 記憶したペアの併合を現在膜+子孫膜全てに対して行なう
  • もろもろの記法をそろそろ決めていきたいところ
    • 新規生成:hLでいいのか、引数は取るか
      • リンク名ならぬハイパーリンク名は代表要素でいいとする(引数を取らない)と、代表要素の無いhylink(つまり無向)は名無しのハイパーリンク(内部的には一意のidなりが付く)になる
        a(hL) <==> a('$hL0') とか?
  • 併合:hylink同士を接続するわけだから、=が自然?
    • unifylinks命令
      $hL = $hL
  • hylinkの比較
    a($p), b($q) :- $p = $q | ...
    a($p), b($p) :- ...  
    • 上の方を採用して、マッチング最適化については内部で頑張らせる方がいいのかも
  • ゆくゆくは属性付き変数を表現する(したい)
    • 属性の情報は階層に属するものではないと思う
    • 属性を表すアトムをハイパーリンクアトム(仮)に直接繋げるやり方はちょっと無理があるかな

2010-06-28

  • 体調悪い

ハイパーリンク

  • 5.全ての膜に作用するシステムルールセットを書いてみた
    • hylinkのunionを表現できる

2010-06-25

ハイパーリンク

  • 上田先生との個別ゼミを個人的に整理してみる
    • hylink(かっこいいから「ハイパー」って言いたい気もする)
  • 実装方法より先にどういう機能を持つのか
    • (拡張)unaryアトムで表現するとしてまとめる
      • アトムが目に見えない(抽象的な)形で互いに接続し合っている
      • つまり、今までの様に膜で表すと
        a($h), b($h) :- ... .
        <==> a(H1), b(H2), h{+H1, +H2} :- ... .
  • 機能
    1. hylinkを新規生成
      a(newhl), b(newhl) 
      --(内部的に)--> a(hyperlink0), b(hyperlink0). とか
    2. 2つのhylinkの等価性判定
      a($p), b($q) :- $p = $q | a($p), b($p). とか
    3. 指定したhylinkの出現の列挙
    4. 指定されたhylinkに繋がるアトムの(効率的)探索
      • unary方式そのままではマッチング効率化は実現できない
      • 適切な索引(index)構造なんかがあるとよい
    5. 指定されたhylink同士の併合(merge, union)
      • システムルールセット的なもので併合元のアトムを併合先のアトムに書き換える
  • 最短の実装を考えたとき、まずどれをやるか
    • 1. 5.

2010-06-24

hylink、SLIM側のみでやる場合

  • 実現方法がいくつかある(1-3は膜を使う)
    1. システムルールセット、モジュールで済ませる
      a(!p) :- a(HL), {name(p), +HL}.
      • !を付けるのはアトムなのかリンクなのか
    2. 中間命令列の変換
      		findatom    [1, 0, 'a'_1]
      		deref       [2, 1, 0, 0]
      		func           [2, '!p'_1]
      • func命令を、膜を使った構造を探してくる命令列に変換するとか
    3. 新中間命令
      • 2は現状の命令列を活用、3はhylink用の命令列としてまとめてしまう
    4. 新データ構造の追加
      • 様子を見ながら

その他

  • 気が早いが、!記法を入れるなら参考に
    • Flexこれこれ
      LinkName [A-Z_][a-zA-Z_0-9]  ==> "!"?[A-Z_][a-zA-Z_0-9]
  • 中間命令列眺める
    • link @@ a(X), b(X) :- c(X), d(X).
      	--memmatch:
      		spec           [1, 3]
      		findatom    [1, 0, 'a'_1]
      		deref       [2, 1, 0, 0]
      		func           [2, 'b'_1]
      		jump           [L103, [0], [1, 2], []]
    • hlink @@ a(X), b(Y), {+X, +Y, $p} :- c(X), d(Y), {+X, +Y, $p}.
      	--memmatch:
      		spec           [1, 10]
      		findatom    [1, 0, 'a'_1]
      		deref       [2, 1, 0, 1]
      		func           [2, $out_2]
      		deref       [3, 2, 0, 0]
      		func           [3, $in_2]
      		deref       [5, 3, 1, 0]
      		func           [5, '+'_1]
      		lockmem     [4, 3, null]
      		norules        [4]
      		findatom    [6, 4, '+'_1]
      		neqatom        [6, 5]
      		deref       [7, 6, 0, 1]
      		func           [7, $in_2]
      		deref       [8, 7, 0, 0]
      		func           [8, $out_2]
      		deref       [9, 8, 1, 0]
      		func           [9, 'b'_1]
      		jump           [L136, [0, 4], [1, 9, 8, 2, 5, 6, 7, 3], []]
  • hlink、単なる妄想
    a(!P), b(!P), c(!P), !-P = 3.
    • "!P"はなんか某エレキバンを思い出させる
  • uniq for nd
    • いくつかの例を動かしてみたが、おかしなところはなさそう
    • ただ他に漏れが無いか不安


  • ルール文脈
    • ヘッドにルール文脈2個書くとルールセット集合に2重にマッチングする事になるのか、知らなかった
      {rule1 @@ a:-b.}. {rule2 @@ c:-d.}.
      {@p}, {@q} :- r{@p, @q}. //2つの膜を結合
      r{@p, @q} :- @p, @q. 
      *---> @5,@5,@6,@6,@7

2010-06-23

時間計測用callback関数

  • &ref(): File not found: "timer.c" at page "研究日誌とうめき";
  • 追加の仕方:SLIM callback関連 メモ
  • 中身
    /* get_time function */
    
    # include <time.h>
    # include "../lmntal_ext.h"
    
    
    void gettime(ReactCxt rc,
                      LmnMembrane *mem,
                      LmnAtom a0, LmnLinkAttr t0)
    {
      double *t = LMN_MALLOC(double); 
    
      *t = (double)clock() / CLOCKS_PER_SEC;
    
      lmn_mem_newlink(mem,
                      a0, LMN_ATTR_MAKE_LINK(0), LMN_ATTR_GET_VALUE(t0),
                      (LmnWord)t, LMN_DBL_ATTR, 0); 
    
      lmn_mem_push_atom(mem, (LmnWord)t, LMN_DBL_ATTR);
    
    }
    
    void init_timer(void)
    {
      lmn_register_c_fun("gettime", gettime, 1);
    }
  • 実行例(bへの加算にかかる時間のみ測る)
    a(0).
    a(A) :- A<500000, A1=A+1 | a(A1).
    a(500000) :- b(0), '$callback'(gettime, start).
    b(B) :- B<500000, B1=B+1 | b(B1).
    b(500000) :- '$callback'(gettime, end).
    end(X), start(Y) :- Z=X-.Y | time(Z).

2010-06-22

uniq for nd

  • 膜のダンプ(--nd)に対応した、気がする
    • 膜が持つルールセット配列をバイナリストリングに書き込んでいる
      • membrane.hにゴミが入ってるよ!(gocho)
         atomlist_gelmn_mem_get_rulesett_record
      • 本当に、申し(略)
    • mem-encに対応させるなら履歴表の中身を全部書き込まないといけないかも
  • 発表資料
    • 概要のあとに発表の流れを置くのも中々いいかも

2010-06-21

  • 臨時班ゼミ
    • hyper link、flatLMNtalを対象にする方向で

2010-06-20

  • callback関数開発メモ
    • rev349_2をテスト用に

2010-06-16

  • SWI-Prologメモ
    -L0 : local stack no limit
    -G0 : global stack ...
  • 循環グラフを生成して一周辿る、もうちょっと細かく
    N1000200040005000600070008000
    atom0.020.020.050.08
    mem0.060.140.470.921.652.844.89

2010-06-15

ゼミ発表終了

  • ありがとうございました。
  • 膜をhlinkとすると、どこかの階層に属さなければならないのでは
    • どこの階層にも属さない、かつ自由に参照できるような何かがあるといい
    • ホントはint型とかもどこかに属していることは望ましくない
  • "-"の無いハイパーリンクはあんまいらないんじゃ?
    • ノード番号があるグラフは本質的にうれしくない
    • 抽象化のためにはいいかもしれない
  • 最適化、という側面からならもっと処理系内部をいじったほうが効果出る
    • ハイパーリンクやる意義をもうちょっと広く深く考えなければ

2010-06-11

昨日の班ゼミメモ

  • 多対多、という表現はなんかおかしい
  • +の方をデフォルトにして文字数減らすとか
  • 階層無視で作用するルールが無い
  • ルートからのプロキシアトムのツリーを作るとか
  • 集合演算の機能があんまりない、膜内のアトム数が分かるとか

2010-06-10

hyperlink : 妄想

  • 同じリンク名の3回以上の出現を許す、とする
    • =内部的には軽い膜でhyperlinkを表現している、とする
  • この二つの表現を分けたほうがいいのでは
    • a.多数と多数の接続関係(多対多)
    • b.多数が一つの共通データを参照している(多対一)
      • bはどちらかというと共有変数的な感じ、とりあえずデータの変更方法は後回し
  • まずは現状の(flatな)LMNtalでできそうなことだけ
  • a.
1.
%大文字膜名は無理だけど
a(!+P), b(!+P), c(!+P).  %% a(!P+), a(+!P).
<==> 
a(L1), b(L2), c(L3), P{+L1, +L2, +L3}.

2.
a(!+P), b(!+P), c.
a(!+X), b(!+X), c :- a(!+X), b(!+X), c(!+X).
<==>
a(L1), b(L2), P{+L1, +L2}, c.
a(L1), b(L2), P{+L1, +L2, $p}, c
  :- a(L1), b(L2), c(L3), P{+L1, +L2, +L3, $p}.

3.
%a,bとcが同じ集合に属するかを調べる
a(!+P), b(!+P), c(!+Q).
a(!+X), b(!+X), c(!+Y)
  :- !+X \= !+Y | a(!+X), b(!+X), ok(!+Y).
<==>
%_A, _Bは膜名変数みたいなものとする
a(L1), b(L2), P{+L1, +L2}, c(L3), Q{+L3}.
a(L1), b(L2), _A{+L1, +L2, $p}, c(L3), _B{+L3, $q}
  :- _A \= _B | 
  a(L1), b(L2), _A{+L1, +L2, $p}, ok(L3), _B{+L3, $q}.
  %%比較の効率を良くできないか

9. %膜内の+の個数をガード条件にする
   %javaには膜内アトム数を数えるガードがある?
a(!*P) :- !*P > 3 | ok(!*P).
<==>
a(X), _A{+X, $p} 
  :- \+($p=("-", $pp)), atomnum? > 3 | ok(X), _A{+X, $p}
  • b. -:[0,1]個, +:[1,inf]個とする ( -L は "-"(L) )
4.
%共有変数への値の代入、のような
a(!+P), b(!+P), !-P = 3.
<==> 
a(L1), b(L2), data(3, D), P{+L1, +L2, -D}.

5.
a(!-X) :- !-X =:= 3 | ok(!-X).
<==>
a(X), data(V, Y), _A{+X, -Y, $p} 
  :- V=:=3 | ok(X), data(V, Y), _A{+X, -Y, $p}.

  %これはどうなるんだろう...
  a(!+X) :- ground(!+X) | ok(!+X).

6.1.
%「この共有変数に値が束縛されていないなら5を代入する」
a(!-X) :- nonvar(!-X), !-X = 5 | a(!-X).
<==>
a(L), _A{+L, $p} :- 
  \+($p=("-"(A), $pp)) | a(L), data(5, D), _A{+L, -D, $p}.

6.2.
%「この共有変数に値が束縛されていないなら5を代入する」
a(!-X) :- nonvar(!-X), !-X = 5 | a(!-X).
<==>
a(L), _A{+L, $p} :- 
  \+($p=("-"(A), $pp)) | a(L), data(5, D), _A{+L, -D, $p}.
  • これらを階層構造がある中でやるするとこれを考える必要がある
    • c.任意階層から等しく参照できる(ルールで操作できる)
      • 一番やっかいかな
  • c.
7.
a(!+P), {b(!+P)}, !-P = 3.
<==>
a(L1), {b(L2)}, data(3, D), P{+L1, +L2, -D}.

%bがある膜内で
b(!-X) :- int(!-X) | ok(!-X). 
<==>
b(X) ... %% 無理
  • (b-3と)cが現状のLMNtalではうまくいかない、かな
    • そもそも階層クラスタグラフ(だっけ?)にhyperlinkがあるというのは、どうなるんだろう
    • プロキシアトムをうまく入れることでどうにかならないかなぁ
    • dataにデータアトムが結びついているときは配列で管理とか

2010-06-09

  • 軽い膜を入れるとすると
    • +/-アトムのみ持てる
    • 子膜、ルールは持てない
      • この辺りはずっと言われてること
    • 多階層から(等しく)参照できる
      • グローバル変数的な、プロキシアトムを調節することでうまくいかないか
    • (なんらかの形でdataを持ってるとして)同じdata持つもの同士をどう扱うのか
      • 同じなら結合させるのか、
      • 軽い膜自体の管理方法に大きく関わってくる
    • 参照カウント(+アトムの数)を利用
    • パラメタ付けによる入出力、共有/非共有の表現
      • 上田先生の論文(これの19番64枚目あたり)にあるけども
  • 膜 → 軽い膜(内部構造、単純に)
    親膜への*p          
    兄弟膜への*p        
    代表子膜への*p      → 廃止
    アトムリスト管理ハッシュテーブル → -/+管理のみで済む
    アトム数               
    ルールセット配列          → 廃止

2010-06-08

  • ゼミ発表資料作成を試みる

2010-06-04

  • 無かった理由として、膜を使えば書けちゃうから必要ないでしょ、がある
  • 今の膜のままじゃいけない理由をはっきりさせておく
    • リンク同士の節点に使うには重い
    • どの階層からも等しく参照できるような(グローバルな)ことは出来ない(やりにくい?やろうと思えば出来そうかな..)
      • 最初はフラットな場合を想定した方がいいんだろうけど、
    • (LMNルールで)同じ要素を持つ膜を結合する時にO(膜の数^2)になるんじゃ?

ubuntu : 起動できない

  • 更新したらboot時にgrub画面になって起動しなくなった
    01,grub>ls
    02,grub>ls (hdX,Y)             #find ubuntu partition
    03,grub>insmod ntfs           #load ntfs module
    04,grub>set root=(hdX,Y)
    05,grub>ls $Boot                   #find BOOT partition's UUID
    06,grub>search --no-floppy --fs-uuid --set xxxxx # 05で出たUUIDの後ろの文字列 
    07,grub>loopback loop0 /ubuntu/disks/root.disk 
    08,grub>set root=(loop0)       #reset loop to loop0
    09,grub>linux /boot/vmlinuzxxxxxxxxx  root=/dev/sda1 loop=/ubuntu/disks/root.disk ro #load kernel
    10,grub>initrd /boot/initrd.imgxxxxxxxxxxxx
    11,grub>boot 
  • で無事復活
  • あとはubuntu上で前回と同じようにカーネルのバージョン2.6.31-20より新しいやつをコメントアウト

2010-06-03 2

班ゼミにて

  • やっぱり膜をユニオンする、あるいはそれに相当する何かがあったほうがいいのではないか
    • 普通の膜よりも軽い膜、あるいはハイパーリンクがほしいかもしれない
    • どういうルールになったらエレガントなのか、ちょっと書いてみるといいかも
    • 見た目は変数3つ許すけど、実は軽い膜を介しているようなシンタックスシュガーはあるとうれしいかも

2010-06-03

CHR : dijkstra(optimize) 測りなおし

  • クエリはRand4 (edge=node*4)
    node128256512102420484096
    normal0.230.662.168.42out of stack
    type/mode_array0.130.311.223.86out of stack
    lmn(素直にencode)7.9547.21320.722719.33

膜による擬似共有変数について(昨日の続き)

  • 昨日は初期グラフを生成する時に、既に変数(膜)とアトムが結びついた状態で生成していた。が、実際のlmnプログラムで使おうと思うと、(単純に考えてだけど)例えば1を持つアトムを
    a(1) :- a(A), {value(1), +A}.
  • という感じで変換した後に、value(1)を持つ膜が複数あれば結合する=共有変数化するという作業が入ってくる。
    {value(X), $p}, {value(Y), $q} :- X=:=Y | {value(X), $p, $q}.
  • これじゃ結局、昨日の'lmn'ルールみたいにガードで整数を比較する作業を全ての値に対して行う必要が出てくる訳で、計算量的には何も改善されないんじゃなかろうか。
    • ちなみにvar moduleを使うと、(最悪の場合で)n=10000で155.21[sec]だった。
  • で、まぁそれがデータ(膜)のunionの話に繋がりそうななさそうな。

CHRのエンコードでどうしても膜を使ってしまう例

  • aを全て消した後にflagを消す。
  • chr
    a, a, a, flag.
    flag \ a <=> true.
    flag <=> true.
  • lmn
    {
      a, a, a, flag.
      flag, a :- flag.
    }.
    {flag, @p}/ :- .

2010-06-02

実験 : LMNtal vs CHR (整数の比較)

  • 同じ値を持つアトムの組を見つけて消す
  • lmn(SLIM rev354) -O3
    % A,Bの値をガードで比較
    lmn  @@ a(A), b(B) :- A=:=B | .
    % A,Bが等しいことがヘッドで分かっている
    lmnV @@ a(A), b(B), {value(N), +A, +B} :- int(N) | .
  • chr(SWI-prolog 5.8.3)
    % 制約の宣言はmode/type無し、mode/type有り、mode/type(dense_int)の三種類
    chr @ a(X), b(X) <=> true.
  • クエリ(計算量最悪になるように)
    %lmnとchr3種類用
    a(1), a(2), ..., a(N).
    b(N), b(N-1), ..., b(1).
    
    %lmnV用
    a(A1), b(B1), {value(1), +A1, +B1}, ...(N番目まで)
  • 実行時間(sec.)
    N10000200004000080000
    lmn1.023.9816.0966.76O(N^2)
    lmnV0.090.150.300.57O(N)
    chr5.4025.57105.49out of stackO(N^2)
    chr(mode/type)0.120.250.521.28O(N)
    chr(mode/type_array)0.080.200.390.80O(N)
    • この例題に関しては、膜を使って擬似的な共有変数を表現したSLIMの方が若干早い
    • ただ膜で変数を表すと、複数の階層間で共有させることは難しいんじゃなかろうか
    • また今回はlmnVはO(1)で同じ値を見つけてこれるが、より多くのアトム(制約)が共通の変数を持っている場合にはその限りではない

CHR : option

:- chr_option(Option, Value).
  • Option = check_guard_bindings, Value = on/off
    • off : default
    • on : ルールのガードで変数へのillegalな束縛があった場合に実行中断
    • 例えば次のルールにquery1, query2をそれぞれ与えると以下の様
    start(X) <=> X=1 | end(X).
    
    % query1 : 正常 (Xの値と1を'比較'している)
    start(1), start(2). 
    *---> end(1), start(2).
    
    % query2 : 中断 (Xという変数に1を'束縛'してしまっている)
    start(X). 
    *---> 
    start(_G25417)
    X = _G25417{user = ...} ;
    No
  • Option = optimize, Value = full/off
    • off : default
    • full : all available optimizations
    • ↓のdebugモードと一緒には使えない
      • offとfullの中間は無いんだろうか?
  • Option = debug, Value = on/off
    on  : default
    off : optimizeを使うときは自動的にこれ?

CHR : その他

  • ERROR: =</2: Arguments are not sufficiently instantiated
    • =< の両側の変数に値が束縛されていない
  • findall_constraint/3 (shceduling.pl)
    • 謎。

2010-06-01

CHR : optimize option

  • type/modeが使えるようになった!
    • 実行オプションつけなきゃいけなかった、書いとけよそういうの!
      :- chr_option(optimize, full)
    • onやoffでもなく、fullなのがよけい分かりにくくしている
    • ちょっと測っただけだが、整数を扱うプログラムが相当に速くなっている様子、明日測ろう

ヒープ

  • orderは次数と訳すのが自然?

2010-05-28

CHR : Union-Find algorithm

  • とりあえず問題の内容をもう一度理解
  • 単純なもの、最適化されたものをlmnにエンコード
    • 集合を膜で表すことは可能なんだろうか?

memo

  • 参照カウント、マークアンドスイープ

2010-05-27

CHR : dijkstraのtype/mode

  • 論文の方ではtype/modeの有無で計算量が変化しているが、手元のSWIprologでは動いているのかよく分からない
    • dense_intを使うと実行時間が変わる(逆に遅くなったけど)結果があったから、何らかの影響は出ているようだ、でも謎
  • 他にはUnion-findでもIndexが使われているようだ

CHR : partner(passive)constraintの探索

  • 共有の変数をうまく利用してパートナーの探索を早くしてほしい、誰かに

2010-05-26

OpenOffice?:対数グラフ

  • 書式→軸→Y軸→スケールタブ

2010-05-24

  • いろいろ整理

dense_int

  • ハッシュベースの制約ストアとは別に、配列形式の制約ストアを用意し、そこにdense_int型でインデックス付けして格納する
    • ハッシュの計算回数を減らせる、衝突を避けることができる
    • インデックスに使われる整数の個数が[0,n]間である程度多い(濃い=dense)場合に効果を発揮する、らしい
  • Indexing tequnicとの関係をもう少し見たい
    • chapter 9 join orderingも参考程度に
  • dijkstra_fheapの計測

ほか

  • prologのマッチングはどうなってる?
  • edge(X,Y)形式だと計算量はどうしても多くなる
    • アトムの引数の数をルールの条件にできたら...

2010-05-19

callback : graph_gen_nocycle_uniq

  • dijkstraのプログラムは与えるグラフに色々注文が多い
  • 閉路無しかつ同じedgeが2つ以上存在しないグラフを生成
    • 関数名がおもいつかない
void graph_gen_nocycle_uniq(ReactCxt rc,
               LmnMembrane *mem,
               LmnAtom a0, LmnLinkAttr t0,
               LmnAtom a1, LmnLinkAttr t1,
               LmnAtom a2, LmnLinkAttr t2,
               LmnAtom a3, LmnLinkAttr t3)
{
  int n = (int)a1, m = (int)a2, r = (int)a3;

  LmnSAtom sa;
  const char *s;


  if (LMN_ATTR_IS_DATA(t0)) {
    switch (t0) {
    case LMN_INT_ATTR:
      break;
    case LMN_DBL_ATTR:
      break;
    default:
      break;
    }
  } else { /* symbol atom */
    s = (const char *)LMN_SATOM_STR(a0);
  } 

  int a[m], b[m];
  int i, j, k, flag = 0;
  srand(time(NULL)); 

  for (i = 0; i < m; i++) {
    a[i] = rand() % n + 1;
    if (a[i] == 100) a[i]--;
    b[i] = a[i] + rand() % (n - (a[i] - 1));
    if (a[i] == b[i]) a[i]--;
  } 


  while(!flag){
    flag = 1;
    for (i = 0; i < m; i++) {
      for (j = 0; j < m; j++) {
        if (i != j && a[j] == a[i] && b[j] == b[i]) {
          a[j] = a[j] / 2;
          b[j] = a[j] + rand() % (n - a[j]) + 1;
          flag = 0;
        }
      }
    }
  }

  for (i = 0; i < m; i++){

    sa = lmn_mem_newatom(mem, lmn_functor_intern(ANONYMOUS,
                                                 lmn_intern(s),
                                                 3)
                         );
    k = rand() % r + 1;
    lmn_mem_newlink(mem,
                    sa, LMN_ATTR_MAKE_LINK(0), 0,
                    (LmnWord)a[i], LMN_INT_ATTR, 0);
    lmn_mem_push_atom(mem, a[i], LMN_INT_ATTR);
    lmn_mem_newlink(mem,
                    sa, LMN_ATTR_MAKE_LINK(0), 1,
                    (LmnWord)b[i], LMN_INT_ATTR, 1);
    lmn_mem_push_atom(mem, b[i], LMN_INT_ATTR);
    lmn_mem_newlink(mem,
                    sa, LMN_ATTR_MAKE_LINK(0), 2,
                    (LmnWord)k, LMN_INT_ATTR, 2);
    lmn_mem_push_atom(mem, k, LMN_INT_ATTR);
  }

  lmn_mem_delete_atom(mem, a0, t0);
  lmn_mem_delete_atom(mem, a1, t1);
  lmn_mem_delete_atom(mem, a2, t2);
  lmn_mem_delete_atom(mem, a3, t3);
} 

2010-05-18

  • 25.

2010-05-17

prolog : setof

  • listdom.plでの集合要素の加算
    ...
    all_addition(L1,L2,L3) :- setof(Z, X^Y^(member(X,L1), member(Y,L2), Z is X + Y), L3).
    ...
    • 実装がどうなっているのか調べたけどよくわからなかった
    • ただ長さNのリストに対してO(N^2)だったので、特別変わった実装じゃなさそう?
      • LMNtalでもやっぱりN^2が最速だろうか

2010-05-14

CHRのlistdom.pl

  • X lt Y って単にmax(X)<max(Y)なんだろうか、少なくとも実行結果はそうみえる
  • だとしてもなんだかちゃんと書かれてない気がするな

UNYOのバグ?(既に報告されていた)


  • LE1.3.5に同封されているUNYO3Gでの現象
  • 「要素が一つ以上入っている(空( [] )じゃない)リスト」にマッチするようなルールを書きたくてrule1の様にした
list(x, [1,2,3]), list(x, [4,5,6]).

rule1 @@ %空じゃないリストにマッチするルール
list(X1, [Y1 | L1]), list(X2, [Y2 | L2]) :- X1 = X2 |
  merge(X1, [Y1 | L1], [Y2 | L2]).

rule2 @@ %rule1を適用後、適用されるルール
merge(X, L1, L2) :- ground(L1), ground(L2) | end(X).
  • Java、SLIMで実行すると正常だが、これをUNYOで動かすとなんかリンクがおかしくなった

    #ref(): File not found: "unyo_bug.png" at page "研究日誌とうめき"

[Step: 0]
list(x,[1,2,3]), list(x,[4,5,6])

[Step: 1]
merge(x,[1,2,3],[L1|L10]), '.'(6,[],L23), '.'(5,L23,L10), 4=[L1|L10]
  • このあとrule2が適用されると落ちる
    • groundチェック中にグラフが途中で途切れてるから?
  • 2Gでも落ちた!
  • rule1のガード(X1=X2)が関係しているのかも、unary(X1), unary(X2)とかにすると大丈夫
    • listを1価(list = [1,2,3]とか)にして、X1=X2を行わないようにしたら大丈夫だった、やっぱりX1=X2がいけない?
    • mergeの第一引数にX1を入れないようにすると大丈夫、アトムの再利用が関係しているのか?
  • rule1をこうすれば大丈夫だけど、リンクの先がリスト構造ならばマッチするようなルールのきれいな書き方はないものか
    list(X1, L1), list(X2, L2) :- X1 = X2 | merge(X1, L1, L2).

2010-05-13

callback関数 : integer_int2float

void integer_int2float(ReactCxt rc,
                       LmnMembrane *mem,
                       LmnAtom a0, LmnLinkAttr t0,
                       LmnAtom a1, LmnLinkAttr t1)
{
  int i = a0;
  double *d = LMN_MALLOC(double);
  *d = i * 1.0; 

  lmn_mem_newlink(mem,
                  a1, LMN_ATTR_MAKE_LINK(0), LMN_ATTR_GET_VALUE(t1),
                  (LmnWord)d, LMN_DBL_ATTR, 0);
  lmn_mem_push_atom(mem, (LmnWord)d, LMN_DBL_ATTR);

  lmn_mem_delete_atom(mem, a0, t0);
}

Prolog : delete

delete([1,3,2,3],3,X) ----> X = [1,2].

班ゼミ

  • 一つの例題をもう少し細かく見てみよう
    • データ表現やルールの工夫なんかでこれ以上改善できないというところまでもっていく

2010-05-12

New CHR website

  • リニューアルされててびっくり

2010-05-11

CHR : \+ : andの否定?

  • A=B∨C=Dの否定なので、A\=B∧C\=Dかな、実行してみるとそうなっている様だ
    ... <=> \+ (A=B, C=D) | ...

2010-05-09

listdom.pl : エンコード完了?

  • エンコードできたと思う、かー疲れた

2010-05-08

listdom.pl

lt : less than
le : less than or equal
ne : X ne Y, Y::[*]で*からXを取り出す?

2010-05-07

callback関数 : graph_gen

  • (Name, M, N, R)で1-R間の乱数を引数に持つM価のNameアトムをN個生成
/*
 * (Name, M, N, R):
 *
 *  Name    = symbol atome
 *  M, N, R = integer
 *
 *  Create random integer sets.
 *
 *            <------------- M --------------------->
 *  1) 'Name'(rand()%R+1, rand()%R+1, ..., rand()%R+1),
 *  2) 'Name'(rand()%R+1, rand()%R+1, ..., rand()%R+1),
 *                    ...
 *  N) 'Name'(rand()%R+1, rand()%R+1, ..., rand()%R+1).
 *
 */ 

void graph_gen(ReactCxt rc,
               LmnMembrane *mem,
               LmnAtom a0, LmnLinkAttr t0,
               LmnAtom a1, LmnLinkAttr t1,
               LmnAtom a2, LmnLinkAttr t2,
               LmnAtom a3, LmnLinkAttr t3)
{
  int m = (int)a1, n = (int)a2, r = (int)a3;
  int i, j, v; 

  LmnSAtom sa;
  const char *s;


  if (LMN_ATTR_IS_DATA(t0)) {
    switch (t0) {
    case LMN_INT_ATTR:
      break;
    case LMN_DBL_ATTR:
      break;
    default:
      break;
    }
  } else { /* symbol atom */
    s = (const char *)LMN_SATOM_STR(a0);
  }

  for (i = 0; i < n; i++){

    sa = lmn_mem_newatom(mem, lmn_functor_intern(ANONYMOUS,
                                                 lmn_intern(s),
                                                 m)
                         );

    for (j = 0; j < m; j++) {
      v = rand() % r + 1;
      lmn_mem_newlink(mem,
    		      sa, LMN_ATTR_MAKE_LINK(0), j,
	 	      v, LMN_INT_ATTR, j);
      lmn_mem_push_atom(mem, v, LMN_INT_ATTR);
    }

  }
 
  lmn_mem_delete_atom(mem, a0, t0);
  lmn_mem_delete_atom(mem, a1, t1);
  lmn_mem_delete_atom(mem, a2, t2);
  lmn_mem_delete_atom(mem, a3, t3); 

}
  • こんな感じ
'$callback'('graph_gen', edge, 3, 4, 10).
---->
edge(7,1,4). edge(4,8,6). edge(2,6,10). edge(1,5,10).

prolog : cut(!)

  • バックトラックを制御するcutについて
    1) ticket(Age, Money) :- Age < 13, Money is 500.
    2) ticket(Age, Money) :- Money is 1000.
    • rule1が再試行したときに、Ageに関係無くrule2が評価されちゃう
      1) ticket(Age, Money) :- Age < 13, Money is 500, !.
      2) ticket(Age, Money) :- Money is 1000.
    • 感嘆符でバックトラックを制御しなければならない

2010-05-07

callback関数を触ってみた


こんなのがあったのか、コロン記法?

x :: [1,2,3],
y :  [4.5.6].
---->
<Java処理系>  '::'(x,[1,2,3]). y:[4,5,6].  
<SLIM>        '.'(1,[2,3],'::'(x)). '.'(4,[5,6],':'(y)).
  • これはerror
    [4.5.6] : y.
  • チルダとか_とかも試してみたけど、こういう風に特別扱いされているものは見当たらなかった


  • eclipse 行番号の表示
    1. 「ウィンドウ」>「設定」>「一般」>「エディタ」>「テキスト・エディタ」
    2. 「行番号の表示」にチェック

2010-05-06

CHR encoding

  • 制約プログラミング的な例題をencodeページに貼っ付ける
    • 貼っ付けて少し整形してみた
  • やりかけ
    • TM, RAM, Floyd-Warshall

2010-05-03

Floyd-Warshall法の解説を読んでみた

  • あのアルゴリズムをそのままLMNtalで書けるのか
    • 書けそうかも?ちょっと書いてみる
  • CHR文献内のベンチマークにたまに"FLOYD-WARSH(N)"てのがある、よく調べる

2010-05-02

ubuntu kernel panic!

  • ubuntuをupdateして再起動したらkernel panic!
    • 検索するとLinux 2.6.31-21-genericでは割と多く起こっているみたい
    • GW早々ざけんな、というわけで
      /boot/grub/grub.cfg の
      Linux 2.6.31-21-generic の部分をコメントアウト
    • してとりあえず回避
  • ubuntuの日本語変換パニクっている
    りようしやすいかたちで
    理想 : 利用し易い形で
    現実 : 理容師やスイカたちで
  • 輪読の担当部分を読んでみた
    • なんかプロセスって言葉の定義と、Javaではどうやって使うかみたいな話ばっかりだった
    • 例題をさらっと流してしまったが、後町分の内容が薄いならここもちゃんとスライドに盛り込んだほうがいいかと

2010-04-27

CHR encoding

  • CHR encodingのページを整形してみたが、ううむ
  • CHRの文献をあさっていたら、いくつか新しい例題を見つけたのでちょっと書いてみる
  • 輪読を忘れないようにしないと


  • キヤノンのメーリス作った

2010-04-26

言語班ローカル/CHR encoding

  • とりあえず作ってみたものの、どういうレイアウトにしたらいいのか悩む

SLIM時間計測

  • まだまだ少ないが、突貫でまとめてみた
  • CHRプログラムに与えるクエリをどうするかでいつも悩むのはなんとかならないものか

ほか

  • dijkstraは重みが非負数の場合のみ使える、O(V^2)
  • Bellman-Fordは非負数でもok、O(V^3)
  • Warshall-Floydは非負数ok、でもサイクルに非負数があるとダメ、O(V^3)

2010-04-25

SLIM他言語インタフェースドキュメント

  • slim/doc/foreign.txt

system_rulesetとcallback

  • こんな風に組み合わせるとおかしくなる、あたりまえか
    '$callback'(integer_rand, N+1, H).

2010-04-24

graph_generator.c

  • 作ってみた、後悔はしていない
    • 地味に重み付け有り無しや、出力先を選べたりする
    • なぜLMNtalで書かないのか、と言われても特に理由はないよ
$ ./graph_generator
name of edge (string) : edge
node num (integer) : 5
edge num (integer) : 5
edges have weights? (yes:1 or no:0) : 1
max edge weights (integer) : 3
at random? (yes:1 or no:0) : 1
---------------------------------
edge(3, 2, 2). edge(1, 4, 2). edge(5, 3, 2). edge(3, 3, 2). edge(4, 5, 3).

UNIX

  • scriptコマンド

2010-04-23

Canon事業所見学会

  • 開発職でも要素技術研究的な仕事もある、というのはどこの事業所も同じらしい
  • Canon合格者のメーリス担当になった。笑

2010-04-22

Union Find

  • エンコードしてみた、クエリとして変数は与えられないけど

最短経路問題

  • グラフ上の1点から他の全ての点への最短距離を求める
    • chr_sssp : 先週の全対用のプログラムを少し変えてノード1からの最短経路のみを求める
      • たったの2ルール
      • O(N^7)のプログラムを、N個のノードからではなくノード1からの探索のみにしたのでO(N^6)
        node1020304050
        time0.021.1514.4783.96330.00
        t/(n/10)^60.0230.0180.0190.0200.021
  • chr_dijkstra_Fheap : ダイクストラ法+優先度付きキュー(フィボナッチヒープで表現)
    • O(M+NlogN)で最も速いとされている方法、Mはエッジ数
    • CHRで書いたらO(N*I+M*D+N*E)、IやらDはルール適用回数
    • dijkstra+Fheapモジュールで26ルールくらいある
    • 今回のクエリ(有向完全グラフ)ではO(N^4)より若干低いくらいになるはず
    • なってた
      node102030405060
      time0.010.050.170.451.031.95
      t/(n/10)^40.010.003120.002130.001750.001640.00150

CHRプログラミング、気になること

  • CHRの例題には「処理系の実装方法的にルールの適用順序はこうなるはず」を考慮してプログラミングしているものが多い気がする(というか文献とかで明示している)
    • 例えば、次の2つのルールは上から順に評価される
      • itemがたくさんある中にfindminを生成するとfindmin@が一通り実行され、最後にfoundmin@が実行される
    • なんかずるくないか、別にitemがあってもfoundmin@が実行されてもいいはずでは
    • それともLMNtalでそういう書き方しないのは馬鹿正直すぎるのだろうか
      findmin  @ findmin, item(I,K,_,0,_) ==> min(I,K).
      foundmin @ findmin <=> true.

2010-04-21

dijkstra のエンコード終わった

その他

  • 村岡・後町を慰める(?)会
    • 生 * 21杯 / 3人 = 7 [杯/人]
    • 酔いって指数関数的にくるよね

2010-04-20

dijkstra's algorithm with F-heap

  • LMNtalにエンコード中
  • 膜を使えばうまくできそうな気がしなくもなくもない
  • memo
    - : 常に未束縛の変数
    + : 常に値を束縛された変数
    ? : default. どっちにもなりうる。
    int       : integer number
    dense_int : array indexとして使用できる
    number    : number
    float     : float
    any       : any 

2010-04-19

chr_path_N

  • All Pairs Shortest Path(APSP) problem:全対最短経路問題
  • EPSON(Quad, 2.6GHz, RAM4GB)で実験してみた
    • クエリは有向完全グラフ
    • node:edge = n:(n^2-n)/2
      node102030405060
      time0.043.3456.94430.482075.187498.03
      t/(n/10)^70.040.26110.26030.26270.26560.2678
  • O(n^7)になってた
    e(I,J1,A),e(J2,K,B) :- uniq(I,J1,K,A,B), ... | ... .
      n  n      n  n            n  n n
  • 今回は重みは全て1なので、A,Bには1しかこない(2以上になると1本目のルールで消される)

例題増やし

  • ダイクストラ
    • フィボナッチヒープを用いた最適化の論文、読んでみてる
  • あとはUnion findとかがいいかな

2010-04-18

CHR book

  • パス整合、アーク整合辺りを読んだ

2010-04-17

Propagationとuniqの違い

  • CHRでよくある経路関係の推移閉包を求める例
    p1 @ e(X,Y) ==> p(X,Y).
    pn @ e(X,Y), p(Y,Z) ==> p(X,Z).
  • propagation ruleは同一の制約(eやp)に対して高々一回適用が許されるため、この例にe(1,1)を与えると止まらない
  • uniqは変数X,Yの組を見ているので、e(1,1)を与えても止まる
  • だから例題によっては、LMNtalの方が計算回数が少ない書き方できる、気がする

2010-04-16

ubuntuでchrを動かせた

  • library下にchrディレクトリとchr.plが無かったのが原因
  • ただ単純に他のswi-prologから持ってきてもうまく動かないことが多い
  • とりあえず、以下の組み合わせなら動いた
  1. http://www.swi-prolog.org/download/stableから次の2つを落としてくる
    • リストの上の方にあるLinux用のバイナリ
    • 下の方にあるSources
  2. Sourcesの方をインストールする
    % tar zxvf pl-<version>.tar.gz
    % cd pl-<version>/src
    % ./configure
    % make
    % [su root]
    % make install
    • ここでとりえあずSWI-prologが動くか確認
      % pl
      Welcome to SWI-Prolog ...(略)
      ?- 
    • chrライブラリを読み込んでみる
      ?- [library(chr)].
    • 次のようなエラーが出たらchrライブラリが無い
      ERROR: source_sink `library(chr)' does not exist
  3. バイナリの方からchrフォルダ,chr.plを持ってくる
    • pl-<version>.rpmを適当な場所に解凍
    • usrフォルダが出来るので、
      解凍した場所/usr/lib/pl-<version>/library/下のchrフォルダとchr.pl
    • を、
      /usr/local/lib/pl-5.8.3/library/
    • にコピーする
  4. Sourcesに対して再度の1.の./configure以降を実行
    • prologを起動し、
      ?- [library(chr)].
      % library(chr) compiled into chr 0.27 sec, 3,866,648 bytes
      true.s
    • となったらめでたしめでたし

2010-04-15班ゼミ後

次週までに

  • chr_path.lmnの測定、オーダー計算などもろもろ
    • warahall's algorithm
  • benchmark setの用意

2010-04-15

-班ゼミ用:どんな例題を早くしたいのか

  • ロックフリーで実装
    • STMベース?
  • 最初は0or1価のアトムやリストを扱う例題(膜無しで)
  • CHR的な何か
    • 最短経路、
  • NESLの例題はどうか
    • quicksort:入れ子データ並列

ubuntuでlibrary(chr)が呼び出せていない

  • 調べる

2010-04-14

ubuntu

$ uname -a で32or64ビット版か見分けられる

Let's Noteが直った

  • パナソニック修理工房、インバータの故障(有料)だったけど、液晶パネルまで交換(無料)してくれた、出来る

2010-04-13

SLIMのrule trialにかかる時間(通常実行)

  • time_optimized_slim
  • 手持ちの例題でざっと取ってみた、編集中
  • あっているんだろうか

2010-04-09

  • 先生からKLICやらCHRを使える環境をどこかに用意しようとのお話
    • paveにはKLICが入っていた、でもうまく動かなかった
  • NIOLOに入れてみようとした
    • 選択肢選んでいったら、途中で無限ループしたので今日は放置
    • でもgochoのubuntuではインストールまではうまくいってた、パッチ当てればうまくいく?
  • NESLの論文の読み飛ばしてたところを思い出した、明日読む
    • やっぱりクイックソート的な例題をやってみたいとは思う

2010-04-08

  • M2ページ作ってみた [#f6ca3e7f]
  • ubuntuを新しいPCにインストールしてみた [#e4d9ba88]
  • KL1を動かしてみる [#hbc9ed25]
    • KLICの実装について
      • Inside KLIC(KLICのHPから)日本語

うめき

2010-08-05

  • 2010-08-05更新
  • ueda先生?
    u: :-) or 鋭意製作中
  • M2
    i: (¬ 。¬)
    s: (~ω~ )
    a: (・∠・^)
    o: (`〜`)
    g: (´^д^)
    m: (`∀´)
  • M1
    y: <(・ω・ )>/
    y: (`口´ ) or (`。´ )
    k: (o-ω-o )
    s: (@∇@ )
    s: (≡ω≡ )
    q: (^皿^ )
    n: (´@_@` ) → (´ _ ` ) → (´_` ) → (No Image ) → (´●_●` )v 
    t: (`ε´ ) or ( `з´)

2010-04-09

  • 春だ
  • 馬場駅周辺が色々変わっててびっくり
  • 就職活動終了、研究がんばらないと
    • 山名先生は優しかった、文面がhiroshiと同じだったが、でも優しかった

2010-04-08

  • がんばりたい。