3

私は J で真理値表を生成する実験をしていました:

    nand =: *:
    nand /~ 0 1
1 1
1 0
    bxor =: 22 b.  NB. Built-in bitwise XOR
    bxor /~ 0 1
0 1
1 0

ここで、自分の論理 xor を定義したいと思います。

    xor =: 3 : 0
]y                     NB. monadic case is just the identity
:
(x*.-.y)+.(y*.-.x)     NB. dyadic case is (x AND NOT y) OR (y AND NOT x)
)

これは、直接呼び出すと期待どおりに機能します。

    0 xor 0 1
0 1
    1 xor 0 1
1 0

ただし、真理値表は生成されません。

    xor /~ 0 1
0 0

なぜだめですか?

おそらく問題は、]/~ 0 1それ自体が 1 x 2 配列を生成したことだと思いました。そのため、モナド部分を nand ( *:y) を使用するように変更しました。これは、2 x 2 配列を生成するためです。

    *:/~ 0 1
1 1
1 0


   xor =: 3 : 0
*:y                  NB. certainly wrong, but at least has 2x2 shape.
:
(x*.-.y)+.(y*.-.x)
)

しかし、私はまだ同じ動作をします:

    xor /~ 0 1
0 0

誰かが私の思考の欠陥を理解するのを手伝ってくれますか?

4

1 に答える 1

3

あなたのxorランクは無限ですが*:、 のランクは 0 です。これは、 b~:を使用して確認できます。:そのように:v b. 0

~: b. 0
  _ 0 0 

*: b. 0
  0 0 0

xor b. 0
  _ _ _

これが意味することは、個々のアトムではなく、xorリストで動作することです。0 101

xorランク 0 で使用すると、期待どおりの結果が得られます。

xor"0 /~ 0 1
0 1
1 0

xorまたは、ランク 0 であると定義した場合。

于 2012-07-05T11:12:12.293 に答える