Pregunta

¿Cómo puedes expresar que X de Y son verdaderas, en lógica booleana? una regla como 2 de las siguientes debe ser verdadera (A, B, C, D, E, F) ¿Es una forma de multiplicación u operaciones de configuración?
el resultado final es todas las permutaciones como AB O AC O AD, si dijiste 3 de los siguientes, es como ABC, ABD, ABE, etc., entonces es como (A, B, C) ^ 2?

¡gracias!

¿Fue útil?

Solución

En lógica booleana ( v es OR, ' después del predicado NO):

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

Con las permutaciones, hay muchas subexpresiones que necesitas escribir.

Por supuesto, si esta es una pregunta de programación, puede convertir los booleanos a 0 o 1, agregarlos todos y asegurarse de que el resultado sea 2.

Otros consejos

Suponiendo C # o algún otro lenguaje donde bool! = 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));

Tienes la idea allí. Para expresar & Quot; k de n contiene & Quot; vas a necesitar enumerar todos los casos para los cuales se cumple k. Entonces, si tenemos variables A B C D E, y desea 3 de 5, necesitará

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

donde & amp; es " y " ;, | es " o " y ~ es " no " ;.

Suponiendo " A o más "

puedes mejorar un poco construyendo un árbol

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

o como código

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;
}

mejor aún

bool AofB(int n, bool[] bs)
{
   foreach(bool b; bs) if(b && --n == 0) return true;
   return false;
}

Los contaría. Sin embargo, si debe producir un predicado utilizando operaciones booleanas solo entonces podría tratar las entradas como bits en un sistema de sumadores.

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;

Puede encontrar más ejemplos y enlaces en [Wikipedia] [ http://en.wikipedia.org / wiki / Half_adder (Half-Adder)]

Luego puede agrupar las seis variables en 3 pares, luego descubrir cómo usar esas salidas para acercarse a la respuesta y resolver el resto usted mismo.

Otra opción sería usar un circuito para encontrar el recuento de pop (agregar de lado) y verificar si el único bit coincide con 2. Un ejemplo famoso en el ensamblaje de puertas no lógicas es [Hakmem 169] [ http: // home.pipeline.com/~hbaker1/hakmem/hacks.html#item169 (popcount)].

Hace una diferencia si quieres decir " exactamente dos deben ser verdaderas " versus " al menos dos deben ser verdaderas " ;.

Para el conjunto de variables {A..F}, las respuestas de Pax y Charlie Martin cubrieron el & "; exactamente dos &"; situación (dos son verdaderas y el resto son falsas), mientras que la expresión en su pregunta parecía tratar con el & "; al menos dos &"; caso:

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

es una expresión que es verdadera cuando, por ejemplo, A y B son verdaderas y las variables restantes son cualquier cosa (verdadero o falso).

Si lo que está pidiendo es una expresión similar a la teoría de conjuntos para describir la (s) situación (es) anterior (s), puede expresarla de esta manera:

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

donde la notación funciona de esta manera:

#{...}

representa el tamaño del conjunto adjunto y el conjunto en sí:

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

lee " el conjunto de x, donde A es uno de F a <=, y <=> es verdadero " ;. En otras palabras, dado el conjunto de variables <=> a <=>, el subconjunto formado por las variables con valores verdaderos tiene exactamente dos elementos. (Use <=> en lugar de '=' para expresar la otra interpretación de su pregunta).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top