如何在布爾邏輯中表達Y的X爲真?像下面的2這樣的規則必須是真的(A,B,C,D,E,F) 它是一種乘法或集合運算?
最終結果是所有的排列如AB或AC OR AD,如果你說3跟隨它就像ABC,ABD,ABE等等。所以它就像(A,B,C)^ 2?布爾表達式
謝謝!
如何在布爾邏輯中表達Y的X爲真?像下面的2這樣的規則必須是真的(A,B,C,D,E,F) 它是一種乘法或集合運算?
最終結果是所有的排列如AB或AC OR AD,如果你說3跟隨它就像ABC,ABD,ABE等等。所以它就像(A,B,C)^ 2?布爾表達式
謝謝!
做的好一點在布爾邏輯(v是OR,「謂語以下是NOT):
A B C'D'E'F' v
A B'C'D'E'F v
A'B C'D'E'F' v
: : : : : :
<absolute bucketload of boolean expressions>
: : : : : :
A'B'C'D'E F
隨着排列,有你需要寫了大量的子表達式。
當然,如果這是一個編程問題,你可以只轉換布爾0或1,增加他們都起來,確保結果是2
你在那裏有想法。爲了表達「n個保留」,你將需要枚舉k所有的情況。所以,如果我們有變量A B C d E,和你想的5 3,您需要
(A & B & C & ~D & ~E) |
(A & B & ~C & D & ~E) |
(A & B & ~C & ~D & E) | ...
(~A & ~B & C & D & E)
其中&是 「和」,|是「或」而〜是「不」。
假設 「A以上」
,你可以通過建立一個樹
2 : a&(b|c|d|e|f) | b&(c|d|e|f) | c&(d|e|f) | d&(e|f) | e*f
3 : a&(b&(c|d|e|f) | c&(d|e|f) | d&(e|f) | e*f) | b&(c&(d|e|f) | d&(e|f) | e*f) | c&(d&(e|f) | e*f) | d&e&f
或代碼
bool AofB(int n, bool[] bs)
{
if(bs.length == 0) return false;
if(n == 0) return true;
foreach(int i, bool b; b[0..$-n])
if(b && AofB(n-1,b[i+1..$]) return true;
return false;
}
更好的
bool AofB(int n, bool[] bs)
{
foreach(bool b; bs) if(b && --n == 0) return true;
return false;
}
假設C#或其他語言,其中布爾!= INT:
bool nOf(int n, bool[] bs)
{
foreach(bool b in bs)
{
if((n -= b ? 1 : 0) <= 0) break;
}
return n == 0;
}
的Python:
expressions = [A, B, C, D, E, F, G ]
numTrue = len(filter(None, expressions)
PHP:
$expressions = array(A, B, C, D, E, F, G);
$numTrue = count(array_filter($expressions));
我會數它們。 但是,如果您必須使用布爾運算生成謂詞,那麼您可以將輸入視爲加法器系統中的位。
Basic Half-Adder
A, B : 1st 2nd bits
O, C : unit output and carry to next unit
O := A xor B;
C := A and B;
您可以在[百科] [http://en.wikipedia.org/wiki/Half_adder(半加器)找到更多的例子和鏈接
然後你就可以組多達六個變量分成3對,然後弄清楚如何使用這些產出接近答案並自己解決其他問題。
另一種選擇是使用一個電路,以找到彈出計數(側身添加),並檢查,以查看是否唯一位爲2 著名的例子在未裝配的邏輯門相匹配是[Hakmem 169] [http://home.pipeline.com/~hbaker1/hakmem/hacks.html#item169(popcount) ]。
無論您的意思是「確切地說兩個必須是真實的」與「至少兩個必須是正確的」,它是有區別的。
對於變量集合{A..F},Pax和查理馬丁的回答涵蓋了「恰好兩個」的情況(兩個是真的,其餘的都是假的),而在你的問題中的表達似乎處理與所述「至少兩個」情況下:
(A && B) || (A && C) || ... || (D && E) || (D && F) || (E && F)
是時,例如,A和B都爲真,且剩餘的變量是什麼,(真或假),其爲真表達式。
如果你要問的是一套理論般的表達,以上面描述局勢(S),你可能會表達出來是這樣的:
#{x | x <- {A, B, C, D, E, F} | x} = 2
這裏的符號這個工作方式:
#{...}
表示所述封閉組的大小,和該組本身:
{x | x <- {A, B, C, D, E, F} | x}
讀取「x
的集合,其中x
是A
到F
之一,並且x
是真實的」。換句話說,給定一組變量A
到F
,由具有真值的變量組成的子集恰好具有兩個元素。 (使用<=
而不是'='來表達您的問題的其他解釋。)