Reasoned Schemer (015) ビット演算
7. A Bit Too Much
bitです
(defrel (bit-xoro x y r)
(conde
((== 0 x) (== 0 y) (== 0 r))
((== 0 x) (== 1 y) (== 1 r))
((== 1 x) (== 0 y) (== 1 r))
((== 1 x) (== 1 y) (== 0 r))))
これは単純
(defrel (bit-xoro x y r)
(fresh (s t u)
(bit-nando x y s)
(bit-nando s y u)
(bit-nando x s t)
(bit-nando t u r)))
とも定義できるらしいけど意味がわからない
真理値表的にはたしかにそうなる
x | y | s | t | u | r |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 |
けどもうちょっと意味をくっつけることができそうな気がするんだよなー
xorは馴染みがあるけどnandは聞いたことがあるくらい
ふーんxorとかnandはそれだけで任意の真偽関係を定義できるんだ
bit-ando
も同じように定義
真偽の組み合わせで定義する方は特に面白くない
(defrel (bit-ando x y r)
(fresh (s)
(bit-nando x y s)
(bit-noto s r)))
(defrel (bit-noto x r)
(bit-nando x x r))
これは意味がわかる
勢いでhalf-addero
とfull-addero
も定義
これも聞いたことがあったくらい
次の桁へのキャリーがあるのが半加算器で
さらに前の桁からのキャリーがあるのが全加算器ね
これで足し算もやるのかな?