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