Truth tables with the reading printed, so A implies B implies C shows its brackets. Refuses a chain of NAND or NOR rather than guessing, and reads a name like nota as one variable.
Initializing in your browser…
Extract a palette whose every colour is one the image actually contains, with the share of the picture each one covers. Median cut, k-means in CIE Lab or plain frequency, each named.
Record from a microphone with the browser's call processing off by default, a level meter in real dBFS with a clipping indicator, and a length taken from the audio rather than the clock.
Aspect ratios reduced exactly by the greatest common divisor, with the reduction multiplied back as a check, resizes that say whether they are exact, and named ratios that carry a note where the name is not the ratio.
You type A -> B -> C. Which grouping did the tool compute, and how would you know?
Expression
A -> B -> C
Read as
A → (B → C) true in 7 of 8 rows (A → B) → C true in 5 of 8 rows
Implication is right associative, so A → B → C means A → (B → C). The other grouping is a genuinely different function, and the previous version of this tool computed it: its parser used a while loop, which is left associative, and it printed the header as "A → B → C" with no brackets, so nothing on the page said which of the two you were looking at. The reading is now printed with the brackets wherever the grouping changes the answer, and dropped where it does not, because A ∧ B ∧ C really does need none. A chain of NAND or NOR is refused outright with both bracketings offered, since neither operator is associative and no convention settles it.
Truth tables for boolean expressions, with the reading printed. A → B → C is shown as A → (B → C), because the other grouping is a different function and nothing on the page should leave that to be guessed.
A truth table has one right answer once the parse is agreed, so everything that can go wrong in a truth table generator is in the reading.
**Implication is right associative**, so A → B → C means A → (B → C). That is the convention in Enderton and in Huth and Ryan, and it matters: the other grouping, (A → B) → C, is true in five of the eight rows where this one is true in seven. The previous version of this tool parsed it in a while loop, which is left associative, and printed the header as A → B → C with no brackets, so nothing said which of the two it had computed. Here the brackets are printed wherever the grouping changes the answer, and dropped where it does not: A ∧ B ∧ C needs none because conjunction is associative.
**A chain of a non-associative operator is refused rather than answered.** (A ⊼ B) ⊼ C and A ⊼ (B ⊼ C) are different, so A NAND B NAND C has no single reading, and neither does a NOR chain. Both are refused by name with the two bracketings you might have meant, instead of being silently left-associated.
**A variable is read whole.** The previous tokeniser guarded its keywords with a test for an uppercase letter, so a lowercase continuation did not stop the match and `nota` came out as NOT applied to a: verified in a browser, it drew a two column table with headings a and ¬a for a variable that was never there. A run of letters, digits and underscores is taken whole here and then looked up, so `nota`, `orange`, `andy` and `norm` are all one variable each.
**And the precedence is on the page.** Every operator with its symbol, everything you can type for it, where it binds, how a chain of it reads and what it means, in one table, so nothing has to be discovered by experiment.
Alongside that: the all-true row at the top, which is how a printed table is laid out; variables in the order they first appear; working columns for every distinct sub-expression; the disjunctive and conjunctive normal forms read straight off the rows; a tautology, contradiction or contingency verdict with the count; an equivalence check against a second expression that gives a COUNTEREXAMPLE rather than a verdict when they differ; and export as tab separated text or as RFC 4180 CSV, where every field is quoted because a rendered expression can contain a comma.
Read as A → (B → C), true in seven of eight rows. The left-associated reading, (A → B) → C, is true in five. They differ when A is false and B is true and C is false, among others.
One variable, two rows. A tokeniser that matches the keyword NOT and then only checks for an uppercase letter after it reads this as NOT applied to a and draws the wrong table entirely.
Refused, with both bracketings offered, because NAND is not associative and there is no convention that settles it.
NOT (A AND B) IFF (NOT A OR NOT B) comes out as a tautology: every row of the last column is true, which is the whole test.
Put the original and the simplified form in the equivalence box; a difference comes back as a concrete assignment.
The precedence table and the printed reading make the conventions explicit rather than implicit.
Translate it into the operators here and read off when it is true.
As A → (B → C). Implication is right associative by convention, and the tool prints the brackets so the reading is visible. The other grouping is a genuinely different function: seven of the eight rows are true under the right-associated reading and five under the left.
Because NAND is not associative: (A NAND B) NAND C and A NAND (B NAND C) give different tables, and no convention settles which one a bare chain means. The tool refuses it and offers both bracketings rather than picking one silently. The same applies to NOR.
A name is read whole and then looked up, so nota, orange, andy and norm are all single variables. A bare NOT with a space after it is still the operator. This is a real distinction: a tokeniser that checks only for an uppercase letter after a keyword turns nota into NOT a and draws a table for a variable that was never there.
With OR and NOR, below AND and above implication. Conventions differ on this one, which is why the whole precedence table is printed on the page. XOR is associative, so a chain of it needs no brackets, and it is true when an odd number of its operands are.
That is how a printed truth table is laid out in a textbook. Counting up in binary puts the all-false row first, which is the other common order; the layout is stated so it cannot surprise you.
Twelve, which is 4,096 rows. Past that a table stops being something a person reads, and the tool says so with the row count rather than trying.
The disjunctive normal form is one conjunction per true row, and the conjunctive normal form is one disjunction per false row. Both are read straight off the table rather than derived, so they cannot disagree with it.
Every calculation runs locally in your browser. Your numbers and expressions are not transmitted or stored.