布尔表达式

时间:2008-11-12 01:14:13

标签: boolean logic

在布尔逻辑中,如何表达Y的X是真的?如下2中的规则必须为真(A,B,C,D,E,F) 它是一种多重或集合操作的形式吗? 最终的结果是像AB或AC或AD这样的所有排列,如果你说下面的3个像ABC,ABD,ABE等那么...所以它就像(A,B,C)^ 2?

谢谢!

7 个答案:

答案 0 :(得分:3)

在布尔逻辑中( 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.

答案 1 :(得分:3)

假设C#或其他语言bool!= int:

bool nOf(int n, bool[] bs)
{
    foreach(bool b in bs)
    {
      if((n -= b ? 1 : 0) <= 0) break;
    }
    return n == 0;
}

答案 2 :(得分:3)

的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));

答案 3 :(得分:2)

你有这个想法。要表达“n个持有的k”,你需要枚举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)

其中&amp;是“和”,|是“或”,而“是”不是。

答案 4 :(得分:0)

假设“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;
}

答案 5 :(得分:0)

我会数他们。 但是,如果必须使用布尔运算生成谓词,则可以将输入作为位处理为加法器系统。

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)]。

答案 6 :(得分:0)

无论你的意思是“两个必须是真的”还是“至少两个必须是真的”,这都有所不同。

对于变量集{A..F},Pax和Charlie Martin的回答涵盖了“正好两个”情况(两个是真的,其余都是假的),而你问题中的表达式似乎与“至少两个”案件:

(A && B) || (A && C) || ... || (D && E) || (D && F) || (E && F)

是一个表达式,例如,当A和B为真且其余变量为任何(真或假)时为真。

如果你要求的是一个类似理论的表达式来描述上面的情况,你可能会表达如下:

#{x | x <- {A, B, C, D, E, F} | x} = 2

符号以这种方式工作:

#{...}

表示所附集的大小,以及集合本身:

{x | x <- {A, B, C, D, E, F} | x}

读取“x的集合,其中xAF之一,x为真”。换句话说,给定变量集AF,由具有真值的变量组成的子集恰好具有两个元素。 (使用<=代替'='来表达对您问题的其他解释。)