我正在尝试在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
有人能帮助我理解我思考的缺陷吗?
答案 0 :(得分:3)
您的xor
具有无限排名,而*:
,~:
排名为0.您可以使用b.:v b. 0
来验证这一点:< / p>
~: b. 0
_ 0 0
*: b. 0
0 0 0
xor b. 0
_ _ _
这意味着xor
对列表0 1
进行操作,而不是对每个原子0
,1
进行操作。
如果您使用排名为0的xor
xor"0 /~ 0 1
0 1
1 0
或者,如果您将xor
定义为等级0。