الحد الأدنى لعدد الشيكات للتحقق من صحة جدول الحقيقة

StackOverflow https://stackoverflow.com/questions/4065539

  •  27-09-2019
  •  | 
  •  

سؤال


لديّ برنامج Java حيث أريد التحقق من صحة ما إذا كان أي من 3 من المنسقات خاطئة. أريد أن أعرف أصغر تعبير يمكنني الكتابة للتحقق من التباديل.

if(!(needsWork && (needsApproval || isAdmin) ))

أعتقد أن هذا يكفي للتأكد من أنه إذا كان أي من المنجلين الثلاثة غير صحيح ، فأنا أريد التوقف عن المعالجة. ومع ذلك ، لدي الشك المتسلل أنني أفتقد شيئًا.

هل كانت مفيدة؟

المحلول

سيكون if (!needsWork || !needsApproval || !isAdmin) لا يعمل؟ Java يدعم تقييم الدائرة القصيرة.

نصائح أخرى

حيث

`any 3 booleans are false` (i.e. `!a || !b || !c`)

و

`(! (needsWork && (needsApproval || isAdmin))` (i.e. (! (a && ( b || c))`

لها جداول الحقيقة المختلفة, ، هل أنت متأكد من أن الحالات المختلفة لا تهم؟

a b c   (!a || !b || !c)    (! (a && (b || c)))
T T T          F                    F          
T T F          T                    F
T F T          T                    F
T F F          T                    T
F T T          T                    T
F T F          T                    T
F F T          T                    T
F F F          T                    T

التحولات

غالبًا ما ألعب مع تعبيرات منطقية لمحاولة توضيحها أو تبسيطها وأستخدم هذه التحولات المنطقية لمساعدتي:

// You can push (distribute) `!` into parenthesis if you reverse the `||` or `&&` operator inside:
! (a || b)             <=> (! a && ! b)
! (a || b || c || ...) <=> (! a && ! b && ! c && ...)

! (a && b)             <=> (! a || ! b)
! (a && b && c && ...) <=> (! a || ! b || ! c || ...)

// You can drop parens when the boolean operator outside the parens is the same as inside:
(a || (b || c || ...)) <=> (a || b || c)
(a && (b && c && ...)) <=> (a && b && c)

// You can push (distribute) a boolean op into parenthesis by applying it to each term inside:
(a || (b && c)         <=> ((a || b) && (a || c)
(a || (b && c && ...)  <=> ((a || b) && (a || c) && (a || ...) ...

(a && (b || c)         <=> ((a && b) || (a && c))
(a && (b || c || ...)  <=> ((a && b) || (a && c) || (a || ...) ...

// XOR means the term values have to be different:
(a ^ b)                <=> ((a && !b) || (!a && b))

// XOR means the same as OR unless both terms are true:
(a ^ b)                <=> ((a || b) && ! (a && b))

هناك بالطبع العديد من الآخرين ، لكن هذه هي تلك التي أستخدمها في أغلب الأحيان. قد يبدو الأمر معقدًا ، لكن من السهل التعرف على القلب بمجرد أن تبدأ بممارستها.

في حالتك ، إذا كنت تريد أن ترى ما هي بعض العبارات المكافئة الممكنة لـ:

(! (needsWork && (needsApproval || isAdmin) ))

فيما يلي بعض التحولات:

(! (needsWork && (needsApproval || isAdmin) ))   => [push the '!' through the `()`]
(! needsWork || ! (needsApproval || isAdmin) )   => [push the 2nd '!' through the `()`]
(! needsWork || (! needsApproval && ! isAdmin))

لكني لا أرى أي تبسيط حقيقي لما لديك.

بالطبع ، إذا تحقق من ذلك any of 3 booleans are false على ما يرام ، ثم اختياراتك بسيطة

(! needsWork || ! needsApproval || ! isAdmin) => [or pull the `!` outside the `()`]
(! (needsWork  && needsApproval && isAdmin))
if(!(needsWork & needsApproval & isAdmin))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top