だめな子

だめな子ですが頑張って成長してゆくのです。

Schemeで非決定性探索 深さ優先探索と幅優先探索

MacBook Air買いました!(挨拶
で、LLFutureんとき買ったOn Lispをがんばってしこしこ読んだらマクロのありがたさが少しわかったような
  ↓
でもSchemeってtraditional macroないんだよね... aifもかけやしねぇ
  ↓
syntax-caseで外の環境の変数とか補足できるよ!aifかけるよ!これは勝つる!!
  ↓
...あれ、使い方全然わかんない...←今ここ
それはそれとして、On Lispに乗ってる幅優先探索ってなんか思った通りの動作をしてくれない気がするんだけど...
見つかる解は浅いところのがちゃんと見つかるっぽいんだけど検索順路が深さ優先探索と同じ順序で探索していくのがなんかこー微妙な気持ち
どうすればいいんだ!!
深さ優先探索
PLAIN TEXT
SCHEME:

;;depth first search

(define depth-fail #f)

(define (depth-choose . args)

  (if (null? args)

      (depth-fail)

      (let ((fail0 depth-fail))

    (call/cc

     (lambda (cc)

       (set! depth-fail

         (lambda ()

           (set! depth-fail fail0)

           (cc (apply depth-choose (cdr args)))))

  [...]

Read the rest of Schemeで非決定性探索 深さ優先探索と幅優先探索

SchemeでLifeGame v3

PLAIN TEXT
SCHEME:

(use srfi-1)

(use srfi-27)

 

(define width 14)

(define height 10)

 

(define population 0.3)

 

(define birth '(3))

(define keep '(2 3))

 

(define element-x car)

(define element-y cadr)

(define element-value caddr)

(define (make-element x y v) (list x y v))

 

(define (make-field)

    (define (flatten x) (fold-right append '() x))

    (map

        (lambda (e) (make-element (car e) (cadr e) #f))

        (zip

  [...]

Read the rest of SchemeでLifeGame v3

SchemeでLifeGame v2

他の人の投稿も見てみた結果こうなった
PLAIN TEXT
SCHEME:

(use srfi-1)

(use srfi-27)

 

(define width 14)

(define height 10)

 

(define population 0.3)

 

(define birth '(3))

(define keep '(2 3))

 

(define element-x car)

(define element-y cadr)

(define element-value caddr)

(define (make-element x y v) (list x y v))

 

(define (step-exec value next proc)

    (define (iter value cc)

        (cc value

            (lambda () (iter (next value) cc))))

    [...]

Read the rest of SchemeでLifeGame v2

WindowsでChicken scheme

Windowsだとexe吐きたいんだよ!!
インストール手順メモ
MinGWとMSYSが必要になるのでいれとく
chickenはCドラ直下に入れる なぜかそうしないとダメ
export PATH="/c/chicken/bin:/c/MinGW/bin:$PATH"とかしてパス通してあげる
msysのetc/profileの
if [ $MSYSTEM == MINGW32 ]; then
export PATH=".:/usr/local/bin:/mingw/bin:/bin:$PATH"
else
export PATH=".:/usr/local/bin:/bin:/mingw/bin:$PATH"
fi
の後らへんに書いとくと毎回設定しなくていいので楽
そんでcsc test.scmとかやるとtest.exeが吐かれるよ!
ついでにobjdump -p test.exeしてみたら
DLL Name: libchicken.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
こんな感じ
eggのインスコの仕方がイマイチわからないけどとりあえずおっけーとしておくだわさ
なんかmsys.batをダブルクリックしてもMSYSが起動しなくなったんだけどなにが原因なんだか…?

Read the rest of WindowsでChicken scheme

SchemeでLifeGame

実行方法
gosh life.scmとかなんか適当
Chickenではsrfi-27なくて無理やった… chicken-setup srfi-27しても途中でコケるしとりあえず保留
初めてじゃ、どうかく?おるぐに投稿してみた
PLAIN TEXT
SCHEME:

(use srfi-1)

(use srfi-27)

 

(define width 14)   ;フィールドの幅

(define height 10)  ;フィールドの高さ

 

(define population 0.3) ;初期人口密度

 

(define birth '(3))     ;隣人が何人いれば新たに生まれるか

(define keep '(2 3))    ;隣人が何人のとき生存できるか

 

;フィールドの要素のx座標を取得

(define element-x caar)

 

;フィールドの要素のy座標を取得

(define element-y cadar)

 

;フィールドの要素の値を取得

(define element-value cadr)

 

;座標の束を作る

(define xy-asix

    (fold-right append '()

        (let

            ((width (+ width 2))

             (height (+ [...]

Read the rest of SchemeでLifeGame

call/cc

call/ccについて勉強する(難しいイメージがあるが案外わかる気がするので)
現時点で知っている事。漠然としたイメージ。
・ambとか実装できる(バックトラックってかっこいい)
・そのときの実行状況を返すらしい(実行状態の保存?好きなときに再開もできるとか聞いたことがあるぞ)
・関数呼び出しと関数からのリターンを1つの対として扱おうとすると便利らしい(両方操作できる的な意味で)
 (意味論がどーだか?対象性がうんたら?)
・うまく使ってあげればなんかGUIとか便利に作れそうな気がする
 (ボタンを押されると欲しい結果が得られるところまで実行して継続を返す プログラム的にはループで扱えて幸せ)
 (1ステップ実行して処理をコントローラに返す時とか便利そう)
・Kahuaみたいな感じで使うと幸せになれる(Sessionみたいな擬似的な処理の継続を使わず、本当の継続でWebページとかを構成できるので幸せ)
なんかコルーチン(こっちもどういうものかよくわかってない マイクロスレッド ファイバ)のイメージとすげー似てる気がする。
調べてみよう!
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
(define call/cc call-with-current-continuation)
call/ccは1引数関数らしい
違った 1引数関数を引数に取るらしい あ、違わない 1引数関数で、1引数関数を引数に取るらしい(ややこしい)
call/ccをコールした時点で継続が生成される
引数として渡した1引数関数に現在の継続を渡すらしい
(+ (* 1 2) (call/cc (lambda (c) (* 3 4))))
↑値に2を加える という継続が生成される
(+ 2 ?) こういうことか
で、(call/cc (lambda (c) (* 3 4)))には継続が渡されるんだと
で、先のlambda式の中で継続を呼び出していないので(* 3 4)の結果が返却され(+ 2 12)だってさ
一方
(+ (* 1 2) (call/cc (lambda (c) (* 3 (c 4)))))
だと継続を呼び出している(見た目、継続は関数として適用できるものらしい)
>関数の実行を直ちに終了して,継続への引数をcall/ccの値として,継続を実行する.
言い換えると、call/ccは1つの値を返す手続きなだけで、継続とは計算の続きのことだから要するに別の言語で言うところのreturn(計算の続きに値を渡す)と同じことだから、実行を直ちに中止して継続に渡した値でもって実行を継続してくれたほうが理にかなってるわけだ。理解できた。
継続は大域脱出に使える
大域脱出は例外処理に使える
例を見ると、次にかける数が0だったら継続に0を渡して大域脱出している。
gotoとか使ってなくてとっても安全ですね!
あと計算の回数も少なくなっていることがわかる。
次の例も理解できる。脱出したくなったらcall/ccのおかげで即脱出できている。
ここまででcall/ccがどういう挙動をするのかは理解できた。
確かにバックトラックはできそう。
別に難しいお話じゃないね、call/cc
でも、うまく使おうとするとすごく難しそう…
http://www.shido.info/lisp/scheme_amb.html
【お題】
ambっぽいものを作る
ていうか(define (hoge . huga) (〜〜〜〜))の.ってなんだっけ
可変長引数か
Rubyで言うと def hoge(*huga) 〜〜〜〜 end か
色々ぐだぐだ頑張って考えたんだけど、理解できてみるとお手本サイトの解説が非常にすっきりしてる。
failに(lambda () (cc 'no-choise))を束縛しなおす。
あ、ちょっとわかんないぞ
call/ccはどこまでを継続として生成するのやら
(set! fail (lambda [...]

Read the rest of call/cc