kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

reasonedschemer

Reasoned Schemer (101) logo

1周目ではほとんどあきらめていたlogo とりあえずlogo以下コードを入力して動かしながらやっていこう 入力するだけでもなかなか大変 目がちかちかする ↓くらいで書けたら関係プログラミングすげー、っていうところなんだけどなあ

Reasoned Schemer (100) わり算 続き3

/o自体は問題ない (defrel (/o n m q r) (conde ((== '() q) (== r n) (

Reasoned Schemer (100) わり算 続き2

(split n r l h)はnからrの長さ+1だけ取ってlとし残りをhとする ただしlやhがちゃんとした数字になるようにする n: (0 0 1 0 1 1) r: (1 0 1) ↓ l: (0 0 1 ) h (1 1)

Reasoned Schemer (99) わり算 続き

さてそうやってガードを入れた/oもこういう式では値を返さない 確かにこれを途中で止めるのは難しそう > (run 3 (y z) (/o `(1 0 . ,y) '(0 1) z '())) user break しっくりこないところもあるけどだいたいストーリーは見えてきた

Reasoned Schemer (98) わり算

わり算ここだな一番わからなかったところ

Reasoned Schemer (97) 比較

えーとここからしばらくはわり算の準備、だったかな?ガードかける用に

Reasoned Schemer (96) *o 続き

本物のbound-*o (*o n m p)でn>pだったりm>pだったりしたら失敗するようにする んだけどそのかわりにnやmをリストとみてnやmがpより長かったら失敗するようにするらしい

Reasoned Schemer (95) *o

かけ算わり算の章 ここが最難関だったような *oは特に難しいところはない non-overlappingで再帰は最後ね

Reasoned Schemer (94) 符号付き 続き2

なんで止まるのか考えないと でも今回書いたコードには再帰してるとこないんだよな +oとか-oとかで止まってるのか? いくつか値を試してみたけどそういう雰囲気はない(あくまで雰囲気

Reasoned Schemer (93) 符号付き 続き

えーと どうなってんの > (check-sumo-augend -5 -5) user break > (check-sumo-augend 1 1) user break > (run* n (sumo n '(0 1) '(0 1))) user break > (run 1 n (sumo n '(0 1) '(0 1))) '(()) なるほど 2個めを探しにいこうとして見つからないってことか

Reasoned Schemer (92) 符号付き

符号付きの数を作ってそれ用の足し算を作る話 1周目に脳内で書いたコードはカッコの対応がついてないところだらけ あとdiff-sign-sumoで答えが0になるときの対応が抜けてることに気づいた

Reasoned Schemer (91) addero, +o, -o, lengtho

adderoとgen-addero genとはなんだろう

Reasoned Schemer (90) half-adder, full-adder, poso, >1oあたりまで

7. A Bit Too Much ビット演算から加算器作ったりする話 というか数を作る話と言った方がいいのかな

Reasoned Schemer (89) リベンジ?

delayしてるところがわかんねえ、って言ってスルーしてきたとこ、今ならわからないかなあ どういう順で答えが出てくるとか、何回forceすると答えが出てくるとか

Reasoned Schemer (88) nevero 続き2

> (run 1 q (conde (succeed) ((nevero))) fail) これが止まるのはだいたいイメージできるけど練習でやってみよう

Reasoned Schemer (87) nevero 続き

後者は1回forceした後同じになるのかな このへん、勘でもREPL頼りでもなくちゃんとわかって言えないものだろうか 一度は追ってみないとダメかなあ

Reasoned Schemer (86) nevero

今回のネタはこれ (defrel (nevero) (nevero)) 単純極まりない でも1周目では腑に落ちないところがいくつかあった

Reasoned Schemer (85) alwayso

6. The Fun Never Ends … この章(も)、1周目は消化不良気味だったけど今回はどうだろう (defrel (alwayso) (conde (succeed) ((alwayso)))) とりあえず一回succeedしてさらにもう一度 ということはすんなりわかるようになった

Reasoned Schemer (83) appendo 続き2

でも! appendoの再帰を最後に持ってくると終わるんだって

Reasoned Schemer (82) appendo

appendoはoutに結果をunifyするだけだから動き的に新しいところはない、かな? (defrel (appendo l t out) (conde ((nullo l) (== t out)) ((fresh (a d res) (conso a d l) (appendo d t res) (conso a res out))))) たとえば

Reasoned Schemer (81) Chapter 3 残り

defrelもわかったことにするとだいたいわかった感じになるかなあ > (run 5 x (lolo `((a b) (c d) . ,x))) '(() (()) ((_0)) (() ()) ((_0 _1))) こういうのもまじめに追いかければなぜこの順になるかわかるはずだけどそこまで元気は出ない defrelのlambda (…

Reasoned Schemer (80) delrel再考

ところで(run 1 x (listo ``(a b c . ,x)))はdefrelにlambda ()がないと帰ってこない やっとlambda ()の存在意義を確認

Reasoned Schemer (80) listo

3. Seeing Old Friends in New Ways Translationの続きだけどTranslationよりも再帰が出てきたことに注目して (defrel (listo l) (conde ((nullo l)) ((fresh (d) (cdro l d) (listo d))))) > (run* x (listo `(a b ,x d))) '(_0) 1周目はTranslationすると…

Reasoned Schemer (79) Translationとか

さらっといく nulloとpairo

Reasoned Schemer (78) caro、cdro、conso

リストの操作 まずはcaro > (defrel (caro p a) (fresh (d) (== (cons a d) p))) > (run* q (caro '(a c o r n) q)) '(a) なんでconsが理解できるんだろうと思ってたけどunifyとかがリストを前提とした作りになってるからだな ていうかむしろリストしか知ら…

Reasoned Schemer (77) defrel 続きとconde

> (run* (x y) (teacupo x) (teacupo y)) '((tea tea) (tea cup) (cup tea) (cup cup)) こうやって組み合わせで増えていくのがrelationalっぽいような気がする

Reasoned Schemer (76) defrel

defrel登場 > (defrel (teacupo t) (disj2 (== 'tea t) (== 'cup t))) > (run* x (teacupo x)) '(tea cup)

Reasoned Schemer (75) fresh、run*

こういう式を短く書く話 (run* r (fresh (x) (fresh (y) (conj2 (== 'split x) (conj2 (== 'pea y) (== `(,x ,y) r)))))) (fresh (x) (fresh (y) g ...)は(fresh (x y) g ...)と書ける (run* r (fresh (x y) (conj2 (== 'split x) (conj2 (== 'pea y) (== `(…

Reasoned Schemer (74) disj2

disj2のほうがconj2よりもイメージしやすい気がする ちょっと加速しよう ((disj2 fail fail) empty-s)は追ってもあっさりしすぎててわからなさそうだから このへんで

Reasoned Schemer (73) conj2 続き

> (run* q (conj2 (== 'corn q) (== 'meal q))) '() これはどういう動きか ((conj2 (== 'corn q) (== 'meal q)) empty-s) = (append-map-inf (== 'meal q) ((== 'corn q) empty-s)) = (append-map-inf (== 'meal q) '(((#(q) . corn)))) = (append-inf ((== …