سؤال

كيف يمكنك التعبير عن X من Y صحيحة في منطقية المنطق ؟ القاعدة مثل 2 من التالية يجب أن يكون صحيحا (A ، B ، C ، D ، E ، F) هو شكل من multiplcation أو مجموعة العمليات ؟
والنتيجة النهائية هي كل التباديل مثل AB أو AC أو الإعلان ، إذا قال لك 3 من بعد هو مثل ABC, عبد, ابي, الخ..لذلك هو مثل (أ ، ب ، ج)^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

مع التقليب هناك كبيرة العديد من subexpressions تحتاج إلى كتابة.

بالطبع, إذا كان هذا هو البرمجة السؤال ، هل يمكن أن مجرد تحويل القيم المنطقية إلى 0 أو 1 ، إضافة الى ضمان النتيجة هي 2.

نصائح أخرى

وعلى افتراض C # أو بعض اللغات الأخرى حيث منطقي = الباحث:!

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

وكنت قد حصلت على فكرة هناك. للتعبير عن "ك ن يحمل" كنت بحاجة الى الذهاب الى تعداد جميع الحالات التي يحمل ك. لذلك، إذا كان لدينا المتغيرات 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.الأمثلة الشهيرة في الجمعية لا البوابات المنطقية هي [Hakmem 169][http://home.pipeline.com/~hbaker1/hakmem/المأجورون.html#item169 (popcount)].

وانه يجعل هناك فارقا ما إذا كنت تعني "بالضبط يجب أن يكون اثنين الحقيقي" في مقابل "اثنين على الأقل يجب أن يكون صحيحا".

لمجموعة من المتغيرات {A..F}، وردود باكس وتشارلي مارتن تغطية الوضع "بالضبط اثنين" (هما الحقيقي والباقي كاذبة)، في حين بدا التعبير في سؤالك للتعامل مع "اثنين على الأقل" القضية:

(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، قدمت فرعية تتكون من المتغيرات مع القيم الحقيقية لها بالضبط عنصرين. (استخدام <= بدلا من '=' للتعبير عن تفسير آخر لسؤالك.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top