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 =: 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 数组,所以我将 monadic 部分更改为使用 nand ( *:y) 因为它产生 2x2 数组:

    *:/~ 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 1而不是对每个单独的原子0,进行操作1

xor如果您使用rank 0,您将获得预期的结果:

xor"0 /~ 0 1
0 1
1 0

或者,如果您定义xor为 0 级。

于 2012-07-05T11:12:12.293 回答