Вопрос

Как вы можете выразить, что X из Y являются истинными, в булевой логике?правило, подобное 2 из следующих, должно быть истинным (A, B, C, D, E, F) является ли это формой операций умножения или набора?
конечным результатом являются все перестановки типа AB, AC Или AD, если вы сказали 3 из следующих, это похоже на ABC, ABD, ABE и т.д..значит, это как (A, B, C) ^ 2?

Спасибо!

Это было полезно?

Решение

В булевой логике (v является ИЛИ, ' следующий за предикатом НЕ является):

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.

Другие советы

Предполагая C # или какой-либо другой язык, где bool != int:

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

Питон:

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

В этом у вас есть идея.Чтобы выразить "k из n удержаний", вам нужно будет перечислить все случаи, для которых выполняется k.Итак, если у нас есть переменные A B C D E, и вы хотите 3 из 5, вам понадобится

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

где & - это "и", | - это "или", а ~ - это "не".

Предполагая "А или более"

вы можете добиться немного большего успеха, построив дерево

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

Я бы пересчитал их.Однако, если вы должны создать предикат, используя только логические операции, тогда вы могли бы обрабатывать входные данные как биты в системе сумматоров.

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.Известным примером в assembly not logic gates является [Hakmem 169][http://home.pipeline.com /~hbaker1/хакмем/hacks.html#item169 (количество посетителей)].

Имеет значение, имеете ли вы в виду "ровно два должны быть истинными" или "по крайней мере два должны быть истинными".

Для набора переменных {A..F} ответы Пакса и Чарли Мартина охватывали ситуацию "ровно два" (два истинны, а остальные ложны), в то время как выражение в вашем вопросе, по-видимому, касалось случая "как минимум два":

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

является выражением, которое является истинным, когда, например, A и B являются истинными, а остальные переменные являются любыми (true или false).

Если то, о чем вы просите, является выражением, подобным теории множеств, для описать ситуация (ситуации) выше, вы могли бы выразить это примерно так:

#{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, подмножество, состоящее из переменных с истинными значениями, содержит ровно два элемента.(Использовать <= вместо '=', чтобы выразить другую интерпретацию вашего вопроса.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top