Skip to content

Eligibility rules: the pattern, the usual exceptions and the tests

Eligibility rules share one shape: a qualifying group, a disqualifier, and a second requirement. The discount rule (student OR senior) AND NOT expired AND (member OR coupon) is the pattern with five conditions, thirty-two rows, and a predictable set of slips.

Read the rule as three clauses joined by AND: who qualifies (student OR senior), what disqualifies (NOT expired), and what else is needed (member OR coupon). Each clause is an OR of alternatives or a negated exception, which is why the pattern survives new requirements: a new way to qualify joins the first OR, a new exclusion joins the AND as another NOT, a new requirement joins as another bracketed OR. The exact checks on the page show the rule is contingent, with the witness senior = TRUE, expired = FALSE, coupon = TRUE, the others FALSE, as one eligible case.

The usual slips are the ones the pitfall pages cover: an exception written with OR instead of AND NOT (every non-expired stranger qualifies), an alternative written with AND instead of OR (only student seniors qualify), a bracket dropped so that the disqualifier binds to one alternative only (expired students qualify through the student clause, which the disqualifier no longer reaches). Each is a one-operator mistake, and each changes several rows of thirty-two.

The tests that catch them are the independence pairs: one pair per condition, about six scenarios, each showing that the condition alone changes the outcome. The rule here has five conditions and six would do; the full table is for the engine, the pairs are for the suite, and the decision-table page shows how the owner's view of the rule maps onto both.

Example

eligible := (student OR senior) AND NOT expired AND (member OR coupon) · output

Exact checks

Always true (tautology)? No Counterexample: student = F, senior = F, expired = F, member = F, coupon = F · Exhaustively checked and solver cross-checked · 1 rows
Always false (contradiction)? No Counterexample: student = F, senior = T, expired = F, member = F, coupon = T · Exhaustively checked and solver cross-checked · 10 rows
Can be true? Yes Example assignment: student = F, senior = T, expired = F, member = F, coupon = T · Exhaustively checked and solver cross-checked · 10 rows

Truth table (32 rows)

Eligibility rules: the pattern, the usual exceptions and the tests
#studentseniorexpiredmembercouponeligible
0FALSEFALSEFALSEFALSEFALSEFALSE
1FALSEFALSEFALSEFALSETRUEFALSE
2FALSEFALSEFALSETRUEFALSEFALSE
3FALSEFALSEFALSETRUETRUEFALSE
4FALSEFALSETRUEFALSEFALSEFALSE
5FALSEFALSETRUEFALSETRUEFALSE
6FALSEFALSETRUETRUEFALSEFALSE
7FALSEFALSETRUETRUETRUEFALSE
8FALSETRUEFALSEFALSEFALSEFALSE
9FALSETRUEFALSEFALSETRUETRUE
10FALSETRUEFALSETRUEFALSETRUE
11FALSETRUEFALSETRUETRUETRUE
12FALSETRUETRUEFALSEFALSEFALSE
13FALSETRUETRUEFALSETRUEFALSE
14FALSETRUETRUETRUEFALSEFALSE
15FALSETRUETRUETRUETRUEFALSE
16TRUEFALSEFALSEFALSEFALSEFALSE
17TRUEFALSEFALSEFALSETRUETRUE
18TRUEFALSEFALSETRUEFALSETRUE
19TRUEFALSEFALSETRUETRUETRUE
20TRUEFALSETRUEFALSEFALSEFALSE
21TRUEFALSETRUEFALSETRUEFALSE
22TRUEFALSETRUETRUEFALSEFALSE
23TRUEFALSETRUETRUETRUEFALSE
24TRUETRUEFALSEFALSEFALSEFALSE
25TRUETRUEFALSEFALSETRUETRUE
26TRUETRUEFALSETRUEFALSETRUE
27TRUETRUEFALSETRUETRUETRUE
28TRUETRUETRUEFALSEFALSEFALSE
29TRUETRUETRUEFALSETRUEFALSE
30TRUETRUETRUETRUEFALSEFALSE
31TRUETRUETRUETRUETRUEFALSE

Plain-language reading

Beginnereligible is true exactly when all of the following hold:
1. at least one of student or senior is true (both may be true)
2. expired is false
3. at least one of member or coupon is true (both may be true)
In every other case, eligible is false.
About the operators:
- AND is true only when all of its parts are true.
- OR is inclusive: it is true when at least one part is true, including when several are.
- NOT reverses a value: true becomes false and false becomes true.
Intermediateeligible is true exactly when all of the following hold:
1. at least one of student or senior is true (both may be true)
2. expired is false
3. at least one of member or coupon is true (both may be true)
In every other case, eligible is false.
Advancedeligible is true exactly when all of the following hold [conjunction ∧]:
1. at least one of student or senior is true (both may be true) [inclusive disjunction ∨]
2. expired is false [negation ¬]
3. at least one of member or coupon is true (both may be true) [inclusive disjunction ∨]
In every other case, eligible is false.
Formal notation: (student ∨ senior) ∧ ¬expired ∧ (member ∨ coupon)

Logic diagram

Eligibility rules: the pattern, the usual exceptions and the tests Eligibility rules: the pattern, the usual exceptions and the tests student senior expired member coupon eligible AND OR NOT OR
Eligibility rules: the pattern, the usual exceptions and the tests Eligibility rules: the pattern, the usual exceptions and the tests student senior expired member coupon eligible AND OR NOT OR

The common slip

Letting the disqualifier bind to one alternative. student OR senior AND NOT expired reads as student OR (senior AND NOT expired), so an expired student card still qualifies. Bracket the group, and let the table confirm the row.

Questions

How do I add a second disqualifier?

As another AND NOT clause: … AND NOT expired AND NOT fraud_flag. De Morgan lets you write the pair as AND NOT (expired OR fraud_flag), which the equivalence checker will confirm.

What if two clauses overlap?

Overlaps are fine in logic (a student who is also a member qualifies twice) and only matter when the rule must be exclusive. The absorption law removes genuinely redundant clauses, and the simplifier reports them.

Related

See also

Testing and rules

Generated from the Tangibool engine, semantics tangibool-semantics/1, engine 1.0.0, build . Every table, map, simplification and verdict on these pages was computed by the Tangibool engine when the site was built, and every claim was re-checked by the same exact checker the app uses. Limits are stated where they apply. © 2026 Foreranger LTD.