문제
부울 논리에서 어떻게 x를 표현할 수 있습니까? 다음 중 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 of n holds"를 표현하려면 k가 보유하는 모든 사례를 열거해야합니다. 따라서 변수가 ABCDE가 있고 5/5를 원한다면 필요합니다.
(A & B & C & ~D & ~E) |
(A & B & ~C & D & ~E) |
(A & B & ~C & ~D & E) | ...
(~A & ~B & C & D & E)
여기서 & is "및", | "또는"및 ~는 "아니야"입니다.
"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;
}
나는 그들을 세고 할 것이다. 그러나 부울 작업을 사용하여 술어를 생성 해야하는 경우 입력을 부가자 시스템으로 비트로 취급 할 수 있습니다.
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;
wikipedia]에서 더 많은 예제와 링크를 찾을 수 있습니다.http://en.wikipedia.org/wiki/half_adder (반 집단)
그런 다음 6 개의 변수를 3 쌍으로 그룹화 한 다음 해당 출력을 사용하여 답변에 더 가까워지고 나머지를 직접 해결하는 방법을 알아낼 수 있습니다.
또 다른 옵션은 회로를 사용하여 Pop Count (Sideway Add)를 찾아서 2에 대한 유일한 비트 일치 여부를 확인하는 것입니다. Logic Gates가 아닌 어셈블리의 유명한 예제 [Hakmem 169].http://home.pipeline.com/~hbaker1/hakmem/hacks.html#item169 (PopCount)].
"정확히 두 개는 진실이어야한다"와 "적어도 두 개는 사실이어야한다"는 의미 여부는 차이를 만듭니다.
변수 세트 {a..f}의 경우, Pax와 Charlie Martin의 응답은 "정확히 두 가지"상황 (두 개는 참이고 나머지는 거짓)을 다루었 고, 질문의 표현은 "at"을 다루는 것처럼 보였습니다. 최소 2 개의 "사례 :
(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
, 어디 x
중 하나이다 A
~을 통해 F
, 그리고 x
사실입니다 ". 즉, 변수 세트가 주어지면 A
~을 통해 F
, 실제 값을 가진 변수로 구성된 서브 세트에는 정확히 두 개의 요소가 있습니다. (사용 <=
당신의 질문에 대한 다른 해석을 표현하기 위해 '='대신.)