kb84tkhrのブログ

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

reasonedschemer

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 ((== …

Reasoned Schemer (72) conj2

fuseされていなければ変数がdifferent 変数の名前が違うだけなら式の値は変わらない xがyの中に現れることをoccurという このあたりはOK conj2登場

Reasoned Schemer (71) ==をさらに

すこしだけ複雑なやつ > (run* q (fresh (x) (== `(((,q)) ,x) `(((,x)) pod)))) '(pod) とはいっても==を評価したstreamの要素がふたつになったくらい

Reasoned Schemer (70) fuseとか

> (run* q (fresh (x) (== x q))) '(_0) xとqがfuseしている というのは`(,x . ,q)というassociationがあるということ でもxもqもfreshなので_0

Reasoned Schemer (69) 勘違い修正

いろいろ考え直さないとか? ↓みたいなのやっていくときはqをqのままにしないで書き替えてったほうがいいのかなー (run* q (== q 'pea)) = (run #f q (== q 'pea)) = (let ((q (var 'q))) (map (reify q) (run-goal #f (conj (== q 'pea))))) = ...

Reasoned Schemer (68) 勘違い

まだ理解したっていう手ごたえを感じてないんだけどどうするっていうアイデアもないので進める > (run* q succeed) '(_0) qはfresh 10章までsucceedって何かあんまり意識してなかったりもした

Reasoned Schemer (67) 関数整理

ひとつひとつの関数のお仕事をひとことで言えて やってみよう その前に用語のまとめ

Reasoned Schemer (66) (run* q fail)とか(run* q (== q 'pea)とか

さて読み返してみるとは言ったもののどうやっていくか せっかく実行できるようになったんだから式を実行してみるのはもちろんだけど デバッガーで追いかけたりしてみるかな DrRacketのデバッガー、いまひとつどう動いてるかよくわからなかったりする とりあ…

Reasoned Schemer (65) Forewordとか

ForewordとかPrefaceから読み返してみる そうだそういうことやってたんだ、という気分(忘れてる relationとgoalを理解して使えるようになる(第1章〜第8章) relationalでない演算子を使い、pureでないrelational programmingを行う(第9章) Schemeで関係型プ…

Reasoned Schemer (64) 読み返し10章(続き3)

お次はこれ (let ((s-inf ((disj2 (nevero) (== 'olive x)) empty-s))) s-inf) = ((disj2 (nevero) (== 'olive x)) empty-s) = ((lambda (s) ((nevero) s) (append-inf ((== 'olive x) s))) empty-s) = (append-inf ((nevero) empty-s) ((== 'olive x) empty…

Reasoned Schemer (64) 読み返し10章(続き2)

次からappend-infが登場 うまく追っかけられるだろうか (let ((s-inf ((disj2 (== 'olive x) (nevero)) empty-s))) s-inf) = ((disj2 (== 'olive x) (nevero)) empty-s) = ((lambda (s) (append-inf ((== 'olive x) s) ((nevero) s))) empty-s) = (append-in…

Reasoned Schemer (64) 読み返し10章(続き)

まだイメージしきれないのは(append-inf s-inf t-if)で (lambda () (append-inf t-inf (s-inf)))するところかな たぶん↓とかもそういうところなんだよな (run 12 l (proper-membero'tofu l))の値の順番がなぜこうなるのか謎 append-infの続きあたりからもう…

Reasoned Schemer (64) 読み返し10章

ということで2周目に入るよ! いきなり始めに戻らずに10章を読み直している

Reasoned Schemer (63) conda, condu

conda (define-syntax conda (syntax-rules () ((conda (g0 g ...)) (conj g0 g ...)) ((conda (g0 g ...) ln ...) (ifte g0 (conj g ...) (conda ln ...))))) condeと違ってifteの入れ子にしないといけないから再帰な形になるってことか やってみる

Reasoned Schemer (62) fresh, conde

fresh (define-syntax fresh (syntax-rules () ((fresh () g ...) (conj g ...)) ((fresh (x0 x ...) g ...) (call/fresh 'x0 (lambda (x0) (fresh (x ...) g ...)))))) やってみる

Reasoned Schemer (61) run, run*

runとrun* (define-syntax run (syntax-rules () ((run n (x0 x ...) g ...) (run n q (fresh (x0 x ...) (== `(,x0 ,x ...) q) g ...))) ((run n q g ...) (let ((q (var 'q))) (map (reify q) (run-goal n (conj g ...))))))) (define-syntax run* (syntax…

Reasoned Schemer (60) disj, conj, defrel

Connecting the Wires いちいち(let ... (map ... (call/fresh ... (disj2 ... (disj2 ...)))))などとは 書いていられないのでマクロ書くよ!という章 まずdisj2のいくつでもゴールを取れる版disj実際にはcondeが使われるので補助的な位置

Reasoned Schemer (59) 10章 once

こんどはonce これはconduのもとになってるはず

Reasoned Schemer (58) 10章 ifte もう少し

if-then-elseとconda、なんとなくつながりがありそうな気はするんだけど どうなるんだ? condaの式をifteで書けるはずなんだよな (conda (#s #u) (#s #s))を書き直してみよう

Reasoned Schemer (58) 10章 ifte

興奮するのもいいけど、なにか忘れてませんか? condaとconduはどうしたっけ そうですね ifteってのを定義します IF-Then-Elseの略

Reasoned Schemer (57) 10章 appendoふたたび

Let’s put the pieces together! piecesをtogetherすると完成? appendoをこの章で定義した関数だけで書く