Prologで毒電波
火曜日, 5月 6th, 2008リファラを辿って行ったら素敵なサイトを見つけました。
うかべん 伺的ソフトウェア勉強会統合作戦本部公式情報サイト
伺か関連の勉強会なんてものがあったんですね。
しかも5/5に大阪で開催してたとか。
もっと早く知ってれば参加したのに orz
とりあえず、何かやっておこうと思い、
やっつけですが、Prologで毒電波を飛ばしてみました。
(製作時間3分ほどwww)

よし、なんだかよく分からないけど上手くいったぞ(笑)
リファラを辿って行ったら素敵なサイトを見つけました。
うかべん 伺的ソフトウェア勉強会統合作戦本部公式情報サイト
伺か関連の勉強会なんてものがあったんですね。
しかも5/5に大阪で開催してたとか。
もっと早く知ってれば参加したのに orz
とりあえず、何かやっておこうと思い、
やっつけですが、Prologで毒電波を飛ばしてみました。
(製作時間3分ほどwww)

よし、なんだかよく分からないけど上手くいったぞ(笑)
それはそれは昨日のお話でした……










帰ってから調べてみたところ、
「琵琶湖一周をするなら奥琵琶湖パークウェイは避けた方が無難。」とか
「相当な根性と体力が必要。」
とか書かれていました。
303号線を通れば楽できたのね orz
(奥琵琶湖パークウェイの地図)
ここで、やる夫は一つの思い込みをしていた。
『「展望台」と名の付く場所は一番高い場所で、
それ以上登り道はない』
という思い込みを……
____
/ \
/ _ノ ヽ、_ \ また登り道だお!
/ o゚((●)) ((●))゚o \ あとは下りだけとか思ってたせいで
| (__人__) | 精神的にかなりのダメージを受けたお……
\ ` ⌒´ /
再び気合と根性にすがることに。
さすがに登り道がずっと続くようなことはなく、
のぼりと下りが混じった道が続き、最後は下りが続いたため、
結構なスピードで駆け下りていきました。
[午前11:30]
____
/⌒ ⌒\
/( ●) (●)\ 平坦な道に復帰したお!
/::::::⌒(__人__)⌒::::: \ あたりには自転車のひとも沢山いて安心だお
| |r┬-| | (さっきまでの道はバイクと車ばっかしとおってたお)
\ `ー’´ /
しばらく進んでいると、分かれ道から、
マウンテンバイクの集団がやってくるのが見えました。
____
/ \!??
/ u ノ \ 今、見えたのって8時ごろに争った集団じゃ……
/ u (●) \ まさか子どもも多いのにあの坂を登って……
| (__人__)| いや、さすがにそれはなさそうだお。
\ u .` ⌒/ となると迂回して楽に行くルートがあったということに……
____
/::::::::::::::::\
/::::::─三三─\
/:::::::: ( ○)三(○)\
|::::::::::::::::::::(__人__):::: | 悲惨なことが頭をよぎったけど気にせず進むお!
\::::::::: |r┬-| ,/ マウンテンバイクの集団なんて沢山いるから
ノ:::::::::::: `ー’´ \ きっと似てるだけで別の集団だったに違いないお!
/:::::::::::::::::::::
|::::::::::::::::: l
[午後1:30]
奥琵琶湖パークウェイを除くと、8時ごろから順調に時速20kmを出し続けていましたが、
唐橋まで残り50km程となったここに来て足に異変が……
____
/ \
/ノ \ u. \ 足がめちゃくちゃ重くなってきたお……
/ (●) (●) \ 今のペースを維持するのは無理かもしれないお……
| (__人__) u. |
\ u.` ⌒´ /
午後4:00に唐橋到着を予定したんですが、
泣く泣くペースを落とし時速15km程に。
これで唐橋到着は午後5:20分ほどに。
そこからは足が痛いのをひたすらに堪えながら、
必死にペースを落とさないように頑張るだけでした。
ちなみに気温は30度。死ぬ……
そうしているうちに悲惨なことに気づきました。
____
/ \
/ ─ ─\ 琵琶湖が……
/ (○) (○) \
| (__人__) | 消えた……
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ ” /__| |
\ /___ /
今回は琵琶湖を時計回りで回っていたので、
右手側には常に琵琶湖が見えるはずでした。
しかし、気づくと右にはなんと山が……
道を間違えたとしても逆戻りする元気なんてもうありません。
とりあえずあってると信じてひたすら直進しました。
すると、コンビニを発見。そこで休んでいた二人組みに突撃。
____
/⌒ ⌒\
/( >) (<)\ 琵琶湖に行きたいんだけど、
/::::::⌒(__人__)⌒::::: \ どっちに行けばいいお?
| /| | | | | |
\ (、`ー―’´, /
_,. -‐===r‐- 、
_, ‐’´ ,r’´三三ミ/==、、\
,. -’” , / イ´r-、!’⌒’, ヽ ヽ
/イ / / / ! |ミ、Y´’, ’,ヽ ヽ ‘,
/’´/ // i | ! ! i``”´^’, ! ‘, ‘, i
‘ / /// i ! ! !! ‘, ! ‘, __!,,|__! !|
| ,イ, ! ! ! | |’, !’, ヾ、ヽ /__ !| ! ! !!
|/| ! | | ‘,TTヽ、’,ヾヾ`ヽ’´ o`゙ レ ,!|
!|! i ‘、 ‘, ヾr’´o` ‐–’ ノ’⌒リリ 多分むこうのほうじゃないっスか?
l| ‘,’,、ヽヽ ヽー” ’ _ rノノ
ヾ ヽ`ヾ、ゝ ヾ二– } ノァイ
丶、 ` ̄´´ ,. ’”!’ ´
,..>r ‘” ,lヽ
_ノ ヾ __,.. -’” ‘,ヽ、
_,. -‐i ,イ`} i i”i ,.ゝ、
,. -‐”´ |/ Y 丿/ ! / 丶
____
/::::::::::::::::\
/::::::─三三─\
/:::::::: ( ○)三(○)\
|::::::::::::::::::::(__人__):::: | 山の方を指されたお!
\::::::::: |r┬-| ,/ まさかこれは山登りフラグ?
ノ:::::::::::: `ー’´ \
/:::::::::::::::::::::
|::::::::::::::::: l
,. :::´:::::;::::/:::::::::::::::::::::::`丶、
/;::::::::/:::/:::::::::::::::::、:::::::::::::::::\
/ァ´:::::::::::::::/::::::::::::::::::::::\:::::::::::::::::ヽ
/’ /:::::::::/::::::/::::::::::::::::、::::::::::::\::::::::::::::ハ
/::/::::/::::::/::/:::::::i::::::::ヽ:::ヽ:::::::ヽ::::::::::::::’
/::/::::/::::::/:/!|::::::::|::|::::::::’::::::’:::::::::ヽ:::::::::::::l
l:::|::::::|:l:::::l/\!:::::::|::|、:::::::!::::::l::::::::::l:::::::::::::|
レ’|::::∧!::::トf卞ヽ::::|リ‐ヽ:::|:、:::|\:::::l:::::::::::/
|::/ V:::l ゞ’ \! T仡フ7ヾ ヽ::|ヽ::::/
|/ \l / ` ´ ,. リ// このまま直進したら
ヽ 〃// 琵琶湖大橋にはいけるんだが……
ヽ ‐- //:::/
ヽ .. ´ l-〈
__,.ィ’´ 八´ / !\
,. ’  ̄ / ! \_∠ | ト、 ̄ ‐- _
,イ / | /  ̄`’, | l \ iヽ
/ | / | ハ:.:.:.:.:.∧ /| , l ’
,′l / |V }=:.:./ ∧/ .l ヽ ! i
i l / | /:.:.:.:V l ハ i / l
/! ヽ i / ! l:.:.:.:.:.:l ,′ ! l / l
{ ヽ ‘ l. / | !.:.:.:.:.:.:! / | l’ |
____
/\ /\
/( ●) (●)\
/ :::::⌒(__人__)⌒:::::\
| |r┬-| |
\ ` ー’´ /
/ \
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | トン
_(,,) 命拾いしたお (,,)_
/ | .| \
/ | .| \
.|__________|
琵琶湖が見えないものの最終的には合流できるので問題ないようです。
そこからしばらくすると無事琵琶湖が見えてきました。
本当によかった。
[午後3:30]
市街地に到着。
そして、そこで見たものは……

▲琵琶湖大橋東詰め。自転車は無料っぽいです。
琵琶湖大橋との実に9時間40分ぶりの再開でした。
少し元気を取り戻し再び自転車をこぎ始めました。
[午後5:10]
__,/__/⊥…–‐=’ -’ー─— 、._
,.ィニニ.ヽ_,/ – ‘´ - 、  ̄ ̄- 、 ̄``ヽ
,. -‐←─—くァ’´/, ’´ ,. –、 `ヽ、
〈:.:.:.:.:.:.ヽ ̄,. ‐’7 / //- ヽヽ ヽヽ ヽ ヽ ヽ \ ヽ.
ヽ:.:.:.:.:.:.V:::::::/ / / // l ! i i ヽヽ ヽ ヽ ヽ.ヽヽ.ヽ
. / ヽ:.:.:.:.:.:ヽ:イ ,ィ′ i::i:l l: lji :トi lLl__:}i .:}}、 .:}、.:::i. l i }
l / 〉.:.:.:.:.:.N`<:::l: l::/l,ム‐7 l l |:: il l i: l`Tトl、:l l l ト、: |
|' /7 l ト、::`!: ,レ'7' j::/- リ ! リ j lリ,ュj ハ:|l:l:l !l l:|
l i l l 〉:ヽ|:: i | _,.ィテラ/ レ′ ノ1ノiトj | lリ リ ,リ
. l l └ ┬--iハ::l::: i l7トッ:チi| トッi| l |
l !: l::::/ :: l:.:.:.:゙l:::: .い い:::_,! ....::::::: , └-' l l もう...ゴールしてもいいよね。
| l:: l:/ l:.:.:.:.:l::::. . い `¨´::::: ー' ::::: ノ ハ
l l::./ l.:.:.:.:.:l:::::. ヽ ヽヽ ´ / い.
. l l└- ..__l.:.:.:.:.:.:':::::.:..ヽ. `弋 - ..____, イ::::: :い、
. い::::::.::::::::レ_.:.:.:.:.:.:l、::::::.. ヽ. \____|┐ l::::::. ::い.
ヽヽ.:.:::.::::::::i丁丁´ ヽ:::::::::...::::....`ヽ、.ヽ ヽ::::.. .:::iい.
ト、ヽ.:::::::::::l:l::::| /,> 、:::::::::::::::::.... `ヽ. ヽ::::.. ::i. '.
lj ヽ. .:.::::::::il::::|〈ィ´,ィ´ ̄` ー- 、_:::..:. ヽ ヽ::. :::l l
. / :ヽ.:.::::::::l::::l l7// `ヽ:::. '. i:::..::l: |
/ .::} .::::::::l:::l |// ヽ: } |::.:::l: l

