Reasoned Schemer (30) 引き算
次は引き算ですがこれはそのままとはいきません
関係プログラミングだから足し算ができれば自動的に引き算もできてましたが(効率とかどうなのかな)
普通は引き算は引き算で書かないと
引き算を書くには、足し算と同じようなことを書く方法もありますが、
足し算は半加算器・全加算器使ってやってる、引き算は?と考えると
2の補数ってやつを使いますね
Reasoned Schemer (28) わり算 終わり
で、ふたつに分けたらわり算がどうなるというのか
わり算短くなったなーと思ったら
(defrel (/o n m q r)
(conde
((== '() q) (== r n) (<o n m))
((== '(1) q) (==lo m n) (+o r m n) (<o r m))
((poso q) (<lo m n) (<o r m) (n-wider-than-mo n m q r))))
まだ割ってなかった!
続きを読む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=()
あれ、同じ答え出た、と思ったらひとつ戻って(pos ^l)
に不適合なんだな
ややこしい
でも確かに右側の0
が消えた
でもでもまだピンと来ていない
Reasoned Schemer (28) わり算 続き
splito
は数をふたつの部分に分けてくれるわけですが
splito
は他にどんなことをしますか?
splito
は関係ですから、下位ビットのl
と上位ビットのh
を結合してn
を作ることができます。r
の長さを使ってパディングビットを詰めます。
こういうの聞くと関係に名前をつけるのが悩ましくなるな
結合でもあり分割でもある
関係なんだから動詞にしちゃいけないのかな
Reasoned Schemer (27) わり算 続き
でどうやるかなんですけど
どうやったらもっといい
/o
を定義して、66コマめのrun*
が値を持つようにすることができるでしょうか?
数がビットのリストで表されているので、リストを「head」と「rest」のふたつの部分に分けて問題を分割してみてはどうでしょう?
なにを言っているんだかわかりません
2進数で表現された数を2で割ってるんだから一桁ずつなにかするっていうのはわからなくもない
でもそれって2で割ったときのため用?他の数で割ったときにも適用できるのかな?
練習だから?