kb84tkhrのブログ

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

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-adderofull-adderoも定義
これも聞いたことがあったくらい
次の桁へのキャリーがあるのが半加算器で
さらに前の桁からのキャリーがあるのが全加算器ね

これで足し算もやるのかな?