kb84tkhrのブログ

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

reasonedschemer

Reasoned Schemer (50) 10章 alwayso

(define (alwayso) (lambda (s) (lambda () ((disj2 succeed (alwayso)) s)))) しっかり読んだらalwaysoの動きがイメージできるようになるだろうか まずalwaysoの形を確認 alwaysoは引数のない関数で substitutionを引数にとって、substitusionのstreamを返…

Reasoned Schemer (49) 10章 nevero 続き

次はこれ > (let ((s-inf ((disj2 (== 'olive x) (nevero)) empty-s))) s-inf) (((#(x) . olive)) . #<procedure:...r/minikanren.scm:52:29>) (== 'olive x)の値と(nevero)の値がappendされているようではある ところでこの式って((disj2 (== 'olive x) (nevero)) empty-s)と何が違うの letの意味</procedure:...r/minikanren.scm:52:29>…

Reasoned Schemer (49) 10章 nevero

(define (nevero) (lambda (s) (lambda () ((nevero) s)))) これはminikanren言語じゃないよね 動かしても関数が返ってくるだけなのでわかりづらい

Reasoned Schemer (48) 10章 disj2

(define (disj2 g1 g2) (lambda (s) (append-inf (g1 s) (g2 s)))) goalはsubstitutionを取ってsubstitusionのstreamを返すもの というのはあってる(当然 でこれってどういう意味なの っていうかその前にsubstitusionのstreamってなんなのかってのがわかっ…

Reasoned Schemer (47) 10章 append-inf

condeのモトになっているdisj2とそのヘルパー関数append-inf append-infから見よう

Reasoned Schemer (46) 10章 stream、==

streamとは空リストかcdrがstreamであるペアかまたはsuspension suspensionとは(lambda () body)という形をしていて評価するとstreamを返すもの 遅延ストリームって言われるやつだな そんなのが突然の出現 そして意外にさらっと説明・例示が終わる

Reasoned Schemer (45) 10章 unify

unify Prologといえばユニフィケーションって出てくるくらいだからきっと何か大事なもの

Reasoned Schemer (45) 10章 ext-s

(ext-s x v s)はsubstitution sにassociation `(,x . ,v) を 追加したものを返す ただし循環参照ができるようなassociationは追加できず#fを返す

Reasoned Schemer (44) 10章 walkまで

10章は処理系を書く話っぽいので ここからひさしぶりに写経モードで そういえば、ここで書く処理系はminiKanrenと呼ばれるものらしい ファイル名つけようと思った時にふと名前が気になった 変数を定義

Reasoned Schemer (43) 9章 enumerate+o

(defrel (enumerate+o r n) (fresh (i j k) (bumpo n i) (bumpo n j) (+o i j k) (gen&test+o i j k) (== `(,i ,j ,k) r))) bumpo、gen&test+oはenumerate+oのヘルパー関数だったみたい (run* s (enumerate+o s '(1 1)))とやると0から3までの数をふたつと そ…

Reasoned Schemer (42) 9章 once, bumpo, gen&test+o

(defrel (onceo g) (condu (g #s) (#s #u))) これはただgを実行だけだけど成功するのは1回だけね、ってことだな (#s #u)は書かないといけないんだろうか

Reasoned Schemer (41) 9章 condu

(run* q (conda ((alwayso) #s) (#s #u)))はno value condaはquestionが成功なら次の行以降は実行しないんだけど これだと(alwayso)が成功し続けてその行の実行が終わらないので そこでconduの登場 こっちはcondaよりもさらに早く打ち切る questionが1回成功…

Reasoned Schemer (41) 9章 conda

9. Thin Ice もう章題を解釈するのはあきらめている この終盤で新しい構文登場

Reasoned Schemer (40) 8章 未体験ゾーン3

戻って本体 (logo n b q r) これはcondeなので1行ずつ見ていく 再帰はしてないな

Reasoned Schemer (39) 8章 未体験ゾーン2

(base-three-or-moreo n b q r) 名前からしてb(baseだろう)が3以上の時のn = b^q + rの関係に違いない baseが2のときはexp2o base-three-or-moreoにはcondeは出てこないので 全部いっぺんに見ないといけない いっぱい式があるけどどれが大事な式なのか

Reasoned Schemer (38) 8章 未体験ゾーン1

ここからが未体験ゾーン (logo n b q r)でn = b^q + rの関係 見るからに複雑そう 単にq(やr)を求めるだけでなくnやbを求めるのにも使えたり 無限に値を探し続けたりしないようにしたりするだけでここまで書かなきゃ いけないものなのか

Reasoned Schemer (37) 読み直し 8章 続き

÷o (

Reasoned Schemer (37) 読み直し 8章

この章の途中で中断が入ったわけだが かなり手ごわかった記憶 こんどは理解度が上がってるだろうか

Reasoned Schemer (36) 読み直し 7章

Under the Hoodはちょっとだけ見た ちょっとだけではなんのことやら 7. A Bit Too Much ビット操作から始めて足し算引き算を作るまで

Reasoned Schemer (35) 読み直し 6章

ざっと読み直す、といってもただ読むだけっていうのがすこし難しくなってきた 6. The Fun Never Ends 無限に続きそうなrelationのお話 conj系は上から順に試して失敗したらいったんそこでおしまい disj系は全部試すんだけどちょっと不思議なことに無限ループ…

Reasoned Schemer (35) 読み直し 3-5章

読み直してみると気づくこともある 特にこれ The Law of conde Every successful conde line contributes one or more values. わかってはいたつもりなんだけど、ここ一番大事なとこなんじゃね?という思い(いまさら 上から読んでいって真のとこ評価したら…

Reasoned Schemer (34) 読み直し

戻ってきましたReasoned Schemer この前の記事はなんと2018-07-17 ちょっと読んでみてそういえば割り算がやたらと難しかったことを思い出す もう一度ざーっとはじめから読むことにする 新出単語くらい書いてくか

Reasoned Schemer (33) わり算

わり算も引き算と同様、関係プログラミング式のやり方は取れないので独自に実装 筆算式にやっています

Reasoned Schemer (32) かけ算

かけ算はすんなり

Reasoned Schemer (31) 引き算 続き

(Reasoned Schemerから少し離れてしまっている) でどっちでやろうか full-adderとかの方が自分にとって新しいのでそっちで書いてみよう 全部反対にするだけだろうし と思った私があさはかでした

Reasoned Schemer (30) 引き算

次は引き算ですがこれはそのままとはいきません 関係プログラミングだから足し算ができれば自動的に引き算もできてましたが(効率とかどうなのかな) 普通は引き算は引き算で書かないと 引き算を書くには、足し算と同じようなことを書く方法もありますが、 …

Reasoned Schemer (29) 普通に書いてみる

これって関係プログラミングで書いてて何がいいんだろう、ということで 普通に書いてみて、比較しようと思います まずは足し算まで

Reasoned Schemer (28) わり算 終わり

で、ふたつに分けたらわり算がどうなるというのか わり算短くなったなーと思ったら (defrel (/o n m q r) (conde ((== '() q) (== r n) (

Reasoned Schemer (28) わり算 続き

次はlの右側の0がなくなる例でやってみよう もう少し圧縮した書き方で s -> (splito '(0 0 1 0 1) '(1) l h) 4 -> (splito '(0 1 0 1) '() '() h), l=() 2 -> h=(1 0 1), l=() 6 -> (splito '(0 1 0 1) '() ^l h), l=(0 . ^l), (pos ^l) 2 -> h=(1 0 1), ^l=…

Reasoned Schemer (28) わり算 続き

splitoは数をふたつの部分に分けてくれるわけですが splitoは他にどんなことをしますか? splitoは関係ですから、下位ビットのlと上位ビットのhを結合してnを作ることができます。rの長さを使ってパディングビットを詰めます。 こういうの聞くと関係に名前を…