2012-07-05 84 views
3

我与以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 =: 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×2的数组,所以我改变了单子部分使用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

**更新**我发现'〜 :',它实现了逻辑XOR,'〜:/〜0 1'正确地构建了真值表......但是我仍然不明白为什么我的手写代码不能很好地处理'/〜'。 – tangentstorm 2012-07-05 10:14:29

回答

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秩0,你会得到你所期望的结果:

xor"0 /~ 0 1 
0 1 
1 0 

或者,如果你定义xor是等级0

+0

请参阅[这里](http://www.jsoftware.com/help/learning/07.htm)和[这里](http://www.jsoftware.com/help/jforc/loopless_code_i_verbs_have_r.htm)等级。 'v b。 0'分别给出了动词'v'的monadic,dyadic-left,dyadic-right情形的等级。 – Eelvex 2012-07-05 11:28:32

+0

谢谢!我一直在试图理解'''做了什么,现在我开始看到这些部分合在一起了:) – tangentstorm 2012-07-05 11:44:04