2014-09-22 54 views
0

我想不出如何正確編寫規則使用&&和||的ruby條件

我想表達以下規則:

如果結論是「負面」的前提之一必須爲負。

下面是我試圖寫這個。

def test4b 
    if (@conclusion.getQuality == 'negative' && (@major.getQuality != 'negative' || @minor.getQuality != 'negative')) 
    validity = "invalid (4b) Negative conclusion without a negative premise" 
    else 
     validity = "pass" 
    end 
end 

但是這不起作用。它似乎排除了所有三段論的負面前提。再次,我只想排除那些沒有任何負面前提的負面結論的三段論。

+0

在Ruby中,你應該使用'方法名稱snake_case'和省略'GET'前綴對於獲得者,即'@conclusion.quality =='negative''或者更好的判斷方法:'@ conclusion.negative?' – Stefan 2014-09-22 12:07:15

回答

0

它應該是:的

if (@conclusion.getQuality == 'negative' && (@major.getQuality != 'negative' && @minor.getQuality != 'negative')) 

兩個@major@minor不爲 '負面'。 您的方法是重試!conclusion => (!major || !minor)的邏輯值。該表達式的否定將爲:

!conclusion && !(!major || !minor) <=> !conclusion && major && major 

(德摩根定律)。這是您正在尋找的條件,請注意這裏沒有||

另外請注意,如果你這樣做會更可讀,但:

if (@conclusion.getQuality == 'negative' && [@major, @minor].all? {|m| m.getQuality != 'negative'}) 

if (@conclusion.getQuality == 'negative' && ![@major, @minor].any? {|m| m.getQuality == 'negative'}) 
+2

我認爲另一種選擇是'[@major,@minor] .none? {| M | m.getQuality =='negative'}',它基本上很好地反映了自然語言。 – 2014-09-22 11:33:49