布尔表达式

问题描述:

如何在布尔逻辑中表达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的集合,其中xAF之一,并且x是真实的”。换句话说,给定一组变量AF,由具有真值的变量组成的子集恰好具有两个元素。 (使用<=而不是'='来表达您的问题的其他解释。)