2012-07-05 49 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