▲ゴール(唐橋)
琵琶湖一周の基点唐橋です。
実際はここからスタートしたわけじゃないんですが、
そんなこはもうどうでもいいです。
とにかくゴールはゴールです。
XPCEを使えばPrologで自由自在にGUIが使えるんですが、
そうすると、どうもプログラムがPrologっぽくなりません。
というのも、画面の表示を書き換えたり、
さらには変数の値を書き換えたりするので、
バックトラックを極力避けるような作りになるためです。
GUIとバックトラックをどうにか共存できないかと考えたところ、
マルチスレッドにする方法を思いつきました。
この考えでどうにかならないかと思い試してみました。

走らせたプログラムはこんな感じです。
test :- (test1 ; thread_send_message(main, [println, 'No'])). test1 :- thread_self(S), thread_send_message(main, [println, 'member(X, [1,2,3,4,5])']), member(X, [1,2,3,4,5]), concat_atom(['X=', X], Text), thread_send_message(main, [println, Text]), thread_send_message(main, [click_wait, S]), check, thread_send_message(main, [println, 'Yes']). check :- thread_get_message(Msg), !, Msg == right.
member(X, [1,2,3,4])を行い、Xが適当な値に単一化されると
それを表示し(別のスレッドに アトムprintlnと共にthread_send_messageで送信しています)、
画面がクリックされるのを待ちます
(アトムclick_waitと自分のスレッドIDを送信すると、
画面がクリックされたときにアトムleftかrightが送信されるので、
それをthread_get_messageで受け取っています。)。
右クリックされると、画面にYesと表示して終了します。
左クリックされると、バックトラックが起こりmember(X, [1,2,3,4])が再び実行され、
Xが別の値に単一化されます。Xが単一化できなくなると、
画面にNoと表示して終了します。
……GUIとPrologっぽいのプログラムを共存させようと思ったんですが、
これをのPrologっぽいプログラムといっていいのやら。
けどまあ、とりあえず無事動いたので満足です。
もうすこし抽象化すれば見た目がマシになるかも。
PrologのXPCEで遊んだときのメモ。
画像ファイルの読み込みは物凄く簡単。
new(BM, bitmap('hoge.bmp')). % hoge.bmpを読み込む
しかし、このようにして作ったbitmapオブジェクトはread-onlyとなり、
invert, xor, orといった破壊的なメソッドを呼び出すことが出来ない。
これを解決するには、コピーを作ってそっちを操作すればいい。
get(BM, copy, CopyBM). send(CopyBM, invert) % 色を反転させる