J中的/〜真值表

时间:2012-07-05 09:55:25

标签: j

我正在尝试在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数组,因此我将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

有人能帮助我理解我思考的缺陷吗?

1 个答案:

答案 0 :(得分:3)

您的xor具有无限排名,而*:~:排名为0.您可以使用b.v b. 0来验证这一点:< / p>

~: b. 0
  _ 0 0 

*: b. 0
  0 0 0

xor b. 0
  _ _ _

这意味着xor对列表0 1进行操作,而不是对每个原子01进行操作。

如果您使用排名为0的xor

,您将获得预期的结果
xor"0 /~ 0 1
0 1
1 0

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